You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2008/08/15 16:05:29 UTC

svn commit: r686215 - in /harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool: control/PolicyTextParser.java model/GrantEntry.java model/Permission.java

Author: sjanuary
Date: Fri Aug 15 07:05:28 2008
New Revision: 686215

URL: http://svn.apache.org/viewvc?rev=686215&view=rev
Log:
Apply patch for HARMONY-5949 (Progress on Policytool)

Modified:
    harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/control/PolicyTextParser.java
    harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/GrantEntry.java
    harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/Permission.java

Modified: harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/control/PolicyTextParser.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/control/PolicyTextParser.java?rev=686215&r1=686214&r2=686215&view=diff
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/control/PolicyTextParser.java (original)
+++ harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/control/PolicyTextParser.java Fri Aug 15 07:05:28 2008
@@ -21,9 +21,12 @@
 import java.util.List;
 
 import org.apache.harmony.tools.policytool.model.CommentEntry;
+import org.apache.harmony.tools.policytool.model.GrantEntry;
 import org.apache.harmony.tools.policytool.model.KeystoreEntry;
 import org.apache.harmony.tools.policytool.model.KeystorePasswordURLEntry;
+import org.apache.harmony.tools.policytool.model.Permission;
 import org.apache.harmony.tools.policytool.model.PolicyEntry;
+import org.apache.harmony.tools.policytool.model.Principal;
 
 /**
  * Policy text parser.
@@ -34,128 +37,389 @@
     /** String containing the white spaces. */
     private static final String WHITE_SPACES  = " \t\n\r";
 
+    /** Policy text to be parsed.                                                     */
+    private final String              policyText;
+    /** Char array of the policy text.                                                */
+    private final char[]              policyTextChars;
+    /** The created equivalent list of policy entries.                                */
+    private final List< PolicyEntry > policyEntryList = new ArrayList< PolicyEntry >();
+
+    /** First and last indices of the current/first token determining the next entry. */
+    private int[] firstLastTokenIndices;
+    /** Position of the parsing.                                                      */
+    private int                       index           = 0;
+    /** New position of parsing after the current entry is processed.                 */
+    private int                       newIndex        = -1;
+
+    /**
+     * Creates a new PolicyTextParser.
+     * @param policyText policy text to be parsed
+     */
+    public PolicyTextParser( final String policyText ) {
+        this.policyText = policyText.replace( "\r", "" ); // I only want to handle a unified line terminator
+        policyTextChars = this.policyText.toCharArray();
+    }
+
     /**
-     * Parses a policy text and creates an equivalent list of policy entries from it.
+     * Parses a policy text and returns an equivalent list of policy entries from it.
      * @param policyText policy text to be parsed
      * @return an equivalent list of policy entries created from the policy text, equivalent to policy text
      * @throws InvalidPolicyTextException thrown if policyText is invalid
      */
