1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
/*******************************************************************************
* Copyright (c) 2004, 2010 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.osgi.internal.baseadaptor;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Dictionary;
import java.util.Properties;
import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
import org.eclipse.osgi.util.ManifestElement;
/**
* This class provides helper methods to support developement classpaths.
* @since 3.1
*/
public final class DevClassPathHelper {
static final private String FILE_PROTOCOL = "file"; //$NON-NLS-1$
static final private boolean inDevelopmentMode;
static final private File devLocation;
static private String[] devDefaultClasspath;
static private Dictionary<String, String> devProperties = null;
// timestamp for the dev.properties file
static private long lastModified = 0;
static {
String osgiDev = FrameworkProperties.getProperty("osgi.dev"); //$NON-NLS-1$
File f = null;
boolean devMode = false;
if (osgiDev != null) {
try {
devMode = true;
URL location = new URL(osgiDev);
if (FILE_PROTOCOL.equals(location.getProtocol())) {
f = new File(location.getFile());
lastModified = f.lastModified();
}
// Check the osgi.dev property to see if dev classpath entries have been defined.
try {
load(location.openStream());
devMode = true;
} catch (IOException e) {
// TODO consider logging
}
} catch (MalformedURLException e) {
devDefaultClasspath = getArrayFromList(osgiDev);
}
}
inDevelopmentMode = devMode;
devLocation = f;
}
/*
* Updates the dev classpath if the file containing the entries have changed
*/
private static void updateDevProperties() {
if (devLocation == null)
return;
if (devLocation.lastModified() == lastModified)
return;
try {
load(new FileInputStream(devLocation));
} catch (FileNotFoundException e) {
return;
}
lastModified = devLocation.lastModified();
}
private static String[] getDevClassPath(String id, Dictionary<String, String> properties, String[] defaultClasspath) {
String[] result = null;
if (id != null && properties != null) {
String entry = properties.get(id);
if (entry != null)
result = getArrayFromList(entry);
}
if (result == null)
result = defaultClasspath;
return result;
}
/**
* Returns a list of classpath elements for the specified bundle symbolic name.
* @param id a bundle symbolic name to get the development classpath for
* @param properties a Dictionary of properties to use or <code>null</code> if
* the default develoment classpath properties should be used
* @return a list of development classpath elements
*/
public static String[] getDevClassPath(String id, Dictionary<String, String> properties) {
if (properties == null) {
synchronized (DevClassPathHelper.class) {
updateDevProperties();
return getDevClassPath(id, devProperties, devDefaultClasspath);
}
}
return getDevClassPath(id, properties, getArrayFromList(properties.get("*"))); //$NON-NLS-1$
}
/**
* Returns a list of classpath elements for the specified bundle symbolic name.
* @param id a bundle symbolic name to get the development classpath for
* @return a list of development classpath elements
*/
public static String[] getDevClassPath(String id) {
return getDevClassPath(id, null);
}
/**
* Returns the result of converting a list of comma-separated tokens into an array
*
* @return the array of string tokens
* @param prop the initial comma-separated string
*/
public static String[] getArrayFromList(String prop) {
return ManifestElement.getArrayFromList(prop, ","); //$NON-NLS-1$
}
/**
* Indicates the development mode.
* @return true if in development mode; false otherwise
*/
public static boolean inDevelopmentMode() {
return inDevelopmentMode;
}
/*
* Load the given input stream into a dictionary
*/
private static void load(InputStream input) {
Properties props = new Properties();
try {
props.load(input);
} catch (IOException e) {
// TODO consider logging here
} finally {
if (input != null)
try {
input.close();
} catch (IOException e) {
// tried our best
}
}
@SuppressWarnings({"unchecked", "rawtypes"})
Dictionary<String, String> result = (Dictionary) props;
devProperties = result;
if (devProperties != null)
devDefaultClasspath = getArrayFromList(devProperties.get("*")); //$NON-NLS-1$
}
}
|