This is the mail archive of the java-patches@sources.redhat.com mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

gij patches and more



I'm about to commit the following patch.  It adds basic support for
executable jar files, similar to Sun's `java' program.

gij now says:

$ gij
Usage: gij [OPTION] ... CLASS [ARGS] ...
          to interpret Java bytecodes, or
       gij -jar [OPTION] ... JARFILE [ARGS] ...
          to execute a jar file
Try `gij --help' for more information.

Given the -jar option, we extract the Main-Class attribute from the
jar file's manifest file and run that.

$ gij -jar Hello.jar
Hello World!

Tom - you may want to bless how I run java code to extract the info
from the manifest file before running the real main.  It's a little
odd.  See prims.cc and FirstThread.java.


Sun Aug 20 21:02:48 2000  Anthony Green  <green@redhat.com>

    * java/lang/natSystem.cc (init_properties): Change sourceware
    reference to sources.redhat.com.

    * include/java-props.h: Add _Jv_Jar_Class_Path.
    * prims.cc: Ditto.  Set it from	`gij -jar file' option.

    * java/lang/natSystem.cc (init_properties): Set java.class.path
    from
    {gij -jar file}:{CLASSPATH variable}:{-Djava.class.path= or .}

    * java/util/PropertyPermission.java: Import from GNU Classpath.
    * Makefile.in: Rebuilt.
    * Makefile.am: Add java/util/PropertyPermission.java.
    * java/lang/System.java: Add setProperty method.

    * gij.cc (main): Add -jar option to execute jar files.
    (help): Describe -jar option.
    * prims.cc (_Jv_RunMain): Add support for jar execution mode.
    * gnu/gcj/tools/Gij.java: New file.
    * include/jvm.h: Add is_jar argument to _Jv_RunMain.
    * gnu/gcj/runtime/FirstThread.java (main): New method.

    * java/util/jar/Attributes.java: Correct comment spelling.


Index: libjava/Makefile.am
===================================================================
RCS file: /cvs/java/libgcj/libjava/Makefile.am,v
retrieving revision 1.80
diff -u -p -u -r1.80 Makefile.am
--- Makefile.am	     2000/08/19 18:19:41	1.80
+++ Makefile.am	     2000/08/21 05:33:16
@@ -1057,6 +1057,7 @@ java/util/NoSuchElementException.java \
 java/util/Observable.java \
 java/util/Observer.java   \
 java/util/Properties.java \
+java/util/PropertyPermission.java \
 java/util/PropertyResourceBundle.java \
 java/util/Random.java \
 java/util/ResourceBundle.java \
Index: libjava/Makefile.in
===================================================================
RCS file: /cvs/java/libgcj/libjava/Makefile.in,v
retrieving revision 1.87
diff -u -p -u -r1.87 Makefile.in
--- Makefile.in	     2000/08/19 18:19:41	1.87
+++ Makefile.in	     2000/08/21 05:33:16
@@ -827,6 +827,7 @@ java/util/NoSuchElementException.java \
 java/util/Observable.java \
 java/util/Observer.java   \
 java/util/Properties.java \
+java/util/PropertyPermission.java \
 java/util/PropertyResourceBundle.java \
 java/util/Random.java \
 java/util/ResourceBundle.java \
@@ -1443,6 +1444,7 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_D
 .deps/java/util/MissingResourceException.P \
 .deps/java/util/NoSuchElementException.P .deps/java/util/Observable.P \
 .deps/java/util/Observer.P .deps/java/util/Properties.P \
+.deps/java/util/PropertyPermission.P \
 .deps/java/util/PropertyResourceBundle.P .deps/java/util/Random.P \
 .deps/java/util/ResourceBundle.P .deps/java/util/Set.P \
 .deps/java/util/SimpleTimeZone.P .deps/java/util/Stack.P \