-    public static List< PolicyEntry > parsePolicyText( String policyText ) throws InvalidPolicyTextException {
-        policyText = policyText.replace( "\r", "" ); // I only want to handle a unified line terminator
-
-        final List< PolicyEntry > policyEntryList = new ArrayList< PolicyEntry >();
-
-        final char[] policyTextChars = policyText.toCharArray();
+    public static List< PolicyEntry > parsePolicyText( final String policyText ) throws InvalidPolicyTextException {
+        return new PolicyTextParser( policyText ).parsePolicyText();
+    }
 
-        int index = 0;
-        int[] firstLastTokenIndices;
-        while ( ( firstLastTokenIndices = peekTokenAhead( policyTextChars, index ) ) != null ) {
+    /**
+     * Parses the policy text and creates an equivalent list of policy entries from it.
+     * @return an equivalent list of policy entries created from the policy text, equivalent to policy text
+     * @throws InvalidPolicyTextException thrown if policyText is invalid
+     */
+    public List< PolicyEntry > parsePolicyText() throws InvalidPolicyTextException {
+        while ( ( firstLastTokenIndices = peekTokenAheadCommentsIncluded( index ) ) != null ) {
 
             final String nextToken        = policyText.substring( firstLastTokenIndices[ 0 ], firstLastTokenIndices[ 1 ] );
             final String loweredNextToken = nextToken.toLowerCase();
 
-            int newIndex = -1;
-
             // Line comment
-            if ( nextToken.startsWith( "//" ) ) {
-                newIndex = policyText.indexOf( '\n', firstLastTokenIndices[ 1 ] );
-                if ( newIndex < 0 ) // This is the last line
-                    newIndex = policyTextChars.length;
-                policyEntryList.add( new CommentEntry( policyText.substring( index, newIndex ) ) );
-            }
+            if ( nextToken.startsWith( "//" ) )
+                parseLineComment();
 
             // Block comment
-            else if ( nextToken.startsWith( "/*" ) ) {
-                newIndex = policyText.indexOf( "*/", firstLastTokenIndices[ 1 ] );
-                if ( newIndex < 0 ) // No closing bracket
-                    throw new InvalidPolicyTextException( "No closing bracket for block comment!" );
-                newIndex += 2;  // length of "*/"
-                policyEntryList.add( new CommentEntry( policyText.substring( index, newIndex ) ) );
-            }
+            else if ( nextToken.startsWith( "/*" ) )
+                parseBlockComment();
 
             // Keystore entry
-            else if ( loweredNextToken.equals( KeystoreEntry.LOWERED_KEYWORD ) ) {
-                final int[] firstLastKeystoreURLIndices = peekQuotedStringAhead( policyTextChars, firstLastTokenIndices[ 1 ] );
-                if ( firstLastKeystoreURLIndices == null )
-                    throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore URL!" );
+            else if ( loweredNextToken.equals( KeystoreEntry.LOWERED_KEYWORD ) )
+                parseKeystoreEntry();
+
+            // Keystore password URL entry
+            else if ( loweredNextToken.equals( KeystorePasswordURLEntry.LOWERED_KEYWORD ) )
+                parseKeystorePasswordURLEntry();
+
+            // Grant entry
+            else if ( loweredNextToken.equals( GrantEntry.LOWERED_KEYWORD ) )
+                parseGrantEntry();
+
+            // Couldn't recognize any entry!
+            else
+                throw new InvalidPolicyTextException( "Unknown entry: " + nextToken );
+
+            if ( newIndex >= 0 && newIndex < policyTextChars.length && policyTextChars[ newIndex ] == '\n' )
+                newIndex++;
+
+            index = newIndex;
+        }
+
+        return policyEntryList;
+    }
+
+    /**
+     * Parses a line comment.
+     */
+    private void parseLineComment() {
+        newIndex = policyText.indexOf( '\n', firstLastTokenIndices[ 0 ] + 2 );
+        if ( newIndex < 0 ) // This is the last line
+            newIndex = policyTextChars.length;
+        policyEntryList.add( new CommentEntry( policyText.substring( index, newIndex ) ) );
+    }
 
-                int[] keystoreTypeIndices     = null;
-                int[] keystoreProviderIndices = null;
+    /**
+     * Parses a block comment.
+     * @throws InvalidPolicyTextException thrown if closing bracket is missing for block comment
+     */
+    private void parseBlockComment() throws InvalidPolicyTextException {
+        newIndex = policyText.indexOf( "*/", firstLastTokenIndices[ 0 ] + 2 );
+        if ( newIndex < 0 ) // No closing bracket
+            throw new InvalidPolicyTextException( "No closing bracket for block comment!" );
+        newIndex += 2;  // length of "*/"
+        policyEntryList.add( new CommentEntry( policyText.substring( index, newIndex ) ) );
+    }
+
+    /**
+     * Parses a keystore entry.<br>
+     * The keystoer entry syntax:
+     * <pre>
+     * keystore "some_keystore_url", "keystore_type", "keystore_provider";
+     * </pre>
+     * @throws InvalidPolicyTextException thrown if invalid keystore entry syntax is detected
+     */
+    private void parseKeystoreEntry() throws InvalidPolicyTextException {
+        final int[] keystoreURLIndices = peekQuotedStringAhead( firstLastTokenIndices[ 1 ] );
+        if ( keystoreURLIndices == null )
+            throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore URL!" );
+
+        int[] keystoreTypeIndices     = null;
+        int[] keystoreProviderIndices = null;
+
+        char nextChar = peekNextNonWhiteSpaceChar( keystoreURLIndices[ 1 ] );
+        if ( nextChar != PolicyEntry.TERMINATOR_CHAR ) {
+            if ( nextChar != ',' )
+                throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
+            keystoreTypeIndices = peekQuotedStringAhead( skipWhiteSpaces( keystoreURLIndices[ 1 ] ) + 1 );
+            if ( keystoreTypeIndices == null )
+                throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore type!" );
+
+            nextChar = peekNextNonWhiteSpaceChar( keystoreTypeIndices[ 1 ] );
+            if ( nextChar != PolicyEntry.TERMINATOR_CHAR ) {
+                if ( nextChar != ',' )
+                    throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
+                keystoreProviderIndices = peekQuotedStringAhead( skipWhiteSpaces( keystoreTypeIndices[ 1 ] ) + 1 );
+                if ( keystoreProviderIndices == null )
+                    throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore provider!" );
+
+                if ( peekNextNonWhiteSpaceChar( keystoreProviderIndices[ 1 ] ) != PolicyEntry.TERMINATOR_CHAR )
+                    throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
+                else
+                    newIndex = skipWhiteSpaces( keystoreProviderIndices[ 1 ] ) + 1;
+            }
+            else
+                newIndex = skipWhiteSpaces( keystoreTypeIndices[ 1 ] ) + 1;
+        }
+        else
+            newIndex = skipWhiteSpaces( keystoreURLIndices[ 1 ] ) + 1;
+
+        final KeystoreEntry keystoreEntry = new KeystoreEntry();
+        keystoreEntry.setUrl( policyText.substring( keystoreURLIndices[ 0 ] + 1, keystoreURLIndices[ 1 ] - 1 ) );
+        if ( keystoreTypeIndices != null )
+            keystoreEntry.setType( policyText.substring( keystoreTypeIndices[ 0 ] + 1, keystoreTypeIndices[ 1 ] - 1 ) );
+        if ( keystoreProviderIndices != null )
+            keystoreEntry.setProvider( policyText.substring( keystoreProviderIndices[ 0 ] + 1, keystoreProviderIndices[ 1 ] - 1 ) );
+        policyEntryList.add( keystoreEntry );
+    }
+
+    /**
+     * Parses a keystore password URL entry.<br>
+     * The keystore password URL syntax:
+     * <pre>
+     * keystorePasswordURL "some_password_url";
+     * </pre>
+     * @throws InvalidPolicyTextException thrown if invalid keystore password URL entry syntax is detected
+     */
+    private void parseKeystorePasswordURLEntry() throws InvalidPolicyTextException {
+        final int[] keystorePasswordURLIndices = peekQuotedStringAhead( firstLastTokenIndices[ 1 ] );
+        if ( keystorePasswordURLIndices == null )
+            throw new InvalidPolicyTextException( "Incomplete keystore password URL entry, found no quoted string for keystore password URL!" );
+
+        final char nextChar = peekNextNonWhiteSpaceChar( keystorePasswordURLIndices[ 1 ] );
+        if ( nextChar != PolicyEntry.TERMINATOR_CHAR )
+            throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
+        else
+            newIndex = skipWhiteSpaces( keystorePasswordURLIndices[ 1 ] ) + 1;
+
+        final KeystorePasswordURLEntry keystorePasswordURLEntry = new KeystorePasswordURLEntry();
+        keystorePasswordURLEntry.setUrl( policyText.substring( keystorePasswordURLIndices[ 0 ] + 1, keystorePasswordURLIndices[ 1 ] - 1 ) );
+        policyEntryList.add( keystorePasswordURLEntry );
+    }
+
+    /**
+     * Parses a grant entry.<br>
+     * The grant entry syntax:
+     * <pre>
+     * grant signedBy "signer_names", codeBase "URL",
+     *       principal principal_class_name "principal_name",
+     *       principal principal_class_name "principal_name",
+     *       ... {
+     *
+     *     permission permission_class_name "target_name", "action", 
+     *         signedBy "signer_names";
+     *     permission permission_class_name "target_name", "action", 
+     *         signedBy "signer_names";
+     *     ...
+     * };
+     * </pre>
+     * @throws InvalidPolicyTextException thrown if invalid grant entry syntax is detected
+     */
+    private void parseGrantEntry() throws InvalidPolicyTextException {
+        final GrantEntry grantEntry = new GrantEntry();
+
+        newIndex = firstLastTokenIndices[ 1 ];
+
+        boolean firstIteration = true;
+        char    nextChar;
+        // First we parse the grant parameters such as signedBy, codeBase and the principals.
+        while ( ( nextChar = peekNextNonWhiteSpaceChar( newIndex ) ) != '{' ) {
+
+            if ( firstIteration )
+                firstIteration = false;
+            else
+                if ( nextChar != ',' )
+                    throw new InvalidPolicyTextException( "Was expecting comma but found something else!" );
+                else
+                    newIndex = skipWhiteSpaces( newIndex ) + 1;
+
+            final int[] paramNameIndices = peekTokenAhead( newIndex );
+            if ( paramNameIndices == null )
+                throw new InvalidPolicyTextException( "Incomplete grant entry!" );
+            final String loweredParamName = policyText.substring( paramNameIndices[ 0 ], paramNameIndices[ 1 ] ).toLowerCase();
+
+            if ( loweredParamName.equals( "signedby" ) ) {
+                final int[] paramValueIndices = peekQuotedStringAhead( paramNameIndices[ 1 ] );
+                if ( paramValueIndices == null )
+                    throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for signedBy!" );
+                if ( grantEntry.getSignedBy() != null )
+                    throw new InvalidPolicyTextException( "Invalid keystore entry, only 1 signedBy allowed!" );
+                if ( grantEntry.getCodeBase() != null || !grantEntry.getPrincipalList().isEmpty() )
+                    throw new InvalidPolicyTextException( "Invalid keystore entry, signedBy cannot be after codeBase or principals!" );
+                grantEntry.setSignedBy( policyText.substring( paramValueIndices[ 0 ] + 1, paramValueIndices[ 1 ] - 1 ) );
+                newIndex = paramValueIndices[ 1 ];
+            }
+            else if ( loweredParamName.equals( "codebase" ) ) {
+                final int[] firstLastParamValueIndices = peekQuotedStringAhead( paramNameIndices[ 1 ] );
+                if ( firstLastParamValueIndices == null )
+                    throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for codeBase!" );
+                if ( grantEntry.getCodeBase() != null )
+                    throw new InvalidPolicyTextException( "Invalid keystore entry, only 1 codeBase allowed!" );
+                if ( !grantEntry.getPrincipalList().isEmpty() )
+                    throw new InvalidPolicyTextException( "Invalid keystore entry, signedBy cannot be after principals!" );
+                grantEntry.setCodeBase( policyText.substring( firstLastParamValueIndices[ 0 ] + 1, firstLastParamValueIndices[ 1 ] - 1 ) );
+                newIndex = firstLastParamValueIndices[ 1 ];
+            }
+            else if ( loweredParamName.equals( "principal" ) ) {
+                final int[] classNameIndices = peekTokenAhead( paramNameIndices[ 1 ] );
+                if ( classNameIndices == null || policyTextChars[ classNameIndices[ 0 ] ] == '{' )
+                    throw new InvalidPolicyTextException( "Invalid grant entry, found no class name for principal!" );
+
+                final int[] principalNameIndices = peekQuotedStringAhead( classNameIndices[ 1 ] );
+                if ( principalNameIndices == null )
+                    throw new InvalidPolicyTextException( "Invalid grant entry, found no name for principal!" );
+
+                final Principal principal = new Principal();
+                principal.setType( policyText.substring( classNameIndices[ 0 ], classNameIndices[ 1 ] ) );
+                principal.setName( policyText.substring( principalNameIndices[ 0 ] + 1, principalNameIndices[ 1 ] - 1 ) );
+                grantEntry.getPrincipalList().add( principal );
 
-                char nextChar = peekNextNonWhiteSpaceChar( policyTextChars, firstLastKeystoreURLIndices[ 1 ] );
+                newIndex = principalNameIndices[ 1 ];
+            }
+        }
+
+        newIndex = policyText.indexOf( '{', newIndex ) + 1;
+
+        // Now permissions what we have left
+        while ( ( nextChar = peekNextNonWhiteSpaceChar( newIndex ) ) != '}' ) {
+
+            final int[] keywordIndices = peekTokenAhead( newIndex );
+            if ( keywordIndices == null )
+                throw new InvalidPolicyTextException( "Incomplete grant entry!" );
+            final String loweredKeyword = policyText.substring( keywordIndices[ 0 ], keywordIndices[ 1 ] ).toLowerCase();
+
+            if ( !loweredKeyword.equals( "permission" ) )
+                throw new InvalidPolicyTextException( "Incomplete grant entry, was expecting permission but found something else!" );
+
+            final int[] classNameIndices = peekTokenAhead( keywordIndices[ 1 ] );
+            if ( classNameIndices == null || policyTextChars[ classNameIndices[ 0 ] ] == '}' )
+                throw new InvalidPolicyTextException( "Invalid grant entry, found no class name for permission!" );
+            if ( classNameIndices[ 1 ] - classNameIndices[ 0 ] == 0 ) {
+                if ( policyTextChars[ classNameIndices[ 0 ] ] == ',' || policyTextChars[ classNameIndices[ 0 ] ] == PolicyEntry.TERMINATOR_CHAR ) // Class name is only a comma or a semicolon
+                    throw new InvalidPolicyTextException( "Invalid grant entry, found no class name for permission!" );
+            }
+            else {
+                if ( policyTextChars[ classNameIndices[ 1 ] - 1 ] == ',' || policyTextChars[ classNameIndices[ 1 ] - 1  ] == PolicyEntry.TERMINATOR_CHAR ) 
+                    classNameIndices[ 1 ]--; // Class name is more than 1 character long and comma or semicolon is at its end; we step back from it
+            }
+
+            int[] targetNameIndices = null;
+            int[] actionsIndices    = null;
+            int[] signedByIndices   = null;
+
+            nextChar = peekNextNonWhiteSpaceChar( classNameIndices[ 1 ] );
+            if ( nextChar != PolicyEntry.TERMINATOR_CHAR ) {
+                if ( nextChar != ',' ) {
+                    // There must be a target name here!
+                    targetNameIndices = peekQuotedStringAhead( classNameIndices[ 1 ] );
+                    if ( targetNameIndices == null )
+                        throw new InvalidPolicyTextException( "Invalid grant entry, found no name for permission!" );
+                }
+
+                newIndex = targetNameIndices == null ? classNameIndices[ 1 ] : targetNameIndices[ 1 ];
+                nextChar = peekNextNonWhiteSpaceChar( newIndex );
                 if ( nextChar != PolicyEntry.TERMINATOR_CHAR ) {
                     if ( nextChar != ',' )
                         throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
-                    keystoreTypeIndices = peekQuotedStringAhead( policyTextChars, policyText.indexOf( ',', firstLastKeystoreURLIndices[ 1 ] ) + 1 );
-                    if ( keystoreTypeIndices == null )
-                        throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore type!" );
 
-                    nextChar = peekNextNonWhiteSpaceChar( policyTextChars, keystoreTypeIndices[ 1 ] );
+                    newIndex = skipWhiteSpaces( newIndex );
+                    nextChar = peekNextNonWhiteSpaceChar( newIndex + 1 );
+                    if ( nextChar == '"' ) { // actions are specified
+                        actionsIndices = peekQuotedStringAhead( newIndex + 1 );
+                        if ( actionsIndices == null )
+                            throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for permission actions!" );
+                        newIndex = actionsIndices[ 1 ];
+                    }
+
+                    nextChar = peekNextNonWhiteSpaceChar( newIndex );
                     if ( nextChar != PolicyEntry.TERMINATOR_CHAR ) {
                         if ( nextChar != ',' )
                             throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
-                        keystoreProviderIndices = peekQuotedStringAhead( policyTextChars, policyText.indexOf( ',', keystoreTypeIndices[ 1 ] ) + 1 );
-                        if ( keystoreProviderIndices == null )
-                            throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for keystore provider!" );
+                        final int[] signedByKeywordIndices = peekTokenAhead( skipWhiteSpaces( newIndex ) + 1 );
+                        final String loweredSignedByKeyword = policyText.substring( signedByKeywordIndices[ 0 ], signedByKeywordIndices[ 1 ] ).toLowerCase();
 
-                        if ( peekNextNonWhiteSpaceChar( policyTextChars, keystoreProviderIndices[ 1 ] ) != PolicyEntry.TERMINATOR_CHAR )
+                        if ( !loweredSignedByKeyword.equals( "signedby" ) )
+                            throw new InvalidPolicyTextException( "Incomplete grant entry, was expecting signedBy but found something else!" );
+
+                        signedByIndices = peekQuotedStringAhead( signedByKeywordIndices[ 1 ] );
+                        if ( signedByIndices == null )
+                            throw new InvalidPolicyTextException( "Incomplete keystore entry, found no quoted string for permission signedBy!" );
+
+                        if ( peekNextNonWhiteSpaceChar( signedByIndices[ 1 ] ) != PolicyEntry.TERMINATOR_CHAR )
                             throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
                         else
-                            newIndex = policyText.indexOf( PolicyEntry.TERMINATOR_CHAR, keystoreProviderIndices[ 1 ] ) + 1;
+                            newIndex = skipWhiteSpaces( newIndex ) + 1;
                     }
                     else
-                        newIndex = policyText.indexOf( PolicyEntry.TERMINATOR_CHAR, keystoreTypeIndices[ 1 ] ) + 1;
+                        newIndex = skipWhiteSpaces( newIndex ) + 1;
                 }
                 else
-                    newIndex = policyText.indexOf( PolicyEntry.TERMINATOR_CHAR, firstLastKeystoreURLIndices[ 1 ] ) + 1;
-
-                final KeystoreEntry keystoreEntry = new KeystoreEntry();
-                keystoreEntry.setUrl( policyText.substring( firstLastKeystoreURLIndices[ 0 ] + 1, firstLastKeystoreURLIndices[ 1 ] - 1 ) );
-                if ( keystoreTypeIndices != null )
-                    keystoreEntry.setType( policyText.substring( keystoreTypeIndices[ 0 ] + 1, keystoreTypeIndices[ 1 ] - 1 ) );
-                if ( keystoreProviderIndices != null )
-                    keystoreEntry.setProvider( policyText.substring( keystoreProviderIndices[ 0 ] + 1, keystoreProviderIndices[ 1 ] - 1 ) );
-                policyEntryList.add( keystoreEntry );
+                    newIndex = skipWhiteSpaces( newIndex ) + 1;
             }
+            else
+                newIndex = skipWhiteSpaces( classNameIndices[ 1 ] ) + 1;
 
-            // Keystore password URL entry
-            else if ( loweredNextToken.equals( KeystorePasswordURLEntry.LOWERED_KEYWORD ) ) {
-                final int[] firstLastKeystorePasswordURLIndices = peekQuotedStringAhead( policyTextChars, firstLastTokenIndices[ 1 ] );
-                if ( firstLastKeystorePasswordURLIndices == null )
-                    throw new InvalidPolicyTextException( "Incomplete keystore password URL entry, found no quoted string for keystore password URL!" );
-
-                final char nextChar = peekNextNonWhiteSpaceChar( policyTextChars, firstLastKeystorePasswordURLIndices[ 1 ] );
-                if ( nextChar != PolicyEntry.TERMINATOR_CHAR )
-                    throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
-                else
-                    newIndex = policyText.indexOf( PolicyEntry.TERMINATOR_CHAR, firstLastKeystorePasswordURLIndices[ 1 ] ) + 1;
-
-                final KeystorePasswordURLEntry keystorePasswordURLEntry = new KeystorePasswordURLEntry();
-                keystorePasswordURLEntry.setUrl( policyText.substring( firstLastKeystorePasswordURLIndices[ 0 ] + 1, firstLastKeystorePasswordURLIndices[ 1 ] - 1 ) );
-                policyEntryList.add( keystorePasswordURLEntry );
-            }
-
-            if ( newIndex >= 0 && newIndex < policyTextChars.length && policyTextChars[ newIndex ] == '\n' )
-                newIndex++;
-
-            index = newIndex;
+            final Permission permission = new Permission();
+            permission.setClassName( policyText.substring( classNameIndices[ 0 ], classNameIndices[ 1 ] ) );
+            if ( targetNameIndices != null )
+                permission.setTargetName( policyText.substring( targetNameIndices[ 0 ] + 1, targetNameIndices[ 1 ] - 1 ) );
+            if ( actionsIndices != null )
+                permission.setActions( policyText.substring( actionsIndices[ 0 ] + 1, actionsIndices[ 1 ] - 1 ) );
+            if ( signedByIndices != null )
+                permission.setSignedBy( policyText.substring( signedByIndices[ 0 ] + 1, signedByIndices[ 1 ] - 1 ) );
+            grantEntry.getPermissionList().add( permission );
         }
 
-        return policyEntryList;
+        newIndex = skipWhiteSpaces( newIndex ) + 1; // index of '}' + 1 (comments skipped)
+        if ( peekNextNonWhiteSpaceChar( newIndex ) != PolicyEntry.TERMINATOR_CHAR )
+            throw new InvalidPolicyTextException( "Was expecting semicolon but found something else!" );
+        newIndex = skipWhiteSpaces( newIndex )  + 1;
+
+        policyEntryList.add( grantEntry );
     }
 
     /**
-     * Skips the following whtie spaces starting from the specified index,
+     * Skips the following white spaces starting from the specified index,
      * and returns the next non-white space index or -1 if end of string reached.
+     * Comments are skipped over if found.
      *
-     * @param stringChars char array of the string to use
      * @param index index to start from
      * @return the next non-white space index or -1 if end of string reached
      */
-    private static int skipWhiteSpaces( final char[] stringChars, int index ) {
+    private int skipWhiteSpaces( int index ) {
         try {
-            while ( WHITE_SPACES.indexOf( stringChars[ index ] ) >= 0 )
-                index++;
+            boolean foundComment;
+            do {
+                foundComment = false;
+                while ( WHITE_SPACES.indexOf( policyTextChars[ index ] ) >= 0 )
+                    index++;
+
+                if ( policyTextChars[ index ] == '/' && index < policyTextChars.length - 1 ) { 
+                    if ( policyTextChars[ index + 1 ] == '/' ) {
+                        foundComment = true;
+                        index = policyText.indexOf( '\n', index + 2 ) + 1;
+                    }
+                    else if ( policyTextChars[ index + 1 ] == '*' ) {
+                        foundComment = true;
+                        index = policyText.indexOf( "*/", index + 2 ) + 2;
+                    }
+                }
+            } while ( foundComment ); // If foundComment, we have to recheck, because another comment might follow the the one we just found
 
             return index;
         } catch ( final ArrayIndexOutOfBoundsException aioobe ) {
@@ -165,33 +429,33 @@
 
     /**
      * Returns the first non-whitespace character starting from a given index or -1 if all the remaining characters are white spaces.
-     * @param stringChars char array of the string to use
+     * Comments are skipped over if found.
      * @param index index to start from
      * @return the first non-whitespace character starting from a given index or -1 if all the remaining characters are white spaces
      */
-    private static char peekNextNonWhiteSpaceChar( final char[] stringChars, int index ) {
-        index = skipWhiteSpaces( stringChars, index );
+    private char peekNextNonWhiteSpaceChar( int index ) {
+        index = skipWhiteSpaces( index );
         if ( index < 0 )
             return (char) -1;
         else
-            return stringChars[ index ];
+            return policyTextChars[ index ];
     }
 
     /**
      * Returns the first (inclusive) and last index (exclusive) of the next token or null if no more tokens.
-     * @param stringChars char array of the string to use
+     * Comments are skipped over if found.
      * @param index index to start from
      * @return the first (inclusive) and last index (exclusive) of the next token or null if no more tokens
      */
-    private static int[] peekTokenAhead ( final char[] stringChars, int index ) {
-        index = skipWhiteSpaces( stringChars, index );
+    private int[] peekTokenAhead ( int index ) {
+        index = skipWhiteSpaces( index );
         if ( index < 0 )
             return null;
 
         final int firstIndex = index;
 
-        while ( index++ < stringChars.length )
-            if ( index == stringChars.length || WHITE_SPACES.indexOf( stringChars[ index ] ) >= 0  )
+        while ( index++ < policyTextChars.length )
+            if ( index == policyTextChars.length || WHITE_SPACES.indexOf( policyTextChars[ index ] ) >= 0  )
                 break;
 
         return new int[] { firstIndex, index };
@@ -200,28 +464,28 @@
     /**
      * Returns the first (inclusive) and last index (exclusive) of the next quoted string or null if found something else.<br>
      * The string denoted by the returned indices includes the quotes in the beginning and in the end of the quoted string.
+     * Comments are skipped over if found.
      *
-     * @param stringChars char array of the string to use
      * @param index index to start from
      * @return the first (inclusive) and last index (exclusive) of the next quoted string or null if found something else
      * @throws InvalidPolicyTextException thrown if no quoted string found
      */
-    private static int[] peekQuotedStringAhead ( final char[] stringChars, int index ) throws InvalidPolicyTextException {
+    private int[] peekQuotedStringAhead ( int index ) throws InvalidPolicyTextException {
         try {
-            index = skipWhiteSpaces( stringChars, index );
+            index = skipWhiteSpaces( index );
             if ( index < 0 )
                 return null;
 
-            if ( stringChars[ index ] != '"' )
+            if ( policyTextChars[ index ] != '"' )
                 throw new InvalidPolicyTextException( "Could not find expected quoted string (missing opener quotation mark)!" );
 
             final int firstIndex = index;
 
-            while ( ++index <= stringChars.length ) {
-                if ( index == stringChars.length )
+            while ( ++index <= policyTextChars.length ) {
+                if ( index == policyTextChars.length )
                     throw new InvalidPolicyTextException( "Could not find expected quoted string (missing closer quotation mark)!" );
 
-                if ( stringChars[ index ] == '"' )
+                if ( policyTextChars[ index ] == '"' )
                     break;
             }
 
@@ -232,4 +496,43 @@
         }
     }
 
+    /**
+     * Skips the following white spaces starting from the specified index,
+     * and returns the next non-white space index or -1 if end of string reached.
+     * Comments are not skipped over.
+     *
+     * @param index index to start from
+     * @return the next non-white space index or -1 if end of string reached
+     */
+    private int skipWhiteSpacesCommentsIncluded( int index ) {
+        try {
+            while ( WHITE_SPACES.indexOf( policyTextChars[ index ] ) >= 0 )
+                index++;
+
+            return index;
+        } catch ( final ArrayIndexOutOfBoundsException aioobe ) {
+            return -1;
+        }
+    }
+
+    /**
+     * Returns the first (inclusive) and last index (exclusive) of the next token or null if no more tokens.
+     * Comments are not skipped over.
+     * @param index index to start from
+     * @return the first (inclusive) and last index (exclusive) of the next token or null if no more tokens
+     */
+    private int[] peekTokenAheadCommentsIncluded( int index ) {
+        index = skipWhiteSpacesCommentsIncluded( index );
+        if ( index < 0 )
+            return null;
+
+        final int firstIndex = index;
+
+        while ( index++ < policyTextChars.length )
+            if ( index == policyTextChars.length || WHITE_SPACES.indexOf( policyTextChars[ index ] ) >= 0  )
+                break;
+
+        return new int[] { firstIndex, index };
+    }
+
 }

Modified: harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/GrantEntry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/GrantEntry.java?rev=686215&r1=686214&r2=686215&view=diff
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/GrantEntry.java (original)
+++ harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/GrantEntry.java Fri Aug 15 07:05:28 2008
@@ -151,9 +151,13 @@
     public String toString() {
         final StringBuilder stringBuilder = new StringBuilder();
 
-        if ( codeBase != null )
-            stringBuilder.append( "CodeBase \"" ).append( codeBase ).append( '"');
-        if ( signedBy != null )
+        stringBuilder.append( " CodeBase " );
+        if ( codeBase != null && codeBase.length() > 0 )
+            stringBuilder.append( '"' ).append( codeBase ).append( '"' );
+        else
+            stringBuilder.append( "<ALL>" );
+
+        if ( signedBy != null && signedBy.length() > 0 )
             stringBuilder.append( stringBuilder.length() > 0 ? ", " : "" ).append( "SignedBy \"" ).append( signedBy ).append( '"' );
 
         for ( final Principal principal : principalList )

Modified: harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/Permission.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/Permission.java?rev=686215&r1=686214&r2=686215&view=diff
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/Permission.java (original)
+++ harmony/enhanced/jdktools/trunk/modules/tools/src/main/java/org/apache/harmony/tools/policytool/model/Permission.java Fri Aug 15 07:05:28 2008
@@ -109,7 +109,7 @@
         final StringBuilder stringBuilder = new StringBuilder( className );
 
         if ( targetName != null && targetName.length() > 0 )
-            stringBuilder.append( " \"" ).append( targetName ).append( '"' );;
+            stringBuilder.append( " \"" ).append( targetName ).append( '"' );
         if ( actions != null && actions.length() > 0 )
             stringBuilder.append( ", \"" ).append( actions ).append( '"');
         if ( signedBy != null && signedBy.length() > 0 )