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