Index: libjava/gij.cc
===================================================================
RCS file: /cvs/java/libgcj/libjava/gij.cc,v
retrieving revision 1.10
diff -u -p -u -r1.10 gij.cc
--- gij.cc 2000/08/20 17:49:11	1.10
+++ gij.cc 2000/08/21 05:33:16
@@ -24,8 +24,10 @@ details.  */
 static void
 help ()
 {
-  printf ("Usage: gij [OPTION] ... CLASS [ARGS] ...\n\n");
-  printf ("Interpret Java bytecodes\n\n");
+  printf ("Usage: gij [OPTION] ... CLASS [ARGS] ...\n");
+  printf ("          to interpret Java bytecodes, or\n");
+  printf ("       gij -jar [OPTION] ... JARFILE [ARGS] ...\n");
+  printf ("          to execute a jar file\n\n");
   printf ("  -DVAR=VAL         define property VAR with value VAL\n");
   printf ("  --help            print this help, then exit\n");
   printf ("  --ms=NUMBER       set initial heap size\n");
@@ -51,6 +53,7 @@ main (int argc, const char **argv)
   /* We rearrange ARGV so that all the -D options appear near the
      beginning.  */
   int last_D_option = 0;
+  bool jar_mode = false;
 
   int i;
   for (i = 1; i < argc; ++i)
@@ -73,6 +76,12 @@ main (int argc, const char **argv)
     continue;
     }
 
+      if (! strcmp (arg, "-jar"))
+      {
+        jar_mode = true;
+	   continue;
+	   }
+
       /* Allow both single or double hyphen for all remaining
        options.  */
       if (arg[1] == '-')
