blob: ec80d19d01341b8d90ab5ddbb8e4ed4184769b31 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License 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 License for the specific language governing permissions and
* limitations under the License.
*/
package java.lang;
import java.io.BufferedInputStream;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.IOException;
import java.security.SecurityPermission;
import java.util.Map;
import java.util.Properties;
import java.util.PropertyPermission;
import java.nio.channels.spi.SelectorProvider;
import java.nio.channels.Channel;
import org.apache.harmony.lang.RuntimePermissionCollection;
import org.apache.harmony.vm.VMStack;
import org.apache.harmony.luni.platform.Environment;
//import org.apache.harmony.drlvm.VMHelper;
//import org.apache.harmony.drlvm.gc_gen.GCHelper;
/**
* @com.intel.drl.spec_ref
*
* @author Roman S. Bushmanov
* @version $Revision: 1.1.2.2.4.3 $
*/
public final class System {
/**
* This class can not be instantiated.
*/
private System() {
}
static String getPropertyUnsecure(String key) {
return getPropertiesUnsecure().getProperty(key);
}
/**
* @com.intel.drl.spec_ref
*/
public static final PrintStream err = createErr();
/**
* @com.intel.drl.spec_ref
*/
public static final InputStream in = createIn();
/**
* @com.intel.drl.spec_ref
*/
public static final PrintStream out = createOut();
/**
* Current system security manager
*/
private static SecurityManager securityManager = null;
/**
* Current system properties
*/
private static Properties systemProperties = null;
/**
* @com.intel.drl.spec_ref
*/
public static void arraycopy(Object src, int srcPos, Object dest,
int destPos, int length) {
VMMemoryManager.arrayCopy(src, srcPos, dest, destPos, length);
}
/**
* @com.intel.drl.spec_ref
*/
public static long currentTimeMillis() {
return VMExecutionEngine.currentTimeMillis();
}
/**
* @com.intel.drl.spec_ref
*/
public static void exit(int status) {
Runtime.getRuntime().exit(status);
}
/**
* @com.intel.drl.spec_ref
*/
public static void gc() {
Runtime.getRuntime().gc();
}
/**
* @com.intel.drl.spec_ref
*/
public static String getenv(String name) {
if (name == null) {
throw new NullPointerException("name should not be null");
}
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(new RuntimePermission("getenv." + name));
}
return Environment.getenv(name);
}
/**
* @com.intel.drl.spec_ref
*/
public static Map<String, String> getenv() {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(RuntimePermissionCollection.GETENV_PERMISSION);
}
return Environment.getenv();
}
/**
* @com.intel.drl.spec_ref
*/
public static Properties getProperties() {
if (securityManager != null) {
securityManager.checkPropertiesAccess();
}
return getPropertiesUnsecure();
}
/**
* @com.intel.drl.spec_ref
*/
public static String getProperty(String key) {
return getProperty(key, null);
}
/**
* @com.intel.drl.spec_ref
*/
public static String getProperty(String key, String def) {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPropertyAccess(key);
} else if (key.length() == 0) {
throw new IllegalArgumentException("key is empty");
}
Properties props = getPropertiesUnsecure();
return props.getProperty(key, def);
}
/**
* @com.intel.drl.spec_ref
*/
public static String clearProperty(String key){
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(new PropertyPermission(key, "write"));
} else if (key.length() == 0) {
throw new IllegalArgumentException("key is empty");
}
Properties props = getPropertiesUnsecure();
return (String)props.remove(key);
}
/**
* @com.intel.drl.spec_ref
*/
public static SecurityManager getSecurityManager() {
return securityManager;
}
/**
* @com.intel.drl.spec_ref
*/
public static int identityHashCode(Object object) {
// if (VMHelper.isVMMagicPackageSupported()) {
// return GCHelper.get_hashcode(object);
// } else {
// return VMMemoryManager.getIdentityHashCode(object);
// }
return VMMemoryManager.getIdentityHashCode(object);
}
/**
* @com.intel.drl.spec_ref
*/
public static Channel inheritedChannel() throws IOException{
//XXX:does it mean the permission of the "access to the channel"?
//If YES then this checkPermission must be removed because it should be presented into java.nio.channels.spi.SelectorProvider.inheritedChannel()
//If NO then some other permission name (which one?) should be used here
//and the corresponding constant should be placed within org.apache.harmony.lang.RuntimePermission class:
if (securityManager != null) {
securityManager.checkPermission(new RuntimePermission("inheritedChannel")); //see java.nio.channels.spi.SelectorProvider.inheritedChannel() spec
}
return SelectorProvider.provider().inheritedChannel();
}
/**
* @com.intel.drl.spec_ref
*/
public static void load(String filename) {
Runtime.getRuntime().load0(
filename,
VMClassRegistry.getClassLoader(VMStack.getCallerClass(0)),
true);
}
public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(
libname,
VMClassRegistry.getClassLoader(VMStack.getCallerClass(0)),
true);
}
/**
* @com.intel.drl.spec_ref
*/
public static String mapLibraryName(String libname) {
if (libname == null) {
throw new NullPointerException("libname should not be empty");
}
return VMExecutionEngine.mapLibraryName(libname);
}
/**
* @com.intel.drl.spec_ref
*/
public static long nanoTime() {
return VMExecutionEngine.nanoTime();
}
/**
* @com.intel.drl.spec_ref
*/
public static void runFinalization() {
Runtime.getRuntime().runFinalization();
}
/**
* @com.intel.drl.spec_ref
* @deprecated
*/
public static void runFinalizersOnExit(boolean value) {
Runtime.runFinalizersOnExit(value);
}
/**
* @com.intel.drl.spec_ref
*/
public static void setErr(PrintStream err) {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(RuntimePermissionCollection.SET_IO_PERMISSION);
}
setErrUnsecure(err);
}
/**
* @com.intel.drl.spec_ref
*/
public static void setIn(InputStream in) {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(RuntimePermissionCollection.SET_IO_PERMISSION);
}
setInUnsecure(in);
}
/**
* @com.intel.drl.spec_ref
*/
public static void setOut(PrintStream out) {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(RuntimePermissionCollection.SET_IO_PERMISSION);
}
setOutUnsecure(out);
}
/**
* @com.intel.drl.spec_ref
*/
public static void setProperties(Properties props) {
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPropertiesAccess();
}
systemProperties = props;
}
/**
* @com.intel.drl.spec_ref
*/
public static String setProperty(String key, String value) {
if (key.length() == 0) {
throw new IllegalArgumentException("key is empty");
}
SecurityManager sm = securityManager;
if (sm != null) {
sm.checkPermission(new PropertyPermission(key, "write"));
}
Properties props = getPropertiesUnsecure();
return (String)props.setProperty(key, value);
}
/**
* @com.intel.drl.spec_ref
*/
public static synchronized void setSecurityManager(SecurityManager sm) {
if (securityManager != null) {
securityManager
.checkPermission(RuntimePermissionCollection.SET_SECURITY_MANAGER_PERMISSION);
}
if (sm != null) {
// before the new manager assumed office, make a pass through
// the common operations and let it load needed classes (if any),
// to avoid infinite recursion later on
try {
sm.checkPermission(new SecurityPermission("getProperty.package.access"));
} catch (Exception ignore) {}
try {
sm.checkPackageAccess("java.lang");
} catch (Exception ignore) {}
}
securityManager = sm;
}
/**
* Constructs a system <code>err</code> stream. This method is used only
* for initialization of <code>err</code> field
*/
private static PrintStream createErr() {
return new PrintStream(new BufferedOutputStream(new FileOutputStream(
FileDescriptor.err)), true);
}
/**
* Constructs a system <code>in</code> stream. This method is used only
* for initialization of <code>in</code> field
*/
private static InputStream createIn() {
return new BufferedInputStream(new FileInputStream(FileDescriptor.in));
}
/**
* Constructs a system <code>out</code> stream. This method is used only
* for initialization of <code>out</code> field
*/
private static PrintStream createOut() {
return new PrintStream(new BufferedOutputStream(new FileOutputStream(
FileDescriptor.out)), true);
}
/**
* Returns system properties without security checks. Initializes the system
* properties if it isn't done yet.
*/
private static Properties getPropertiesUnsecure() {
Properties sp = systemProperties;
if (sp == null) {
systemProperties = sp = VMExecutionEngine.getProperties();
}
return sp;
}
/**
* Initiaies the VM shutdown sequence.
*/
static void execShutdownSequence() {
Runtime.getRuntime().execShutdownSequence();
}
/**
* Sets the value of <code>err</code> field without any security checks
*/
private static native void setErrUnsecure(PrintStream err);
/**
* Sets the value of <code>in</code> field without any security checks
*/
private static native void setInUnsecure(InputStream in);
/**
* Sets the value of <code>out</code> field without any security checks
*/
private static native void setOutUnsecure(PrintStream out);
/**
* Helps to throw an arbitrary throwable without mentioning within
* <code>throw</code> clause and so bypass
* exception checking by a compiler.
*
* @see java.lang.Class#newInstance()
*/
native static void rethrow(Throwable tr);
}