org.ebayopensource.turmeric.eclipse.codegen.utils.SOACodegenTransformer.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.codegen.utils.SOACodegenTransformer.java

Source

/*******************************************************************************
 * 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;
    }

}