@@ -120,9 +129,12 @@ main (int argc, const char **argv)
   if (argc - i < 1)
     {
       fprintf (stderr, "Usage: gij [OPTION] ... CLASS [ARGS] ...\n");
+      fprintf (stderr, "          to interpret Java bytecodes, or\n");
+      fprintf (stderr, "       gij -jar [O+import java.security.PermissionCollection;
+import java.io.ObjectStreamField;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+
+/**
+ * This class represents the permission to access and modify a property.<br>
+ *
+ * The name is the name of the property, e.g. xxx.  You can also
+ * use an asterisk "*" as described in BasicPermission <br>
+ *
+ * The action string is a comma-separated list if keywords.  There are
+ * two possible actions:
+ * <dl>
+ * <dt>read</dt> 
+ * <dd>Allows to read the property via <code>System.getProperty</code>.</dd>
+ * <dt>write</dt> 
+ * <dd>Allows to write the property via <code>System.setProperty</code>.</dd>
+ * </dl>
+ * 
+ * The action string is case insensitive (it is converted to lower case).
+ *
+ * @see Permission
+ * @see BasicPermission
+ * @author Jochen Hoenicke 
+ */
+public final class PropertyPermission extends BasicPermission
+{
+  /**
+   * @serialField action String
+   *   The action string.
+   */
+  private static final ObjectStreamField[] serialPersistentFields =
+  {
+    new ObjectStreamField("action", String.class)
+  };
+
+  private static final long serialVersionUID = 885438825399942851L;
+
+  private static final int READ  = 1;
+  private static final int WRITE = 2;
+  private transient int actions;
+
+  private static String actionStrings[] = 
+  { 
+    "", "read", "write", "read,write" 
+  };
+
+  /**
+   * Constructs a PropertyPermission witha he specified property.  Possible
+   * actions are read and write.
+   * @param name the name of the property.
+   * @param actions the action string.
+   * @exception IllegalArgumentException if name string contains an
+   * illegal wildcard or actions string contains an illegal action
+   */
+  public PropertyPermission(String name, String actions)
+  {
+    super(name);
+    setActions(actions.toLowerCase());
+  }
+
+  /**
+   * Parse the action string and convert actions from external to internal
+   * form.  This will set the internal actions field.
+   * @param actions the action string.
+   * @exception IllegalArgumentException if actions string contains an
+   * illegal action */
+  private void setActions(String actions)
+  {
+    this.actions = 0;
+    StringTokenizer actionTokenizer = new StringTokenizer(actions, ",");
+    while (actionTokenizer.hasMoreElements())
+      {
+      String anAction = actionTokenizer.nextToken();
+      if ("read".equals(anAction))
+        this.actions |= READ;
+	 else if ("write".equals(anAction))
+	   this.actions |= WRITE;
+	   else
+	     throw new IllegalArgumentException("illegal action "+anAction);
+      }
+  }
+
+  /**
+   * Check if this permission implies p.  This returns true iff all of
+   * the following conditions are true:
+   * <ul>
+   * <li> p is a PropertyPermission </li>
+   * <li> this.getName() implies p.getName(),  
+   *  e.g. <code>java.*</code> implies <code>java.home</code> </li>
+   * <li> this.getActions is a subset of p.getActions </li>
+   * </ul>
+   */
+  public boolean implies(Permission p)
+  {
+    if (!(p instanceof PropertyPermission))
+      return false;
+    
+    // We have to check the actions.
+    PropertyPermission pp = (PropertyPermission) p;
+    if ((pp.actions & ~actions) != 0)
+      return false;
+
+    // BasicPermission checks for name.
+    if (!super.implies(p))
+      return false;
+
+    return true;
+  }
+
+  /**
+   * Returns the action string.  Note that this may differ from the string
+   * given at the constructor:  The actions are converted to lowercase and
+   * may be reordered.
+   */
+  public String getActions()
+  {
+    return actionStrings[actions];
+  }
+
+  /**
+   * Reads an object from the stream. This converts the external to the
+   * internal representation.
+   */
+  private void readObject(ObjectInputStream s) 
+    throws IOException, ClassNotFoundException
+  {
+    ObjectInputStream.GetField fields = s.readFields();
+    setActions((String) fields.get("actions", null));
+  }
+
+  /**
+   * Writes an object to the stream. This converts the internal to the
+   * external representation.
+   */
+  private void writeObject(ObjectOutputStream s) 
+    throws IOException
+  {
+    ObjectOutputStream.PutField fields = s.putFields();
+    fields.put("actions", getActions());
+    s.writeFields();
+  }
+
+  /**
+   * Returns a permission collection suitable to take
+   * PropertyPermission objects.
+   * @return a new empty PermissionCollection.  
+   */
+  public PermissionCollection newPermissionCollection() 
+  {
+    return new PermissionCollection() 
+      {
+      Hashtable permissions = new Hashtable();
+      int allActions = 0;
+      
+      public void add(Permission permission) 
+        {
+	     if (isReadOnly())
+	           throw new IllegalStateException("readonly");
+
+	    // also check that permission is of correct type.
+	        PropertyPermission pp = (PropertyPermission) permission;
+		    String name = pp.getName();
+		        if (name.equals("*"))
+			      allActions |= pp.actions;
+			          permissions.put(name, pp);
+				    }
+				    
+				    public boolean implies(Permission permission)
+				      {
+				          if (!(permission instanceof PropertyPermission))
+					        return false;
+
+	    PropertyPermission toImply = (PropertyPermission) permission;
+	        if ((toImply.actions & ~allActions) == 0)
+		      return true;
+
+	    String name = toImply.getName();
+	        if (name.equals("*"))
+		      return false;
+
+	    int prefixLength = name.length();
+	        if (name.endsWith("*"))
+		      prefixLength -= 2;
+
+	    while (true) {
+	          PropertyPermission forName = 
+				     (PropertyPermission) permissions.get(name);
+				           if (forName != null
+					        && (toImply.actions & ~forName.actions) == 0)
+						   return true;
+
+	      prefixLength = name.lastIndexOf('.', prefixLength);
+	            if (prefixLength < 0)
+		       return false;
+		             name = name.substring(0, prefixLength + 1) + '*';
+			         }
+				   }
+				   
+				   public Enumeration elements()
+				     {
+				         return permissions.elements();
+					   }
+      };
+  }
+}
Index: libjava/java/util/jar/Attributes.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/util/jar/Attributes.java,v
retrieving revision 1.1
diff -u -p -u -r1.1 Attributes.java
--- Attributes.java 2000/08/19 18:19:42	1.1
+++ Attributes.java 2000/08/21 05:33:16
@@ -460,7 +460,7 @@ public class Attributes implements Clone
     }
 
     /**
-     * Gives a Set of atrribute name and values pairs as MapEntries.
+     * Gives a Set of attribute name and values pairs as MapEntries.
      * @see java.util.Map.Entry
      * @see java.util.Map#entrySet()
      *


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]