You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2012/01/09 14:12:54 UTC

svn commit: r1229137 [3/3] - in /river/jtsk/skunk/peterConcurrentPolicy: qa/harness/policy/ qa/src/com/sun/jini/qa/harness/ qa/src/com/sun/jini/qa/resources/ qa/src/com/sun/jini/test/impl/start/ qa/src/com/sun/jini/test/impl/start/aggregatepolicyprovid...

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/DefaultPolicyScanner.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/DefaultPolicyScanner.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/DefaultPolicyScanner.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/DefaultPolicyScanner.java Mon Jan  9 13:12:52 2012
@@ -167,19 +167,19 @@ public class DefaultPolicyScanner {
      */
     protected KeystoreEntry readKeystoreEntry(StreamTokenizer st)
             throws IOException, InvalidFormatException {
-        KeystoreEntry ke = new KeystoreEntry();
+        String url = null, type = null;
         if (st.nextToken() == '"') {
-            ke.url = st.sval;
+            url = st.sval;
             if ((st.nextToken() == '"')
                     || ((st.ttype == ',') && (st.nextToken() == '"'))) {
-                ke.type = st.sval;
+                type = st.sval;
             } else { // handle token in the main loop
                 st.pushBack();
             }
         } else {
             handleUnexpectedToken(st, Messages.getString("security.8A")); //$NON-NLS-1$
         }
-        return ke;
+        return new KeystoreEntry(url, type);
     }
 
     /**
@@ -207,25 +207,28 @@ public class DefaultPolicyScanner {
      */
     protected GrantEntry readGrantEntry(StreamTokenizer st) throws IOException,
             InvalidFormatException {
-        GrantEntry ge = new GrantEntry();
+        String signer = null, codebase = null;
+        Collection<PrincipalEntry> principals = new ArrayList<PrincipalEntry>();
+        Collection<PermissionEntry> permissions = null;
+        
         parsing: while (true) {
             switch (st.nextToken()) {
 
             case StreamTokenizer.TT_WORD:
                 if (Util.equalsIgnoreCase("signedby", st.sval)) { //$NON-NLS-1$
                     if (st.nextToken() == '"') {
-                        ge.setSigners(st.sval);
+                        signer = st.sval;
                     } else {
                         handleUnexpectedToken(st, Messages.getString("security.8B")); //$NON-NLS-1$
                     }
                 } else if (Util.equalsIgnoreCase("codebase", st.sval)) { //$NON-NLS-1$
                     if (st.nextToken() == '"') {
-                        ge.setCodebase(st.sval);
+                        codebase = st.sval;
                     } else {
                         handleUnexpectedToken(st, Messages.getString("security.8C")); //$NON-NLS-1$
                     }
                 } else if (Util.equalsIgnoreCase("principal", st.sval)) { //$NON-NLS-1$
-                    ge.addPrincipal(readPrincipalEntry(st));
+                    principals.add(readPrincipalEntry(st));
                 } else {
                     handleUnexpectedToken(st);
                 }
@@ -235,7 +238,7 @@ public class DefaultPolicyScanner {
                 break;
 
             case '{':
-                ge.setPermissions(readPermissionEntries(st));
+                permissions = readPermissionEntries(st);
                 break parsing;
 
             default: // handle token in the main loop
@@ -244,7 +247,7 @@ public class DefaultPolicyScanner {
             }
         }
 
-        return ge;
+        return new GrantEntry(signer, codebase, principals, permissions);
     }
 
     /**
@@ -267,22 +270,22 @@ public class DefaultPolicyScanner {
      */
     protected PrincipalEntry readPrincipalEntry(StreamTokenizer st)
             throws IOException, InvalidFormatException {
-        PrincipalEntry pe = new PrincipalEntry();
+        String classname = null, name = null;
         if (st.nextToken() == StreamTokenizer.TT_WORD) {
-            pe.klass = st.sval;
+            classname = st.sval;
             st.nextToken();
         } else if (st.ttype == '*') {
-            pe.klass = PrincipalEntry.WILDCARD;
+            classname = PrincipalEntry.WILDCARD;
             st.nextToken();
         }
         if (st.ttype == '"') {
-            pe.name = st.sval;
+            name = st.sval;
         } else if (st.ttype == '*') {
-            pe.name = PrincipalEntry.WILDCARD;
+            name = PrincipalEntry.WILDCARD;
         } else {
             handleUnexpectedToken(st, Messages.getString("security.8D")); //$NON-NLS-1$
         }
-        return pe;
+        return new PrincipalEntry(classname, name);
     }
 
     /**
@@ -313,18 +316,19 @@ public class DefaultPolicyScanner {
 
             case StreamTokenizer.TT_WORD:
                 if (Util.equalsIgnoreCase("permission", st.sval)) { //$NON-NLS-1$
-                    PermissionEntry pe = new PermissionEntry();
+                    String klass = null, name = null, actions = null, signers = null;
+                    
                     if (st.nextToken() == StreamTokenizer.TT_WORD) {
-                        pe.klass = st.sval;
+                        klass = st.sval;
                         if (st.nextToken() == '"') {
-                            pe.name = st.sval;
+                            name = st.sval;
                             st.nextToken();
                         }
                         if (st.ttype == ',') {
                             st.nextToken();
                         }
                         if (st.ttype == '"') {
-                            pe.actions = st.sval;
+                            actions = st.sval;
                             if (st.nextToken() == ',') {
                                 st.nextToken();
                             }
@@ -332,13 +336,14 @@ public class DefaultPolicyScanner {
                         if (st.ttype == StreamTokenizer.TT_WORD
                                 && Util.equalsIgnoreCase("signedby", st.sval)) { //$NON-NLS-1$
                             if (st.nextToken() == '"') {
-                                pe.signers = st.sval;
+                                signers = st.sval;
                             } else {
                                 handleUnexpectedToken(st);
                             }
                         } else { // handle token in the next iteration
                             st.pushBack();
                         }
+                        PermissionEntry pe = new PermissionEntry(klass, name, actions, signers);
                         permissions.add(pe);
                         continue parsing;
                     }
@@ -417,23 +422,42 @@ public class DefaultPolicyScanner {
         /**
          * The URL part of keystore clause.
          */
-        public String url;
+        private final String url;
 
         /**
          * The typename part of keystore clause.
          */
-        public String type;
+        private final String type;
+        
+        KeystoreEntry(String url, String type){
+            this.url= url;
+            this.type= type;
+        }
         
         public String toString(){
             String newline = "\n";
-            int l = url == null? 0 : url.length();
-            l = l + type == null? 0 : type.length();
+            int l = getUrl() == null? 0 : getUrl().length();
+            l = l + (getType() == null? 0 : getType().length());
             l = l + 4;
             StringBuffer sb = new StringBuffer(l);
-            if ( url != null ) sb.append(url).append(newline);
-            if ( type != null ) sb.append(type).append(newline);
+            if ( getUrl() != null ) sb.append(getUrl()).append(newline);
+            if ( getType() != null ) sb.append(getType()).append(newline);
             return sb.toString();
         }
+
+        /**
+         * @return the url
+         */
+        public String getUrl() {
+            return url;
+        }
+
+        /**
+         * @return the type
+         */
+        public String getType() {
+            return type;
+        }
     }
 
     /**
@@ -449,63 +473,48 @@ public class DefaultPolicyScanner {
          * The signers part of grant clause. This is a comma-separated list of
          * certificate aliases.
          */
-        private String signers;
+        private final String signers;
 
         /**
          * The codebase part of grant clause. This is an URL from which code
          * originates.  Comma separate list allowed?
          */
-        private String codebase;
-
-        /**
-         * If there is an array string of codebases, use this field instead.
-         */
-        private Collection<String> codebases;
+        private final String codebase;
 
         /**
          * Collection of PrincipalEntries of grant clause.
          */
-        private Collection<PrincipalEntry> principals;
+        private final Collection<PrincipalEntry> principals;
 
         /**
          * Collection of PermissionEntries of grant clause.
          */
-        private Collection<PermissionEntry> permissions;
+        private final Collection<PermissionEntry> permissions;
+        
+        GrantEntry(String signers, String codebase, 
+                    Collection<PrincipalEntry> pe,
+                    Collection<PermissionEntry> perms){
+            this.signers = signers;
+            this.codebase = codebase;
+            this.principals = pe;
+            this.permissions = perms;
+        }
         
         public String toString(){
             String newline = "\n";
-            StringBuffer sb = new StringBuffer(400);
+            StringBuilder sb = new StringBuilder(400);
             if (signers != null ) sb.append(signers).append(newline);
             if (codebase != null ) sb.append(codebase).append(newline);
-            if (codebases != null ) sb.append(codebases).append(newline);
             if (principals != null ) sb.append(principals).append(newline);
             if (permissions != null ) sb.append(permissions).append(newline);
             return sb.toString();
         }
 
         /**
-         * Adds specified element to the <code>principals</code> collection.
-         * If collection does not exist yet, creates a new one.
-         */
-        public void addPrincipal(PrincipalEntry pe) {
-            if (getPrincipals(null) == null) {
-                setPrincipals(new HashSet<PrincipalEntry>());
-            }
-            getPrincipals(null).add(pe);
-        }
-
-        /**
          * @return the signers
          */
         public String getSigners() {
             return signers;
-    }
-
-    /**
-         * @param signers the signers to set
-         */
-        public void setSigners(String signers) {
-            this.signers = signers;
         }
 
         /**
@@ -523,14 +532,6 @@ public class DefaultPolicyScanner {
         }
 
         /**
-         * Set the the codebase string.
-         * @param codebase the codebase to set
-         */
-        public void setCodebase(String codebase) {
-            this.codebase = codebase;
-        }
-
-        /**
          * @return the principals
          */
         public Collection<PrincipalEntry> getPrincipals(Properties system) {
@@ -538,26 +539,12 @@ public class DefaultPolicyScanner {
         }
 
         /**
-         * @param principals the principals to set
-         */
-        public void setPrincipals(Collection<PrincipalEntry> principals) {
-            this.principals = principals;
-        }
-
-        /**
          * @return the permissions
          */
         public Collection<PermissionEntry> getPermissions() {
             return permissions;
         }
 
-        /**
-         * @param permissions the permissions to set
-         */
-        public void setPermissions(Collection<PermissionEntry> permissions) {
-            this.permissions = permissions;
-        }
-
     }
 
     /**
@@ -580,23 +567,42 @@ public class DefaultPolicyScanner {
         /**
          * The classname part of principal clause.
          */
-        public String klass;
+        private final String klass;
 
         /**
          * The name part of principal clause.
          */
-        public String name;
+        private final String name;
+        
+        PrincipalEntry(String classname, String name){
+            klass = classname;
+            this.name = name;
+        }
         
         public String toString(){
             String newline = "\n";
-            int l = klass == null? 0 : klass.length();
-            l = l + name == null? 0 : name.length();
+            int l = getKlass() == null? 0 : getKlass().length();
+            l = l + getName() == null? 0 : getName().length();
             l = l + 4;
             StringBuffer sb = new StringBuffer(l);
-            if ( klass != null ) sb.append(klass).append(newline);
-            if ( name != null ) sb.append(name).append(newline);
+            if ( getKlass() != null ) sb.append(getKlass()).append(newline);
+            if ( getName() != null ) sb.append(getName()).append(newline);
             return sb.toString();
         }
+
+        /**
+         * @return the klass
+         */
+        public String getKlass() {
+            return klass;
+        }
+
+        /**
+         * @return the name
+         */
+        public String getName() {
+            return name;
+        }
     }
 
     /**
@@ -612,37 +618,73 @@ public class DefaultPolicyScanner {
         /**
          * The classname part of permission clause.
          */
-        public String klass;
+        private final String klass;
 
         /**
          * The name part of permission clause.
          */
-        public String name;
+        private final String name;
 
         /**
          * The actions part of permission clause.
          */
-        public String actions;
+        private final String actions;
 
         /**
          * The signers part of permission clause. This is a comma-separated list
          * of certificate aliases.
          */
-        public String signers;
+        private final String signers;
+        
+        PermissionEntry(String klass, String name, String actions, String signers){
+            if (klass == null) throw new NullPointerException();
+            this.klass= klass;
+            this.name= name == null ? "" : name;
+            this.actions= actions == null ? "" : actions;
+            this.signers= signers;
+        }
         
         public String toString(){
             String endline = "\n";
-            int l = klass == null ? 0 : klass.length();
-            l = l + name == null? 0 : name.length();
-            l = l + actions == null? 0 : actions.length();
-            l = l + signers == null? 0 : signers.length();
+            int l = getKlass() == null ? 0 : getKlass().length();
+            l = l + (getName() == null? 0 : getName().length());
+            l = l + (getActions() == null? 0 : getActions().length());
+            l = l + (getSigners() == null? 0 : getSigners().length());
             l = l + 8;
             StringBuffer sb = new StringBuffer(l);
-            if ( klass != null ) sb.append(klass).append(endline);
-            if ( name != null ) sb.append(name).append(endline);
-            if ( actions != null ) sb.append(actions).append(endline);
-            if ( signers != null ) sb.append(signers).append(endline);
+            if ( getKlass() != null ) sb.append(getKlass()).append(endline);
+            if ( getName() != null ) sb.append(getName()).append(endline);
+            if ( getActions() != null ) sb.append(getActions()).append(endline);
+            if ( getSigners() != null ) sb.append(getSigners()).append(endline);
             return sb.toString();
         }
+
+        /**
+         * @return the klass
+         */
+        public String getKlass() {
+            return klass;
+        }
+
+        /**
+         * @return the name
+         */
+        public String getName() {
+            return name;
+        }
+
+        /**
+         * @return the actions
+         */
+        public String getActions() {
+            return actions;
+        }
+
+        /**
+         * @return the signers
+         */
+        public String getSigners() {
+            return signers;
+        }
     }
 }

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Messages.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Messages.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Messages.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Messages.java Mon Jan  9 13:12:52 2012
@@ -49,7 +49,19 @@ import java.util.ResourceBundle;
 public class Messages {
 
     // ResourceBundle holding the system messages.
-    static private ResourceBundle bundle = null;
+    static final private ResourceBundle bundle ;
+    
+    static {
+        // Attempt to load the messages.
+        ResourceBundle rb = null;
+        try {
+            rb = setLocale(Locale.getDefault(),
+                    "org.apache.river.impl.security.policy.util.messages"); //$NON-NLS-1$
+        } catch (Throwable e) {
+            System.err.println(e);
+        }
+        bundle = rb;
+    }
 
     /**
      * Retrieves a message which has no arguments.
@@ -139,6 +151,7 @@ public class Messages {
             try {
                 format = bundle.getString(msg);
             } catch (MissingResourceException e) {
+                System.err.println(e);
             }
         }
 
@@ -234,17 +247,10 @@ public class Messages {
                         }
                     });
         } catch (MissingResourceException e) {
+            System.err.println(e);
         }
         return null;
     }
 
-    static {
-        // Attempt to load the messages.
-        try {
-            bundle = setLocale(Locale.getDefault(),
-                    "org.apache.river.impl.security.policy.util.messages"); //$NON-NLS-1$
-        } catch (Throwable e) {
-            e.printStackTrace();
-        }
-    }
+
 }

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/PolicyUtils.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/PolicyUtils.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/PolicyUtils.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/PolicyUtils.java Mon Jan  9 13:12:52 2012
@@ -44,6 +44,8 @@ import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import net.jini.security.ConcurrentPermissions;
 
 /**
@@ -64,7 +66,7 @@ public class PolicyUtils {
         /** 
          * URL of target location. 
          */
-        public URL location;
+        private final URL location;
 
         /**
          *  Constructor with target URL parameter. 
@@ -134,7 +136,7 @@ public class PolicyUtils {
             super(message, cause);
         }
     }
-
+    
     /**
      * Substitutes all entries like ${some.key}, found in specified string, 
      * for specified values.
@@ -146,28 +148,18 @@ public class PolicyUtils {
      */
     public static String expand(String str, Properties properties)
             throws ExpansionFailedException {
-        final String ARRAY_START_MARK = "${{";
-        final String ARRAY_END_MARK = "}}";
         final String START_MARK = "${"; //$NON-NLS-1$
         final String END_MARK = "}"; //$NON-NLS-1$
-
-        if ( str.indexOf(ARRAY_START_MARK) > 0) {
-            return process(str, properties, ARRAY_START_MARK, ARRAY_END_MARK);
-        }
-        return process(str, properties, START_MARK, END_MARK);
-    }
-    
-    private static String process(String str, Properties p, String START_MARK,
-            String END_MARK) throws ExpansionFailedException{
-        StringBuilder result = new StringBuilder(str);
         final int START_OFFSET = START_MARK.length();
         final int END_OFFSET = END_MARK.length();
+
+        StringBuilder result = new StringBuilder(str);
         int start = result.indexOf(START_MARK);
         while (start >= 0) {
             int end = result.indexOf(END_MARK, start);
             if (end >= 0) {
                 String key = result.substring(start + START_OFFSET, end);
-                String value = p.getProperty(key);
+                String value = properties.getProperty(key);
                 if (value != null) {
                     result.replace(start, end + END_OFFSET, value);
                     start += value.length();
@@ -179,6 +171,15 @@ public class PolicyUtils {
         }
         return result.toString();
     }
+    
+//    public static String expand(String str, Properties properties) throws ExpansionFailedException{
+//        Segment s = new Segment(str, null);
+//        for (int i = 0; i < 3; i++){ //nested properies 3 deep.
+//            s.divideAndReplace("${", "}", null, properties);
+//        }
+//        s.hasNext(); // There will be at least one result
+//        return s.next(); // Don't bother checking for more, not split into array.
+//    }
 
     /**
      * Handy shortcut for 
@@ -199,7 +200,8 @@ public class PolicyUtils {
      * @throws URISyntaxException  
      */
     public static URI normalizeURL(URL codebase) throws URISyntaxException {
-        if (codebase != null && "file".equals(codebase.getProtocol())) { //$NON-NLS-1$
+        if (codebase == null) return null;
+        if ("file".equals(codebase.getProtocol())) { //$NON-NLS-1$
             try {
                 if (codebase.getHost().length() == 0) {
                     String path = codebase.getFile();
@@ -437,7 +439,7 @@ public class PolicyUtils {
      */
     public static PermissionCollection 
             toPermissionCollection(Collection<Permission> perms) {
-        PermissionCollection pc = new ConcurrentPermissions();
+        PermissionCollection pc = new Permissions();
         if (perms != null) {
             for (Iterator<Permission> iter = perms.iterator(); iter.hasNext();) {
                 Permission element = iter.next();

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/RC.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/RC.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/RC.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/RC.java Mon Jan  9 13:12:52 2012
@@ -166,7 +166,7 @@ public class RC {
      * @return
      */
     public static <T> Collection<T> collection(Collection<Referrer<T>> internal, Ref type){
-        return new ReferenceCollection<T>(internal, type);
+        return new ReferenceCollection<T>(internal, type, false);
     }
     
 //    /**
@@ -272,7 +272,7 @@ public class RC {
         return new ReferenceBlockingQueue<T>(internal, type);
     }
     /**
-     * Wrap a Blocki    ngDeque for holding references so it appears as a BlockingDeque
+     * Wrap a BlockingDeque for holding references so it appears as a BlockingDeque
      * containing referents.
      * 
      * @param <T>

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceCollection.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceCollection.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceCollection.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceCollection.java Mon Jan  9 13:12:52 2012
@@ -43,7 +43,7 @@ import java.util.logging.Logger;
  * 
  * Synchronisation must be implemented by the underlying Collection and cannot
  * be performed externally to this class.  The underlying Collection must
- * also be mutable.  Object will be removed automatically from the underlying
+ * also be mutable.  Objects will be removed automatically from the underlying
  * Collection when they are eligible for garbage collection.
  * 
  * Weak, Weak Identity, Soft, Soft Identity or Strong references may be used.
@@ -64,12 +64,12 @@ class ReferenceCollection<T> extends Abs
     private final ReferenceQueuingFactory<T, Referrer<T>> rqf;
     private final Ref type;
     
-    ReferenceCollection(Collection<Referrer<T>> col, Ref type){
-        this(col, new ReferenceProcessor<T>(col, type, type == Ref.STRONG ? null : new ReferenceQueue<T>()), type);
+    ReferenceCollection(Collection<Referrer<T>> col, Ref type, boolean gcThread){
+        this(col, new ReferenceProcessor<T>(col, type, type == Ref.STRONG ? null : new ReferenceQueue<T>(), false), type, false);
     }
     
     ReferenceCollection(Collection<Referrer<T>> col, 
-            ReferenceQueuingFactory<T, Referrer<T>> rqf, Ref type){
+            ReferenceQueuingFactory<T, Referrer<T>> rqf, Ref type, boolean gcThread){
         this.col = col;
         this.rqf = rqf;
         this.type = type;

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceIterator.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceIterator.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceIterator.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceIterator.java Mon Jan  9 13:12:52 2012
@@ -20,6 +20,7 @@ package org.apache.river.impl.util;
 
 import java.lang.ref.Reference;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 /**
  *
@@ -27,20 +28,30 @@ import java.util.Iterator;
  */
 class ReferenceIterator<T> implements Iterator<T> {
     private final Iterator<Referrer<T>> iterator;
+    private T next;
 
     ReferenceIterator(Iterator<Referrer<T>> iterator) {
         if ( iterator == null ) throw new IllegalArgumentException("iterator cannot be null");
         this.iterator = iterator;
+        next = null;
     }
 
     public boolean hasNext() {
-        return iterator.hasNext();
+        while ( iterator.hasNext()){
+            Referrer<T> t = iterator.next();
+            if ( t != null ) {
+                next = t.get();
+                if (next != null) return true;
+                else iterator.remove(); // garbage collected.
+            }
+        }
+        next = null;
+        return false;
     }
 
     public T next() {
-        Referrer<T> t = iterator.next();
-        if ( t != null ) return t.get();
-        return null;
+        if (next == null) throw new NoSuchElementException();
+        return next;
     }
 
     public void remove() {

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceList.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceList.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceList.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceList.java Mon Jan  9 13:12:52 2012
@@ -49,12 +49,12 @@ class ReferenceList<T> extends Reference
     private static final long serialVersionUID = 1L;
     private final List<Referrer<T>> list;
     ReferenceList(List<Referrer<T>> list, Ref type){
-        super(list, type);
+        super(list, type, false);
         this.list = list;
     }
     
     ReferenceList(List<Referrer<T>> list, ReferenceQueuingFactory<T, Referrer<T>> rqf, Ref type){
-        super(list, rqf, type);
+        super(list, rqf, type, false);
         this.list = list;
     }
     

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceMap.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceMap.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceMap.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceMap.java Mon Jan  9 13:12:52 2012
@@ -68,8 +68,8 @@ class ReferenceMap<K, V> extends Abstrac
     
     ReferenceMap(Map<Referrer<K>,Referrer<V>> map, Ref key, Ref val){
         this(map, 
-                new ReferenceProcessor<K>(map.keySet(), key, new ReferenceQueue<K>()),
-                new ReferenceProcessor<V>(map.values(), val, new ReferenceQueue<V>()), 
+                new ReferenceProcessor<K>(map.keySet(), key, new ReferenceQueue<K>(), false),
+                new ReferenceProcessor<V>(map.values(), val, new ReferenceQueue<V>(), false), 
                 key, val
                 );
     }
@@ -80,7 +80,7 @@ class ReferenceMap<K, V> extends Abstrac
         this.vrqf = vrqf;
         this.key = key;
         this.val = val;
-        values = new ReferenceCollection<V>(this.map.values(), vrqf, val);
+        values = new ReferenceCollection<V>(this.map.values(), vrqf, val, false);
         keys = new ReferenceSet<K>(this.map.keySet(), krqf, key);
         // We let this escape during construction, but it's package private only
         // and doesn't escape the package.

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceProcessor.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceProcessor.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceProcessor.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceProcessor.java Mon Jan  9 13:12:52 2012
@@ -18,32 +18,87 @@
 
 package org.apache.river.impl.util;
 
+import java.lang.ref.PhantomReference;
 import java.lang.ref.Reference;
 import java.lang.ref.ReferenceQueue;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
- *
+ * ReferenceProcessor is responsible for creation and collection of References 
+ * on behalf of Reference Collection implementations.
  *
  * @param <T> 
  * @author peter
  */
 class ReferenceProcessor<T> implements ReferenceQueuingFactory<T, Referrer<T>> {
     
+    private final static ScheduledExecutorService garbageCleaner =
+            Executors.newScheduledThreadPool(1, new SystemThreadFactory());
+    // Map to register newly created object references.
+    private final static Map<Reference,ScheduledFuture> finalizerTasks = 
+            new ConcurrentHashMap<Reference,ScheduledFuture>();
+    // Finalizer queue to advise cancellation of ScheduledFuture's, 
+    // when their ReferenceProcessor has been collected.
+    private final static ReferenceQueue<Reference> phantomQueue = 
+            new ReferenceQueue<Reference>();
+    static {
+        // Finizer Task to cancel unneeded tasks.
+        garbageCleaner.scheduleAtFixedRate(
+                new FinalizerTask(phantomQueue, finalizerTasks), 
+                5L, 5L, TimeUnit.MINUTES
+                );
+    }
+    
     private final Collection<Referrer<T>> col;
     private final ReferenceQueue<T> queue;
     private final Ref type;
     private final Lock queueLock;
+    private final boolean gcThreads;
+    private volatile boolean started = false;
     
-    ReferenceProcessor(Collection<Referrer<T>> col, Ref type, ReferenceQueue<T> queue){
+    ReferenceProcessor(Collection<Referrer<T>> col, Ref type, ReferenceQueue<T> queue, boolean gcThreads){
         if (col == null || type == null ) throw new NullPointerException("collection or reference type cannot be null");
         this.col = col;
         this.type = type;
         this.queue = type == Ref.STRONG ? null : queue;
+        this.gcThreads = gcThreads;
         queueLock = new ReentrantLock();
     }
+    
+    /**
+     * Register with executor service and finaliser for cleanup.
+     */
+    public void start(){
+       if (started) return; // Start once only.
+       synchronized (this){
+           if (started) return;
+           started = true;
+       }
+       ScheduledFuture task;
+       task = (gcThreads && queue != null)
+                ? garbageCleaner.scheduleAtFixedRate(new CleanerTask(col, queue), 10L, 10L, TimeUnit.SECONDS) 
+                : null;
+       if ( task != null ){
+           // Register with finaliser.
+            @SuppressWarnings("unchecked")
+           Reference r = new PhantomReference(this, phantomQueue);
+           finalizerTasks.put(r, task);
+       }
+    }
 
     @Override
     public T pseudoReferent(Referrer<T> u) {
@@ -59,7 +114,7 @@ class ReferenceProcessor<T> implements R
 
     @Override
     public void processQueue() {
-        if (queue == null) return;
+        if (queue == null || gcThreads) return;
         Object t = null;
         /*
          * The reason for using an explicit lock is if another thread is
@@ -79,4 +134,97 @@ class ReferenceProcessor<T> implements R
             }
         }
     }
+    
+    private static class CleanerTask implements Runnable {
+        
+        private final Collection col;
+        private final ReferenceQueue queue;
+        
+        private CleanerTask(Collection c, ReferenceQueue queue){
+            col = c;
+            this.queue = queue;
+        }
+        
+        @Override
+        public void run() {
+            Object t;
+            while ( (t = queue.poll()) != null ){ 
+                col.remove(t);
+            }
+        }
+    
+    }
+    
+    private static class FinalizerTask implements Runnable {
+        
+        private final ReferenceQueue phantomQueue;
+        private final Map<Reference,ScheduledFuture> finalizerTasks ;
+        
+        private FinalizerTask(ReferenceQueue queue, 
+                Map<Reference,ScheduledFuture> tasks){
+            phantomQueue = queue;
+            finalizerTasks = tasks;
+        }
+
+        @Override
+        public void run() {
+            Reference p;
+            while ( (p = phantomQueue.poll()) != null){
+                ScheduledFuture sf = finalizerTasks.remove(p);
+                if (sf !=null) sf.cancel(true);
+                // phantom reference is eligible for gc we don't have to
+                // clear it, but might as well.
+                p.clear();
+            }
+        }
+        
+    }
+    
+    private static class SystemThreadFactory implements ThreadFactory{
+        private static final ThreadGroup g;
+        
+        static {
+            ThreadGroup tg = Thread.currentThread().getThreadGroup();
+            try {
+                tg = AccessController.doPrivileged( new ThreadGroupAction(tg));
+            } catch (PrivilegedActionException ex) {
+                Exception e = ex.getException();
+                if (e instanceof SecurityException){
+                    Logger.getLogger(ReferenceProcessor.class.getName()).log(Level.FINE, null, e);
+                } else if (e instanceof RuntimeException){
+                    throw (RuntimeException) e;
+                }
+            }
+            g = tg;
+        }
+
+        private SystemThreadFactory(){
+        }
+        
+        @Override
+        public Thread newThread(Runnable r) {
+            Thread t = new Thread(g, r);
+            t.setContextClassLoader(null);
+            t.setPriority(Thread.MAX_PRIORITY);
+            return t;
+        }
+        
+    }
+    
+    private static class ThreadGroupAction implements PrivilegedExceptionAction<ThreadGroup>{
+        private ThreadGroup tg;
+        
+        ThreadGroupAction(ThreadGroup g){
+            tg = g;
+        }
+        public ThreadGroup run() {
+            ThreadGroup parent = tg.getParent();
+            while (parent != null){
+                tg = parent;
+                parent = tg.getParent();
+            }
+            return tg;
+        }
+    }
+    
 }

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceSet.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceSet.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceSet.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferenceSet.java Mon Jan  9 13:12:52 2012
@@ -34,11 +34,11 @@ class ReferenceSet<T> extends ReferenceC
     private static final long serialVersionUID = 1L;
     
     ReferenceSet(Set<Referrer<T>> col, Ref type){
-        super(col, type);
+        super(col, type, false);
     }
     
     ReferenceSet(Set<Referrer<T>> col, ReferenceQueuingFactory<T, Referrer<T>> rqf, Ref type){
-        super(col, rqf, type);
+        super(col, rqf, type, false);
     }
     
     private void readObject(ObjectInputStream stream) 

Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferencedQueue.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferencedQueue.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferencedQueue.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/util/ReferencedQueue.java Mon Jan  9 13:12:52 2012
@@ -32,7 +32,7 @@ public class ReferencedQueue<T> extends 
     private final Queue<Referrer<T>> queue;
     
     public ReferencedQueue( Queue<Referrer<T>> queue, Ref type){
-        super(queue, type);
+        super(queue, type, false);
         this.queue = queue;
     }
     

Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java Mon Jan  9 13:12:52 2012
@@ -19,6 +19,7 @@
 package net.jini.security;
 
 
+import java.util.TreeSet;
 import java.util.Collection;
 import java.io.IOException;
 import java.io.ByteArrayInputStream;
@@ -140,7 +141,7 @@ public class DynamicPermissionCollection
         expResult.add(permission0);
         expResult.add(permission1);
         expResult.add(permission2);
-        Collection<Permission> result = new ArrayList<Permission>(3);
+        Collection<Permission> result = new TreeSet<Permission>(new PermissionComparator());
         ObjectOutputStream out = null;
         ObjectInputStream in = null;
         ByteArrayOutputStream baos = new ByteArrayOutputStream();

Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/DefaultPolicyParserTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/DefaultPolicyParserTest.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/DefaultPolicyParserTest.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/DefaultPolicyParserTest.java Mon Jan  9 13:12:52 2012
@@ -22,23 +22,35 @@
 
 package org.apache.river.impl.security.policy.util;
 
+import com.sun.jini.start.SharedActivationPolicyPermission;
+import java.net.URISyntaxException;
+import java.security.KeyStore;
 import java.util.Properties;
 import java.util.SortedSet;
 import java.io.File;
 import java.io.FileWriter;
+import java.net.URI;
 import java.net.URL;
 import java.security.CodeSource;
 import java.security.Permission;
 import java.security.Principal;
 import java.security.SecurityPermission;
+import java.security.UnresolvedPermission;
 import java.security.cert.Certificate;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import junit.framework.TestCase;
 import org.apache.river.api.security.PermissionGrant;
+import org.apache.river.api.security.PermissionGrantBuilder;
+import org.apache.river.impl.security.policy.util.DefaultPolicyScanner.GrantEntry;
+import org.apache.river.impl.security.policy.util.DefaultPolicyScanner.KeystoreEntry;
+import org.apache.river.impl.security.policy.util.DefaultPolicyScanner.PermissionEntry;
+import org.junit.Before;
 import org.junit.Test;
 
 
@@ -48,10 +60,70 @@ import org.junit.Test;
  */
 
 public class DefaultPolicyParserTest extends TestCase {
-
+    private Properties system;
+    private GrantEntry ge;
+    private Collection<Permission> permissions;
+    private PermissionGrant grant;
+    private PermissionEntry pe0, pe1, pe2, pe3;
+    private Permission perm0, perm1, perm2, perm3;
     public static void main(String[] args) {
         junit.textui.TestRunner.run(DefaultPolicyParserTest.class);
     }
+    
+    @Before
+    public void setUp(){
+       system = new Properties();
+       system.setProperty("com.sun.jini.jsk.home", "/opt/src/river/trunk");
+       system.setProperty("/", "/");
+       system.setProperty("com.sun.jini.qa.harness.harnessJar", "/opt/src/river/trunk/qa/lib/harness.jar");
+       pe0 = new PermissionEntry("permission com.sun.jini.start.SharedActivationPolicyPermission", 
+               "jar:file:${com.sun.jini.qa.harness.harnessJar}!/harness/policy/sec-jeri-group.policy",
+               null, null );
+       pe1 = new PermissionEntry("permission com.sun.jini.start.SharedActivationPolicyPermission", 
+               "jar:file:${com.sun.jini.qa.harness.harnessJar}!/harness/policy/all.policy",
+               null, null );
+       pe2 = new PermissionEntry("permission com.sun.jini.start.SharedActivationPolicyPermission", 
+               "jar:file:${com.sun.jini.qa.harness.harnessJar}!/harness/policy/policy.all",
+               null, null );
+       pe3 = new PermissionEntry("permission com.sun.jini.start.SharedActivationPolicyPermission", 
+               "jar:file:${com.sun.jini.qa.harness.harnessJar}!/harness/policy/defaultgroup.policy",
+               null, null );
+       List<PermissionEntry> pec = new ArrayList<PermissionEntry>(4);
+       pec.add(0, pe0);
+       pec.add(1, pe1);
+       pec.add(2, pe2);
+       pec.add(3, pe3);
+       ge = new GrantEntry( null, "file:${com.sun.jini.jsk.home}${/}lib${/}group.jar", null, pec );
+       perm0 = new UnresolvedPermission("permission com.sun.jini.start.SharedActivationPolicyPermission",
+               "jar:file:/opt/src/river/trunk/qa/lib/harness.jar!/harness/policy/sec-jeri-group.policy",
+               "", null);
+       perm1 = new UnresolvedPermission("permission com.sun.jini.start.SharedActivationPolicyPermission",
+               "jar:file:/opt/src/river/trunk/qa/lib/harness.jar!/harness/policy/all.policy",
+               "", null);
+       perm2 = new UnresolvedPermission("permission com.sun.jini.start.SharedActivationPolicyPermission",
+               "jar:file:/opt/src/river/trunk/qa/lib/harness.jar!/harness/policy/policy.all",
+               "", null);
+       perm3 = new UnresolvedPermission("permission com.sun.jini.start.SharedActivationPolicyPermission",
+               "jar:file:/opt/src/river/trunk/qa/lib/harness.jar!/harness/policy/defaultgroup.policy",
+               "", null);
+       permissions = new ArrayList<Permission>(4);
+       permissions.add(perm0);
+       permissions.add(perm1);
+       permissions.add(perm2);
+       permissions.add(perm3);
+       PermissionGrantBuilder pgb = PermissionGrantBuilder.newBuilder();
+       URI uri = null;
+        try {
+            uri = new URI("file:/opt/src/river/trunk/lib/group.jar");
+        } catch (URISyntaxException ex) {
+            System.err.println(ex);
+        }
+       grant = pgb
+               .uri(uri)
+               .permissions(permissions.toArray(new Permission[4]))
+               .context(PermissionGrantBuilder.URI)
+               .build();
+    }
 
     /**
      * Tests parsing of a sample policy from temporary file, validates returned
@@ -95,7 +167,7 @@ public class DefaultPolicyParserTest ext
             tmp.delete();
         }
     }
-
+    
 //    /**
 //     * Test of segment method, of class DefaultPolicyParser.
 //     */
@@ -124,6 +196,97 @@ public class DefaultPolicyParserTest ext
 //        assertEquals(expResult, result);
 //    }
 //
+
+    /**
+     * Test of resolveGrant method, of class DefaultPolicyParser.
+     */
+    @Test
+    public void testResolveGrant() throws Exception {
+        System.out.println("resolveGrant");
+        KeyStore ks = null;
+        boolean resolve = true;
+        DefaultPolicyParser instance = new DefaultPolicyParser();
+        PermissionGrant expResult = grant;
+        PermissionGrant result = instance.resolveGrant(ge, ks, system, resolve);
+        assertEquals(expResult, result);
+        // TODO review the generated test code and remove the default call to fail.
+//        fail("The test case is a prototype.");
+    }
+
+    /**
+     * Test of resolvePermission method, of class DefaultPolicyParser.
+     */
+    @Test
+    public void testResolvePermission() throws Exception {
+        System.out.println("resolvePermission");
+        KeyStore ks = null;
+        boolean resolve = true;
+        DefaultPolicyParser instance = new DefaultPolicyParser();
+        Permission expResult = perm0;
+        Permission result = instance.resolvePermission(pe0, ge, ks, system, resolve);
+        assertEquals(expResult, result);
+        expResult = perm1;
+        result = instance.resolvePermission(pe1, ge, ks, system, resolve);
+        assertEquals(expResult, result);
+        expResult = perm2;
+        result = instance.resolvePermission(pe2, ge, ks, system, resolve);
+        assertEquals(expResult, result);
+        expResult = perm3;
+        result = instance.resolvePermission(pe3, ge, ks, system, resolve);
+        assertEquals(expResult, result);
+        // TODO review the generated test code and remove the default call to fail.
+//        fail("The test case is a prototype.");
+    }
+
+//    /**
+//     * Test of resolveSigners method, of class DefaultPolicyParser.
+//     */
+//    @Test
+//    public void testResolveSigners() throws Exception {
+//        System.out.println("resolveSigners");
+//        KeyStore ks = null;
+//        String signers = "";
+//        DefaultPolicyParser instance = new DefaultPolicyParser();
+//        Certificate[] expResult = null;
+//        Certificate[] result = instance.resolveSigners(ks, signers);
+//        assertEquals(expResult, result);
+//        // TODO review the generated test code and remove the default call to fail.
+//        fail("The test case is a prototype.");
+//    }
+
+//    /**
+//     * Test of getPrincipalByAlias method, of class DefaultPolicyParser.
+//     */
+//    @Test
+//    public void testGetPrincipalByAlias() throws Exception {
+//        System.out.println("getPrincipalByAlias");
+//        KeyStore ks = null;
+//        String alias = "";
+//        DefaultPolicyParser instance = new DefaultPolicyParser();
+//        Principal expResult = null;
+//        Principal result = instance.getPrincipalByAlias(ks, alias);
+//        assertEquals(expResult, result);
+//        // TODO review the generated test code and remove the default call to fail.
+//        fail("The test case is a prototype.");
+//    }
+//
+//    /**
+//     * Test of initKeyStore method, of class DefaultPolicyParser.
+//     */
+//    @Test
+//    public void testInitKeyStore() {
+//        System.out.println("initKeyStore");
+//        List<KeystoreEntry> keystores = null;
+//        URL base = null;
+//        Properties system = null;
+//        boolean resolve = false;
+//        DefaultPolicyParser instance = new DefaultPolicyParser();
+//        KeyStore expResult = null;
+//        KeyStore result = instance.initKeyStore(keystores, base, system, resolve);
+//        assertEquals(expResult, result);
+//        // TODO review the generated test code and remove the default call to fail.
+//        fail("The test case is a prototype.");
+//    }
 }
 
 class FakePrincipal implements Principal {

Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/util/ReferenceCollectionTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/util/ReferenceCollectionTest.java?rev=1229137&r1=1229136&r2=1229137&view=diff
==============================================================================
--- river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/util/ReferenceCollectionTest.java (original)
+++ river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/util/ReferenceCollectionTest.java Mon Jan  9 13:12:52 2012
@@ -19,7 +19,6 @@
 package org.apache.river.impl.util;
 
 import java.util.ArrayList;
-import java.lang.ref.Reference;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
@@ -57,7 +56,7 @@ public class ReferenceCollectionTest {
     
     @Before
     public void setUp() {
-        instance = new ReferenceCollection<String>(new ArrayList<Referrer<String>>(), Ref.WEAK_IDENTITY);
+        instance = new ReferenceCollection<String>(new ArrayList<Referrer<String>>(), Ref.WEAK_IDENTITY, false);
         instance.add(truck);
         instance.add(shovel);
         instance.add(grader);