/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ /** * */ package org.ebayopensource.turmeric.eclipse.resources.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.resources.model.AssetInfo; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAConsumerProject; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAConsumerProject.SOAClientConfig; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAConsumerProject.SOAClientEnvironment; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAProject.SOAProjectSourceDirectory; import org.ebayopensource.turmeric.eclipse.resources.model.SOAConsumerProject; import org.ebayopensource.turmeric.eclipse.resources.model.SOAIntfMetadata; import org.ebayopensource.turmeric.eclipse.utils.collections.ListUtil; import org.ebayopensource.turmeric.eclipse.utils.io.PropertiesFileUtil; import org.ebayopensource.turmeric.eclipse.utils.lang.StringUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils; import org.ebayopensource.turmeric.eclipse.utils.plugin.JDTUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.WorkspaceUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.jdom.JDOMException; /** * The Class SOAConsumerUtil. * * @author yayu * @since 1.0.0 */ public final class SOAConsumerUtil { private static final SOALogger logger = SOALogger.getLogger(); /** * */ private SOAConsumerUtil() { super(); } /** * Removes the client config files. * * @param project the project * @param monitor the monitor * @param serviceNames the service names * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static void removeClientConfigFiles(final IProject project, IProgressMonitor monitor, final String... serviceNames) throws CoreException, IOException { IFolder parentFolder = project .getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); if (parentFolder != null && parentFolder.exists() && serviceNames != null) { final String clientName = getClientName(project); parentFolder = parentFolder.getFolder(clientName); if (parentFolder.exists()) { for (IResource envResource : parentFolder.members()) { if (envResource.exists()) { IFolder envFolder = (IFolder)envResource; for (final String serviceName : serviceNames) { final IFolder folder = envFolder.getFolder(serviceName); if (folder != null && folder.exists()) { final File file = new File(folder.getLocation().toString()); FileUtils.deleteDirectory(file); // folder.delete(true, new NullProgressMonitor()); TODO } } } } } parentFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); } } /** * The Class ModifyConsumerIDResult. */ public static class ModifyConsumerIDResult { /** The client configs. */ final List<SOAClientConfig> clientConfigs = new ArrayList<SOAClientConfig>(); /** The old client configs. */ final List<SOAClientConfig> oldClientConfigs = new ArrayList<SOAClientConfig>(); private Properties properties = null; /** * Gets the client configs. * * @return the client configs */ public List<SOAClientConfig> getClientConfigs() { return clientConfigs; } /** * Gets the old client configs. * * @return the old client configs */ public List<SOAClientConfig> getOldClientConfigs() { return oldClientConfigs; } /** * Gets the properties. * * @return the properties */ public Properties getProperties() { return properties; } } /** * Update consumer id. * * @param consumerId the consumer id * @param consumerProject the consumer project * @return the modify consumer id result * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. * @throws JDOMException the jDOM exception */ public static ModifyConsumerIDResult updateConsumerId(String consumerId, IProject consumerProject) throws CoreException, IOException, JDOMException { final Properties props = SOAConsumerUtil.loadConsumerProperties(consumerProject); final String conId = props.getProperty(SOAProjectConstants.PROPS_KEY_CONSUMER_ID); if (consumerId.equals(conId) == false && props.containsKey(SOAProjectConstants.PROPS_KEY_SCPP_VERSION)) { //the consumer ID being entered and the version of scpp is new. final ModifyConsumerIDResult result = new ModifyConsumerIDResult(); result.properties = props; //modify the consumer-id tag in the CC.xml files as well for (IFile configFile : SOAConsumerUtil.getClientConfigFiles(consumerProject).values()) { final SOAClientConfig clientConfig = SOAClientConfigUtil.parseClientConfig(configFile); clientConfig.setConsumerId(consumerId); result.clientConfigs.add(clientConfig); if (clientConfig.getInvocationUseCase() != null) { //old client config result.oldClientConfigs.add(clientConfig); } } return result; } return null; } /** * Removes the environments. * * @param project the project * @param monitor the monitor * @param envrionmentNames the envrionment names * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static void removeEnvironments(final IProject project, IProgressMonitor monitor, final String... envrionmentNames) throws CoreException, IOException { IFolder parentFolder = project .getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); if (parentFolder != null && parentFolder.exists() && envrionmentNames != null) { final String clientName = getClientName(project); if (clientName == null) return; parentFolder = parentFolder.getFolder(clientName); if (parentFolder.exists()) { for (final String envName : envrionmentNames) { final IFolder folder = parentFolder.getFolder(envName); if (folder != null && folder.exists()) { final File file = new File(folder.getLocation().toString()); FileUtils.deleteDirectory(file); // folder.delete(true, new NullProgressMonitor()); TODO } } } parentFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); } } /** * Gets the consumed service list. * * @param project the project * @return the consumed service list * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static List<String> getConsumedServiceList(IProject project) throws CoreException, IOException { final List<String> result = new ArrayList<String>(); final List<EnvironmentItem> items = SOAConsumerUtil.getClientConfigStructure(project); if (items.isEmpty() == false) { result.addAll(items.get(0).getServices()); } return result; } /** * <p> * Get all client config files of the underlying consumer project. * The key would be the environment name, and the values would be the client * config files belong to this enviroment.</p> * * <p>Note. this method would be able to handle both old and new dir structure for * ClientConfig.xml files. For the old dir structure, the environment name would * be <b>default</b>.</p> * * @param project the project * @return all client configs of the underlying consumer project * @throws CoreException the core exception */ public static Map<SOAClientEnvironment, IFile> getClientConfigFiles(final IProject project) throws CoreException { final Map<SOAClientEnvironment, IFile> result = new LinkedHashMap <SOAClientEnvironment, IFile>(); final IFolder folder = getClientConfigClientFolder(project); if (folder != null && folder.exists()) { if (isOldClientConfigDirStructure(project) == false) { //the new client config dir structure for (final IResource res : folder.members()) { if (res instanceof IFolder) { //string environment name String envName = res.getName(); for (IResource clientFolder : ((IFolder)res).members()) { if (clientFolder instanceof IFolder &&((IFolder) clientFolder) .getFile(ISOAConsumerProject.FILE_ClIENT_CONFIG).isAccessible()) { //the sub folder contains valid ClientConfig.xml file result.put(new SOAClientEnvironment(envName, clientFolder.getName()), ((IFolder) clientFolder) .getFile(ISOAConsumerProject.FILE_ClIENT_CONFIG)); } } } } } else { //the OLD client config dir structure Map<String, String> svcClientMap = new ConcurrentHashMap<String, String>();; try { svcClientMap = SOAConsumerUtil .getMappedServiceNamesFromPropsFile(project); } catch (IOException e) { throw new CoreException(EclipseMessageUtils.createErrorStatus(e)); } for (final IResource clientFolder : folder.getParent().members()) { if (clientFolder instanceof IFolder) { //service name if (clientFolder instanceof IFolder &&((IFolder) clientFolder) .getFile(ISOAConsumerProject.FILE_ClIENT_CONFIG).isAccessible()) { //the sub folder contains valid ClientConfig.xml file final String clientFolderName = clientFolder.getName(); final String serviceName = svcClientMap.containsKey( clientFolderName) ? svcClientMap.get(clientFolderName) : clientFolderName; result.put(new SOAClientEnvironment(SOAProjectConstants.DEFAULT_CLIENT_CONFIG_ENVIRONMENT, serviceName), ((IFolder) clientFolder) .getFile(ISOAConsumerProject.FILE_ClIENT_CONFIG)); } } } } } return result; } /** * Save impl metadata props. * * @param consumerProject the consumer project * @throws IOException Signals that an I/O exception has occurred. * @throws CoreException the core exception */ public static void saveImplMetadataProps( final SOAConsumerProject consumerProject) throws IOException, CoreException { Properties properties = loadConsumerProperties(consumerProject.getProject()); PropertiesFileUtil.writeToFile(properties, consumerProject.getProject() .getFile(SOAProjectConstants.PROPS_FILE_SERVICE_CONSUMER), SOAProjectConstants.PROPS_COMMENTS); } /** * Load client configs. * * @param consumerProject the consumer project * @throws Exception the exception */ public static void loadClientConfigs( final SOAConsumerProject consumerProject) throws Exception { final Map<SOAClientEnvironment, IFile> clientConfigFiles = getClientConfigFiles(consumerProject .getProject()); final Set<String> serviceNames = new LinkedHashSet<String>(); for (SOAClientEnvironment cliEnv : clientConfigFiles.keySet()) { final IFile configFile = clientConfigFiles.get(cliEnv); final SOAClientConfig config = SOAClientConfigUtil .parseClientConfig(configFile); consumerProject.getClientConfigs().put(cliEnv, config); serviceNames.add(cliEnv.getServiceName()); } fillMetadata(consumerProject, ListUtil.arrayList(serviceNames)); } /** * Fill metadata. * * @param consumerProject the consumer project * @param serviceNames the service names * @return the sOA consumer project * @throws Exception the exception */ public static SOAConsumerProject fillMetadata( final SOAConsumerProject consumerProject, final List<String> serviceNames) throws Exception { final List<SOAProjectSourceDirectory> entries = new ArrayList<SOAProjectSourceDirectory>(); for (final IClasspathEntry entry : JDTUtil.rawClasspath(consumerProject .getProject(), false)) { if (entry == null || entry.getEntryKind() != IClasspathEntry.CPE_SOURCE) continue; final String path = entry.getPath().removeFirstSegments(1) .toString(); entries.add(new SOAProjectSourceDirectory(path)); } consumerProject.setSourceDirectories(entries); if (serviceNames != null) { if (consumerProject instanceof SOAConsumerProject) { ((SOAConsumerProject) consumerProject).getMetadata() .setServiceNames(serviceNames); } for (final String serviceName : serviceNames) { final IProject intfProject = WorkspaceUtil .getProject(serviceName); if (intfProject != null && intfProject.isAccessible()) { SOAIntfMetadata intfMetadata = SOAServiceUtil .getSOAIntfMetadata(SOAServiceUtil .getSOAEclipseMetadata(intfProject)); intfMetadata.setServiceName(serviceName); SOAIntfUtil.fillMetadata(intfProject, intfMetadata); consumerProject.getRequiredServices().put(serviceName, intfMetadata); } } } return consumerProject; } /** * Gets the client config. * @param project * @param serviceName * @return * @throws CoreException * @throws IOException * @deprecated This is only used for the old dir structure which * does not have environment in the path. Please use another overloaded * version which has environmentName as input option. */ public static IFile getClientConfig(final IProject project, final String serviceName) throws CoreException, IOException { return getClientConfig(project, null, serviceName); } /** * Gets the client config. * * @param project the project * @param environmentName null means loading client config from old dir structure * @param serviceName the service name * @return the client config * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static IFile getClientConfig(final IProject project, final String environmentName, final String serviceName) throws CoreException, IOException { if (project == null || serviceName == null) return null; if (StringUtils.isBlank(environmentName)) { //loading old client config logger.warning("Loading client config from deprecated dir structure->" + project); return project.getFile(StringUtil.toString( SOAConsumerProject.META_SRC_ClIENT_CONFIG, serviceName, WorkspaceUtil.PATH_SEPERATOR, ISOAConsumerProject.FILE_ClIENT_CONFIG)); } else { String clientName = getClientName(project); if (StringUtils.isNotBlank(clientName)) { return project.getFile(StringUtil.toString( SOAConsumerProject.META_SRC_ClIENT_CONFIG, clientName, WorkspaceUtil.PATH_SEPERATOR, environmentName, WorkspaceUtil.PATH_SEPERATOR, serviceName, WorkspaceUtil.PATH_SEPERATOR, ISOAConsumerProject.FILE_ClIENT_CONFIG)); } } return null; } /** * Load client config. * * @param project the project * @param environmentName the environment name * @param serviceName the service name * @return the sOA client config * @throws IOException Signals that an I/O exception has occurred. * @throws JDOMException the jDOM exception * @throws CoreException the core exception */ public static SOAClientConfig loadClientConfig(final IProject project, final String environmentName, final String serviceName) throws IOException, JDOMException, CoreException { final IFile clientConfigFile = getClientConfig(project, environmentName, serviceName); if (clientConfigFile != null && clientConfigFile.isAccessible()) { return SOAClientConfigUtil.parseClientConfig(clientConfigFile); } return null; } /** * Gets the consumer properties file. * * @param project the project * @return the consumer properties file */ public static IFile getConsumerPropertiesFile(IProject project) { return project.getFile(SOAProjectConstants.PROPS_FILE_SERVICE_CONSUMER); } /** * Load consumer properties. * * @param project the project * @return the properties * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static Properties loadConsumerProperties(IProject project) throws CoreException, IOException { final Properties properties = new Properties(); InputStream ins = null; try { ins = getConsumerPropertiesFile(project).getContents(); properties.load(ins); } finally { IOUtils.closeQuietly(ins); } return properties; } /** * Gets the env mapper from consumer properties. * * @param project the project * @return the env mapper from consumer properties * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static String getEnvMapperFromConsumerProperties(IProject project) throws CoreException, IOException { return StringUtils.trim(loadConsumerProperties(project).getProperty( SOAProjectConstants.PROPS_ENV_MAPPER)); } /** * This function returns the mapped value. Lets say the client config folder * name is "a" and if a has an entry in the the properties file map,then * that entry is returned otherwise a. the format of the String in the props * file is {[a,b],[d,e]} * * @param project the project * @param clientNames the client names * @return the mapped service names from props file * @throws IOException Signals that an I/O exception has occurred. * @throws CoreException the core exception */ public static Map<String, String> getMappedServiceNamesFromPropsFile( IProject project, String... clientNames) throws IOException, CoreException { final Map<String, String> svcClientNameMap = new ConcurrentHashMap<String, String>(); // This is a hot fix for consumers. Impls wont have this props file // This is not a very nice approach. Impls also should have // consumer properties if its a consumer. IFile consumerPropsFile = getConsumerPropertiesFile(project); if (consumerPropsFile != null && consumerPropsFile.isAccessible()) { //this should be a consumer project final Properties properties = loadConsumerProperties(project); Object objMapStr = properties .get(SOAProjectConstants.PROPS_KEY_CONSUMER_SVC_CLIENT_NAME_MAPPING); if (objMapStr != null && objMapStr instanceof String && StringUtils.isNotEmpty((String) objMapStr)) { String strMap = (String) objMapStr; strMap = StringUtils.substringBetween(strMap, "{", "}"); for (String tempStr : StringUtils.substringsBetween(strMap, "[", "]")) { String[] tempArr = StringUtils.split(tempStr, SOAProjectConstants.DELIMITER_COMMA); svcClientNameMap.put(tempArr[0], tempArr[1]); } } } if (clientNames != null) { for (String clientName : clientNames) { String svcName = svcClientNameMap.get(clientName); if (StringUtils.isEmpty(svcName)) { svcClientNameMap.put(clientName, clientName); } } } return svcClientNameMap; } /** * Gets the service client name. * * @param project the project * @return the service client name * @throws CoreException the core exception */ public static String getServiceClientName(IProject project) throws CoreException { if (isOldClientConfigDirStructure(project) == true) { return project.getName(); } else { final IFolder parentFolder = project.getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); if (parentFolder != null && parentFolder.exists() && parentFolder.members().length == 1) { //the correct directory structure return parentFolder.members()[0].getName(); } else if (project .getFile(SOAProjectConstants.PROPS_FILE_SERVICE_IMPL).isAccessible()){ //this is an impl project that has not consumed any services yet //this is a dirty fix, but we could not get the service name at this point final String serviceName = StringUtils.removeEnd(project.getName(), SOAProjectConstants.IMPL_PROJECT_SUFFIX); return serviceName + SOAProjectConstants.CLIENT_PROJECT_SUFFIX; } } return project.getName(); } /** * Starting from SOA v2.3.0, we have deployed a new multi client config directory strucutre. * The new path format would be <b>meta-src/META-INF/soa/client/config/<client name>/<environment>/<service name>/ClientConfig.xml</b> * * @param project the project * @return True is old client config directory structure or False otherwise * @throws CoreException the core exception * @since 1.0.0 */ public static boolean isOldClientConfigDirStructure(IProject project) throws CoreException { final IFolder parentFolder = project.getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); if (parentFolder != null && parentFolder.exists()) { for (final IResource res : parentFolder.members()) { if (res instanceof IFolder) { IFile file = ((IFolder) res).getFile(ISOAConsumerProject.FILE_ClIENT_CONFIG); if (file.exists() == true) { logger.warning("Project ", project, " is using the old deprecated directory structure for client config->", file.getLocation()); return true; } } } } return false; } /** * Gets the client config structure. * * @param project the project * @param availableServices the available services * @return the client config structure * @throws CoreException the core exception */ public static List<EnvironmentItem> getClientConfigStructure(IProject project, List<String> availableServices) throws CoreException{ final List<EnvironmentItem> result = getClientConfigEnvironments(project, null); for (EnvironmentItem item : result) { item.setServices(availableServices); } return result; } /** * Gets the client config structure. * * @param project the project * @return the client config structure * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static List<EnvironmentItem> getClientConfigStructure(IProject project) throws CoreException, IOException { return getClientConfigStructure(project, (IProgressMonitor)null); } /** * Gets the client environment list. * * @param project the project * @param monitor the monitor * @return the client environment list * @throws CoreException the core exception */ public static List<String> getClientEnvironmentList(IProject project, IProgressMonitor monitor) throws CoreException { final List<String> clients = new ArrayList<String>(); if (project == null) return clients; final IFolder clientConfigFolder = project .getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); //lets do a refresh to ensure we can have the latest change, //because the user might have modified the file in an external text //editor clientConfigFolder.refreshLocal(IResource.DEPTH_ONE, monitor); if (clientConfigFolder.isAccessible() == false) { logger.warning("Client config folder is not accessible->", clientConfigFolder.getLocation()); return clients; } if (isOldClientConfigDirStructure(project) == true) { //the old dir structure clients.add(SOAProjectConstants.DEFAULT_CLIENT_CONFIG_ENVIRONMENT); } else { for (final IResource res : clientConfigFolder.members()) { if (res instanceof IFolder) { //this should be the client name for (final IResource folder : ((IFolder)res).members()) { if (folder instanceof IFolder) { //this should be the environment clients.add(folder.getName()); } } } } } return clients; } /** * Gets the client config environments. * * @param project the project * @param monitor the monitor * @return the client config environments * @throws CoreException the core exception */ public static List<EnvironmentItem> getClientConfigEnvironments(IProject project, IProgressMonitor monitor) throws CoreException { final List<EnvironmentItem> clients = new ArrayList<EnvironmentItem>(); for (String envName : getClientEnvironmentList(project, monitor)) { clients.add(new EnvironmentItem(envName)); } return clients; } /** * Gets the client name. * * @param project the project * @return the client name * @throws IOException Signals that an I/O exception has occurred. * @throws CoreException the core exception */ public static String getClientName(IProject project) throws IOException, CoreException { final IFile file = getConsumerPropertiesFile(project); //the default name is same as the project name String clientName = project.getName(); if (file.exists() == true) { final Properties props = loadConsumerProperties(project); clientName = StringUtils.trim(props.getProperty(SOAProjectConstants.PROPS_KEY_CLIENT_NAME, clientName)); } else { logger.warning( "service_consumer_project.properties file is missing, so use the project name instead->", project.getName()); } return clientName; } public static boolean isZeroConfigEnabled(IProject project) throws IOException, CoreException { final IFile file = getConsumerPropertiesFile(project); //the default name is same as the project name boolean isZeroConfig = Boolean.FALSE; if (file.exists() == true) { final Properties props = loadConsumerProperties(project); isZeroConfig = Boolean.valueOf(StringUtils.trim( props.getProperty(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG, Boolean.FALSE.toString()))); } else { logger.warning( "service_consumer_project.properties file is missing, so use the support_zero_config=false instead"); } return isZeroConfig; } /** * Gets the client config client folder. * * @param project the project * @return the client config client folder * @throws CoreException the core exception */ public static IFolder getClientConfigClientFolder(IProject project) throws CoreException { final IFolder clientConfigFolder = project .getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); //lets do a refresh to ensure we can have the latest change, //because the user might have modified the file in an external text //editor clientConfigFolder.refreshLocal(IResource.DEPTH_ONE, null); if (clientConfigFolder.isAccessible() == false) { logger.warning("Client config folder is not accessible->", clientConfigFolder.getLocation()); return null; } for (final IResource res : clientConfigFolder.members()) { if (res instanceof IFolder) { //this should be the client name return (IFolder)res; } } return null; } /** * Clone environment. * * @param project the project * @param existingEnvName the existing env name * @param newEnvName the new env name * @param monitor the monitor * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static void cloneEnvironment(IProject project, String existingEnvName, String newEnvName, IProgressMonitor monitor) throws CoreException, IOException { final IFolder clientFolder = getClientConfigClientFolder(project); if (clientFolder != null) { IFolder srcFolder = clientFolder.getFolder(existingEnvName); if (srcFolder.exists()) { IFolder targetFolder = clientFolder.getFolder(newEnvName); FileUtils.copyDirectory(srcFolder.getLocation().toFile(), targetFolder.getLocation().toFile(), true); monitor.worked(10); clientFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor); } } } /** * Add an admin name into the consumer_project.props file to indicate that the base * consumer should not be generated in the consumer project. * * @param project the project * @param addedAdminNames the added admin names * @param removedAdminNames the removed admin names * @param monitor the monitor * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static void modifyNotGenerateBaseConsumers(final IProject project, final Collection<String> addedAdminNames, final Collection<String> removedAdminNames, IProgressMonitor monitor) throws CoreException, IOException { final Properties props = loadConsumerProperties(project); final List<String> adminNames = ListUtil.arrayList(StringUtils.split( props.getProperty(SOAProjectConstants.PROPS_NOT_GENERATE_BASE_CONSUMER, ""), SOAProjectConstants.DELIMITER_COMMA)); for (String adminName : addedAdminNames) { if (adminNames.contains(adminName) == false) { adminNames.add(adminName); } else { logger.warning( "Admin name already exist in the not_genreate_base_consumer propery->", adminName); } } for (String adminName : removedAdminNames) { if (adminNames.contains(adminName) == true) { adminNames.remove(adminName); } else { logger.debug( "The admin name does not exist in the not_genreate_base_consumer property->", adminName); } } props.setProperty(SOAProjectConstants.PROPS_NOT_GENERATE_BASE_CONSUMER, StringUtils.join(adminNames, SOAProjectConstants.DELIMITER_COMMA)); savePropsFileForConsumer(project, props, monitor); } /** * Save props file for consumer. * * @param project the project * @param props the props * @param monitor the monitor * @throws IOException Signals that an I/O exception has occurred. * @throws CoreException the core exception */ public static void savePropsFileForConsumer(IProject project, final Properties props, IProgressMonitor monitor) throws IOException, CoreException { final IFile file = SOAConsumerUtil.getConsumerPropertiesFile(project); OutputStream output = null; try { output = new ByteArrayOutputStream(); props.store(output, SOAProjectConstants.PROPS_COMMENTS); WorkspaceUtil.writeToFile(output.toString(), file, monitor); } finally { IOUtils.closeQuietly(output); } } /** * Gets the client config structure. * * @param project the project * @param monitor the monitor * @return the client config structure * @throws CoreException the core exception * @throws IOException Signals that an I/O exception has occurred. */ public static List<EnvironmentItem> getClientConfigStructure(IProject project, IProgressMonitor monitor) throws CoreException, IOException { final List<EnvironmentItem> clients = getClientConfigEnvironments(project, monitor); if (clients.isEmpty()) return clients; IFolder clientConfigFolder = project .getFolder(SOAConsumerProject.META_SRC_ClIENT_CONFIG); if (isOldClientConfigDirStructure(project) == true) { //the old dir structure EnvironmentItem item = clients.get(0); for (final IResource res : clientConfigFolder.members()) { if (res instanceof IFolder) { // each service should have a corresponding folder in here // using its service name String svcName = res.getName(); item.addService(svcName); } } } else { final String clientName = getClientName(project); clientConfigFolder = clientConfigFolder.getFolder(clientName); if (clientConfigFolder.exists() == false) { logger.warning("Client Config folder is missing->", clientConfigFolder.getLocation()); return clients; } for (final EnvironmentItem item : clients) { for (final IResource child : clientConfigFolder. getFolder(item.getName()).members()) { //this should be the service names if (child instanceof IFolder) { final IFolder folder = (IFolder) child; final IFile clientFile = folder.getFile( ISOAConsumerProject.FILE_ClIENT_CONFIG); if (clientFile.isAccessible() == true) { item.addService(folder.getName()); if (clients.contains(item) == false) { //we only add the environment if and //only if it contains valid ClientConfig.xml files clients.add(item); } } } } } } return clients; } /** * The Class EnvironmentItem. */ public static class EnvironmentItem { private String name; private List<String> services = new ArrayList<String>(); private Map<String, AssetInfo> serviceData = new ConcurrentHashMap<String, AssetInfo>(); /** * Instantiates a new environment item. * * @param name the name */ public EnvironmentItem(String name) { super(); this.name = name; } /** * Gets the name. * * @return the name */ public String getName() { return name; } /** * Sets the name. * * @param name the new name */ public void setName(String name) { this.name = name; } /** * Gets the services. * * @return the services */ public List<String> getServices() { return services; } /** * Removes the service. * * @param service the service */ public void removeService(String service) { services.remove(service); serviceData.remove(service); } /** * Adds the service. * * @param service the service * @return true, if successful */ public boolean addService(String service) { return services.add(service); } /** * Sets the services. * * @param services the new services */ public void setServices(List<String> services) { this.services = services; } /** * Gets the service data. * * @param serviceName the service name * @return the service data */ public AssetInfo getServiceData(String serviceName) { return serviceData.get(serviceName); } /** * Gets the service data. * * @return the service data */ public Map<String, AssetInfo> getServiceData() { return serviceData; } /** * Sets the service data. * * @param serviceData the service data */ public void setServiceData(Map<String, AssetInfo> serviceData) { this.serviceData = serviceData; } /** * Adds the service data. * * @param svcData the svc data */ public void addServiceData(AssetInfo svcData) { if (services.contains(svcData.getName()) == false) services.add(svcData.getName()); serviceData.put(svcData.getName(), svcData); } /** * {@inheritDoc} */ @Override public String toString() { return this.name; } } }