org.ebayopensource.turmeric.eclipse.buildsystem.utils.ProjectPropertiesFileUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.buildsystem.utils.ProjectPropertiesFileUtil.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.buildsystem.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;

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.core.resources.constants.SOAProjectConstants.ServiceImplType;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOAAssetRegistry;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOAConfigurationRegistry;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAConsumerMetadata;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAConsumerProject;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAImplMetadata;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAImplProject;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAIntfMetadata;
import org.ebayopensource.turmeric.eclipse.resources.model.SOAIntfProject;
import org.ebayopensource.turmeric.eclipse.resources.util.SOAConsumerUtil;
import org.ebayopensource.turmeric.eclipse.resources.util.SOAIntfUtil;
import org.ebayopensource.turmeric.eclipse.utils.plugin.WorkspaceUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.osgi.framework.Version;

/**
 * The SOA plugin specific project properties files are created here. Includes
 * interface project properties file, consumer properties file and
 * implementation properties file. Some of these files might be empty for now,
 * But we still maintain this for future purposes. These properties file has
 * information that plugin needs to call codegen or identify the project
 * details. Most of the information here are not used by codegen directly.
 * 
 * @author smathew
 * 
 * 
 */
public class ProjectPropertiesFileUtil {

    /**
     * Creates the interface project properties file. The name of the file is
     * "service_intf_project.properties". This file has information like source
     * type of the project, package to name space mapping etc.
     *
     * @param soaIntfProject the soa intf project
     * @param monitor the monitor
     * @return the i file
     * @throws IOException Signals that an I/O exception has occurred.
     * @throws CoreException the core exception
     */
    public static IFile createPropsFile(SOAIntfProject soaIntfProject, IProgressMonitor monitor)
            throws IOException, CoreException {
        IFile file = soaIntfProject.getEclipseMetadata().getProject()
                .getFile(SOAProjectConstants.PROPS_FILE_SERVICE_INTERFACE);
        OutputStream output = null;
        try {
            output = new ByteArrayOutputStream();
            final Properties properties = new Properties();
            final SOAIntfMetadata metadata = soaIntfProject.getMetadata();
            addServiceMetadataProperties(properties, metadata);
            if (metadata.getServiceNonXSDProtocols() == null) {
                boolean protoBufCreated = ProjectProtoBufFileUtil.createServiceProtoBufFile(soaIntfProject,
                        metadata.getServiceLocation());
                if (protoBufCreated == true) {
                    properties.setProperty(SOAProjectConstants.PROP_KEY_NON_XSD_FORMATS,
                            SOAProjectConstants.SVC_PROTOCOL_BUF);
                }
            }
            if (SOAProjectConstants.InterfaceSourceType.WSDL.equals(metadata.getSourceType())
                    || SOAProjectConstants.InterfaceWsdlSourceType.EXISTIING.equals(metadata.getWsdlSourceType())) {
                properties.setProperty(SOAProjectConstants.PROPS_INTF_SOURCE_TYPE,
                        SOAProjectConstants.PROPS_INTF_SOURCE_TYPE_WSDL);
                if (metadata.getNamespaceToPackageMappings().isEmpty() == false) {
                    final Collection<String> data = new ArrayList<String>();
                    for (final String namespace : metadata.getNamespaceToPackageMappings().keySet()) {
                        final String pakcage = metadata.getNamespaceToPackageMappings().get(namespace);
                        data.add(namespace + SOAProjectConstants.DELIMITER_PIPE + pakcage);
                    }
                    final String ns2pkg = StringUtils.join(data, SOAProjectConstants.DELIMITER_COMMA);
                    properties.setProperty(SOAProjectConstants.PROPS_KEY_NAMESPACE_TO_PACKAGE, ns2pkg);
                }
            } else {
                properties.setProperty(SOAProjectConstants.PROPS_INTF_SOURCE_TYPE,
                        SOAProjectConstants.PROPS_INTF_SOURCE_TYPE_JAVA);
            }
            if (!metadata.getTypeFolding() && StringUtils.isNotBlank(metadata.getTypeNamespace())) {
                properties.setProperty(SOAProjectConstants.PROPS_KEY_TYPE_NAMESPACE, metadata.getTypeNamespace());
            }
            if (StringUtils.isNotBlank(metadata.getServiceDomainName())) {
                properties.setProperty(SOAProjectConstants.PROPS_SERVICE_DOMAIN_NAME,
                        metadata.getServiceDomainName());
            }

            if (StringUtils.isNotBlank(metadata.getServiceNamespacePart())) {
                properties.setProperty(SOAProjectConstants.PROPS_SERVICE_NAMESPACE_PART,
                        metadata.getServiceNamespacePart());
            }

            properties.setProperty(SOAProjectConstants.PROPS_KEY_TYPE_FOLDING,
                    Boolean.toString(metadata.getTypeFolding()));
            properties.setProperty(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG, Boolean.TRUE.toString());

            ISOAConfigurationRegistry configReg = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getConfigurationRegistry();
            if (configReg != null && StringUtils.isNotBlank(configReg.getEnvironmentMapperImpl())) {
                properties.setProperty(SOAProjectConstants.PROPS_ENV_MAPPER, configReg.getEnvironmentMapperImpl());
            }

            properties.setProperty(SOAProjectConstants.PROPS_KEY_SIPP_VERSION,
                    SOAProjectConstants.PROPS_DEFAULT_SIPP_VERSION);

            //short package name for shared consumer
            final String intfPkgName = StringUtils.substringBeforeLast(metadata.getServiceInterface(),
                    SOAProjectConstants.DELIMITER_DOT);
            properties.setProperty(SOAProjectConstants.PROPS_KEY_SHORT_PATH_FOR_SHARED_CONSUMER,
                    intfPkgName + SOAProjectConstants.DELIMITER_DOT + SOAProjectConstants.GEN);

            properties.store(output, SOAProjectConstants.PROPS_COMMENTS);

            WorkspaceUtil.writeToFile(output.toString(), file, monitor);
        } finally {
            IOUtils.closeQuietly(output);
        }
        return file;
    }

