blob: cca1de56f982947caec9780d9de465a4fba10ca2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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
* EclipseSource Corporation - ongoing enhancements
*******************************************************************************/
package org.eclipse.pde.internal.core.exports;
import java.io.*;
import java.net.URL;
import java.util.Properties;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.build.IPDEBuildConstants;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.PDECoreMessages;
import org.osgi.framework.Bundle;
/**
* Generates profiles for custom execution environments. Custom profiles are
* generated on demand, once per workspace invocation (since EE's are extensible,
* the set of EE's can change from time to time).
*/
public class ExecutionEnvironmentProfileManager {
/**
* Location in the local file system where custom profiles are stored
*/
private static final IPath PROFILE_PATH = PDECore.getDefault().getStateLocation().append(".profiles"); //$NON-NLS-1$
/**
* Number of custom profiles or -1 if not yet initialized.
*/
private static int fgCustomCount = -1;
/**
* Array of locations where custom profiles are stored.
*/
private static final String[] LOCATIONS = new String[] {PROFILE_PATH.toOSString()};
/**
* Returns absolute paths in the local file systems of directories and jars containing
* OSGi profile property files for custom execution environments, or <code>null</code>
* if none. This is in addition to the standard profiles known by <code>org.eclipse.osgi</code>.
*
* @return locations (directories and jars) containing custom execution environment
* profile files, or <code>null</code> if none
*/
public static String[] getCustomProfileLocations() {
initialize();
if (fgCustomCount > 0) {
return LOCATIONS;
}
return null;
}
/**
* Generates profile files for custom execution environments (i.e. those not provided
* by OSGi framework).
*/
private static synchronized void initialize() {
if (fgCustomCount == -1) {
fgCustomCount = 0;
// clean any existing profiles
File dir = PROFILE_PATH.toFile();
if (!dir.exists()) {
dir.mkdir();
}
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
// create current profiles
Bundle bundle = Platform.getBundle(IPDEBuildConstants.BUNDLE_OSGI);
IExecutionEnvironment[] environments = JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
for (int i = 0; i < environments.length; i++) {
IExecutionEnvironment env = environments[i];
String path = env.getId().replace('/', '_') + ".profile"; //$NON-NLS-1$
URL entry = bundle.getEntry(path);
if (entry == null) {
// custom entry if not contained in OSGi bundle
Properties properties = env.getProfileProperties();
if (properties != null) {
File profile = new File(dir, path);
OutputStream stream = null;
try {
fgCustomCount++;
stream = new BufferedOutputStream(new FileOutputStream(profile));
properties.store(stream, null);
} catch (IOException e) {
PDECore.log(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, NLS.bind(PDECoreMessages.ExecutionEnvironmentProfileManager_0, env.getId()), e));
} finally {
try {
if (stream != null)
stream.close();
} catch (IOException e) {
PDECore.logException(e);
}
}
}
}
}
}
}
}