/** * MicroEmulator * Copyright (C) 2006-2007 Bartek Teodorczyk <barteo@barteo.net> * Copyright (C) 2006-2007 Vlad Skarzhevskyy * * It is licensed under the following two licenses as alternatives: * 1. GNU Lesser General Public License (the "LGPL") version 2.1 or any newer version * 2. Apache License (the "AL") Version 2.0 * * You may not use this file except in compliance with at least one of * the above two licenses. * * You may obtain a copy of the LGPL at * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt * * You may obtain a copy of the AL at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the LGPL or the AL for the specific language governing permissions and * limitations. * * @version $Id: MIDletSystemProperties.java 2377 2010-05-06 10:41:07Z barteo@gmail.com $ */ package org.microemu.app.util; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedExceptionAction; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.Vector; import org.microemu.device.Device; import org.microemu.log.Logger; /** * @author vlads * * This class is called by MIDlet to access System Property. Call injection is * made by MIDlet ClassLoaded * */ public class MIDletSystemProperties { /** * This may be a configuration option. But not for applet and Web Start. */ public static boolean applyToJavaSystemProperties = true; /** * Permits null values. */ private static final Map props = new HashMap(); private static final Map permissions = new HashMap(); private static Map systemPropertiesPreserve; private static List systemPropertiesDevice; private static boolean wanrOnce = true; private static boolean initialized = false; /* The context to be used when starting MicroEmulator */ private static AccessControlContext acc; private static void initOnce() { // Can't use static initializer because of applyToJavaSystemProperties // in applet if (initialized) { return; } initialized = true; setProperty("microedition.configuration", "CLDC-1.1"); setProperty("microedition.profiles", "MIDP-2.0"); setProperty("microedition.platform", "MicroEmulator"); setProperty("microedition.encoding", getSystemProperty("file.encoding")); } /** * Allow Access to system properties from MIDlet */ public static void initContext() { acc = AccessController.getContext(); } /** * Gets the system property indicated by the specified key. The only * function called by MIDlet * * @param key * the name of the system property * @return */ public static String getProperty(String key) { initOnce(); if (props.containsKey(key)) { return (String) props.get(key); } String v = getDynamicProperty(key); if (v != null) { return v; } try { return getSystemProperty(key); } catch (SecurityException e) { return null; } } public static String getSystemProperty(String key) { try { if (acc != null) { return getSystemPropertySecure(key); } else { return System.getProperty(key); } } catch (SecurityException e) { return null; } } private static String getSystemPropertySecure(final String key) { try { return (String) AccessController.doPrivileged(new PrivilegedExceptionAction() { public Object run() { return System.getProperty(key); } }, acc); } catch (Throwable e) { return null; } } private static String getDynamicProperty(String key) { if (key.equals("microedition.locale")) { return Locale.getDefault().getLanguage(); } return null; } public static Set getPropertiesSet() { initOnce(); return props.entrySet(); } public static String setProperty(String key, String value) { initOnce(); if (applyToJavaSystemProperties) { try { if (value == null) { System.getProperties().remove(key); } else { System.setProperty(key, value); } } catch (SecurityException e) { if (wanrOnce) { wanrOnce = false; Logger.error("Cannot update Java System.Properties", e); Logger.debug("Continue ME2 operations with no updates to system Properties"); } } } return (String) props.put(key, value); } public static String clearProperty(String key) { if (applyToJavaSystemProperties) { try { System.getProperties().remove(key); } catch (SecurityException e) { if (wanrOnce) { wanrOnce = false; Logger.error("Cannot update Java System.Properties", e); } } } return (String) props.remove(key); } public static void setProperties(Map properties) { initOnce(); for (Iterator i = properties.entrySet().iterator(); i.hasNext();) { Map.Entry e = (Map.Entry) i.next(); setProperty((String) e.getKey(), (String) e.getValue()); } } public static int getPermission(String permission) { Integer value = (Integer) permissions.get(permission); if (value == null) { return -1; } else { return value.intValue(); } } public static void setPermission(String permission, int value) { permissions.put(permission, new Integer(value)); } public static void setDevice(Device newDevice) { initOnce(); // Restore System Properties from previous device activation. if (systemPropertiesDevice != null) { for (Iterator iter = systemPropertiesDevice.iterator(); iter.hasNext();) { clearProperty((String) iter.next()); } } if (systemPropertiesPreserve != null) { for (Iterator i = systemPropertiesPreserve.entrySet().iterator(); i.hasNext();) { Map.Entry e = (Map.Entry) i.next(); setProperty((String) e.getKey(), (String) e.getValue()); } } systemPropertiesDevice = new Vector(); systemPropertiesPreserve = new HashMap(); for (Iterator i = newDevice.getSystemProperties().entrySet().iterator(); i.hasNext();) { Map.Entry e = (Map.Entry) i.next(); String key = (String) e.getKey(); if (props.containsKey(key)) { systemPropertiesPreserve.put(key, props.get(key)); } else { systemPropertiesDevice.add(key); } setProperty(key, (String) e.getValue()); } } }