    /**
     * 
     * adding service metadata properties
     * @param props
     * @param intfProject
     */
    private static void addServiceMetadataProperties(final Properties props, final SOAIntfMetadata metadata) {
        props.setProperty(SOAProjectConstants.PROP_KEY_SERVICE_INTERFACE_CLASS_NAME,
                metadata.getServiceInterface());
        props.setProperty(SOAProjectConstants.PROP_KEY_SERVICE_LAYER, metadata.getServiceLayer());
        if (metadata.getOriginalWSDLUrl() != null) {
            props.setProperty(SOAProjectConstants.PROP_KEY_ORIGINAL_WSDL_URI,
                    metadata.getOriginalWSDLUrl().toString());
        }
        props.setProperty(SOAProjectConstants.PROP_KEY_SERVICE_VERSION, metadata.getServiceVersion());
        props.setProperty(SOAProjectConstants.PROP_KEY_ADMIN_NAME, metadata.getServiceName());
        String protocols = metadata.getServiceNonXSDProtocols();
        if (protocols == null) {
            protocols = "";
        }
        props.setProperty(SOAProjectConstants.PROP_KEY_NON_XSD_FORMATS, protocols);
    }

    /**
     * Creates the implementation project properties file. The name of the file
     * is "service_impl_project.properties". This file has information about the
     * base consumer source directory if there is one.
     *
     * @param soaImplProject the soa impl project
     * @return the i file
     * @throws IOException Signals that an I/O exception has occurred.
     * @throws CoreException the core exception
     */
    public static IFile createPropsFile(SOAImplProject soaImplProject) throws IOException, CoreException {
        IFile file = soaImplProject.getEclipseMetadata().getProject()
                .getFile(SOAProjectConstants.PROPS_FILE_SERVICE_IMPL);
        OutputStream output = null;

        try {
            output = new ByteArrayOutputStream();
            Properties properties = new Properties();
            SOAImplMetadata metadata = soaImplProject.getMetadata();
            properties.setProperty(SOAProjectConstants.PROPS_KEY_SIMP_VERSION,
                    SOAProjectConstants.PROPS_DEFAULT_SIMP_VERSION);

            boolean useServiceFactory = ServiceImplType.SERVICE_IMPL_FACTORY.equals(metadata.getServiceImplType());

            properties.setProperty(SOAProjectConstants.PROPS_KEY_USE_EXTERNAL_SERVICE_FACTORY,
                    useServiceFactory ? Boolean.TRUE.toString() : Boolean.FALSE.toString());

            if (useServiceFactory == true) {
                String implClassName = soaImplProject.getMetadata().getServiceImplClassName();
                properties.setProperty(SOAProjectConstants.PROPS_KEY_SERVICE_FACTORY_CLASS_NAME,
                        implClassName + SOAProjectConstants.PROPS_DEFAULT_VALUE_SERVICE_FACTORY_CLASS_NAME_POSTFIX);
            }

            properties.store(output, SOAProjectConstants.PROPS_COMMENTS);
            WorkspaceUtil.writeToFile(output.toString(), file, null);
        } finally {
            IOUtils.closeQuietly(output);
        }
        return file;
    }

