001: /*****************************************************************************
002: * *
003: * This file is part of the BeanShell Java Scripting distribution. *
004: * Documentation and updates may be found at http://www.beanshell.org/ *
005: * *
006: * Sun Public License Notice: *
007: * *
008: * The contents of this file are subject to the Sun Public License Version *
009: * 1.0 (the "License"); you may not use this file except in compliance with *
010: * the License. A copy of the License is available at http://www.sun.com *
011: * *
012: * The Original Code is BeanShell. The Initial Developer of the Original *
013: * Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright *
014: * (C) 2000. All Rights Reserved. *
015: * *
016: * GNU Public License Notice: *
017: * *
018: * Alternatively, the contents of this file may be used under the terms of *
019: * the GNU Lesser General Public License (the "LGPL"), in which case the *
020: * provisions of LGPL are applicable instead of those above. If you wish to *
021: * allow use of your version of this file only under the terms of the LGPL *
022: * and not to allow others to use your version of this file under the SPL, *
023: * indicate your decision by deleting the provisions above and replace *
024: * them with the notice and other provisions required by the LGPL. If you *
025: * do not delete the provisions above, a recipient may use your version of *
026: * this file under either the SPL or the LGPL. *
027: * *
028: * Patrick Niemeyer (pat@pat.net) *
029: * Author of Learning Java, O'Reilly & Associates *
030: * http://www.pat.net/~pat/ *
031: * *
032: *****************************************************************************/package bsh;
033:
034: import java.util.Hashtable;
035:
036: /**
037: The map of extended features supported by the runtime in which we live.
038: <p>
039:
040: This class should be independent of all other bsh classes!
041: <p>
042:
043: Note that tests for class existence here do *not* use the
044: BshClassManager, as it may require other optional class files to be
045: loaded.
046: */
047: public class Capabilities {
048: private static boolean accessibility = false;
049:
050: public static boolean haveSwing() {
051: // classExists caches info for us
052: return classExists("javax.swing.JButton");
053: }
054:
055: public static boolean canGenerateInterfaces() {
056: // classExists caches info for us
057: return classExists("java.lang.reflect.Proxy");
058: }
059:
060: /**
061: If accessibility is enabled
062: determine if the accessibility mechanism exists and if we have
063: the optional bsh package to use it.
064: Note that even if both are true it does not necessarily mean that we
065: have runtime permission to access the fields... Java security has
066: a say in it.
067: @see bsh.ReflectManager
068: */
069: public static boolean haveAccessibility() {
070: return accessibility;
071: }
072:
073: public static void setAccessibility(boolean b) throws Unavailable {
074: if (b == false) {
075: accessibility = false;
076: return;
077: }
078:
079: if (!classExists("java.lang.reflect.AccessibleObject")
080: || !classExists("bsh.reflect.ReflectManagerImpl"))
081: throw new Unavailable("Accessibility unavailable");
082:
083: // test basic access
084: try {
085: String.class.getDeclaredMethods();
086: } catch (SecurityException e) {
087: throw new Unavailable("Accessibility unavailable: " + e);
088: }
089:
090: accessibility = true;
091: }
092:
093: private static Hashtable classes = new Hashtable();
094:
095: /**
096: Use direct Class.forName() to test for the existence of a class.
097: We should not use BshClassManager here because:
098: a) the systems using these tests would probably not load the
099: classes through it anyway.
100: b) bshclassmanager is heavy and touches other class files.
101: this capabilities code must be light enough to be used by any
102: system **including the remote applet**.
103: */
104: public static boolean classExists(String name) {
105: Object c = classes.get(name);
106:
107: if (c == null) {
108: try {
109: /*
110: Note: do *not* change this to
111: BshClassManager plainClassForName() or equivalent.
112: This class must not touch any other bsh classes.
113: */
114: c = Class.forName(name);
115: } catch (ClassNotFoundException e) {
116: }
117:
118: if (c != null)
119: classes.put(c, "unused");
120: }
121:
122: return c != null;
123: }
124:
125: /**
126: An attempt was made to use an unavailable capability supported by
127: an optional package. The normal operation is to test before attempting
128: to use these packages... so this is runtime exception.
129: */
130: public static class Unavailable extends UtilEvalError {
131: public Unavailable(String s) {
132: super(s);
133: }
134: }
135: }
|