/******************************************************************************* * 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.codegen.utils; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang.StringUtils; import org.ebayopensource.turmeric.eclipse.codegen.model.ConsumerCodeGenModel; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOACodegenTransformer; import org.ebayopensource.turmeric.eclipse.repositorysystem.model.BaseCodeGenModel; import org.ebayopensource.turmeric.eclipse.repositorysystem.utils.TurmericServiceUtils; import org.ebayopensource.turmeric.eclipse.resources.model.ISOAConsumerProject.SOAClientEnvironment; import org.ebayopensource.turmeric.eclipse.resources.model.ProjectInfo; import org.ebayopensource.turmeric.eclipse.resources.model.SOAImplMetadata; import org.ebayopensource.turmeric.eclipse.resources.model.SOAIntfMetadata; import org.ebayopensource.turmeric.eclipse.resources.util.SOAConsumerUtil; import org.ebayopensource.turmeric.eclipse.resources.util.SOAImplUtil; import org.ebayopensource.turmeric.eclipse.resources.util.SOAIntfUtil; import org.ebayopensource.turmeric.eclipse.utils.io.PropertiesFileUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils; import org.ebayopensource.turmeric.eclipse.utils.plugin.ProgressUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; /** * The Class SOACodegenTransformer. * * @author yayu */ public class SOACodegenTransformer implements ISOACodegenTransformer { /** * Instantiates a new sOA codegen transformer. */ public SOACodegenTransformer() { super(); } /** * {@inheritDoc} */ @Override public BaseCodeGenModel transformModel(IProject project, final IProgressMonitor monitor) throws Exception { BaseCodeGenModel model = new BaseCodeGenModel(); final boolean isConsumerProject = TurmericServiceUtils .isSOAConsumerProject(project); if (isConsumerProject) { model = new ConsumerCodeGenModel(); } transform(model, project, monitor); if (TurmericServiceUtils.isSOAInterfaceProject(project)) { final SOAIntfMetadata intfMetadata = SOAIntfUtil.loadIntfMetadata( project.getLocation().makeAbsolute().toString(), project .getName()); final Properties properties = SOAIntfUtil .loadIntfProjectPropFile(project); Object obj = properties .get(SOAProjectConstants.PROPS_KEY_NAMESPACE_TO_PACKAGE); if (obj != null) { final String ns2Pkg = StringUtils.replaceChars(String .valueOf(obj), '|', '='); model.setNs2pkg(ns2Pkg); } transform(model, intfMetadata, monitor); } else if (TurmericServiceUtils.isSOAImplProject(project)) { final ProjectInfo implProjectInfo = GlobalRepositorySystem .instanceOf().getActiveRepositorySystem() .getAssetRegistry().getProjectInfo(project.getName()); final String serviceName = implProjectInfo .getInterfaceProjectName(); final SOAImplMetadata implMetadata = SOAImplUtil.loadServiceConfig( project, serviceName); final String assetLocation = GlobalRepositorySystem.instanceOf() .getActiveRepositorySystem().getAssetRegistry() .getAssetLocation(serviceName); final SOAIntfMetadata intfMetadata = SOAIntfUtil.loadIntfMetadata( assetLocation, serviceName); if (intfMetadata == null) throw new CoreException( EclipseMessageUtils .createErrorStatus("Can not load metadata for service->" + serviceName)); transform(model, intfMetadata, monitor); // get the useExternalServiceFactory property value and set it to gen model. IFile svcImplProperties = SOAImplUtil .getServiceImplPropertiesFile(project); if (svcImplProperties.isAccessible() == true) { String useExternalFac = PropertiesFileUtil .getPropertyValueByKey( svcImplProperties.getContents(), SOAProjectConstants.PROPS_KEY_USE_EXTERNAL_SERVICE_FACTORY); model.setUseExternalServiceFactory(Boolean .valueOf(useExternalFac)); } model.setServiceImplClassName(implMetadata .getServiceImplClassName()); } if (isConsumerProject) { final String clientName = SOAConsumerUtil.getClientName(project); ((ConsumerCodeGenModel) model).setClientName(clientName); final Map<SOAClientEnvironment, IFile> configFiles = SOAConsumerUtil .getClientConfigFiles(project); /* * final Set<String> svcNames = new LinkedHashSet<String>(); for * (SOAClientEnvironment env : configFiles.keySet()) { * svcNames.add(env.getServiceName()); } * * final Map<String, String> svcClientMap = SOAConsumerUtil * .getMappedServiceNamesFromPropsFile(project, svcNames * .toArray(new String[0])); */ for (final SOAClientEnvironment env : configFiles.keySet()) { // each service should have a corresponding folder in here // using its service name final IFile clientConfigFile = configFiles.get(env); if (clientConfigFile.isAccessible()) { final String serviceName = env.getServiceName(); final String assetLocation = GlobalRepositorySystem .instanceOf().getActiveRepositorySystem() .getAssetRegistry().getAssetLocation(serviceName); final SOAIntfMetadata intfMetadata = SOAIntfUtil .loadIntfMetadata(assetLocation, serviceName); if (intfMetadata == null) throw new CoreException( EclipseMessageUtils .createErrorStatus("Can not load metadata for service->" + serviceName)); final Map<String, String> data = new ConcurrentHashMap<String, String>(); data.put(BaseCodeGenModel.PARAM_SERVICE_NAME, serviceName); data.put(BaseCodeGenModel.PARAM_INTERFACE, intfMetadata .getServiceInterface()); data.put(BaseCodeGenModel.PARAM_SLAYER, intfMetadata .getServiceLayer()); data.put(BaseCodeGenModel.PARAM_SCV, intfMetadata .getServiceVersion()); data.put(BaseCodeGenModel.PARAM_NAMESPACE, intfMetadata .getTargetNamespace()); data.put(BaseCodeGenModel.PARAM_SL, intfMetadata .getServiceLocation()); ((ConsumerCodeGenModel) model).getRequiredServices().put( serviceName, data); } } } return model; } private static BaseCodeGenModel transform(final BaseCodeGenModel model, final IProject project, final IProgressMonitor monitor) { final String projectLocation = project.getLocation().toString(); model.setProjectName(project.getName()); model.setDestination(projectLocation); model.setSourceDirectory(project.getFolder( SOAProjectConstants.FOLDER_SRC).getLocation().toString()); model.setOutputDirectory(project.getFolder( SOAProjectConstants.CODEGEN_FOLDER_OUTPUT_DIR).getLocation() .toString()); model.setProjectRoot(projectLocation); ProgressUtil.progressOneStep(monitor); return model; } private static BaseCodeGenModel transform(final BaseCodeGenModel model, final SOAIntfMetadata intfMetadata, final IProgressMonitor monitor) throws Exception { model.setAdminName(intfMetadata.getServiceName()); model.setServiceName(intfMetadata.getPublicServiceName()); model.setServiceVersion(intfMetadata.getServiceVersion()); model.setServiceInterface(intfMetadata.getServiceInterface()); model.setNamespace(intfMetadata.getTargetNamespace()); model.setServiceLayer(intfMetadata.getServiceLayer()); model.setNonXSDFormats(intfMetadata.getServiceNonXSDProtocols()); if (intfMetadata.getOriginalWSDLUrl() != null) model.setOriginalWsdlUrl(intfMetadata.getOriginalWSDLUrl() .toString()); ProgressUtil.progressOneStep(monitor); return model; } }