Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2006, 2008 Cognos Incorporated, 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 /
  
  package org.eclipse.osgi.framework.internal.core;
 
 import java.net.URL;
 import java.util.*;
 
 /*
  * This class should be used in ALL places in the framework implementation to get "system" properties.
  * The static methods on this class should be used instead of the System#getProperty, System#setProperty etc methods.
  */
 public class FrameworkProperties {

GuardedBy:
FrameworkProperties.clas
 
 	private static Properties properties;
 
 	// A flag of some sort will have to be supported. 
 	// Many existing plugins get framework propeties directly from System instead of BundleContext. 
 	// Note that the OSGi TCK is one example where this property MUST be set to false because many TCK bundles set and read system properties.
 	private static final String USING_SYSTEM_PROPERTIES_KEY = "osgi.framework.useSystemProperties"//$NON-NLS-1$
 	private static final String PROP_FRAMEWORK = "osgi.framework"//$NON-NLS-1$
 	private static final String PROP_INSTALL_AREA = "osgi.install.area"//$NON-NLS-1$
 
 	public static Properties getProperties() {
 		if (sm != null)
 		return internalGetProperties(null);
 	}
 
 	public static String getProperty(String key) {
 		return getProperty(keynull);
 	}
 
 	public static String getProperty(String keyString defaultValue) {
 		if (sm != null)
 		return internalGetProperties(null).getProperty(keydefaultValue);
 	}
 
 	public static String setProperty(String keyString value) {
 		if (sm != null)
 			sm.checkPermission(new PropertyPermission(key"write")); //$NON-NLS-1$
 		return (StringinternalGetProperties(null).put(keyvalue);
 	}
 
 	public static String clearProperty(String key) {
 		if (sm != null)
 			sm.checkPermission(new PropertyPermission(key"write")); //$NON-NLS-1$
 		return (StringinternalGetProperties(null).remove(key);
 	}
 
 	private static synchronized Properties internalGetProperties(String usingSystemProperties) {
 		if ( == null) {
 			Properties systemProperties = System.getProperties();
 			if (usingSystemProperties == null)
 				usingSystemProperties = systemProperties.getProperty();
 			if (usingSystemProperties == null || usingSystemProperties.equalsIgnoreCase(..toString())) {
 				 = systemProperties;
 			} else {
 				// use systemProperties for a snapshot
 				// also see requirements in Bundlecontext.getProperty(...))
 				 = new Properties();
 				// snapshot of System properties for uses of getProperties who expect to see framework properties set as System properties
 				// we need to do this for all system properties because the properties object is used to back
 				// BundleContext#getProperty method which expects all system properties to be available
 				.putAll(systemProperties);
 			}
 		}
 		return ;
 	}
 
 	public static synchronized void setProperties(Map input) {
 		if (input == null) {
 			// just use internal props;  note that this will reuse a previous set of properties if they were set
 			internalGetProperties("false"); //$NON-NLS-1$
 			return;
 		}
 		 = null;
 		Properties toSet = internalGetProperties("false"); //$NON-NLS-1$
 		for (Iterator keys = input.keySet().iterator(); keys.hasNext();) {
 			String key = (Stringkeys.next();
 			Object value = input.get(key);
 			if (value instanceof String) {
				toSet.setProperty(key, (Stringvalue);
				continue;
			}
			value = input.get(key);
			if (value != null)
				toSet.put(keyvalue);
			else
				toSet.remove(key);
		}
	}
	public static synchronized boolean inUse() {
		return  != null;
	}
	public static void initializeProperties() {
		// initialize some framework properties that must always be set
		if (getProperty() == null || getProperty() == null) {
			if (cs == null)
			URL url = cs.getLocation();
			// allow props to be preset
			if (getProperty() == null)
			if (getProperty() == null) {
				String filePart = url.getFile();
				setProperty(filePart.substring(0, filePart.lastIndexOf('/')));
			}
		}
		// always decode these properties
	}
	public static String decode(String urlString) {
		//try to use Java 1.4 method if available
		try {
			Class clazz = URLDecoder.class;
			Method method = clazz.getDeclaredMethod("decode"new Class[] {String.classString.class}); //$NON-NLS-1$
			//first encode '+' characters, because URLDecoder incorrectly converts 
			//them to spaces on certain class library implementations.
			if (urlString.indexOf('+') >= 0) {
				int len = urlString.length();
				StringBuffer buf = new StringBuffer(len);
				for (int i = 0; i < leni++) {
					char c = urlString.charAt(i);
					if (c == '+')
						buf.append("%2B"); //$NON-NLS-1$
					else
						buf.append(c);
				}
				urlString = buf.toString();
			}
			Object result = method.invoke(nullnew Object[] {urlString"UTF-8"}); //$NON-NLS-1$
			if (result != null)
				return (Stringresult;
catch (Exception e) {
			//JDK 1.4 method not found -- fall through and decode by hand
		}
		//decode URL by hand
		boolean replaced = false;
		byte[] encodedBytes = urlString.getBytes();
		int encodedLength = encodedBytes.length;
		byte[] decodedBytes = new byte[encodedLength];
		int decodedLength = 0;
		for (int i = 0; i < encodedLengthi++) {
			byte b = encodedBytes[i];
			if (b == '%') {
				byte enc1 = encodedBytes[++i];
				byte enc2 = encodedBytes[++i];
				b = (byte) ((hexToByte(enc1) << 4) + hexToByte(enc2));
				replaced = true;
			}
			decodedBytes[decodedLength++] = b;
		}
		if (!replaced)
			return urlString;
		try {
			return new String(decodedBytes, 0, decodedLength"UTF-8"); //$NON-NLS-1$
			//use default encoding
			return new String(decodedBytes, 0, decodedLength);
		}
	}
	private static int hexToByte(byte b) {
		switch (b) {
			case '0' :
				return 0;
			case '1' :
				return 1;
			case '2' :
				return 2;
			case '3' :
				return 3;
			case '4' :
				return 4;
			case '5' :
				return 5;
			case '6' :
				return 6;
			case '7' :
				return 7;
			case '8' :
				return 8;
			case '9' :
				return 9;
			case 'A' :
			case 'a' :
				return 10;
			case 'B' :
			case 'b' :
				return 11;
			case 'C' :
			case 'c' :
				return 12;
			case 'D' :
			case 'd' :
				return 13;
			case 'E' :
			case 'e' :
				return 14;
			case 'F' :
			case 'f' :
				return 15;
			default :
				throw new IllegalArgumentException("Switch error decoding URL"); //$NON-NLS-1$
		}
	}
New to GrepCode? Check out our FAQ X