Modified: river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Segment.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Segment.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Segment.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/src/org/apache/river/impl/security/policy/util/Segment.java Mon Dec 19 19:42:37 2011 @@ -20,6 +20,8 @@ package org.apache.river.impl.security.p import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Properties; import org.apache.river.impl.security.policy.util.PolicyUtils.ExpansionFailedException; @@ -36,47 +38,88 @@ import org.apache.river.impl.security.po * every possible unique string combination is produced, before the status of * the first link becomes complete. * - * Segments + * Segments are not thread safe. + * + * Segments are comparable, but shouldn't be compared until after segmentation + * is completed, so initially should be stored in an unsorted Collection. + * * @author Peter Firmstone. */ public class Segment implements Comparable { private Segment previous; - private String [] properties; + private Segment [] divisions; private String original; - private int length = 0; +// private int length = 0; int counter = 0; Status stat; + private StringBuilder sb; + private boolean toggle; public Segment(String s, Segment preceed){ previous = preceed; stat = Status.STRING; - properties = null; + divisions = null; + original = s; + sb = null; + toggle = false; } @Override public String toString(){ - if (stat.equals(Status.STRING)) return original; - return properties[counter]; + return original; } public Status status(){ return stat; } + + public boolean hasNext(){ + if (allStringState()) return true; + if ( stat.equals(Status.COMPLETE) || stat.equals(Status.STRING)) { + return previous == null ? false : previous.hasNext(); + } + return true; + } + + private boolean allStringState(){ + if (toggle) return false; + toggle = true; + if ( ( previous == null || previous.allStringState()) && status().equals(Status.STRING)) return true; + return false; + } - public void next(){ + /** + * Must only be called on the last segment in the Set after sorting. + */ + public String next(){ + if (sb == null) sb = new StringBuilder(120); + else sb.delete(0, sb.capacity() -1 ); + append(sb); if ( stat.equals(Status.COMPLETE)){ - counter = 0; - stat = Status.MORE; if (previous != null ){ previous.next(); } } else if ( stat.equals(Status.MORE)){ - counter ++; - if (counter == length){ + if (divisions[counter].status().equals(Status.MORE)){ + divisions[counter].next(); + } else { + counter ++; + } + if (counter == divisions.length){ stat = Status.COMPLETE; } } else if ( stat.equals(Status.STRING)&& previous != null){ - previous.next(); + if (previous != null) { + previous.next(); // ensures backward propagation. + } } + return sb.toString(); + } + + private StringBuilder append(StringBuilder sb){ + if (previous != null) previous.append(sb); + if (divisions != null) divisions[counter].append(sb); + else sb.append(original); + return sb; } private int sequenceNumber(){ @@ -107,12 +150,19 @@ public class Segment implements Comparab * @param p * @return */ - public Collection<Segment> divideAndReplace(String START_MARK, String END_MARK, + public void divideAndReplace(String START_MARK, String END_MARK, String regex, Properties p) throws ExpansionFailedException{ - Collection<Segment> result = new ArrayList<Segment>(); + if (previous != null) previous.divideAndReplace(START_MARK, END_MARK, regex, p); + if (divisions != null ){ + int l = divisions.length; + for (int i = 0; i < l ; i++ ){ + divisions[i].divideAndReplace(START_MARK, END_MARK, regex, p); + } + // If divisions exist, then this Segment has already been processed. + return; + } String orig = original; //original reference is replaced - Segment last = previous; //previous reference too. - ArrayList<String> segments = new ArrayList<String>(); + Segment prev = previous; //previous reference too. final int START_OFFSET = START_MARK.length(); final int END_OFFSET = END_MARK.length(); int start = orig.indexOf(START_MARK); @@ -120,47 +170,45 @@ public class Segment implements Comparab int beginning = 0; while (start >= 0) { // Get the segment preceeding the key, or between keys. - Segment seg = new Segment(orig.substring(beginning, start), last); - result.add(seg); - last = seg; + Segment seg; + if ( start > beginning && beginning >= 0){ + seg = new Segment(orig.substring(beginning, start), prev); + prev = seg; + } end = orig.indexOf(END_MARK, start); if (end >= 0) { String key = orig.substring(start + START_OFFSET, end); String value = p.getProperty(key); if (value != null) { - seg = new Segment(value, last); + seg = new Segment(value, prev); if (regex != null) { seg.split(regex); seg.status(Status.MORE); } - result.add(seg); - last = seg; + prev = seg; } else { throw new ExpansionFailedException(Messages.getString("security.14F", key)); //$NON-NLS-1$ } } - beginning = end; - start = orig.indexOf(START_MARK, start); + beginning = end + END_OFFSET; + start = orig.indexOf(START_MARK, beginning); } // Now there could be a trailing string. - if (end < orig.length()){ + if (beginning < orig.length()){ // Use this to represent it. - previous = last; - original = orig.substring(end); - } else if ( end == orig.length() && last != null){ + previous = prev; + original = orig.substring(beginning); + } else if ( beginning == orig.length() && prev != null){ // Replace the last Segment in the list with this, after // making it equal. The reason for doing so is that a downstream // Segment may reference this. - result.remove(last); - previous = last.previous; - original = last.original; - properties = last.properties; - length = last.length; - stat = last.stat; + previous = prev.previous; + original = prev.original; + divisions = prev.divisions; +// length = last.length; + stat = prev.stat; } - result.add(this); //We must always keep this since other Segments may reference it. - return result; } /** @@ -168,7 +216,13 @@ public class Segment implements Comparab * internally. */ private void split(String regex){ - properties = original.split(regex); + String [] prop = original.split(regex); + int l = prop.length; + divisions = new Segment[l]; + for (int i = 0; i < l; i++ ){ + // Divisions are parallel, they don't preceed or link to each other. + divisions[i] = new Segment(prop[i], null); + } } private void status(Status status){
Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/ConcurrentPermissionsTest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/ConcurrentPermissionsTest.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/ConcurrentPermissionsTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/ConcurrentPermissionsTest.java Mon Dec 19 19:42:37 2011 @@ -1,6 +1,19 @@ /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package net.jini.security; Copied: river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java (from r1213147, river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java) URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java?p2=river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java&p1=river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java&r1=1213147&r2=1220916&rev=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/DynamicPermissionCollectionTest.java Mon Dec 19 19:42:37 2011 @@ -1,11 +1,30 @@ /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package net.jini.security; +import java.util.Collection; +import java.io.IOException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.security.Permission; import java.security.PermissionCollection; import java.util.ArrayList; @@ -21,9 +40,9 @@ import static org.junit.Assert.*; * * @author peter */ -public class MultiReadPermissionCollectionTest { +public class DynamicPermissionCollectionTest { - public MultiReadPermissionCollectionTest() { + public DynamicPermissionCollectionTest() { } @org.junit.BeforeClass @@ -49,19 +68,18 @@ public class MultiReadPermissionCollecti public void isReadOnly() { System.out.println("isReadOnly"); Permission permission0 = new RuntimePermission("getClassLoader"); - MultiReadPermissionCollection instance = new MultiReadPermissionCollection(permission0); + PermissionCollection instance = + new DynamicPermissionCollection(null,permission0.getClass()); instance.setReadOnly(); - SecurityException exp = new SecurityException("attempt to add a Permission to a readonly PermissionCollection"); - String result = null; + Exception result = null; Permission permission1 = new RuntimePermission("getProtectionDomain"); try { instance.add(permission1); }catch (SecurityException e) { - result = e.toString(); + result = e; System.out.println(e.toString()); } - String expResult = exp.toString(); - assertEquals(expResult, result); + assertTrue(result instanceof SecurityException ); } /** @@ -71,7 +89,8 @@ public class MultiReadPermissionCollecti public void implies() { System.out.println("add"); Permission permission = new RuntimePermission("getClassLoader"); - PermissionCollection instance = new MultiReadPermissionCollection(permission); + PermissionCollection instance = + new DynamicPermissionCollection(null,permission.getClass()); instance.add(permission); boolean result = instance.implies(permission); assertEquals(true, result); @@ -86,7 +105,7 @@ public class MultiReadPermissionCollecti Permission permission0 = new AccessPermission("org.some.class"); Permission permission1 = new AccessPermission("org.some.other.class"); Permission permission2 = new AccessPermission("org.another.class"); - PermissionCollection instance = new MultiReadPermissionCollection(permission0); + PermissionCollection instance = new DynamicPermissionCollection(null,permission0.getClass()); instance.add(permission0); instance.add(permission1); instance.add(permission2); @@ -104,6 +123,42 @@ public class MultiReadPermissionCollecti assertEquals(expRes, res); } - + /** + * Test of readResolve method. + */ + @Test + public void testSerialization() { + System.out.println("Serialization test"); + Permission permission0 = new AccessPermission("org.some.class"); + Permission permission1 = new AccessPermission("org.some.other.class"); + Permission permission2 = new AccessPermission("org.another.class"); + PermissionCollection pc = new DynamicPermissionCollection(null,permission0.getClass()); + Collection<Permission> expResult = new ArrayList<Permission>(3); + pc.add(permission0); + pc.add(permission1); + pc.add(permission2); + expResult.add(permission0); + expResult.add(permission1); + expResult.add(permission2); + Collection<Permission> result = new ArrayList<Permission>(3); + ObjectOutputStream out = null; + ObjectInputStream in = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + out = new ObjectOutputStream(baos); + out.writeObject(pc); + // Unmarshall it + in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); + Enumeration<Permission> en = ((PermissionCollection) in.readObject()).elements(); + while(en.hasMoreElements()){ + result.add(en.nextElement()); + } + } catch (IOException ex) { + ex.printStackTrace(System.out); + } catch (ClassNotFoundException ex){ + ex.printStackTrace(System.out); + } + assertEquals(expResult, result); + } } \ No newline at end of file Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/GrantPermissionTest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/GrantPermissionTest.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/GrantPermissionTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/GrantPermissionTest.java Mon Dec 19 19:42:37 2011 @@ -1,6 +1,19 @@ /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package net.jini.security; Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/net/jini/security/MultiReadPermissionCollectionTest.java Mon Dec 19 19:42:37 2011 @@ -1,6 +1,19 @@ /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package net.jini.security; Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/api/security/DelegateCombinerSecurityManagerTest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/api/security/DelegateCombinerSecurityManagerTest.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/api/security/DelegateCombinerSecurityManagerTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/api/security/DelegateCombinerSecurityManagerTest.java Mon Dec 19 19:42:37 2011 @@ -111,7 +111,7 @@ public class DelegateCombinerSecurityMan Boolean result = Boolean.FALSE; Boolean expectedResult = Boolean.FALSE; try { - sm.checkPermission(p1, acc); + sm.checkPermission(p1, acc); result = Boolean.TRUE; } catch (SecurityException e){ result = Boolean.FALSE; @@ -125,7 +125,41 @@ public class DelegateCombinerSecurityMan Boolean result = Boolean.FALSE; Boolean expectedResult = Boolean.TRUE; try { - sm.checkPermission(p2, acc); + /* This permission check is cached, lets test performance. + */ + for (int i = 0; i < 200000; i++ ){ + sm.checkPermission(p2, acc); + } + result = Boolean.TRUE; + } catch (Exception e){ + e.printStackTrace(System.out); + result = Boolean.FALSE; + } + assertEquals(expectedResult,result); + } + + @Test + public void testCheckPermission3() { + System.out.println("checkPermission3"); + Boolean result = Boolean.FALSE; + Boolean expectedResult = Boolean.FALSE; + try { + sm.checkPermission(p3, acc); + result = Boolean.TRUE; + } catch (Exception e){ + e.printStackTrace(System.out); + result = Boolean.FALSE; + } + assertEquals(expectedResult,result); + } + + @Test + public void testCheckPermission4() { + System.out.println("checkPermission4"); + Boolean result = Boolean.FALSE; + Boolean expectedResult = Boolean.TRUE; + try { + sm.checkPermission(p4, acc); result = Boolean.TRUE; } catch (Exception e){ e.printStackTrace(System.out); 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=1220916&r1=1220915&r2=1220916&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 Dec 19 19:42:37 2011 @@ -22,8 +22,8 @@ package org.apache.river.impl.security.policy.util; -import org.apache.river.impl.security.policy.util.*; -import org.apache.river.impl.security.policy.util.DefaultPolicyParser; +import java.util.Properties; +import java.util.SortedSet; import java.io.File; import java.io.FileWriter; import java.net.URL; @@ -32,13 +32,14 @@ import java.security.Permission; import java.security.Principal; import java.security.SecurityPermission; import java.security.cert.Certificate; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; - import java.util.List; + import junit.framework.TestCase; import org.apache.river.api.security.PermissionGrant; +import org.junit.Test; /** @@ -94,6 +95,35 @@ public class DefaultPolicyParserTest ext tmp.delete(); } } + +// /** +// * Test of segment method, of class DefaultPolicyParser. +// */ +// @Test +// public void testSegment() throws Exception { +// System.out.println("segment"); +// String s = ""; +// Properties p = null; +// DefaultPolicyParser instance = new DefaultPolicyParser(); +// List expResult = new ArrayList(); +// List result = instance.segment(s, p); +// assertEquals(expResult, result); +// } +// +// /** +// * Test of expandURLs method, of class DefaultPolicyParser. +// */ +// @Test +// public void testExpandURLs() throws Exception { +// System.out.println("expandURLs"); +// String s = ""; +// Properties p = null; +// DefaultPolicyParser instance = new DefaultPolicyParser(); +// Collection expResult = null; +// Collection result = instance.expandURLs(s, p); +// assertEquals(expResult, result); +// } +// } class FakePrincipal implements Principal { Modified: river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/SegmentTest.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/SegmentTest.java?rev=1220916&r1=1220915&r2=1220916&view=diff ============================================================================== --- river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/SegmentTest.java (original) +++ river/jtsk/skunk/peterConcurrentPolicy/test/src/org/apache/river/impl/security/policy/util/SegmentTest.java Mon Dec 19 19:42:37 2011 @@ -18,7 +18,10 @@ package org.apache.river.impl.security.policy.util; +import java.util.List; +import java.util.Collection; import java.util.Properties; +import org.apache.river.impl.security.policy.util.PolicyUtils.ExpansionFailedException; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; @@ -35,14 +38,72 @@ public class SegmentTest { @Before public void setup(){ p = new Properties(); - p.setProperty("java.ext.dirs", "tests:foo:bar:cat"); + p.setProperty("java.ext.dirs", "tests:foo:bar:${jini.home}"); + p.setProperty("jini.home", "${river.apache.org}"); + p.setProperty("river.apache.org", "/opt/src/river"); } @Test - public void divideAndReplace(){ + public void divideAndReplace() throws ExpansionFailedException{ System.out.println("Test divideAndReplace"); + System.out.println(p.toString()); String policyGrantln = "file:${{java.ext.dirs}}/*"; + System.out.println(policyGrantln); + Segment seg = new Segment(policyGrantln, null); + String startMark = "${{"; + String endMark = "}}"; + seg.divideAndReplace(startMark, endMark, ":", p); + while (seg.hasNext()){ + System.out.println(seg.next()); + } + } + + @Test + public void divideAndReplaceTwice() throws ExpansionFailedException{ + System.out.println("Test nested divideAndReplace"); + System.out.println(p.toString()); + String policyGrantln = "file:${{java.ext.dirs}}/*"; + System.out.println(policyGrantln); + Segment seg = new Segment(policyGrantln, null); + String startMark = "${{"; + String endMark = "}}"; + seg.divideAndReplace(startMark, endMark, ":", p); + seg.divideAndReplace("${", "}", null, p); + while (seg.hasNext()){ + System.out.println(seg.next()); + } + } + + @Test + public void divideAndReplaceThrice() throws ExpansionFailedException{ + System.out.println("Test duplicate nested divideAndReplace"); + System.out.println(p.toString()); + String policyGrantln = "file:${{java.ext.dirs}}/*"; + System.out.println(policyGrantln); + Segment seg = new Segment(policyGrantln, null); + String startMark = "${{"; + String endMark = "}}"; + seg.divideAndReplace(startMark, endMark, ":", p); + seg.divideAndReplace("${", "}", null, p); + seg.divideAndReplace("${", "}", null, p); + while (seg.hasNext()){ + System.out.println(seg.next()); + } + } + + @Test + public void divideAndReplaceNoArray() throws ExpansionFailedException{ + System.out.println("Test divideAndReplace"); + System.out.println(p.toString()); + String policyGrantln = "file:${jini.home}/*"; + System.out.println(policyGrantln); + Segment seg = new Segment(policyGrantln, null); + String startMark = "${"; + String endMark = "}"; + seg.divideAndReplace(startMark, endMark, null, p); + while (seg.hasNext()){ + System.out.println(seg.next()); + } } - }
