/******************************************************************************* * Copyright © 2012, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.deployment.services.operation; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.edt.compiler.internal.util.EGLMessage; import org.eclipse.edt.ide.core.internal.utils.Util; import org.eclipse.edt.ide.core.model.EGLCore; import org.eclipse.edt.ide.deployment.core.model.RUIApplication; import org.eclipse.edt.ide.deployment.core.model.Restservice; import org.eclipse.edt.ide.deployment.operation.AbstractDeploymentOperation; import org.eclipse.edt.ide.deployment.results.DeploymentResultMessageRequestor; import org.eclipse.edt.ide.deployment.results.IDeploymentResultsCollector; import org.eclipse.edt.ide.deployment.solution.DeploymentContext; import org.eclipse.edt.ide.deployment.utilities.DeploymentUtilities; import org.eclipse.edt.javart.Constants; import org.eclipse.edt.javart.util.JavaAliaser; import org.eclipse.edt.mof.egl.Part; import org.eclipse.edt.mof.egl.PartNotFoundException; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; /** * Configures rununit.properties in the target project. New values for keys get appended to the file. */ public class ConfigureRuntimePropertiesOperation extends AbstractDeploymentOperation { private static final String RUNUNIT_PROPERTIES = "rununit.properties"; //$NON-NLS-1$ @Override public void execute(DeploymentContext context, IDeploymentResultsCollector resultsCollector, IProgressMonitor monitor) throws CoreException { DeploymentResultMessageRequestor requestor = new DeploymentResultMessageRequestor(resultsCollector); Set<Part> restServices = findRESTServices(context, requestor); boolean deployingRUIHandlers; RUIApplication ruiApp = context.getDeploymentDesc().getRUIApplication(); if (ruiApp.deployAllHandlers()) { if (context.getSourceProject() != null) { deployingRUIHandlers = DeploymentUtilities.getAllRUIHandlersInProject(EGLCore.create(context.getSourceProject())).size() > 0; } else { deployingRUIHandlers = false; } } else { deployingRUIHandlers = ruiApp.getRUIHandlers().size() > 0; } if (deployingRUIHandlers || restServices.size() > 0) { genProperties(context, restServices, deployingRUIHandlers, requestor); } } private void genProperties(DeploymentContext context, Set<Part> services, boolean setGlobalProperty, DeploymentResultMessageRequestor requestor) { IFile file = null; try { if (context.getTargetProject().hasNature(JavaCore.NATURE_ID)) { IJavaProject javaProject = JavaCore.create(context.getTargetProject()); IPath srcFolder = null; for (IClasspathEntry entry : javaProject.getRawClasspath()) { if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) { srcFolder = entry.getPath(); break; } } if (srcFolder != null) { StringBuilder contents = new StringBuilder(100); Properties props = new Properties(); file = ResourcesPlugin.getWorkspace().getRoot().getFile(srcFolder.append(RUNUNIT_PROPERTIES)); if (file.exists()) { // Read in the previous entries. BufferedInputStream bis = null; try { bis = new BufferedInputStream(file.getContents(true)); props.load(bis); // Also load the previous file contents so we can append to it. contents.append(Util.getFileContents(file)); if (contents.charAt(contents.length() - 1) != '\n') { contents.append('\n'); } } finally { if (bis != null) { try { bis.close(); } catch (IOException ioe) { } } } } String ddName = context.getDeploymentDesc().getEGLDDFileName().toLowerCase(); boolean changed = false; if (setGlobalProperty && appendPropertyIfNecessary(Constants.APPLICATION_PROPERTY_FILE_NAME_KEY, ddName, props, contents)) { changed = true; } for (Part part : services) { String generatedName; String id = part.getCaseSensitiveName(); String pkg = part.getCaseSensitivePackageName(); if (pkg == null || pkg.length() == 0) { generatedName = JavaAliaser.getAlias(id); } else { generatedName = JavaAliaser.packageNameAlias(pkg) + '.' + JavaAliaser.getAlias(id); } String key = Constants.APPLICATION_PROPERTY_FILE_NAME_KEY + '.' + generatedName; if (appendPropertyIfNecessary(key, ddName, props, contents)) { changed = true; } } if (changed) { ByteArrayInputStream bais = new ByteArrayInputStream(contents.toString().getBytes()); if (file.exists()) { file.setContents(bais, true, false, null); } else { file.create(bais, true, null); } requestor.addMessage(DeploymentUtilities.createEGLDeploymentInformationalMessage( EGLMessage.EGL_DEPLOYMENT_DEPLOYED_RT_PROPERTY_FILE, null, new String[] { file.getProjectRelativePath().toPortableString() })); } } } } catch (Exception e) { requestor.addMessage(DeploymentUtilities.createEGLDeploymentErrorMessage( EGLMessage.EGL_DEPLOYMENT_FAILED_DEPLOY_RT_PROPERTY_FILE, null, new String[] { file == null ? RUNUNIT_PROPERTIES : file.getProjectRelativePath().toPortableString() })); requestor.addMessage(DeploymentUtilities.createEGLDeploymentErrorMessage( EGLMessage.EGL_DEPLOYMENT_EXCEPTION, null, new String[] { DeploymentUtilities.createExceptionMessage(e) })); } } private boolean appendPropertyIfNecessary(String key, String value, Properties prevProps, StringBuilder buf) { String prevValue = prevProps.getProperty(key); if (prevValue == null || !value.equals(prevValue.trim())) { buf.append(key); buf.append('='); buf.append(value); buf.append('\n'); return true; } return false; } private Set<Part> findRESTServices(DeploymentContext context, DeploymentResultMessageRequestor requestor) { Set<Part> services = new HashSet<Part>(); List<Restservice> restServices = context.getDeploymentDesc().getRestservices(); for (Restservice rest : restServices) { if (rest.isEnableGeneration()) { try { Part part = context.findPart(rest.getImplementation()); services.add(part); } catch (PartNotFoundException e) { requestor.addMessage(DeploymentUtilities.createEGLDeploymentErrorMessage( EGLMessage.EGL_DEPLOYMENT_FAILED, null, new String[] { DeploymentUtilities.createExceptionMessage(e) })); } } } return services; } }