    /**
     * Creates the consumer project properties file. The name of the file is
     * "service_consumer_project.properties". This file has information about
     * the base consumer source directory if there is one.
     *
     * @param soaConsumerProject the soa consumer project
     * @param monitor the monitor
     * @return the i file
     * @throws Exception the exception
     */
    public static IFile createPropsFile(SOAConsumerProject soaConsumerProject, IProgressMonitor monitor)
            throws Exception {
        IFile file = soaConsumerProject.getEclipseMetadata().getProject()
                .getFile(SOAProjectConstants.PROPS_FILE_SERVICE_CONSUMER);
        OutputStream output = null;
        try {
            final SOAConsumerMetadata metadata = soaConsumerProject.getMetadata();
            output = new ByteArrayOutputStream();
            Properties properties = new Properties();
            properties.setProperty(SOAProjectConstants.PROPS_KEY_CLIENT_NAME, metadata.getClientName());
            String consumerID = metadata.getConsumerId() != null ? metadata.getConsumerId() : "";
            properties.setProperty(SOAProjectConstants.PROPS_KEY_CONSUMER_ID, consumerID);
            ISOAConfigurationRegistry configReg = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getConfigurationRegistry();
            if (configReg != null && StringUtils.isNotBlank(configReg.getEnvironmentMapperImpl())) {
                properties.setProperty(SOAProjectConstants.PROPS_ENV_MAPPER, configReg.getEnvironmentMapperImpl());
            }
            properties.setProperty(SOAProjectConstants.PROPS_KEY_SCPP_VERSION,
                    SOAProjectConstants.PROPS_DEFAULT_SCPP_VERSION);

            final Collection<String> services = new ArrayList<String>();
            final ISOAAssetRegistry assetRegistry = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getAssetRegistry();

            for (String serviceName : metadata.getServiceNames()) {
                final String assetLocation = assetRegistry.getAssetLocation(serviceName);
                if (StringUtils.isNotBlank(assetLocation)) {
                    final Version version = SOAIntfUtil.getServiceMetadataVersion(serviceName, assetLocation);
                    if (version.compareTo(SOAProjectConstants.DEFAULT_PROPERTY_VERSION) >= 0) {
                        //the project is post 2.4
                        services.add(serviceName);
                    }
                } else {
                    SOALogger.getLogger().warning(
                            "Could not find the service in the underlying system, so generate the base cosumer:",
                            serviceName);
                    //services.add(serviceName);
                }
            }
            properties.setProperty(SOAProjectConstants.PROPS_NOT_GENERATE_BASE_CONSUMER,
                    StringUtils.join(services, SOAProjectConstants.DELIMITER_COMMA));
            properties.setProperty(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG,
                    Boolean.toString(metadata.isZeroConfig()));

            properties.store(output, SOAProjectConstants.PROPS_COMMENTS);
            WorkspaceUtil.writeToFile(output.toString(), file, monitor);
        } finally {
            IOUtils.closeQuietly(output);
        }
        return file;
    }

    public static IFile createPropsFileForImplProjects(IProject implProject, String clientName, String consumerId,
            IProgressMonitor monitor) throws IOException, CoreException {
        IFile file = SOAConsumerUtil.getConsumerPropertiesFile(implProject);

        Properties properties = new Properties();
        if (file.isAccessible() == true) {
            properties = SOAConsumerUtil.loadConsumerProperties(implProject);
        }
        properties.setProperty(SOAProjectConstants.PROPS_KEY_CLIENT_NAME, clientName);
        String consumerID = consumerId != null ? consumerId : "";
        properties.setProperty(SOAProjectConstants.PROPS_KEY_CONSUMER_ID, consumerID);

        properties.setProperty(SOAProjectConstants.PROPS_KEY_SCPP_VERSION,
                SOAProjectConstants.PROPS_DEFAULT_SCPP_VERSION);
        if (properties.containsKey(SOAProjectConstants.PROPS_ENV_MAPPER) == false) {
            ISOAConfigurationRegistry configReg = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getConfigurationRegistry();
            if (configReg != null && StringUtils.isNotBlank(configReg.getEnvironmentMapperImpl())) {
                properties.setProperty(SOAProjectConstants.PROPS_ENV_MAPPER, configReg.getEnvironmentMapperImpl());
            }
        }

        // set the default value of PROPS_SUPPORT_ZERO_CONFIG to false. if this
        // is modify client name or client id, then no change.
        if (properties.containsKey(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG) == false && StringUtils
                .isEmpty(properties.getProperty(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG)) == true) {
            properties.setProperty(SOAProjectConstants.PROPS_SUPPORT_ZERO_CONFIG, Boolean.FALSE.toString());
        }

        SOAConsumerUtil.savePropsFileForConsumer(implProject, properties, monitor);

        return file;
    }

}