I've raised an issue with INFRA: https://issues.apache.org/jira/servicedesk/customer/portal/1/INFRA-9439
Colm. On Mon, Apr 13, 2015 at 8:26 PM, Hal Lockhart <[email protected]> wrote: > I thought messages of this type would go to commits or some other list. > This will make dev unusable. > > Hal > > > -----Original Message----- > > From: [email protected] [mailto:[email protected]] > > Sent: Monday, April 13, 2015 11:38 AM > > To: [email protected] > > Subject: [10/51] [partial] incubator-openaz git commit: Initial seed of > > merged of AT&T and JP Morgan code > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTest.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTest.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTest.java > > new file mode 100755 > > index 0000000..be0b46f > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTest.java > > @@ -0,0 +1,95 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import java.io.File; > > + > > +/** > > + * ConformanceTest represents a collection of XACML files with a root > > Policy document, optional referenced Policy documents, a Request, and a > > Response. > > + * > > + * @author car > > + * @version $Revision: 1.2 $ > > + */ > > +public class ConformanceTest { > > + private String testName; > > + private File request; > > + private File response; > > + private ConformanceRepository repository; > > + > > + public ConformanceTest(String name, ConformanceRepository > > conformanceRepository, File fileRequest, File fileResponse) { > > + this.testName = name; > > + this.request = fileRequest; > > + this.response = fileResponse; > > + this.repository = conformanceRepository; > > + } > > + > > + public ConformanceTest(String name) { > > + this.testName = name; > > + } > > + > > + public String getTestName() { > > + return this.testName; > > + } > > + public void setTestName(String s) { > > + this.testName = s; > > + } > > + public ConformanceRepository getRepository() { > > + if (this.repository == null) { > > + this.repository = new ConformanceRepository(); > > + } > > + return this.repository; > > + } > > + public File getRequest() { > > + return this.request; > > + } > > + public void setRequest(File f) { > > + this.request = f; > > + } > > + public File getResponse() { > > + return this.response; > > + } > > + public void setResponse(File f) { > > + this.response = f; > > + } > > + > > + public boolean isComplete() { > > + return this.getTestName() != null && this.getRepository() > > != null && this.getRepository().hasRootPolicy() && this.getRequest() != > > null && this.getResponse() != null; > > + } > > + > > + @Override > > + public String toString() { > > + StringBuilder stringBuilder = new StringBuilder(); > > + boolean needColon = false; > > + if (this.getTestName() != null) { > > + stringBuilder.append(this.getTestName()); > > + needColon = true; > > + } > > + if (this.getRepository() != null) { > > + > > + } > > + if (this.getRequest() != null) { > > + if (needColon) { > > + stringBuilder.append(':'); > > + } > > + stringBuilder.append(this.getRequest().getName()); > > + needColon = true; > > + } > > + if (this.getResponse() != null) { > > + if (needColon) { > > + stringBuilder.append(':'); > > + } > > + stringBuilder.append(this.getResponse().getName()); > > + needColon = true; > > + } > > + return stringBuilder.toString(); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestEngine.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestEngine.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestEngine.java > > new file mode 100755 > > index 0000000..822006a > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestEngine.java > > @@ -0,0 +1,210 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import org.apache.commons.logging.Log; > > +import org.apache.commons.logging.LogFactory; > > + > > +import com.att.research.xacml.api.Request; > > +import com.att.research.xacml.api.Response; > > +import com.att.research.xacml.api.pdp.PDPEngine; > > +import com.att.research.xacml.api.pdp.PDPEngineFactory; > > +import com.att.research.xacml.api.pdp.ScopeResolver; > > +import com.att.research.xacml.std.dom.DOMProperties; > > +import com.att.research.xacml.std.dom.DOMRequest; > > +import com.att.research.xacml.std.dom.DOMResponse; > > +import com.att.research.xacml.util.FactoryException; > > + > > +/** > > + * ConformanceTestEngine handles the creation of the PDPEngine for a > > ConformanceTest instance. > > + * > > + * @author car > > + * @version $Revision: 1.2 $ > > + */ > > +public class ConformanceTestEngine { > > + private Log logger = > > LogFactory.getLog(ConformanceTestEngine.class); > > + > > + private PDPEngineFactory pdpEngineFactory; > > + private ScopeResolver scopeResolver; > > + private boolean lenientRequests; > > + private boolean lenientPolicies; > > + private int iterations = 1; > > + > > + // total of all first calls to decide() > > + private long firstDecideTime; > > + private int numberOfFirstDecides = 0; > > + > > + // total of all non-first-calls to decide() > > + private long decideTimeMultiple; > > + > > + // total of average time each test case uses for a Request > > + // (sum of : for each test case, average of all non-first-call > > calls to decide() ) > > + private long avgDecideTimeMultiple = 0; > > + > > + protected PDPEngineFactory getPDPEngineFactory() throws > > FactoryException { > > + if (this.pdpEngineFactory == null) { > > + this.pdpEngineFactory = > > PDPEngineFactory.newInstance(); > > + > > this.pdpEngineFactory.setScopeResolver(this.scopeResolver); > > + } > > + return this.pdpEngineFactory; > > + } > > + > > + public ConformanceTestEngine(ScopeResolver scopeResolverIn, > > boolean lenientRequestsIn, boolean lenientPoliciesIn, int iterationsIn) > > { > > + this.scopeResolver = scopeResolverIn; > > + this.lenientRequests = lenientRequestsIn; > > + this.lenientPolicies = lenientPoliciesIn; > > + this.iterations = iterationsIn; > > + } > > + > > + public ConformanceTestResult run(ConformanceTest conformanceTest) > > { > > + if (conformanceTest.getRequest() == null || > > conformanceTest.getResponse() == null || > > conformanceTest.getRepository() == null) { > > + logger.error("Incomplete Conformance Test: " + > > conformanceTest.getTestName()); > > + } > > + PDPEngineFactory thisPDPEngineFactory = null; > > + try { > > + thisPDPEngineFactory = > this.getPDPEngineFactory(); > > + } catch (FactoryException ex) { > > + return new ConformanceTestResult(conformanceTest, > > ex); > > + } > > + > > + ConformanceTestResult conformanceTestResult = new > > ConformanceTestResult(conformanceTest, iterations); > > + > > + /* > > + * Load the request > > + */ > > + Request request = null; > > + boolean isLenient = > DOMProperties.isLenient(); > > + try { > > + DOMProperties.setLenient(this.lenientRequests); > > + try { > > + request = > > DOMRequest.load(conformanceTest.getRequest()); > > + conformanceTestResult.setRequest(request); > > + } catch (Exception ex) { > > + logger.error("Exception loading Request > file " > > + conformanceTest.getRequest().getAbsolutePath(), ex); > > + conformanceTestResult.setError(ex); > > + return conformanceTestResult; > > + > > + } > > + > > + /* > > + * Load the expected response > > + */ > > + Response response = null; > > + try { > > + response = > > DOMResponse.load(conformanceTest.getResponse()); > > + > > conformanceTestResult.setExpectedResponse(response); > > + } catch (Exception ex) { > > + logger.error("Exception loading Response > file " > > + conformanceTest.getResponse().getAbsolutePath(), ex); > > + conformanceTestResult.setError(ex); > > + return conformanceTestResult; > > + } > > + > > + /* > > + * Set up the configuration for the policy finder > > + */ > > + > conformanceTest.getRepository().setXACMLProperties(); > > + DOMProperties.setLenient(this.lenientPolicies); > > + > > + /* > > + * Create the engine > > + */ > > + PDPEngine pdpEngine = null; > > + try { > > + // pdpEngine = > > thisPDPEngineFactory.newEngine(conformanceTest.getRootPolicy(), > > conformanceTest.getReferencedPolicies(), pipFinderEngine); > > + pdpEngine = > > thisPDPEngineFactory.newEngine(); > > + } catch (Exception ex) { > > + logger.error("Exception getting PDP engine > > instance", ex); > > + conformanceTestResult.setError(ex); > > + return conformanceTestResult; > > + } > > + if (pdpEngine == null) { > > + logger.error("Null PDP engine"); > > + conformanceTestResult.setError(new > > NullPointerException("Null engine")); > > + return conformanceTestResult; > > + } > > + > > + /* > > + * Run the request > > + */ > > + long startTime, endTime; > > + long curDecideTime = this.firstDecideTime; > > + try { > > + startTime = System.nanoTime(); > > + response = > pdpEngine.decide(request); > > + endTime = System.nanoTime(); > > +//System.out.println(endTime - startTime); > > + // add to total > > + this.firstDecideTime += endTime - > startTime; > > + this.numberOfFirstDecides++; > > + // remember just this test > > + > conformanceTestResult.setFirstCallTime(endTime > > - startTime); > > + > > conformanceTestResult.setActualResponse(response); > > + } catch (Exception ex) { > > + logger.error("Exception in decide", ex); > > + conformanceTestResult.setError(ex); > > + return conformanceTestResult; > > + } > > + if (response == null) { > > + logger.error("Null Response"); > > + conformanceTestResult.setError(new > > NullPointerException("Null Response")); > > + return conformanceTestResult; > > + } > > + > > + long localLoopTime = 0; > > + try { > > + // if user requested non-first-call calls > to > > decide() to get performance info, run them now. > > + // We can ignore the result since we are > only > > interested in how long they take to process the Request. > > + for (int i = 0 ; i < this.iterations ; > i++) { > > + startTime = > System.nanoTime(); > > + pdpEngine.decide(request); > > + endTime = System.nanoTime(); > > +//System.out.println(endTime - startTime); > > > > + // add to the global total for all > tests > > + this.decideTimeMultiple += > (endTime - > > startTime); > > + // remember just this one test's > info > > + localLoopTime += (endTime - > startTime); > > + } > > + } catch (Exception ex) { > > + logger.error("Exception in iterated > decide", > > ex); > > + return conformanceTestResult; > > + } > > + > > + // add to total average for non-first-call times > for > > all test cases > > + avgDecideTimeMultiple += (localLoopTime / > > iterations); > > +//System.out.println("localLoop="+localLoopTime + " it="+iterations > > + " avg=" + (localLoopTime / iterations) ); > > + // remember average time for just this test > > + > > conformanceTestResult.setAverageTotalLoopTime(localLoopTime/itera > > tions); > > + > > + long elapsedDecideTime = this.firstDecideTime - > > curDecideTime; > > + logger.info("Decide Time: " + elapsedDecideTime + > > "ns"); > > + > > + return conformanceTestResult; > > + } finally { > > + DOMProperties.setLenient(isLenient); > > + } > > + } > > + > > + public long getFirstDecideTime() { > > + return this.firstDecideTime; > > + } > > + > > + public long getDecideTimeMultiple() { > > + return this.decideTimeMultiple; > > + } > > + > > + > > + public long getAvgFirstDecideTime() { > > + return this.firstDecideTime / numberOfFirstDecides; > > + } > > + public long getAvgDecideTimeMultiple() { > > + return this.avgDecideTimeMultiple / numberOfFirstDecides; > > + } > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestResult.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestResult.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestResult.java > > new file mode 100755 > > index 0000000..9c895c6 > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestResult.java > > @@ -0,0 +1,113 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import com.att.research.xacml.api.Request; > > +import com.att.research.xacml.api.Response; > > + > > +/** > > + * ConformanceTestResult holds all of the objects for a single > > conformance test run. > > + * > > + * @author car > > + * @version $Revision: 1.1 $ > > + */ > > +public class ConformanceTestResult { > > + private ConformanceTest conformanceTest; > > + private Request request; > > + private Response expectedResponse; > > + private Response actualResponse; > > + private ResponseMatchResult responseMatchResult; > > + private Exception error; > > + > > + // performance timings > > + private long firstCallTime; > > + private long averageTotalLoopTime; > > + > > + // how many non-first-call times the decide() was called > > + private int iterations; > > + > > + public ConformanceTestResult(ConformanceTest conformanceTestIn, > > int iterations) { > > + this.conformanceTest = conformanceTestIn; > > + this.iterations = iterations; > > + } > > + > > + public ConformanceTestResult(ConformanceTest conformanceTestIn, > > Exception errorIn) { > > + this.conformanceTest = conformanceTestIn; > > + this.error = errorIn; > > + } > > + > > + public int getIterations() { > > + return this.iterations; > > + } > > + > > + public ConformanceTest getConformanceTest() { > > + return this.conformanceTest; > > + } > > + public void setConformanceTest(ConformanceTest conformanceTestIn) > > { > > + this.conformanceTest = conformanceTestIn; > > + } > > + > > + public Request getRequest() { > > + return this.request; > > + } > > + public void setRequest(Request requestIn) { > > + this.request = requestIn; > > + } > > + > > + public Response getExpectedResponse() { > > + return this.expectedResponse; > > + } > > + public void setExpectedResponse(Response response) { > > + this.expectedResponse = response; > > + this.responseMatchResult = null; > > + } > > + > > + public Response getActualResponse() { > > + return this.actualResponse; > > + } > > + public void setActualResponse(Response response) { > > + this.actualResponse = response; > > + this.responseMatchResult = null; > > + } > > + > > + public ResponseMatchResult getResponseMatchResult() { > > + if (this.responseMatchResult == null && > > (this.actualResponse != null && this.expectedResponse != null)) { > > + this.computeResponseMatchResult(); > > + } > > + return this.responseMatchResult; > > + } > > + public void computeResponseMatchResult() { > > + if (this.expectedResponse != null && this.actualResponse != > > null) { > > + this.responseMatchResult = > > ResponseMatchResult.newInstance(this.expectedResponse, > > this.actualResponse); > > + } > > + } > > + public Exception getError() { > > + return this.error; > > + } > > + public void setError(Exception ex) { > > + this.error = ex; > > + } > > + > > + public long getFirstCallTime() { > > + return firstCallTime; > > + } > > + public void setFirstCallTime(long t) { > > + firstCallTime = t; > > + } > > + public long getAverageTotalLoopTime(){ > > + return averageTotalLoopTime; > > + } > > + public void setAverageTotalLoopTime(long t) { > > + averageTotalLoopTime = t; > > + } > > + > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestSet.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestSet.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestSet.java > > new file mode 100755 > > index 0000000..a04b50c > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Confo > > rmanceTestSet.java > > @@ -0,0 +1,171 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import java.io.File; > > +import java.io.IOException; > > +import java.nio.file.FileVisitResult; > > +import java.nio.file.FileVisitor; > > +import java.nio.file.Files; > > +import java.nio.file.Path; > > +import java.nio.file.attribute.BasicFileAttributes; > > +import java.util.ArrayList; > > +import java.util.Collections; > > +import java.util.HashMap; > > +import java.util.Iterator; > > +import java.util.List; > > +import java.util.Map; > > + > > +import org.apache.commons.logging.Log; > > +import org.apache.commons.logging.LogFactory; > > + > > +/** > > + * ConformanceTestSet represents a collection of > > <code>ConformanceTest</code>s ordered by the test name. It has methods > > for > > + * scanning a directory to generate an ordered set. > > + * > > + * @author car > > + * @version $Revision: 1.1 $ > > + */ > > +public class ConformanceTestSet { > > + private static final Log logger > > = LogFactory.getLog(ConformanceTestSet.class); > > + private List<ConformanceTest> listConformanceTests = new > > ArrayList<ConformanceTest>(); > > + > > + protected List<ConformanceTest> getListConformanceTests() { > > + return this.listConformanceTests; > > + } > > + > > + protected ConformanceTestSet() { > > + > > + } > > + > > + private static String getTestName(String fileName, int itemPos) { > > + return (itemPos == 0 ? "NULL" : fileName.substring(0, > > itemPos)); > > + } > > + > > + private static String getTestName(File file) { > > + String fileName = file.getName(); > > + int itemPos = fileName.indexOf("Policy"); > > + if (itemPos >= 0) { > > + return getTestName(fileName, itemPos); > > + } else if ((itemPos = fileName.indexOf("Request")) >= 0) { > > + return getTestName(fileName, itemPos); > > + } else if ((itemPos = fileName.indexOf("Response")) >= 0) { > > + return getTestName(fileName, itemPos); > > + } else if ((itemPos = fileName.indexOf("Repository")) >= 0) > > { > > + return getTestName(fileName, itemPos); > > + } else { > > + return null; > > + } > > + } > > + > > + public static ConformanceTestSet loadDirectory(File fileDir) > > throws IOException { > > + final Map<String,ConformanceTest> mapConformanceTests = > new > > HashMap<String,ConformanceTest>(); > > + > > + Files.walkFileTree(fileDir.toPath(), new > > FileVisitor<Path>() { > > + @Override > > + public FileVisitResult preVisitDirectory(Path dir, > > BasicFileAttributes attrs) throws IOException { > > + logger.info("Scanning directory " + > > dir.getFileName()); > > + return FileVisitResult.CONTINUE; > > + } > > + > > + @Override > > + public FileVisitResult visitFile(Path file, > > BasicFileAttributes attrs) throws IOException { > > + File fileVisited = file.toFile(); > > + String fileName = > > fileVisited.getName(); > > + if (fileName.endsWith(".xml") || > > fileName.endsWith(".properties")) { > > + String testName = > > getTestName(fileVisited); > > + if (testName != null) { > > + ConformanceTest > conformanceTest > > = mapConformanceTests.get(testName); > > + if (conformanceTest == > null) { > > + logger.info("Added > test " + > > testName); > > + conformanceTest = > new > > ConformanceTest(testName); > > + > > mapConformanceTests.put(testName, conformanceTest); > > + } > > + if > > (fileName.endsWith("Policy.xml")) { > > + > > conformanceTest.getRepository().addRootPolicy(fileVisited); > > + } else if > > (fileName.endsWith("Repository.properties")) { > > + > > conformanceTest.getRepository().load(fileVisited); > > + } else if > > (fileName.endsWith("Request.xml")) { > > + > > conformanceTest.setRequest(fileVisited); > > + } else if > > (fileName.endsWith("Response.xml")) { > > + > > conformanceTest.setResponse(fileVisited); > > + } > > + } > > + } > > + return FileVisitResult.CONTINUE; > > + } > > + > > + @Override > > + public FileVisitResult visitFileFailed(Path file, > > IOException exc) throws IOException { > > + logger.warn("Skipped " + > file.getFileName()); > > + return FileVisitResult.CONTINUE; > > + } > > + > > + @Override > > + public FileVisitResult postVisitDirectory(Path dir, > > IOException exc) throws IOException { > > + return FileVisitResult.CONTINUE; > > + } > > + }); > > + > > + /* > > + * Sort the keyset and pull out the tests that have the > > required components > > + */ > > + List<String> listTestNames = new ArrayList<String>(); > > + listTestNames.addAll(mapConformanceTests.keySet()); > > + Collections.sort(listTestNames); > > + > > + ConformanceTestSet conformanceTestSet = new > > ConformanceTestSet(); > > + Iterator<String> iterTestNames = > > listTestNames.iterator(); > > + while (iterTestNames.hasNext()) { > > + ConformanceTest conformanceTest = > > mapConformanceTests.get(iterTestNames.next()); > > + if (conformanceTest.isComplete()) { > > + > > conformanceTestSet.addConformanceTest(conformanceTest); > > + logger.debug("Added conformance test " + > > conformanceTest.getTestName()); > > + } else { > > + logger.warn("Incomplete conformance test " > + > > conformanceTest.getTestName()); > > + } > > + } > > + > > + return conformanceTestSet; > > + > > + } > > + > > + public Iterator<ConformanceTest> getConformanceTests() { > > + return this.listConformanceTests.iterator(); > > + } > > + > > + public void addConformanceTest(ConformanceTest conformanceTest) { > > + this.listConformanceTests.add(conformanceTest); > > + } > > + > > + public void addConformanceTestSet(ConformanceTestSet > > conformanceTestSet) { > > + > > this.listConformanceTests.addAll(conformanceTestSet.getListConfor > > manceTests()); > > + } > > + > > + public static void main(String[] args) { > > + for (String dir : args) { > > + try { > > + ConformanceTestSet conformanceTestSet > > = ConformanceTestSet.loadDirectory(new File(dir)); > > + Iterator<ConformanceTest> > iterConformanceTests > > = conformanceTestSet.getConformanceTests(); > > + if (iterConformanceTests == null) { > > + System.out.println("No tests found > in " + > > dir); > > + } else { > > + System.out.println("Tests found in > " + > > dir); > > + while > (iterConformanceTests.hasNext()) { > > + > > System.out.println(iterConformanceTests.next().toString()); > > + } > > + } > > + } catch (Exception ex) { > > + ex.printStackTrace(System.err); > > + } > > + } > > + } > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Respo > > nseMatchResult.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Respo > > nseMatchResult.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Respo > > nseMatchResult.java > > new file mode 100755 > > index 0000000..00db0dc > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Respo > > nseMatchResult.java > > @@ -0,0 +1,128 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import java.util.ArrayList; > > +import java.util.Collection; > > +import java.util.Iterator; > > +import java.util.List; > > + > > +import com.att.research.xacml.api.Response; > > +import com.att.research.xacml.api.Result; > > + > > +/** > > + * ResponseMatchResult provides information about how a {@link > > com.att.research.xacml.api.Response} object matches > > + * another <code>Response</code> object. > > + * > > + * @author car > > + * @version $Revision: 1.1 $ > > + */ > > +public class ResponseMatchResult { > > + private List<ResultMatchResult> resultMatchResults = new > > ArrayList<ResultMatchResult>(); > > + > > + private boolean bAssociatedAdviceMatches = > true; > > + private boolean bAttributesMatch > = > > true; > > + private boolean bDecisionsMatch > > = true; > > + private boolean bStatusCodesMatch > = > > true; > > + private boolean bObligationsMatch > = > > true; > > + private boolean bPolicyIdentifiersMatch = > > true; > > + private boolean bPolicySetIdentifiersMatch = > > true; > > + private boolean bNumResultsMatch > = > > true; > > + private boolean bUnknownFunction; > > + > > + protected void addResultMatchResult(ResultMatchResult > > resultMatchResult) { > > + this.resultMatchResults.add(resultMatchResult); > > + this.bAssociatedAdviceMatches = > > resultMatchResult.associatedAdviceMatches() && > > this.bAssociatedAdviceMatches; > > + this.bAttributesMatch = > > resultMatchResult.attributesMatch() && this.bAttributesMatch; > > + this.bDecisionsMatch = > > resultMatchResult.decisionsMatch() && this.bDecisionsMatch; > > + this.bStatusCodesMatch = > > resultMatchResult.statusCodesMatch() && this.bStatusCodesMatch; > > + this.bObligationsMatch = > > resultMatchResult.obligationsMatch() && this.bObligationsMatch; > > + this.bPolicyIdentifiersMatch = > > resultMatchResult.policyIdentifiersMatch() && > > this.bPolicyIdentifiersMatch; > > + this.bPolicySetIdentifiersMatch = > > resultMatchResult.policySetIdentifiersMatch() && > > this.bPolicySetIdentifiersMatch; > > + this.bUnknownFunction = > > resultMatchResult.unknownFunction() || this.bUnknownFunction; > > + } > > + > > + protected void setNumResultsMatch(boolean b) { > > + this.bNumResultsMatch = b; > > + } > > + > > + public ResponseMatchResult() { > > + } > > + > > + public static ResponseMatchResult newInstance(Response response1, > > Response response2) { > > + ResponseMatchResult responseMatchResult = new > > ResponseMatchResult(); > > + > > + Collection<Result> listResultsResponse1 = > > response1.getResults(); > > + Collection<Result> listResultsResponse2 = > > response2.getResults(); > > + if (listResultsResponse1.size() == 1 && > > listResultsResponse2.size() == 1) { > > + /* > > + * Just add a single ResultMatchResult comparing > the > > results in the two responses > > + */ > > + > > responseMatchResult.addResultMatchResult(ResultMatchResult.newIns > > tance(listResultsResponse1.iterator().next(), > > listResultsResponse2.iterator().next())); > > + } else { > > + /* > > + * Iterate over all of the results in the two > > responses and match them > > + */ > > + Iterator<Result> iterResponse1Results = > > listResultsResponse1.iterator(); > > + Iterator<Result> iterResponse2Results = > > listResultsResponse2.iterator(); > > + while ((iterResponse1Results != null && > > iterResponse1Results.hasNext()) || (iterResponse2Results != null && > > iterResponse2Results.hasNext())) { > > + Result result1 = (iterResponse1Results != > > null && iterResponse1Results.hasNext() ? iterResponse1Results.next() : > > null); > > + Result result2 = (iterResponse2Results != > > null && iterResponse2Results.hasNext() ? iterResponse2Results.next() : > > null); > > + if ((result1 == null || result2 == null) && > > responseMatchResult.numResultsMatch()) { > > + > > responseMatchResult.setNumResultsMatch(false); > > + } > > + > > responseMatchResult.addResultMatchResult(ResultMatchResult.newIns > > tance(result1, result2)); > > + } > > + } > > + return responseMatchResult; > > + } > > + > > + public Iterator<ResultMatchResult> getResultMatchResults() { > > + return this.resultMatchResults.iterator(); > > + } > > + > > + public boolean numResultsMatch() { > > + return this.bNumResultsMatch; > > + } > > + > > + public boolean associatedAdviceMatches() { > > + return this.bAssociatedAdviceMatches; > > + } > > + > > + public boolean attributesMatch() { > > + return this.bAttributesMatch; > > + } > > + > > + public boolean decisionsMatch() { > > + return this.bDecisionsMatch; > > + } > > + > > + public boolean obligationsMatch() { > > + return this.bObligationsMatch; > > + } > > + > > + public boolean policyIdentifiersMatch() { > > + return this.bPolicyIdentifiersMatch; > > + } > > + > > + public boolean policySetIdentifiersMatch() { > > + return this.bPolicySetIdentifiersMatch; > > + } > > + > > + public boolean statusCodesMatch() { > > + return this.bStatusCodesMatch; > > + } > > + > > + public boolean unknownFunction() { > > + return this.bUnknownFunction; > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Resul > > tMatchResult.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Resul > > tMatchResult.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Resul > > tMatchResult.java > > new file mode 100755 > > index 0000000..645a755 > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/conformance/Resul > > tMatchResult.java > > @@ -0,0 +1,127 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2013 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.conformance; > > + > > +import com.att.research.xacml.api.Result; > > +import com.att.research.xacml.std.StdStatusCode; > > +import com.att.research.xacml.util.ListUtil; > > + > > +/** > > + * ResultMatchResult provides information about how well a {@link > > com.att.research.xacml.api.Result} object matches > > + * another <code>Result</code> object. > > + * > > + * @author car > > + * @version $Revision: 1.1 $ > > + */ > > +public class ResultMatchResult { > > + private boolean bAssociatedAdviceMatches = true; > > + private boolean bAttributesMatch = true; > > + private boolean bDecisionsMatch = true; > > + private boolean bObligationsMatch = true; > > + private boolean bPolicyIdentifiersMatch = true; > > + private boolean bPolicySetIdentifiersMatch = true; > > + private boolean bStatusCodesMatch = true; > > + private boolean bUnknownFunction = false; > > + > > + protected void setAssociatedAdviceMatches(boolean b) { > > + this.bAssociatedAdviceMatches = b; > > + } > > + protected void setAttributesMatch(boolean b) { > > + this.bAttributesMatch = b; > > + } > > + protected void setDecisionsMatch(boolean b) { > > + this.bDecisionsMatch = b; > > + } > > + protected void setObligationsMatch(boolean b) { > > + this.bObligationsMatch = b; > > + } > > + protected void setPolicyIdentifiersMatch(boolean b) { > > + this.bPolicyIdentifiersMatch = b; > > + } > > + protected void setPolicySetIdentifiersMatch(boolean b) { > > + this.bPolicySetIdentifiersMatch = b; > > + } > > + protected void setStatusCodesMatch(boolean b) { > > + this.bStatusCodesMatch = b; > > + } > > + protected void setUnknownFunction(boolean b) { > > + this.bUnknownFunction = b; > > + } > > + > > + public ResultMatchResult() { > > + } > > + > > + public static ResultMatchResult newInstance(Result result1, > > Result result2) { > > + ResultMatchResult resultMatchResult = new > > ResultMatchResult(); > > + if (result2 != null && result2.getStatus() != null && > > + > > result2.getStatus().getStatusCode().equals(StdStatusCode.STATUS_C > > ODE_PROCESSING_ERROR) && > > + result2.getStatus().getStatusMessage() != null && > > + > > result2.getStatus().getStatusMessage().contains("Unknown > > Function") > > + ) { > > + resultMatchResult.setUnknownFunction(true); > > + } > > + if (result1 == null || result2 == null) { > > + > resultMatchResult.setAssociatedAdviceMatches(false); > > + resultMatchResult.setAttributesMatch(false); > > + resultMatchResult.setDecisionsMatch(false); > > + resultMatchResult.setObligationsMatch(false); > > + resultMatchResult.setPolicyIdentifiersMatch(false); > > + > > resultMatchResult.setPolicySetIdentifiersMatch(false); > > + resultMatchResult.setStatusCodesMatch(false); > > + } else { > > + > > resultMatchResult.setAssociatedAdviceMatches(ListUtil.equalsAllow > > Nulls(result1.getAssociatedAdvice(), result2.getAssociatedAdvice())); > > + > > resultMatchResult.setAttributesMatch(ListUtil.equalsAllowNulls(re > > sult1.getAttributes(), result2.getAttributes())); > > + > > resultMatchResult.setDecisionsMatch(result1.getDecision() == > > result2.getDecision()); > > + > > resultMatchResult.setObligationsMatch(ListUtil.equalsAllowNulls(r > > esult1.getObligations(), result2.getObligations())); > > + > > resultMatchResult.setPolicyIdentifiersMatch(ListUtil.equalsAllowN > > ulls(result1.getPolicyIdentifiers(), result2.getPolicyIdentifiers())); > > + > > resultMatchResult.setPolicySetIdentifiersMatch(ListUtil.equalsAll > > owNulls(result1.getPolicySetIdentifiers(), > > result2.getPolicySetIdentifiers())); > > + if (result1.getStatus() == null || > > result1.getStatus().getStatusCode() == null || result2.getStatus() == > > null || result2.getStatus().getStatusCode() == null) { > > + > resultMatchResult.setStatusCodesMatch(false); > > + } else { > > + > > resultMatchResult.setStatusCodesMatch(result1.getStatus().getStat > > usCode().equals(result2.getStatus().getStatusCode())); > > + } > > + } > > + return resultMatchResult; > > + } > > + > > + public boolean associatedAdviceMatches() { > > + return this.bAssociatedAdviceMatches; > > + } > > + > > + public boolean attributesMatch() { > > + return this.bAttributesMatch; > > + } > > + > > + public boolean decisionsMatch() { > > + return this.bDecisionsMatch; > > + } > > + > > + public boolean obligationsMatch() { > > + return this.bObligationsMatch; > > + } > > + > > + public boolean policyIdentifiersMatch() { > > + return this.bPolicyIdentifiersMatch; > > + } > > + > > + public boolean policySetIdentifiersMatch() { > > + return this.bPolicySetIdentifiersMatch; > > + } > > + > > + public boolean statusCodesMatch() { > > + return this.bStatusCodesMatch; > > + } > > + > > + public boolean unknownFunction() { > > + return this.bUnknownFunction; > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomData > > TypeFactory.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomData > > TypeFactory.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomData > > TypeFactory.java > > new file mode 100755 > > index 0000000..b3e6cc4 > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomData > > TypeFactory.java > > @@ -0,0 +1,78 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.util.HashMap; > > +import java.util.Map; > > + > > +import com.att.research.xacml.api.DataType; > > +import com.att.research.xacml.api.DataTypeFactory; > > +import com.att.research.xacml.api.Identifier; > > +import com.att.research.xacml.std.datatypes.DataTypes; > > + > > +public class CustomDataTypeFactory extends DataTypeFactory { > > + private static final Map<Identifier,DataType<?>> > > mapIdentifiersToDataTypes = new HashMap<Identifier,DataType<?>>(); > > + private static boolean mapNeedsInit > > = true; > > + > > + public static final DataTypePrivateKey > > DT_PRIVATEKEY = > > DataTypePrivateKey.newInstance(); > > + public static final DataTypePublicKey > > DT_PUBLICKEY = > > DataTypePublicKey.newInstance(); > > + > > + private static void registerDataType(DataType<?> dataType) { > > + if (dataType != null && dataType.getId() != null) { > > + mapIdentifiersToDataTypes.put(dataType.getId(), > > dataType); > > + } > > + } > > + > > + private static void initMap() { > > + if (mapNeedsInit) { > > + synchronized(mapIdentifiersToDataTypes) { > > + if (mapNeedsInit) { > > + > registerDataType(DataTypes.DT_ANYURI); > > + > > registerDataType(DataTypes.DT_BASE64BINARY); > > + > registerDataType(DataTypes.DT_BOOLEAN); > > + > registerDataType(DataTypes.DT_DATE); > > + > registerDataType(DataTypes.DT_DATETIME); > > + > > registerDataType(DataTypes.DT_DAYTIMEDURATION); > > + > registerDataType(DataTypes.DT_DNSNAME); > > + > registerDataType(DataTypes.DT_DOUBLE); > > + > registerDataType(DataTypes.DT_HEXBINARY); > > + > registerDataType(DataTypes.DT_INTEGER); > > + > registerDataType(DataTypes.DT_IPADDRESS); > > + > > registerDataType(DataTypes.DT_RFC822NAME); > > + > registerDataType(DataTypes.DT_STRING); > > + > registerDataType(DataTypes.DT_TIME); > > + > registerDataType(DataTypes.DT_X500NAME); > > + > > registerDataType(DataTypes.DT_XPATHEXPRESSION); > > + > > registerDataType(DataTypes.DT_YEARMONTHDURATION); > > + // > > + // These are the custom data types! > > + // > > + registerDataType(DT_PRIVATEKEY); > > + registerDataType(DT_PUBLICKEY); > > + // > > + // Done > > + // > > + mapNeedsInit = false; > > + } > > + } > > + } > > + } > > + > > + public CustomDataTypeFactory() { > > + initMap(); > > + } > > + > > + @Override > > + public DataType<?> getDataType(Identifier dataTypeId) { > > + return mapIdentifiersToDataTypes.get(dataTypeId); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomFunc > > tionDefinitionFactory.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomFunc > > tionDefinitionFactory.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomFunc > > tionDefinitionFactory.java > > new file mode 100755 > > index 0000000..dd4decb > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/CustomFunc > > tionDefinitionFactory.java > > @@ -0,0 +1,80 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.lang.reflect.Field; > > +import java.lang.reflect.Modifier; > > +import java.security.PrivateKey; > > +import java.security.PublicKey; > > +import java.util.HashMap; > > +import java.util.Map; > > + > > +import com.att.research.xacml.api.Identifier; > > +import com.att.research.xacml.std.IdentifierImpl; > > +import com.att.research.xacmlatt.pdp.policy.FunctionDefinition; > > +import com.att.research.xacmlatt.pdp.policy.FunctionDefinitionFactory; > > +import com.att.research.xacmlatt.pdp.std.StdFunctions; > > +import > > com.att.research.xacmlatt.pdp.std.functions.FunctionDefinitionBagOneAnd > > Only; > > + > > +public class CustomFunctionDefinitionFactory extends > > FunctionDefinitionFactory { > > + private static Map<Identifier,FunctionDefinition> > > mapFunctionDefinitions = new > > HashMap<Identifier,FunctionDefinition>(); > > + private static boolean > > needMapInit = true; > > + > > + public static final Identifier > > ID_FUNCTION_PRIVATEKEY_ONE_AND_ONLY = new > > IdentifierImpl("urn:com:att:research:xacml:custom:function:3.0:rsa:priv > > atekey-one-and-only"); > > + public static final Identifier ID_FUNCTION_PUBLICKEY_ONE_AND_ONLY > > = new > > IdentifierImpl("urn:com:att:research:xacml:custom:function:3.0:rsa:publ > > ickey-one-and-only"); > > + > > + public static final FunctionDefinition > > FD_PRIVATEKEY_ONE_AND_ONLY = new > > FunctionDefinitionBagOneAndOnly<PrivateKey>(ID_FUNCTION_PRIVATEKEY_ONE_ > > AND_ONLY, DataTypePrivateKey.newInstance()); > > + public static final FunctionDefinition > > FD_PUBLICKEY_ONE_AND_ONLY = new > > FunctionDefinitionBagOneAndOnly<PublicKey>(ID_FUNCTION_PUBLICKEY_ONE_AN > > D_ONLY, DataTypePublicKey.newInstance()); > > + > > + private static void register(FunctionDefinition > > functionDefinition) { > > + mapFunctionDefinitions.put(functionDefinition.getId(), > > functionDefinition); > > + } > > + > > + private static void initMap() { > > + if (needMapInit) { > > + synchronized(mapFunctionDefinitions) { > > + if (needMapInit) { > > + needMapInit = false; > > + Field[] declaredFields = > > StdFunctions.class.getDeclaredFields(); > > + for (Field field : declaredFields) > { > > + if > > (Modifier.isStatic(field.getModifiers()) && > > + > > field.getName().startsWith(StdFunctions.FD_PREFIX) && > > + > > FunctionDefinition.class.isAssignableFrom(field.getType()) && > > + > > Modifier.isPublic(field.getModifiers()) > > + ) { > > + try { > > + > > register((FunctionDefinition)(field.get(null))); > > + } catch > > (IllegalAccessException ex) { > > + > > + } > > + } > > + } > > + // > > + // Our custom function > > + // > > + > > register(FunctionDefinitionDecrypt.newInstance()); > > + > register(FD_PRIVATEKEY_ONE_AND_ONLY); > > + > register(FD_PUBLICKEY_ONE_AND_ONLY); > > + } > > + } > > + } > > + } > > + > > + public CustomFunctionDefinitionFactory() { > > + initMap(); > > + } > > + > > + @Override > > + public FunctionDefinition getFunctionDefinition(Identifier > > functionId) { > > + return mapFunctionDefinitions.get(functionId); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePr > > ivateKey.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePr > > ivateKey.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePr > > ivateKey.java > > new file mode 100755 > > index 0000000..4e12aef > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePr > > ivateKey.java > > @@ -0,0 +1,44 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.security.PrivateKey; > > + > > +import com.att.research.xacml.api.DataTypeException; > > +import com.att.research.xacml.api.Identifier; > > +import com.att.research.xacml.std.IdentifierImpl; > > +import com.att.research.xacml.std.datatypes.DataTypeBase; > > + > > +public class DataTypePrivateKey extends DataTypeBase<PrivateKey> { > > + public static final Identifier DT_PRIVATEKEY = new > > IdentifierImpl("urn:com:att:research:xacml:custom:3.0:rsa:private"); > > + private static final DataTypePrivateKey singleInstance = new > > DataTypePrivateKey(); > > + > > + private DataTypePrivateKey() { > > + super(DT_PRIVATEKEY, PrivateKey.class); > > + } > > + > > + public static DataTypePrivateKey newInstance() { > > + return singleInstance; > > + } > > + > > + @Override > > + public PrivateKey convert(Object source) throws DataTypeException > > { > > + if (source == null || (source instanceof PrivateKey) ) { > > + return (PrivateKey) source; > > + } else if (source instanceof byte[]) { > > + return (PrivateKey) source; > > + } else if (source instanceof String) { > > + return (PrivateKey) (Object) ((String) > > source).getBytes(); > > + } > > + throw new DataTypeException(this, "Failed to convert \"" + > > source.getClass().getCanonicalName()); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePu > > blicKey.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePu > > blicKey.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePu > > blicKey.java > > new file mode 100755 > > index 0000000..d40ee82 > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/DataTypePu > > blicKey.java > > @@ -0,0 +1,44 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.security.PublicKey; > > + > > +import com.att.research.xacml.api.DataTypeException; > > +import com.att.research.xacml.api.Identifier; > > +import com.att.research.xacml.std.IdentifierImpl; > > +import com.att.research.xacml.std.datatypes.DataTypeBase; > > + > > +public class DataTypePublicKey extends DataTypeBase<PublicKey> { > > + public static final Identifier DT_PUBLICKEY = new > > IdentifierImpl("urn:com:att:research:xacml:custom:3.0:rsa:public"); > > + private static final DataTypePublicKey singleInstance = new > > DataTypePublicKey(); > > + > > + public DataTypePublicKey() { > > + super(DT_PUBLICKEY, PublicKey.class); > > + } > > + > > + public static DataTypePublicKey newInstance() { > > + return singleInstance; > > + } > > + > > + @Override > > + public PublicKey convert(Object source) throws DataTypeException > > { > > + if (source == null || (source instanceof PublicKey) ) { > > + return (PublicKey) source; > > + } else if (source instanceof byte[]) { > > + return (PublicKey) source; > > + } else if (source instanceof String) { > > + return (PublicKey) (Object) ((String) > > source).getBytes(); > > + } > > + throw new DataTypeException(this, "Failed to convert \"" + > > source.getClass().getCanonicalName()); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/FunctionDe > > finitionDecrypt.java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/FunctionDe > > finitionDecrypt.java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/FunctionDe > > finitionDecrypt.java > > new file mode 100755 > > index 0000000..d51c73d > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/FunctionDe > > finitionDecrypt.java > > @@ -0,0 +1,152 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.security.InvalidKeyException; > > +import java.security.NoSuchAlgorithmException; > > +import java.security.PrivateKey; > > +import java.security.PublicKey; > > +import java.util.List; > > + > > +import javax.crypto.BadPaddingException; > > +import javax.crypto.Cipher; > > +import javax.crypto.IllegalBlockSizeException; > > +import javax.crypto.NoSuchPaddingException; > > + > > +import com.att.research.xacml.api.DataType; > > +import com.att.research.xacml.api.DataTypeException; > > +import com.att.research.xacml.api.Identifier; > > +import com.att.research.xacml.api.XACML3; > > +import com.att.research.xacml.std.IdentifierImpl; > > +import com.att.research.xacml.std.StdStatus; > > +import com.att.research.xacml.std.StdStatusCode; > > +import com.att.research.xacml.std.datatypes.DataTypeHexBinary; > > +import com.att.research.xacml.std.datatypes.DataTypeString; > > +import com.att.research.xacml.std.datatypes.HexBinary; > > +import com.att.research.xacmlatt.pdp.eval.EvaluationContext; > > +import com.att.research.xacmlatt.pdp.policy.ExpressionResult; > > +import com.att.research.xacmlatt.pdp.policy.FunctionArgument; > > +import com.att.research.xacmlatt.pdp.policy.FunctionDefinition; > > +import com.att.research.xacmlatt.pdp.std.functions.ConvertedArgument; > > + > > +public class FunctionDefinitionDecrypt implements FunctionDefinition { > > + public static final Identifier FD_RSA_DECRYPT = new > > IdentifierImpl("urn:com:att:research:xacml:custom:function:3.0:rsa:decr > > ypt"); > > + private static final FunctionDefinitionDecrypt singleInstance = > > new FunctionDefinitionDecrypt(); > > + > > + public static FunctionDefinitionDecrypt newInstance() { > > + return singleInstance; > > + } > > + > > + @Override > > + public Identifier getId() { > > + return FD_RSA_DECRYPT; > > + } > > + > > + @Override > > + public Identifier getDataTypeId() { > > + return XACML3.ID_DATATYPE_STRING; > > + } > > + > > + @Override > > + public boolean returnsBag() { > > + return false; > > + } > > + > > + @Override > > + public ExpressionResult evaluate(EvaluationContext > > evaluationContext, List<FunctionArgument> arguments) { > > + if (arguments == null || arguments.size() < 2) { > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > expecting 2 arguments.")); > > + } > > + // > > + // What is the first argument? > > + // > > + FunctionArgument arg0 = arguments.get(0); > > + if (arg0.isBag()) { > > + // > > + // We don't support bags right now > > + // > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > not expecting a bag for argument 0.")); > > + } > > + if > > (arg0.getValue().getDataTypeId().equals(XACML3.ID_DATATYPE_HEXBINARY) > > == false) { > > + // > > + // Should be a String > > + // > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > expected a Hex Binary for argument 0.")); > > + } > > + // > > + // Convert the argument > > + // > > + ConvertedArgument<HexBinary> data = new > > ConvertedArgument<HexBinary>(arg0, DataTypeHexBinary.newInstance(), > > false); > > + if (! data.isOk()) { > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > argument 0 failed to convert to Hex Binary.")); > > + } > > + // > > + // Ok - check the 2nd argument > > + // > > + FunctionArgument arg1 = arguments.get(1); > > + if (arg1.isBag()) { > > + // > > + // We don't support bags right now > > + // > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > not expecting a bag for argument 1.")); > > + } > > + if > > (arg1.getValue().getDataTypeId().equals(DataTypePrivateKey.DT_PRIVATEKE > > Y) || > > + > > arg1.getValue().getDataTypeId().equals(DataTypePublicKey.DT_PUBLI > > CKEY)) { > > + // > > + // Ok - let's try to decrypt > > + // > > + Cipher cipher; > > + try { > > + cipher = Cipher.getInstance("RSA"); > > + if > > (arg1.getValue().getDataTypeId().equals(DataTypePrivateKey.DT_PRIVATEKE > > Y)) { > > + // > > + // Using the private key > > + // > > + DataType<PrivateKey> pkDatatype = > > DataTypePrivateKey.newInstance(); > > + ConvertedArgument<PrivateKey> > privateKey > > = new ConvertedArgument<PrivateKey>(arg1, pkDatatype, false); > > + if ( ! privateKey.isOk()) { > > + return > > ExpressionResult.newError(new > > StdStatus(privateKey.getStatus().getStatusCode(), "Decrypt: " + > > privateKey.getStatus().getStatusMessage())); > > + } > > + // > > + // Setup decryption > > + // > > + cipher.init(Cipher.DECRYPT_MODE, > > privateKey.getValue()); > > + } else if > > (arg1.getValue().getDataTypeId().equals(DataTypePublicKey.DT_PUBLICKEY) > > ) { > > + // > > + // Using the private key > > + // > > + DataType<PublicKey> pkDatatype = > > DataTypePublicKey.newInstance(); > > + ConvertedArgument<PublicKey> > publicKey = > > new ConvertedArgument<PublicKey>(arg1, pkDatatype, false); > > + if ( ! publicKey.isOk()) { > > + return > > ExpressionResult.newError(new > > StdStatus(publicKey.getStatus().getStatusCode(), "Decrypt: " + > > publicKey.getStatus().getStatusMessage())); > > + } > > + // > > + // Setup decryption > > + // > > + cipher.init(Cipher.DECRYPT_MODE, > > publicKey.getValue()); > > + } > > + // > > + // Do the decryption > > + // > > + byte[] decryptedData = > > cipher.doFinal(data.getValue().getData()); > > + String decryptedString = new > > String(decryptedData); > > + // > > + // All good, return the decrypted string > > + // > > + return > > ExpressionResult.newSingle(DataTypeString.newInstance().createAttribute > > Value(decryptedString)); > > + } catch (NoSuchAlgorithmException | > > NoSuchPaddingException | InvalidKeyException | > > IllegalBlockSizeException | BadPaddingException | DataTypeException e) > > { > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed: > > " + e.getLocalizedMessage())); > > + } > > + } > > + return ExpressionResult.newError(new > > StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Decrypt failed, > > expecting public/private key datatype for argument 1.")); > > + } > > + > > +} > > > > http://git-wip-us.apache.org/repos/asf/incubator- > > openaz/blob/94fcdd90/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/TestCustom > > .java > > ---------------------------------------------------------------------- > > diff --git a/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/TestCustom > > .java b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/TestCustom > > .java > > new file mode 100755 > > index 0000000..df93001 > > --- /dev/null > > +++ b/openaz-xacml- > > test/src/test/java/com/att/research/xacmlatt/pdp/test/custom/TestCustom > > .java > > @@ -0,0 +1,384 @@ > > +/* > > + * AT&T - PROPRIETARY > > + * THIS FILE CONTAINS PROPRIETARY INFORMATION OF > > + * AT&T AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN > > + * ACCORDANCE WITH APPLICABLE AGREEMENTS. > > + * > > + * Copyright (c) 2014 AT&T Knowledge Ventures > > + * Unpublished and Not for Publication > > + * All Rights Reserved > > + */ > > +package com.att.research.xacmlatt.pdp.test.custom; > > + > > +import java.io.IOException; > > +import java.io.ObjectInputStream; > > +import java.io.ObjectOutputStream; > > +import java.net.MalformedURLException; > > +import java.nio.file.Files; > > +import java.nio.file.Path; > > +import java.nio.file.Paths; > > +import java.security.InvalidKeyException; > > +import java.security.KeyPair; > > +import java.security.KeyPairGenerator; > > +import java.security.NoSuchAlgorithmException; > > +import java.security.PrivateKey; > > +import java.security.PublicKey; > > +import java.util.ArrayList; > > +import java.util.List; > > + > > +import javax.crypto.BadPaddingException; > > +import javax.crypto.Cipher; > > +import javax.crypto.IllegalBlockSizeException; > > +import javax.crypto.NoSuchPaddingException; > > + > > +import org.apache.commons.cli.CommandLine; > > +import org.apache.commons.cli.GnuParser; > > +import org.apache.commons.cli.Option; > > +import org.apache.commons.cli.ParseException; > > +import org.apache.commons.logging.Log; > > +import org.apache.commons.logging.LogFactory; > > + > > +import com.att.research.xacml.api.AttributeValue; > > +import com.att.research.xacml.api.DataType; > > +import com.att.research.xacml.api.DataTypeException; > > +import com.att.research.xacml.api.Request; > > +import com.att.research.xacml.api.RequestAttributes; > > +import com.att.research.xacml.api.XACML3; > > +import com.att.research.xacml.api.pep.PEPException; > > +import com.att.research.xacml.std.IdentifierImpl; > > +import com.att.research.xacml.std.StdMutableAttribute; > > +import com.att.research.xacml.std.StdMutableRequest; > > +import com.att.research.xacml.std.StdMutableRequestAttributes; > > +import com.att.research.xacml.std.dom.DOMStructureException; > > +import com.att.research.xacml.std.json.JSONStructureException; > > +import com.att.research.xacml.util.FactoryException; > > +import com.att.research.xacmlatt.pdp.test.TestBase; > > + > > +/** > > + * TestCustom is an application that tests the extensibility and > > configurability of the AT&T XACML API. > > + * > > + * It creates a custom datatype definition factory that adds in custom > > data types for RSA > > + * PublicKey and PrivateKey. > > + * > > + * It creates a custom function definition factory that adds in custom > > decryption function for decrypting data. It > > + * also derives and loads custom functions for the RSA public/private > > key datatypes for the bag function: one-and-only. > > + * > > + * @author pameladragosh > > + * > > + */ > > +public class TestCustom extends TestBase { > > + private static final Log logger = > > LogFactory.getLog(TestCustom.class); > > + > > + // > > + // Our public's > > + // > > + public static final String ALGORITHM = "RSA"; > > + public static final String PRIVATEKEY_FILE = "PrivateKey.key"; > > + public static final String PUBLICKEY_FILE = "PublicKey.key"; > > + > > + public static final String DECRYPTION_INPUT_STRING = "This is the > > SECRET value!"; > > + > > + public static final String DECRYPTION_INPUT_ID = > > "com:att:research:xacml:test:custom:encrypted-data"; > > + // > > + // Our keys > > + // > > + protected PublicKey publicKey = null; > > + protected PrivateKey privateKey = null; > > + // > > + // Our command line parameters > > + // > > + public static final String OPTION_GENERATE = "generate"; > > + > > + static { > > + options.addOption(new Option(OPTION_GENERATE, false, > > "Generate a private/public key pair.")); > > + } > > + > > + /** > > + * This function generates the public/private key pair. Should > > never have to call this again, this was > > + * called once to generate the keys. They were saved into the > > testsets/custom/datatype-function sub-directory. > > + */ > > + public void generateKeyPair() { > > + // > > + // Generate a RSA private/public key pair > > + // > > + KeyPairGenerator keyGen; > > + try { > > + keyGen = KeyPairGenerator.getInstance(ALGORITHM); > > + } catch (NoSuchAlgorithmException e) { > > + logger.error("failed to generate keypair: " + e); > > + return; > > + } > > + keyGen.initialize(1024); > > + final KeyPair key = keyGen.generateKeyPair(); > > + // > > + // Save the keys to disk > > + // > > + Path file = Paths.get(this.directory, PRIVATEKEY_FILE); > > + try (ObjectOutputStream os = new > > ObjectOutputStream(Files.newOutputStream(file))) { > > + os.writeObject(key.getPrivate()); > > + } catch (IOException e) { > > + e.printStackTrace(); > > + } > > + file = Paths.get(this.directory, PUBLICKEY_FILE); > > + try (ObjectOutputStream os = new > > ObjectOutputStream(Files.newOutputStream(file))) { > > + os.writeObject(key.getPublic()); > > + } catch (IOException e) { > > + e.printStackTrace(); > > + } > > + } > > + > > + public TestCustom(String[] args) throws ParseException, > > MalformedURLException, HelpException { > > + super(args); > > + } > > + > > + /* (non-Javadoc) > > + * > > + * Simply look for command line option: -generate > > + * This generates the public/private key. Shouldn't need to call > > it again, the keys have > > + * already been generated and saved. > > + * > > + * @see > > com.att.research.xacmlatt.pdp.test.TestBase#parseCommands(java.lang.Str > > ing[]) > > + */ > > + @Override > > + protected void parseCommands(String[] args) throws > > ParseException, MalformedURLException, HelpException { > > + // > > + // Have our parent class parse its options out > > + // > > + super.parseCommands(args); > > + // > > + // Parse the command line options > > + // > > + CommandLine cl; > > + cl = new GnuParser().parse(options, args); > > + if (cl.hasOption(OPTION_GENERATE)) { > > + // > > + // Really only need to do this once to setup the > > test. > > + // > > + this.generateKeyPair(); > > + } > > + } > > + > > + /* (non-Javadoc) > > + * > > + * After our parent class configure's itself, all this needs to > > do is read in > > + * the public/private key's into objects. > > + * > > + * @see com.att.research.xacmlatt.pdp.test.TestBase#configure() > > + */ > > + @Override > > + protected void configure() throws FactoryException { > > + // > > + // Have our super do its thing > > + // > > + super.configure(); > > + // > > + // Read in the public key > > + // > > + try { > > + this.publicKey = (PublicKey) new > > ObjectInputStream(Files.newInputStream(Paths.get(this.directory, > > PUBLICKEY_FILE))).readObject(); > > + } catch (ClassNotFoundException | IOException e) { > > + logger.error(e); > > + } > > + // > > + // Read in the private key > > + // > > + try { > > + this.privateKey = (PrivateKey) new > > ObjectInputStream(Files.newInputStream(Paths.get(this.directory, > > PRIVATEKEY_FILE))).readObject(); > > + } catch (ClassNotFoundException | IOException e) { > > + logger.error(e); > > + } > > + } > > + > > + /* (non-Javadoc) > > + * > > + * Here we add 2 attributes into the request: 1) the private key, > > and 2) a String that was encrypted using the public key. > > + * > > + * The goal is to have the custom decrypt function use the > > private key to decrypt that string. > > + * > > + * @see > > com.att.research.xacmlatt.pdp.test.TestBase#generateRequest(java.nio.fi > > le.Path, java.lang.String) > > + */ > > + @Override > > + protected Request generateRequest(Path file, String group) throws > > JSONStructureException, DOMStructureException, PEPException { > > + // > > + // Have our super class do its work > > + // > > + Request oldRequest = super.generateRequest(file, group); > > + // > > + // Copy the request attributes > > + // > > + List<StdMutableRequestAttributes> attributes = new > > ArrayList<StdMutableRequestAttributes>(); > > + for (RequestAttributes a : > > oldRequest.getRequestAttributes()) { > > + attributes.add(new StdMutableRequestAttributes(a)); > > + } > > + // > > + // We are supplying the private key as an attribute for the > > decryption function to use: > > + // > > + // (NOTE: Ideally this would be provided by a custom PIP > > provider, not the PEP) > > + // > > + // ID=com:att:research:xacml:test:custom:privatekey > > + // Issuer=com:att:research:xacml:test:custom > > + // Category=urn:oasis:names:tc:xacml:1.0:subject- > > category:access-subject > > + // > > Datatype=urn:com:att:research:xacml:custom:3.0:rsa:private > > + // > > + DataType<?> dtExtended = > > dataTypeFactory.getDataType(DataTypePrivateKey.DT_PRIVATEKEY); > > + if (dtExtended == null) { > > + logger.error("Failed to get private key > datatype."); > > + return null; > > + } > > + // > > + // Create the attribute value > > + // > > + try { > > + AttributeValue<?> attributeValue = > > dtExtended.createAttributeValue(this.privateKey); > > > > + // > > + // Create the attribute > > + // > > + StdMutableAttribute newAttribute = new > > StdMutableAttribute(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT, > > + > > new > > IdentifierImpl("com:att:research:xacml:test:custom:privatekey"), > > + > > attributeValue, > > + > > > > "com:att:research:xacml:test:custom", > > + > > false); > > + boolean added = false; > > + for (StdMutableRequestAttributes a : attributes) { > > + // > > + // Does the category exist? > > + // > > + if > > (a.getCategory().equals(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT)) { > > + // > > + // Yes - add in the new attribute > value > > + // > > + a.add(newAttribute); > > + added = true; > > + break; > > + } > > + } > > + if (added == false) { > > + // > > + // New category - create it and add it in > > + // > > + StdMutableRequestAttributes a = new > > StdMutableRequestAttributes(); > > + a.setCategory(newAttribute.getCategory()); > > + a.add(newAttribute); > > + attributes.add(a); > > + } > > + } catch (DataTypeException e) { > > + logger.error(e); > > + return null; > > + } > > + // > > + // We are also supplying this attribute which is the secret > > text encrypted with > > + // the public key. > > + // > > + // ID=com:att:research:xacml:test:custom:encrypted-data > > + // Issuer= > > + // Category=urn:oasis:names:tc:xacml:1.0:subject- > > category:access-subject > > + // Datatype=http://www.w3.org/2001/XMLSchema#hexBinary > > + // > > + // Encrypt it > > + // > > + byte[] encryptedData = null; > > + try { > > + Cipher cipher = Cipher.getInstance(ALGORITHM); > > + cipher.init(Cipher.ENCRYPT_MODE, this.publicKey); > > + // > > + // This is just a hack to test a decryption of the > > wrong value. > > + // > > + if (group.equals("Permit")) { > > + encryptedData = > > cipher.doFinal(DECRYPTION_INPUT_STRING.getBytes()); > > + } else { > > + encryptedData = cipher.doFinal("This is > NOT the > > secret".getBytes()); > > + } > > + } catch (NoSuchAlgorithmException | NoSuchPaddingException > > | InvalidKeyException | IllegalBlockSizeException | BadPaddingException > > e) { > > + logger.error(e); > > + return null; > > + } > > + // > > + // Sanity check (for the Permit request) > > + // > > + try { > > + if (group.equals("Permit")) { > > + Cipher cipher = > Cipher.getInstance(ALGORITHM); > > + cipher.init(Cipher.DECRYPT_MODE, > > this.privateKey); > > + byte[] decryptedData = > > cipher.doFinal(encryptedData); > > + if (new > > String(decryptedData).equals(DECRYPTION_INPUT_STRING)) { > > + logger.info("Sanity check passed: > > decrypted the encrypted data."); > > + } else { > > + logger.error("Sanity check failed > to > > decrypt the encrypted data."); > > + return null; > > + } > > + } > > + } catch (NoSuchAlgorithmException | NoSuchPaddingException > > | InvalidKeyException | IllegalBlockSizeException | BadPaddingException > > e) { > > + logger.error(e); > > + } > > + // > > + // Get our datatype factory > > + // > > + dtExtended = > > dataTypeFactory.getDataType(XACML3.ID_DATATYPE_HEXBINARY); > > + if (dtExtended == null) { > > + logger.error("Failed to get hex binary datatype."); > > + return null; > > + } > > + // > > + // Create the attribute value > > + // > > + try { > > + AttributeValue<?> attributeValue = > > dtExtended.createAttributeValue(encryptedData); > > > > + // > > + // Create the attribute > > + // > > + StdMutableAttribute newAttribute = new > > StdMutableAttribute(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT, > > + > > new > > IdentifierImpl("com:att:research:xacml:test:custom:encrypted-data"), > > + > > attributeValue, > > + > > null, > > + > > false); > > + boolean added = false; > > + for (StdMutableRequestAttributes a : attributes) { > > + // > > + // Does the category exist? > > + // > > + if > > (a.getCategory().equals(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT)) { > > + // > > + // Yes - add in the new attribute > value > > + // > > + a.add(newAttribute); > > + added = true; > > + break; > > + } > > + } > > + if (added == false) { > > + // > > + // New category - create it and add it in > > + // > > + StdMutableRequestAttributes a = new > > StdMutableRequestAttributes(); > > + a.setCategory(newAttribute.getCategory()); > > + a.add(newAttribute); > > + attributes.add(a); > > + } > > + } catch (DataTypeException e) { > > + logger.error(e); > > + return null; > > + } > > + // > > + // Now form our final request > > + // > > + StdMutableRequest newRequest = new StdMutableRequest(); > > + > > newRequest.setCombinedDecision(oldRequest.getCombinedDecision()); > > + > > newRequest.setRequestDefaults(oldRequest.getRequestDefaults()); > > + > > newRequest.setReturnPolicyIdList(oldRequest.getReturnPolicyIdList > > ()); > > + newRequest.setStatus(oldRequest.getStatus()); > > + for (StdMutableRequestAttributes a : attributes) { > > + newRequest.add(a); > > + } > > + return newRequest; > > + } > > + > > + public static void main(String[] args) { > > + try { > > + new TestCustom(args).run(); > > + } catch (ParseException | IOException | FactoryException e) > > { > > + logger.error(e); > > + } catch (HelpException e) { > > + } > > + } > > + > > +} > > > -- Colm O hEigeartaigh Talend Community Coder http://coders.talend.com
