/******************************************************************************* * Copyright (c) 2010 Eteration A.S. 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: * Naci Dai and Murat Yener, Eteration A.S. - Initial API and implementation *******************************************************************************/ package org.eclipse.libra.framework.equinox; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jdt.launching.environments.IExecutionEnvironment; import org.eclipse.libra.framework.core.FrameworkCorePlugin; import org.eclipse.libra.framework.core.IOSGIExecutionEnvironment; import org.eclipse.libra.framework.core.Trace; import org.eclipse.pde.core.plugin.IPluginModelBase; import org.eclipse.pde.core.plugin.PluginRegistry; import org.eclipse.pde.core.plugin.TargetPlatform; import org.eclipse.pde.core.project.IBundleClasspathEntry; import org.eclipse.pde.core.project.IBundleProjectDescription; import org.eclipse.pde.core.target.TargetBundle; import org.eclipse.wst.server.core.IModule; public class EquinoxHandler implements IEquinoxVersionHandler { public IStatus verifyInstallPath(IPath location) { boolean isFound = false; IPath plugins = location.append("plugins"); if (plugins.toFile().exists()) { File[] files = plugins.toFile().listFiles(); if (files!=null) for (File file : files) { if (file.getName().indexOf("org.eclipse.osgi_") > -1) { isFound = true; break; } } if (isFound) { return Status.OK_STATUS; } } return new Status(IStatus.ERROR, EquinoxPlugin.PLUGIN_ID, 0, Messages.warningCantReadConfig, null); } public String getFrameworkClass() { return "org.eclipse.core.runtime.adaptor.EclipseStarter"; } @SuppressWarnings({ "rawtypes", "unchecked" }) public List getFrameworkClasspath(IPath installPath, IPath configPath) { List cp = new ArrayList(); IPath plugins = installPath.append("plugins"); if (plugins.toFile().exists()) { File[] files = plugins.toFile().listFiles(); if (files!=null) for (File file : files) { if (file.getName().indexOf("org.eclipse.osgi_") > -1) { IPath path = plugins.append(file.getName()); cp.add(JavaRuntime.newArchiveRuntimeClasspathEntry(path)); } } } return cp; } public String[] getFrameworkProgramArguments(IPath configPath, boolean debug, boolean starting) { ArrayList<String> programArgs = new ArrayList<String>(); programArgs.add("-dev"); programArgs.add("file:"+configPath.append("dev.properties").toOSString()); //$NON-NLS-1$ programArgs.add("-configuration"); programArgs.add(configPath.makeAbsolute().toOSString()); //$NON-NLS-1$ if (debug) { programArgs.add("-debug"); //$NON-NLS-1$ } programArgs.add("-os"); //$NON-NLS-1$ programArgs.add(TargetPlatform.getOS()); programArgs.add("-ws"); //$NON-NLS-1$ programArgs.add(TargetPlatform.getWS()); programArgs.add("-arch"); //$NON-NLS-1$ programArgs.add(TargetPlatform.getOSArch()); programArgs.add("-consoleLog"); //$NON-NLS-1$ programArgs.add("-console"); //$NON-NLS-1$ return programArgs.toArray(new String[programArgs.size()]); } public String[] getExcludedFrameworkProgramArguments(boolean debug, boolean starting) { return null; } public String[] getFrameworkVMArguments(IPath installPath, boolean jmxEnabled, int jmxPort, String javaProfileID, IPath configPath, IPath deployPath, boolean isTestEnv) { //String configPathStr = deployPath.makeAbsolute().toOSString(); String profilePath = deployPath.append("java.profile").toOSString(); Properties javaProfileProps = null; IExecutionEnvironment environment[] = JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments(); for(IExecutionEnvironment e: environment){ if(javaProfileID.equals(e.getId())){ javaProfileProps = e.getProfileProperties(); break; } } try { if(IOSGIExecutionEnvironment.JAVASE6_SERVER.toString().equals(javaProfileID)){ copyFile(this.getClass().getResourceAsStream("java6-server.profile"), new File(profilePath)); }else if(javaProfileProps != null){ FileOutputStream os = new FileOutputStream(new File(profilePath)); try{ javaProfileProps.store(os, "THIS FILE IS AUTO GENERATED"); }finally{ os.close(); } } } catch (IOException e) { Trace.trace(Trace.SEVERE, "Could not set equinox VM arguments:"+e.getMessage(), e); } String vmArgs ="" ; //If there is a non-default java profile then set it. if(javaProfileID != null && !javaProfileID.equals(IOSGIExecutionEnvironment.Default.toString())) vmArgs += "-Dosgi.java.profile=file:"+profilePath; //$NON-NLS-1$ //$NON-NLS-2$ if(jmxEnabled) return new String[] {"-Dcom.sun.management.jmxremote.port="+jmxPort, "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-Declipse.ignoreApp=true", "-Dosgi.noShutdown=true", vmArgs }; return new String[] { "-Declipse.ignoreApp=true", "-Dosgi.noShutdown=true", vmArgs }; } public IStatus canAddModule(IModule module) { String id = module.getModuleType().getId(); // String version = module.getModuleType().getVersion(); if ("osgi.bundle".equals(id)) return Status.OK_STATUS; return new Status(IStatus.ERROR, EquinoxPlugin.PLUGIN_ID, 0, Messages.errorNotBundle, null); } public IStatus prepareFrameworkInstanceDirectory(IPath baseDir) { return Status.OK_STATUS; } public IStatus prepareDeployDirectory(IPath deployPath) { if (Trace.isTraceEnabled()) Trace.trace(Trace.FINER, "Creating runtime directory at " + deployPath.toOSString()); // Prepare a directory structure final String[] subdirs = new String[]{"plugins", "auto", "cache"}; for(final String subdir: subdirs){ File temp = deployPath.append(subdir).toFile(); if (temp.exists() && temp.isDirectory()) continue; if (! temp.mkdirs()) return new Status(IStatus.ERROR, EquinoxPlugin.PLUGIN_ID, 0, Messages.errorIOerror+temp, null); } return Status.OK_STATUS; } public boolean supportsServeModulesWithoutPublish() { return true; } public void prepareFrameworkConfigurationFile(IPath configPath, String workspaceBundles, String frameworkJar, TargetBundle[] kernelBundles) { String[] wsBundleIds = workspaceBundles.split(" "); prepareDevProperties(configPath, wsBundleIds); prepareConfigIni(configPath, wsBundleIds, frameworkJar, kernelBundles); } private static void prepareConfigIni(IPath configPath, String[] wsBundleIds, String frameworkJar, TargetBundle[] krBundles) { StringBuilder propertyInstall = new StringBuilder(); for (String bundle : wsBundleIds) { if (bundle.indexOf("@") != -1) bundle = bundle.substring(0, bundle.indexOf("@")); IPluginModelBase[] models = PluginRegistry.getWorkspaceModels(); for (IPluginModelBase iPluginModelBase : models) { if (bundle .indexOf(iPluginModelBase.getPluginBase().getId()) > -1) { String bpath = iPluginModelBase.getInstallLocation(); if(bpath.endsWith("/")) bpath = bpath.substring(0,bpath.length()-1); if(iPluginModelBase.isFragmentModel()) propertyInstall.append("reference:file:" + bpath+ ", "); else propertyInstall.append("reference:file:" + bpath+ "@start, "); } } } Properties properties = new Properties(); properties.setProperty( "osgi.instance.area.default", "file:" + configPath.toPortableString().substring( 0, configPath.toPortableString().indexOf( ".metadata"))); properties.put("osgi.framework", frameworkJar); properties.setProperty("osgi.configuration.cascaded", "false"); //$NON-NLS-1$ //$NON-NLS-2$ int start = 4; properties.put( "osgi.bundles.defaultStartLevel", Integer.toString(start)); //$NON-NLS-1$ for (int i = 0; i < krBundles.length; i++) { String targetBundleRawpath = krBundles[i].getBundleInfo().getLocation().getRawPath(); if (targetBundleRawpath != null && !(targetBundleRawpath.trim().equalsIgnoreCase(""))) { if (targetBundleRawpath.indexOf("org.eclipse.osgi_") > -1) continue; String targetBundlePath = "reference:file:"+targetBundleRawpath; File file = new File(targetBundlePath.substring(targetBundlePath.indexOf("/"))); if (file.isFile()) { propertyInstall.append(targetBundlePath); if(krBundles[i].isFragment()) propertyInstall.append(", "); else propertyInstall.append("@start, "); } else { String[] fileList = file.list(); if (fileList!=null) for (String string2 : fileList) { if (string2.indexOf(".jar") > -1) { propertyInstall.append(targetBundlePath + string2); // String fbundleId = getBundleId(string2); // IPluginModelBase modelBase = PluginRegistry.findModel(fbundleId); if(krBundles[i].isFragment()) propertyInstall.append(", "); else propertyInstall.append("@start, "); } } } } } properties.setProperty("osgi.bundles", propertyInstall.toString()); properties.put("eclipse.ignoreApp", "true"); //$NON-NLS-1$ //$NON-NLS-2$ properties.put("osgi.noShutdown", "true"); //$NON-NLS-1$ //$NON-NLS-2$ try { final FileOutputStream out = new FileOutputStream( configPath.append("config.ini").makeAbsolute().toFile() ); try{ properties.store(out, "## AUTO GENERATED ##"); }finally{ try{ out.close(); }catch(IOException x){ x.printStackTrace(); } } } catch (IOException e) { Trace.trace(Trace.SEVERE, "Could not create equinox dev.properties configrutaion file:"+e.getMessage(), e); } } @SuppressWarnings("unused") private static String getBundleId(String targetBundlePath) { IPath kbPath = new Path(targetBundlePath); String bundleId = kbPath.lastSegment(); if(bundleId.endsWith(".jar")) bundleId = bundleId.substring(0,bundleId.length()-4); int vversioNloc = bundleId.indexOf("_"); if(vversioNloc > 0) bundleId = bundleId.substring(0, vversioNloc); return bundleId; } private static String[] prepareDevProperties(IPath configPath, String[] wsBundleIds) { try { // Create file FileWriter fstream = new FileWriter(configPath.toPortableString() + "/dev.properties"); BufferedWriter out = new BufferedWriter(fstream); out.write("#OSAMI AUTO GENERATED\n"); for (String bundle : wsBundleIds) { if (bundle.indexOf("@") != -1) bundle = bundle.substring(0, bundle.indexOf("@")); IPluginModelBase[] models = PluginRegistry.getWorkspaceModels(); String modelId = ""; for (IPluginModelBase iPluginModelBase : models) { if (bundle.indexOf(iPluginModelBase.getPluginBase().getId()) > -1) { IProject pluginProject = iPluginModelBase.getUnderlyingResource().getProject(); IJavaProject javaProject = JavaCore.create(pluginProject); IBundleProjectDescription bundleProjectDescription = FrameworkCorePlugin.getDescription(pluginProject); IPath bpath = new Path(iPluginModelBase.getInstallLocation()); IPath ploc = pluginProject.getLocation(); if(bpath.equals(ploc)) bpath = pluginProject.getFullPath(); else bpath = bpath.makeRelativeTo(ploc.removeLastSegments(1)); IBundleClasspathEntry[] allCPEntry = bundleProjectDescription.getBundleClasspath(); modelId = iPluginModelBase.getPluginBase().getId(); out.write("\n"+modelId + "="); for(IBundleClasspathEntry bcpe: allCPEntry){ if(bcpe.getSourcePath() != null && bcpe.getBinaryPath() == null) out.write(" "+ ploc.removeLastSegments(1).append(javaProject.getOutputLocation()) +","); else if(bcpe.getSourcePath() != null && bcpe.getBinaryPath() != null) out.write(" "+bcpe.getBinaryPath().toOSString() +","); else if(bcpe.getLibrary() != null && bcpe.getLibrary().toOSString().endsWith(".jar") ) out.write(" "+bcpe.getLibrary().toOSString() +","); else out.write(" "+javaProject.getOutputLocation().makeRelativeTo(pluginProject.getFullPath()) +","); } } } } out.close(); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Could not create equinox dev.properties configuration file:"+e.getMessage(), e); } return wsBundleIds; } private static void copyFile(InputStream source, File destFile) throws IOException { FileOutputStream destination = null; try { destination = new FileOutputStream(destFile); int c; while((c = source.read()) != -1){ destination.write(c); } } finally { if(source != null) { try{ source.close(); }catch(IOException x){ x.printStackTrace(); } } if(destination != null) { try{ destination.close(); }catch(IOException x){ x.printStackTrace(); } } } } }