Ported original att source to openaz This Closes #3
diff --git a/openaz-xacml-pap-admin/pom.xml b/openaz-xacml-pap-admin/pom.xml index b027045..c494f77 100644 --- a/openaz-xacml-pap-admin/pom.xml +++ b/openaz-xacml-pap-admin/pom.xml
@@ -23,4 +23,284 @@ </parent> <modelVersion>4.0.0</modelVersion> <artifactId>openaz-xacml-pap-admin</artifactId> + <packaging>war</packaging> + + <repositories> + <repository> + <id>vaadin-addons</id> + <url>http://maven.vaadin.com/vaadin-addons</url> + </repository> + <repository> + <id>vaadin-snapshots</id> + <url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + + <!-- + <pluginRepositories> + <pluginRepository> + <id>vaadin-snapshots</id> + <url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + --> + + <properties> + <vaadin.version>7.1.11</vaadin.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.openaz</groupId> + <artifactId>openaz-xacml</artifactId> + </dependency> + <dependency> + <groupId>org.apache.openaz</groupId> + <artifactId>openaz-xacml-pdp</artifactId> + </dependency> + + + <!-- The core server part of Vaadin --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-server</artifactId> + <version>${vaadin.version}</version> + </dependency> + + <!-- Vaadin themes --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-themes</artifactId> + <version>${vaadin.version}</version> + </dependency> + + <!-- Push support --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-push</artifactId> + <version>${vaadin.version}</version> + </dependency> + + <!-- + Use the appropriate javax.servlet version for your + version of Jetty and other considerations. + + Jetty 6 - Servlet API 2.4 + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>2.4</version> + <scope>provided</scope> + </dependency> + + Jetty 7 - Servlet API 2.5 / Standard Location + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>2.5</version> + <scope>provided</scope> + </dependency> + + Jetty 7 - Servlet API 2.5 / OSGi bundle ready + + <dependency> + <groupId>org.eclipse.jetty.orbit</groupId> + <artifactId>javax.servlet</artifactId> + <version>2.5.0.v201103041518</version> + <scope>provided</scope> + </dependency> + + Jetty 8 - Servlet API 3.0 / Standard Location / OSGi bundle ready + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.0.1</version> + <scope>provided</scope> + </dependency> + + Jetty 9 - Servlet API 3.1 / Standard Location / OSGi bundle ready + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + <scope>provided</scope> + </dependency> + --> + + <!-- Jetty 8 - Servlet API 3.0 / Standard Location / OSGi bundle ready --> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.0.1</version> + <scope>provided</scope> + </dependency> + + <!-- Precompiled DefaultWidgetSet --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-client-compiled</artifactId> + <version>${vaadin.version}</version> + </dependency> + + <!-- Vaadin client side, needed for widget set compilation --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-client</artifactId> + <scope>provided</scope> + <version>${vaadin.version}</version> + </dependency> + + <!-- Compiler for custom widget sets. Should not be deployed --> + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-client-compiler</artifactId> + <scope>provided</scope> + <version>${vaadin.version}</version> + </dependency> + + <dependency> + <groupId>com.vaadin.addon</groupId> + <artifactId>jpacontainer</artifactId> + <version>3.1.1</version> + </dependency> + + <dependency> + <groupId>org.vaadin.addon</groupId> + <artifactId>confirmdialog</artifactId> + <version>2.0.5</version> + </dependency> + + <dependency> + <groupId>org.apache.openaz</groupId> + <artifactId>openaz-xacml</artifactId> + </dependency> + <dependency> + <groupId>org.apache.openaz</groupId> + <artifactId>openaz-xacml-rest</artifactId> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.17</version> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.1.3</version> + <exclusions> + <exclusion> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-continuation</artifactId> + <version>9.0.0.v20130308</version> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>apache-log4j-extras</artifactId> + <version>1.2.17</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-compress</artifactId> + <version>1.8</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.3.0-rc1</version> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>14.0.1</version> + </dependency> + <dependency> + <groupId>org.eclipse.jgit</groupId> + <artifactId>org.eclipse.jgit</artifactId> + <version>3.2.0.201312181205-r</version> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>1.3.174</version> + </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>5.1.30</version> + </dependency> + <dependency> + <groupId>postgresql</groupId> + <artifactId>postgresql</artifactId> + <version>9.1-901.jdbc4</version> + </dependency> + <dependency> + <groupId>org.hsqldb</groupId> + <artifactId>hsqldb</artifactId> + <version>2.3.2</version> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + </dependency> + <dependency> + <groupId>org.eclipse.persistence</groupId> + <artifactId>eclipselink</artifactId> + <version>2.5.2</version> + </dependency> + </dependencies> + + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <configuration> + <webXml>src\main\webapp\WEB-INF\web.xml</webXml> + <resource> + <directory>src/META-INF</directory> + <targetPath>META-INF</targetPath> + <includes> + <include>persistence.xml</include> + <include>data.sql</include> + <include>drop.sql</include> + <include>empty.sql</include> + <include>views.sql</include> + </includes> + </resource> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + </project>
diff --git a/openaz-xacml-pap-admin/src/META-INF/data.sql b/openaz-xacml-pap-admin/src/META-INF/data.sql new file mode 100644 index 0000000..a679b4d --- /dev/null +++ b/openaz-xacml-pap-admin/src/META-INF/data.sql
@@ -0,0 +1,723 @@ +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (1,'Range','Set a range of min and/or max integer/double values the attribute can be set to during policy creation.'); +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (2,'Regular Expression','Define a regular expression the attribute must match against during policy creation.'); +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (3,'Enumeration','Enumerate a set of values that the attribute may be set to during policy creation.'); + +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (4,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject','intermediary-subject'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (5,'resource','S','urn:oasis:names:tc:xacml:3.0:attribute-category:resource','resource'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (6,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:codebase','codebase'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (7,'action','S','urn:oasis:names:tc:xacml:3.0:attribute-category:action','action'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (8,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:access-subject','access-subject'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (9,'environment','S','urn:oasis:names:tc:xacml:3.0:attribute-category:environment','environment'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (10,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:requesting-machine','requesting-machine'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (11,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject','recipient-subject'); + +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (12,'S','integer','http://www.w3.org/2001/XMLSchema#integer'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (13,'S','base64Binary','http://www.w3.org/2001/XMLSchema#base64Binary'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (14,'S','x500Name','urn:oasis:names:tc:xacml:1.0:data-type:x500Name'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (15,'S','dayTimeDuration','http://www.w3.org/2001/XMLSchema#dayTimeDuration'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (16,'S','time','http://www.w3.org/2001/XMLSchema#time'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (17,'S','dnsName','urn:oasis:names:tc:xacml:2.0:data-type:dnsName'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (18,'S','boolean','http://www.w3.org/2001/XMLSchema#boolean'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (19,'S','dateTime','http://www.w3.org/2001/XMLSchema#dateTime'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (20,'S','rfc822Name','urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (21,'S','date','http://www.w3.org/2001/XMLSchema#date'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (22,'S','ipAddress','urn:oasis:names:tc:xacml:2.0:data-type:ipAddress'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (23,'S','yearMonthDuration','http://www.w3.org/2001/XMLSchema#yearMonthDuration'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (24,'S','hexBinary','http://www.w3.org/2001/XMLSchema#hexBinary'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (25,'S','double','http://www.w3.org/2001/XMLSchema#double'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (26,'S','string','http://www.w3.org/2001/XMLSchema#string'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (27,'S','anyURI','http://www.w3.org/2001/XMLSchema#anyURI'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (28,'S','xpathExpression','urn:oasis:names:tc:xacml:3.0:data-type:xpathExpression'); + +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (29,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (30,'S','on-permit-apply-second','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (31,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (32,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (33,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (34,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (35,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (36,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (37,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides'); + +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (38,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (39,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (40,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (41,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (42,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (43,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (44,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:only-one-applicable'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (45,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable'); + +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (1,'integer-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (2,'integer-subtract','urn:oasis:names:tc:xacml:1.0:function:integer-subtract',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (3,'double-to-integer','urn:oasis:names:tc:xacml:1.0:function:double-to-integer',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (4,'integer-one-and-only','urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (5,'double-one-and-only','urn:oasis:names:tc:xacml:1.0:function:double-one-and-only',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (6,'string-equal','urn:oasis:names:tc:xacml:1.0:function:string-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (7,'string-equal-ignore-case','urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (8,'string-starts-with','urn:oasis:names:tc:xacml:3.0:function:string-starts-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (9,'string-ends-with','urn:oasis:names:tc:xacml:3.0:function: string-ends-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (10,'string-concatenate','urn:oasis:names:tc:xacml:2.0:function:string-concatenate',26,0,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (11,'boolean-from-string','urn:oasis:names:tc:xacml:3.0:function:boolean-from-string',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (12,'string-from-boolean','urn:oasis:names:tc:xacml:3.0:function:string-from-boolean',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (13,'integer-from-string','urn:oasis:names:tc:xacml:3.0:function:integer-from-string',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (14,'string-from-integer','urn:oasis:names:tc:xacml:3.0:function:string-from-integer',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (15,'double-from-string','urn:oasis:names:tc:xacml:3.0:function:double-from-string',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (16,'string-from-double','urn:oasis:names:tc:xacml:3.0:function:string-from-double',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (17,'time-from-string','urn:oasis:names:tc:xacml:3.0:function:time-from-string',16,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (18,'string-from-time','urn:oasis:names:tc:xacml:3.0:function:string-from-time',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (19,'date-from-string','urn:oasis:names:tc:xacml:3.0:function:date-from-string',21,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (20,'string-from-date','urn:oasis:names:tc:xacml:3.0:function:string-from-date',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (21,'dateTime-from-string','urn:oasis:names:tc:xacml:3.0:function:dateTime-from-string',19,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (22,'string-from-dateTime','urn:oasis:names:tc:xacml:3.0:function:string-from-dateTime',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (23,'anyURI-from-string','urn:oasis:names:tc:xacml:3.0:function:anyURI-from-string',27,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (24,'string-from-anyURI','urn:oasis:names:tc:xacml:3.0:function:string-from-anyURI',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (25,'dayTimeDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-from-string',15,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (26,'string-from-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-dayTimeDuration',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (27,'yearMonthDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-from-string',23,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (28,'string-from-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-yearMonthDuration',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (29,'x500Name-from-string','urn:oasis:names:tc:xacml:3.0:function:x500Name-from-string',14,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (30,'string-from-x500Name','urn:oasis:names:tc:xacml:3.0:function:string-from-x500Name',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (31,'rfc822Name-from-string','urn:oasis:names:tc:xacml:3.0:function:rfc822Name-from-string',20,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (32,'string-from-rfc822Name','urn:oasis:names:tc:xacml:3.0:function:string-from-rfc822Name',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (33,'ipAddress-from-string','urn:oasis:names:tc:xacml:3.0:function:ipAddress-from-string',22,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (34,'string-from-ipAddress','urn:oasis:names:tc:xacml:3.0:function:string-from-ipAddress',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (35,'dnsName-from-string','urn:oasis:names:tc:xacml:3.0:function:dnsName-from-string',17,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (36,'string-from-dnsName','urn:oasis:names:tc:xacml:3.0:function:string-from-dnsName',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (37,'anyURI-starts-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-starts-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (38,'anyURI-ends-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-ends-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (39,'string-contains','urn:oasis:names:tc:xacml:3.0:function:string-contains',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (40,'anyURI-contains','urn:oasis:names:tc:xacml:3.0:function:anyURI-contains',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (41,'string-substring','urn:oasis:names:tc:xacml:3.0:function:string-substring',26,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (42,'anyURI-substring','urn:oasis:names:tc:xacml:3.0:function:anyURI-substring',26,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (43,'boolean-equal','urn:oasis:names:tc:xacml:1.0:function:boolean-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (44,'integer-equal','urn:oasis:names:tc:xacml:1.0:function:integer-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (45,'double-equal','urn:oasis:names:tc:xacml:1.0:function:double-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (46,'date-equal','urn:oasis:names:tc:xacml:1.0:function:date-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (47,'time-equal','urn:oasis:names:tc:xacml:1.0:function:time-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (48,'dateTime-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (49,'dayTimeDuration-equal','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (50,'yearMonthDuration-equal','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (51,'anyURI-equal','urn:oasis:names:tc:xacml:1.0:function:anyURI-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (52,'x500Name-equal','urn:oasis:names:tc:xacml:1.0:function:x500Name-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (53,'rfc822Name-equal','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (54,'hexBinary-equal','urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (55,'base64Binary-equal','urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (56,'integer-add','urn:oasis:names:tc:xacml:1.0:function:integer-add',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (57,'double-add','urn:oasis:names:tc:xacml:1.0:function:double-add',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (58,'double-subtract','urn:oasis:names:tc:xacml:1.0:function:double-subtract',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (59,'integer-multiply','urn:oasis:names:tc:xacml:1.0:function:integer-multiply',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (60,'double-multiply','urn:oasis:names:tc:xacml:1.0:function:double-multiply',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (61,'integer-divide','urn:oasis:names:tc:xacml:1.0:function:integer-divide',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (62,'double-divide','urn:oasis:names:tc:xacml:1.0:function:double-divide',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (63,'integer-mod','urn:oasis:names:tc:xacml:1.0:function:integer-mod',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (64,'integer-abs','urn:oasis:names:tc:xacml:1.0:function:integer-abs',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (65,'double-abs','urn:oasis:names:tc:xacml:1.0:function:double-abs',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (66,'round','urn:oasis:names:tc:xacml:1.0:function:round',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (67,'floor','urn:oasis:names:tc:xacml:1.0:function:floor',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (68,'string-normalize-space','urn:oasis:names:tc:xacml:1.0:function:string-normalize-space',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (69,'string-normalize-to-lower-case','urn:oasis:names:tc:xacml:1.0:function:string-normalize-to-lower-case',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (70,'integer-to-double','urn:oasis:names:tc:xacml:1.0:function:integer-to-double',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (71,'integer-greater-than','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (72,'integer-less-than','urn:oasis:names:tc:xacml:1.0:function:integer-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (73,'integer-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (74,'double-greater-than','urn:oasis:names:tc:xacml:1.0:function:double-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (75,'double-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (76,'double-less-than','urn:oasis:names:tc:xacml:1.0:function:double-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (77,'double-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (78,'dateTime-add-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (79,'dateTime-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (80,'dateTime-subtract-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (81,'dateTime-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (82,'date-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-add-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (83,'date-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-subtract-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (84,'string-greater-than','urn:oasis:names:tc:xacml:1.0:function:string-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (85,'string-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (86,'string-less-than','urn:oasis:names:tc:xacml:1.0:function:string-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (87,'string-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (88,'time-greater-than','urn:oasis:names:tc:xacml:1.0:function:time-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (89,'time-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (90,'time-less-than','urn:oasis:names:tc:xacml:1.0:function:time-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (91,'time-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (92,'time-in-range','urn:oasis:names:tc:xacml:2.0:function:time-in-range',18,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (93,'dateTime-greater-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (94,'dateTime-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (95,'dateTime-less-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (96,'dateTime-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (97,'date-greater-than','urn:oasis:names:tc:xacml:1.0:function:date-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (98,'date-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (99,'date-less-than','urn:oasis:names:tc:xacml:1.0:function:date-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (100,'date-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (101,'string-one-and-only','urn:oasis:names:tc:xacml:1.0:function:string-one-and-only',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (102,'string-bag-size','urn:oasis:names:tc:xacml:1.0:function:string-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (103,'string-is-in','urn:oasis:names:tc:xacml:1.0:function:string-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (104,'string-bag','urn:oasis:names:tc:xacml:1.0:function:string-bag',26,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (105,'integer-bag-size','urn:oasis:names:tc:xacml:1.0:function:integer-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (106,'integer-is-in','urn:oasis:names:tc:xacml:1.0:function:integer-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (107,'integer-bag','urn:oasis:names:tc:xacml:1.0:function:integer-bag',12,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (108,'double-bag-size','urn:oasis:names:tc:xacml:1.0:function:double-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (109,'double-is-in','urn:oasis:names:tc:xacml:1.0:function:double-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (110,'double-bag','urn:oasis:names:tc:xacml:1.0:function:double-bag',25,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (111,'boolean-one-and-only','urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (112,'boolean-bag-size','urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (113,'boolean-is-in','urn:oasis:names:tc:xacml:1.0:function:boolean-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (114,'boolean-bag','urn:oasis:names:tc:xacml:1.0:function:boolean-bag',18,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (115,'time-one-and-only','urn:oasis:names:tc:xacml:1.0:function:time-one-and-only',16,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (116,'time-bag-size','urn:oasis:names:tc:xacml:1.0:function:time-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (117,'time-is-in','urn:oasis:names:tc:xacml:1.0:function:time-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (118,'time-bag','urn:oasis:names:tc:xacml:1.0:function:time-bag',16,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (119,'date-one-and-only','urn:oasis:names:tc:xacml:1.0:function:date-one-and-only',21,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (120,'date-bag-size','urn:oasis:names:tc:xacml:1.0:function:date-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (121,'date-is-in','urn:oasis:names:tc:xacml:1.0:function:date-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (122,'date-bag','urn:oasis:names:tc:xacml:1.0:function:date-bag',21,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (123,'dateTime-one-and-only','urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only',19,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (124,'dateTime-bag-size','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (125,'dateTime-is-in','urn:oasis:names:tc:xacml:1.0:function:dateTime-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (126,'dateTime-bag','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag',19,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (127,'anyURI-one-and-only','urn:oasis:names:tc:xacml:1.0:function:anyURI-one-and-only',27,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (128,'anyURI-bag-size','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (129,'anyURI-is-in','urn:oasis:names:tc:xacml:1.0:function:anyURI-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (130,'anyURI-bag','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag',27,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (131,'hexBinary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:hexBinary-one-and-only',24,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (132,'hexBinary-bag-size','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (133,'hexBinary-is-in','urn:oasis:names:tc:xacml:1.0:function:hexBinary-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (134,'hexBinary-bag','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag',24,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (135,'base64Binary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:base64Binary-one-and-only',13,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (136,'base64Binary-bag-size','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (137,'base64Binary-is-in','urn:oasis:names:tc:xacml:1.0:function:base64Binary-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (138,'base64Binary-bag','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag',13,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (139,'dayTimeDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-one-and-only',15,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (140,'dayTimeDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (141,'dayTimeDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (142,'dayTimeDuration-bag','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag',15,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (143,'yearMonthDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-one-and-only',23,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (144,'yearMonthDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (145,'yearMonthDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (146,'yearMonthDuration-bag','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag',23,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (147,'x500Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:x500Name-one-and-only',14,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (148,'x500Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (149,'x500Name-is-in','urn:oasis:names:tc:xacml:1.0:function:x500Name-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (150,'x500Name-bag','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag',14,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (151,'rfc822Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-one-and-only',20,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (152,'rfc822Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (153,'rfc822Name-is-in','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (154,'rfc822Name-bag','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag',20,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (155,'ipAddress-one-and-only','urn:oasis:names:tc:xacml:2.0:function:ipAddress-one-and-only',22,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (156,'ipAddress-bag-size','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (157,'ipAddress-is-in','urn:oasis:names:tc:xacml:2.0:function:ipAddress-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (158,'ipAddress-bag','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag',22,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (159,'dnsName-one-and-only','urn:oasis:names:tc:xacml:2.0:function:dnsName-one-and-only',17,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (160,'dnsName-bag-size','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (161,'dnsName-is-in','urn:oasis:names:tc:xacml:2.0:function:dnsName-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (162,'dnsName-bag','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag',17,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (163,'string-regexp-match','urn:oasis:names:tc:xacml:1.0:function:string-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (164,'anyURI-regexp-match','urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (165,'ipAddress-regexp-match','urn:oasis:names:tc:xacml:2.0:function:ipAddress-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (166,'dnsName-regexp-match','urn:oasis:names:tc:xacml:2.0:function:dnsName-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (167,'rfc822Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:rfc822Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (168,'x500Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:x500Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (169,'string-intersection','urn:oasis:names:tc:xacml:1.0:function:string-intersection',26,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (170,'string-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (171,'string-union','urn:oasis:names:tc:xacml:1.0:function:string-union',26,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (172,'string-subset','urn:oasis:names:tc:xacml:1.0:function:string-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (173,'string-set-equals','urn:oasis:names:tc:xacml:1.0:function:string-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (174,'integer-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:integer-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (175,'integer-union','urn:oasis:names:tc:xacml:1.0:function:integer-union',12,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (176,'integer-subset','urn:oasis:names:tc:xacml:1.0:function:integer-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (177,'integer-set-equals','urn:oasis:names:tc:xacml:1.0:function:integer-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (178,'double-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:double-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (179,'double-union','urn:oasis:names:tc:xacml:1.0:function:double-union',25,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (180,'double-subset','urn:oasis:names:tc:xacml:1.0:function:double-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (181,'double-set-equals','urn:oasis:names:tc:xacml:1.0:function:double-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (182,'boolean-intersection','urn:oasis:names:tc:xacml:1.0:function:boolean-intersection',18,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (183,'boolean-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:boolean-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (184,'boolean-union','urn:oasis:names:tc:xacml:1.0:function:boolean-union',18,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (185,'boolean-subset','urn:oasis:names:tc:xacml:1.0:function:boolean-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (186,'boolean-set-equals','urn:oasis:names:tc:xacml:1.0:function:boolean-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (187,'time-intersection','urn:oasis:names:tc:xacml:1.0:function:time-intersection',16,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (188,'time-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:time-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (189,'time-union','urn:oasis:names:tc:xacml:1.0:function:time-union',16,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (190,'time-subset','urn:oasis:names:tc:xacml:1.0:function:time-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (191,'time-set-equals','urn:oasis:names:tc:xacml:1.0:function:time-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (192,'date-intersection','urn:oasis:names:tc:xacml:1.0:function:date-intersection',21,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (193,'date-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:date-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (194,'date-union','urn:oasis:names:tc:xacml:1.0:function:date-union',21,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (195,'date-subset','urn:oasis:names:tc:xacml:1.0:function:date-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (196,'date-set-equals','urn:oasis:names:tc:xacml:1.0:function:date-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (197,'dateTime-intersection','urn:oasis:names:tc:xacml:1.0:function:dateTime-intersection',19,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (198,'dateTime-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:dateTime-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (199,'dateTime-union','urn:oasis:names:tc:xacml:1.0:function:dateTime-union',19,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (200,'dateTime-subset','urn:oasis:names:tc:xacml:1.0:function:dateTime-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (201,'dateTime-set-equals','urn:oasis:names:tc:xacml:1.0:function:dateTime-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (202,'anyURI-intersection','urn:oasis:names:tc:xacml:1.0:function:anyURI-intersection',27,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (203,'anyURI-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (204,'anyURI-union','urn:oasis:names:tc:xacml:1.0:function:anyURI-union',27,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (205,'anyURI-subset','urn:oasis:names:tc:xacml:1.0:function:anyURI-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (206,'anyURI-set-equals','urn:oasis:names:tc:xacml:1.0:function:anyURI-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (207,'hexBinary-intersection','urn:oasis:names:tc:xacml:1.0:function:hexBinary-intersection',24,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (208,'hexBinary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:hexBinary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (209,'hexBinary-union','urn:oasis:names:tc:xacml:1.0:function:hexBinary-union',24,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (210,'hexBinary-subset','urn:oasis:names:tc:xacml:1.0:function:hexBinary-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (211,'hexBinary-set-equals','urn:oasis:names:tc:xacml:1.0:function:hexBinary-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (212,'base64Binary-intersection','urn:oasis:names:tc:xacml:1.0:function:base64Binary-intersection',13,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (213,'base64Binary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:base64Binary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (214,'base64Binary-union','urn:oasis:names:tc:xacml:1.0:function:base64Binary-union',13,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (215,'base64Binary-subset','urn:oasis:names:tc:xacml:1.0:function:base64Binary-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (216,'base64Binary-set-equals','urn:oasis:names:tc:xacml:1.0:function:base64Binary-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (217,'dayTimeDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-intersection',15,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (218,'dayTimeDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (219,'dayTimeDuration-union','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-union',15,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (220,'dayTimeDuration-subset','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (221,'dayTimeDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (222,'yearMonthDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-intersection',23,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (223,'yearMonthDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (224,'yearMonthDuration-union','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-union',23,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (225,'yearMonthDuration-subset','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (226,'yearMonthDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (227,'x500Name-intersection','urn:oasis:names:tc:xacml:1.0:function:x500Name-intersection',14,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (228,'x500Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:x500Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (229,'x500Name-union','urn:oasis:names:tc:xacml:1.0:function:x500Name-union',14,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (230,'x500Name-subset','urn:oasis:names:tc:xacml:1.0:function:x500Name-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (231,'x500Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:x500Name-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (232,'rfc822Name-intersection','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-intersection',20,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (233,'rfc822Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (234,'rfc822Name-union','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-union',20,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (235,'rfc822Name-subset','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (236,'rfc822Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (237,'x500Name-match','urn:oasis:names:tc:xacml:1.0:function:x500Name-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (238,'rfc822Name-match','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (239,'integer-intersection','urn:oasis:names:tc:xacml:1.0:function:integer-intersection',12,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (240,'double-intersection','urn:oasis:names:tc:xacml:1.0:function:double-intersection',25,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (241,'or','urn:oasis:names:tc:xacml:1.0:function:or',18,0,0,0,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (242,'and','urn:oasis:names:tc:xacml:1.0:function:and',18,0,0,0,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (243,'n-of','urn:oasis:names:tc:xacml:1.0:function:n-of',18,0,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (244,'not','urn:oasis:names:tc:xacml:1.0:function:not',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (245,'any-of','urn:oasis:names:tc:xacml:3.0:function:any-of',18,0,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (246,'all-of','urn:oasis:names:tc:xacml:3.0:function:all-of',18,0,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (247,'any-of-any','urn:oasis:names:tc:xacml:3.0:function:any-of-any',18,0,1,2,-1,1,-1,0); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (248,'all-of-any','urn:oasis:names:tc:xacml:1.0:function:all-of-any',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (249,'any-of-all','urn:oasis:names:tc:xacml:1.0:function:any-of-all',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (250,'all-of-all','urn:oasis:names:tc:xacml:1.0:function:all-of-all',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (251,'map','urn:oasis:names:tc:xacml:3.0:function:map',NULL,1,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (252,'xpath-node-count','urn:oasis:names:tc:xacml:3.0:function:xpath-node-count',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (253,'xpath-node-equal','urn:oasis:names:tc:xacml:3.0:function:xpath-node-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (254,'xpath-node-match','urn:oasis:names:tc:xacml:3.0:function:xpath-node-match',18,0,0,2,2,NULL,NULL,NULL); + +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (1,0,1,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (2,0,1,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (3,0,2,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (4,0,2,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (5,0,3,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (6,1,4,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (7,1,5,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (8,0,6,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (9,0,6,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (10,0,7,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (11,0,7,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (12,0,8,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (13,0,8,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (14,0,9,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (15,0,9,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (16,0,10,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (17,0,11,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (18,0,12,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (19,0,13,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (20,0,14,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (21,0,15,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (22,0,16,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (23,0,17,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (24,0,18,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (25,0,19,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (26,0,20,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (27,0,21,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (28,0,22,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (29,0,23,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (30,0,24,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (31,0,25,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (32,0,26,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (33,0,27,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (34,0,28,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (35,0,29,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (36,0,30,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (37,0,31,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (38,0,32,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (39,0,33,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (40,0,34,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (41,0,35,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (42,0,36,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (43,0,37,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (44,0,37,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (45,0,38,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (46,0,38,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (47,0,39,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (48,0,39,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (49,0,40,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (50,0,40,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (51,0,41,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (52,0,41,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (53,0,41,3,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (54,0,42,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (55,0,42,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (56,0,42,3,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (57,0,43,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (58,0,43,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (59,0,44,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (60,0,44,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (61,0,45,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (62,0,45,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (63,0,46,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (64,0,46,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (65,0,47,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (66,0,47,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (67,0,48,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (68,0,48,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (69,0,49,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (70,0,49,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (71,0,50,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (72,0,50,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (73,0,51,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (74,0,51,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (75,0,52,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (76,0,52,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (77,0,53,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (78,0,53,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (79,0,54,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (80,0,54,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (81,0,55,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (82,0,55,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (83,0,56,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (84,0,56,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (85,0,57,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (86,0,57,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (89,0,58,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (90,0,58,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (91,0,59,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (92,0,59,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (93,0,60,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (94,0,60,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (95,0,61,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (96,0,61,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (97,0,62,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (98,0,62,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (99,0,63,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (100,0,63,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (101,0,64,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (102,0,65,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (103,0,66,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (104,0,67,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (125,0,68,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (126,0,69,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (128,0,70,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (129,0,71,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (130,0,71,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (131,0,72,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (132,0,72,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (133,0,73,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (134,0,73,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (135,0,74,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (136,0,74,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (137,0,75,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (138,0,75,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (139,0,76,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (140,0,76,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (141,0,77,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (142,0,77,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (143,0,78,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (144,0,78,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (145,0,79,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (146,0,79,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (147,0,80,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (148,0,80,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (149,0,81,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (150,0,81,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (151,0,82,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (152,0,82,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (153,0,83,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (154,0,83,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (155,0,84,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (156,0,84,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (157,0,85,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (158,0,85,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (159,0,86,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (160,0,86,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (161,0,87,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (162,0,87,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (163,0,88,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (164,0,88,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (165,0,89,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (166,0,89,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (167,0,90,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (168,0,90,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (169,0,91,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (170,0,91,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (171,0,92,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (172,0,92,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (173,0,93,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (174,0,93,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (175,0,94,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (176,0,94,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (177,0,95,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (178,0,95,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (179,0,96,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (180,0,96,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (181,0,97,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (182,0,97,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (183,0,98,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (184,0,98,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (185,0,99,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (186,0,99,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (187,0,100,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (188,0,100,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (189,1,101,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (190,1,102,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (191,0,103,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (192,1,103,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (193,0,104,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (194,1,105,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (195,0,106,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (196,1,106,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (197,0,107,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (198,1,108,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (199,0,109,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (200,1,109,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (201,0,110,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (202,1,111,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (203,1,112,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (204,0,113,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (205,1,113,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (206,0,114,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (207,1,115,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (208,1,116,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (209,0,117,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (210,1,117,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (211,0,118,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (212,1,119,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (213,1,120,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (214,0,121,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (215,1,121,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (216,0,122,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (217,1,123,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (218,1,124,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (219,0,125,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (220,1,125,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (221,0,126,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (222,1,127,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (223,1,128,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (224,0,129,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (225,1,129,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (226,0,130,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (227,1,131,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (228,1,132,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (229,0,133,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (230,1,133,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (231,0,134,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (232,1,135,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (233,1,136,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (234,0,137,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (235,1,137,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (236,0,138,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (237,1,139,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (238,1,140,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (239,0,141,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (240,1,141,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (241,0,142,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (242,1,143,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (243,1,144,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (244,1,145,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (245,0,145,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (246,0,146,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (247,1,147,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (248,1,148,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (249,0,149,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (250,1,149,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (251,0,150,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (252,1,151,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (253,1,152,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (254,0,153,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (255,1,153,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (256,0,154,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (257,1,155,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (258,1,156,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (259,0,157,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (260,1,157,2,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (261,0,158,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (262,1,159,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (263,1,160,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (264,0,161,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (265,1,161,2,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (266,0,162,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (267,0,163,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (268,0,163,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (269,0,164,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (270,0,164,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (271,0,165,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (272,0,165,2,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (273,0,166,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (274,0,166,2,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (275,0,167,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (276,0,167,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (277,0,168,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (278,0,168,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (279,1,169,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (280,1,169,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (281,1,170,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (282,1,170,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (283,1,171,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (284,1,172,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (285,1,172,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (286,1,173,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (287,1,173,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (288,1,174,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (289,1,174,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (290,1,175,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (292,1,176,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (293,1,176,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (294,1,177,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (295,1,177,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (296,1,178,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (297,1,178,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (298,1,179,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (299,1,180,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (300,1,180,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (301,1,181,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (302,1,181,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (303,1,182,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (304,1,182,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (305,1,183,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (306,1,183,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (307,1,184,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (308,1,185,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (309,1,185,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (310,1,186,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (311,1,186,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (312,1,187,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (313,1,187,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (314,1,188,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (315,1,188,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (316,1,189,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (317,1,190,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (318,1,190,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (319,1,191,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (320,1,191,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (321,1,192,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (322,1,192,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (323,1,193,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (324,1,193,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (325,1,194,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (326,1,195,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (327,1,195,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (328,1,196,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (329,1,196,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (330,1,197,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (331,1,197,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (332,1,198,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (333,1,198,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (334,1,199,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (335,1,200,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (336,1,200,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (337,1,201,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (338,1,201,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (339,1,202,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (340,1,202,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (341,1,203,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (342,1,203,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (343,1,204,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (344,1,205,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (345,1,205,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (346,1,206,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (347,1,206,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (348,1,207,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (349,1,207,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (350,1,208,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (351,1,208,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (352,1,209,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (353,1,210,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (354,1,210,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (355,1,211,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (356,1,211,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (357,1,212,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (358,1,212,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (359,1,213,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (360,1,213,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (361,1,214,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (362,1,215,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (363,1,215,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (364,1,216,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (365,1,216,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (366,1,217,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (367,1,217,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (368,1,218,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (369,1,218,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (370,1,219,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (371,1,220,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (372,1,220,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (373,1,221,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (374,1,221,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (375,1,222,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (376,1,222,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (377,1,223,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (378,1,223,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (380,1,224,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (381,1,225,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (382,1,225,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (383,1,226,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (384,1,226,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (385,1,227,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (386,1,227,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (387,1,228,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (388,1,228,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (389,1,229,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (390,1,230,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (391,1,230,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (392,1,231,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (393,1,231,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (394,1,232,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (395,1,232,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (396,1,233,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (397,1,233,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (398,1,234,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (399,1,235,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (400,1,235,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (401,1,236,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (402,1,236,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (403,0,237,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (404,0,237,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (405,0,238,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (406,0,238,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (407,1,239,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (408,1,239,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (409,1,240,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (410,1,240,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (411,0,241,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (412,0,242,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (413,0,243,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (414,0,243,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (415,0,244,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (416,0,245,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (417,0,245,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (418,1,245,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (419,0,246,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (420,0,246,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (421,1,246,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (422,0,247,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (423,1,247,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (424,1,247,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (433,0,248,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (434,1,248,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (435,1,248,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (436,0,249,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (437,1,249,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (438,1,249,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (439,0,250,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (440,1,250,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (441,1,250,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (442,0,251,1,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (447,1,251,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (448,0,252,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (449,0,253,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (450,0,253,2,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (451,0,254,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (452,0,254,2,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (453,0,92,3,16); + +INSERT INTO PIPType VALUES (500,'SQL'), (501,'LDAP'), (502,'CSV'), (503,'Hyper-CSV'), (504,'Custom');
diff --git a/openaz-xacml-pap-admin/src/META-INF/drop.sql b/openaz-xacml-pap-admin/src/META-INF/drop.sql new file mode 100644 index 0000000..8aee7ee --- /dev/null +++ b/openaz-xacml-pap-admin/src/META-INF/drop.sql
@@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS AttributeAssignment; +DROP TABLE IF EXISTS ConstraintValues; +DROP TABLE IF EXISTS ObadviceExpressions; +DROP TABLE IF EXISTS Attribute; +DROP TABLE IF EXISTS Category; +DROP TABLE IF EXISTS ConstraintType; +DROP VIEW IF EXISTS match_functions; +DROP VIEW IF EXISTS higherorder_bag_functions; +DROP VIEW IF EXISTS function_flattener; +DROP TABLE IF EXISTS FunctionArguments; +DROP TABLE IF EXISTS FunctionDefinition; +DROP TABLE IF EXISTS Datatype; +DROP TABLE IF EXISTS Obadvice; +DROP TABLE IF EXISTS PIPConfigParams; +DROP TABLE IF EXISTS PIPResolverParams; +DROP TABLE IF EXISTS PIPResolver; +DROP TABLE IF EXISTS PIPConfiguration; +DROP TABLE IF EXISTS PIPType; +DROP TABLE IF EXISTS PolicyAlgorithms; +DROP TABLE IF EXISTS RuleAlgorithms; +DROP TABLE IF EXISTS SEQUENCE; \ No newline at end of file
diff --git a/openaz-xacml-pap-admin/src/META-INF/empty.sql b/openaz-xacml-pap-admin/src/META-INF/empty.sql new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/openaz-xacml-pap-admin/src/META-INF/empty.sql
diff --git a/openaz-xacml-pap-admin/src/META-INF/persistence.xml b/openaz-xacml-pap-admin/src/META-INF/persistence.xml new file mode 100644 index 0000000..79594a9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/META-INF/persistence.xml
@@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> + <persistence-unit name="XACML-PAP-ADMIN"> + <class>org.apache.openaz.xacml.admin.jpa.Attribute</class> + <class>org.apache.openaz.xacml.admin.jpa.AttributeAssignment</class> + <class>org.apache.openaz.xacml.admin.jpa.Category</class> + <class>org.apache.openaz.xacml.admin.jpa.ConstraintType</class> + <class>org.apache.openaz.xacml.admin.jpa.ConstraintValue</class> + <class>org.apache.openaz.xacml.admin.jpa.Datatype</class> + <class>org.apache.openaz.xacml.admin.jpa.Obadvice</class> + <class>org.apache.openaz.xacml.admin.jpa.ObadviceExpression</class> + <class>org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms</class> + <class>org.apache.openaz.xacml.admin.jpa.RuleAlgorithms</class> + <class>org.apache.openaz.xacml.admin.jpa.FunctionArgument</class> + <class>org.apache.openaz.xacml.admin.jpa.FunctionDefinition</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPConfigParam</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPConfiguration</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPResolver</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPResolverParam</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPType</class> + <properties> + <!-- + The properties defined below are the default settings to be used when someone initially + wants to start working with the XACML-PAP-ADMIN web gui. They are not intended for production + use. + + They are setup to drop and create the tables and then load an initial set of data into the database + every time the application is deployed. So if you add anything to the dictionaries or PIP + configuration, they will get lost upon each deployment. It uses an H2 database engine configured + for a local file so you don't have to setup you're own SQL database environment to start. + + Instead of modifying this file directly, please refer to the xacml.admin.properties file for + customizing the application settings. + + --> + <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> + <property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/> + <property name="javax.persistence.schema-generation.create-script-source" value="META-INF/views.sql" /> + <property name="javax.persistence.schema-generation.drop-source" value="script"/> + <property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop.sql" /> + <property name="javax.persistence.sql-load-script-source" value="META-INF/data.sql" /> + + <!-- + + These properties should be set in the xacml.admin.properties file, so they can be re-used by non-JPA + database functionality. + + <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> + <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:sql/xacml"/> + <property name="javax.persistence.jdbc.user" value="sa"/> + <property name="javax.persistence.jdbc.password" value=""/> + --> + </properties> + </persistence-unit> +</persistence>
diff --git a/openaz-xacml-pap-admin/src/META-INF/views.sql b/openaz-xacml-pap-admin/src/META-INF/views.sql new file mode 100644 index 0000000..7c4a820 --- /dev/null +++ b/openaz-xacml-pap-admin/src/META-INF/views.sql
@@ -0,0 +1,6 @@ + +CREATE VIEW match_functions AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.XACML_ID AS xacmlid, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype FROM (FunctionDefinition D left join FunctionArguments A1 on (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 on (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2)) where (D.ARG_LB = 2 and D.ARG_UB = 2 and D.RETURN_DATATYPE = 18 and A1.IS_BAG = 0) order by D.SHORT_NAME; + +CREATE VIEW function_flattener AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.IS_HIGHER_ORDER AS is_higher_order, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype, A3.IS_BAG AS arg3_isbag, A3.DATATYPE_ID AS arg3_datatype FROM (FunctionDefinition D left join FunctionArguments A1 ON (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 ON (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2) LEFT JOIN FunctionArguments A3 ON (A3.FUNCTION_ID = D.ID and A3.ARG_INDEX = 3)) ORDER BY D.ID; + +CREATE VIEW higherorder_bag_functions AS SELECT * FROM function_flattener WHERE is_higher_order = 1 AND is_bag_return = 1 AND return_datatype=18 AND arg_lb=2 AND arg_ub=2 AND arg1_isbag = 1 AND (arg2_isbag = 1 OR arg2_isbag IS NULL);
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java new file mode 100644 index 0000000..b2deda7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java
@@ -0,0 +1,120 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Handle Notifications from the PAP that the PDP Groups have been changed. + * We need a Server Push Broadcaster because there may be multiple Vaadin instances (i.e. Users) that need to be told when a change occurs. + * + * Initially we only update the entire set of PDPGroups in one shot. + * + * (Code copied from Book of Vaadin chapter on Server Push + * @author glenngriffin + * + */ +public class PAPNotificationBroadcaster implements Serializable { + /** + * + */ + private static final long serialVersionUID = -2539940306348821754L; + + + private static Log logger = LogFactory.getLog(PAPNotificationBroadcaster.class); + + + static ExecutorService executorService = Executors.newSingleThreadExecutor(); + + /** + * Interface used by all classes that need to be notified when PAP sends an update message. + * + * @author glenngriffin + * + */ + public interface PAPNotificationBroadcastListener { + void updateAllGroups(); + } + + + + /* + * list of registered listeners + */ + private static LinkedList<PAPNotificationBroadcastListener> listeners = + new LinkedList<PAPNotificationBroadcastListener>(); + + /** + * Listener registers to hear about updates. + * @param listener + */ + public static synchronized void register( + PAPNotificationBroadcastListener listener) { + listeners.add(listener); + } + + + /** + * Listener is going away. + * + * @param listener + */ + public static synchronized void unregister( + PAPNotificationBroadcastListener listener) { + listeners.remove(listener); + } + + + + /** + * Tell all listeners about an update. + * + * @param message + */ + public static synchronized void updateAllGroups() { + for (final PAPNotificationBroadcastListener listener: listeners) { + // Original code copied from example: + // executorService.execute(new Runnable() { + // @Override + // public void run() { + // The problem with this is that the execute starts a new Thread, but the thing we are calling (the listener.updateAllGroups) + // happens in this case to ALSO create a new thread, and it locks up because the shared threadpool queue is already locked by this method. + // On application shutdown that left us with a blocked thread, so the process never goes away. + // Since the listener.updateAllGroups does ALL of its work inside a new Runnable thread, there should be no need for this method to also create a thread. + + /* + * IMPORTANT: + * All listeners MUST either execute with no possibility of blocking + * OR must start their own threads to handle blocking and concurrent operations. + */ + if (logger.isDebugEnabled()) { + logger.debug("updateAllGroups"); + } + listener.updateAllGroups(); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java new file mode 100644 index 0000000..2a065d5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java
@@ -0,0 +1,178 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.std.annotations.XACMLRequest; +import org.apache.openaz.xacml.std.annotations.RequestParser; +import org.apache.openaz.xacml.std.annotations.XACMLSubject; +import org.apache.openaz.xacml.std.annotations.XACMLAction; +import org.apache.openaz.xacml.std.annotations.XACMLResource; +import org.apache.openaz.xacml.api.DataTypeException; +import org.apache.openaz.xacml.api.Decision; +import org.apache.openaz.xacml.api.Request; +import org.apache.openaz.xacml.api.Response; +import org.apache.openaz.xacml.api.Result; +import org.apache.openaz.xacml.api.pdp.PDPEngine; +import org.apache.openaz.xacml.api.pdp.PDPEngineFactory; +import org.apache.openaz.xacml.api.pdp.PDPException; +import org.apache.openaz.xacml.util.FactoryException; + +public class XacmlAdminAuthorization { + private static Log logger = LogFactory.getLog(XacmlAdminAuthorization.class); + + public enum AdminAction { + ACTION_ACCESS("access"), + ACTION_READ("read"), + ACTION_WRITE("write"), + ACTION_ADMIN("admin"); + + String action; + AdminAction(String a) { + this.action = a; + } + public String toString() { + return this.action; + } + } + + public enum AdminResource { + RESOURCE_APPLICATION("application"), + RESOURCE_POLICY_WORKSPACE("workspace"), + RESOURCE_POLICY_EDITOR("editor"), + RESOURCE_DICTIONARIES("dictionaries"), + RESOURCE_PDP_ADMIN("pdp_admin"), + RESOURCE_PIP_ADMIN("pip_admin"); + + String resource; + AdminResource(String r) { + this.resource = r; + } + public String toString() { + return this.resource; + } + } + + @XACMLRequest(ReturnPolicyIdList=true) + public class AuthorizationRequest { + + @XACMLSubject(includeInResults=true) + String userID; + + @XACMLAction() + String action; + + @XACMLResource() + String resource; + + public AuthorizationRequest(String userId, String action, String resource) { + this.userID = userId; + this.action = action; + this.resource = resource; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getResource() { + return resource; + } + + public void setResource(String resource) { + this.resource = resource; + } + } + + // + // The PDP Engine + // + protected PDPEngine pdpEngine; + + public XacmlAdminAuthorization() { + PDPEngineFactory pdpEngineFactory = null; + try { + pdpEngineFactory = PDPEngineFactory.newInstance(); + if (pdpEngineFactory == null) { + logger.error("Failed to create PDP Engine Factory"); + } + this.pdpEngine = pdpEngineFactory.newEngine(); + } catch (FactoryException e) { + logger.error("Exception create PDP Engine: " + e.getLocalizedMessage()); + } + } + + public boolean isAuthorized(String userid, AdminAction action, AdminResource resource) { + logger.info("authorize: " + userid + " to " + action + " with " + resource); + if (this.pdpEngine == null) { + logger.warn("no pdp engine available to authorize"); + return false; + } + Request request; + try { + request = RequestParser.parseRequest(new AuthorizationRequest(userid, action.toString(), resource.toString())); + } catch (IllegalArgumentException | IllegalAccessException | DataTypeException e) { + logger.error("Failed to create request: " + e.getLocalizedMessage()); + return false; + } + if (request == null) { + logger.error("Failed to parse request."); + return false; + } + logger.info("Request: " + request); + // + // Ask the engine + // + try { + Response response = this.pdpEngine.decide(request); + if (response == null) { + logger.error("Null response from PDP decide"); + } + // + // Should only be one result + // + for (Result result : response.getResults()) { + Decision decision = result.getDecision(); + logger.info("Decision: " + decision); + if (decision.equals(Decision.PERMIT)) { + return true; + } + } + } catch (PDPException e) { + logger.error("PDP Decide failed: " + e.getLocalizedMessage()); + } + return false; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java new file mode 100644 index 0000000..91e831b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java
@@ -0,0 +1,253 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.components.AttributeDictionary; +import org.apache.openaz.xacml.admin.components.ObadviceDictionary; +import org.apache.openaz.xacml.admin.components.PDPManagement; +import org.apache.openaz.xacml.admin.components.PIPManagement; +import org.apache.openaz.xacml.admin.components.PolicyWorkspace; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.navigator.View; +import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; +import com.vaadin.server.ThemeResource; +import com.vaadin.shared.ui.label.ContentMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Embedded; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public class XacmlAdminConsole extends CustomComponent implements View { + private static final long serialVersionUID = 1L; + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Label labelCopyright; + @AutoGenerated + private TabSheet tabSheet; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private Label labelWelcome; + @AutoGenerated + private Label caption; + @AutoGenerated + private Embedded embedded_1; + + private static Log logger = LogFactory.getLog(XacmlAdminConsole.class); + + private final PolicyWorkspace policyWorkspace; + private final AttributeDictionary attributeDictionary; + private final ObadviceDictionary obadvice; + private final PDPManagement pdp; + private final PIPManagement pip; +// private final UserManagement user; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public XacmlAdminConsole() { + buildMainLayout(); + setCompositionRoot(mainLayout); + + if (logger.isDebugEnabled()) { + logger.debug("Creating tabs..."); + } + + this.labelWelcome.setValue("Welcome " + ((XacmlAdminUI)UI.getCurrent()).getUserName()); + this.labelCopyright.setContentMode(ContentMode.HTML); + + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_READ, + XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) { + this.policyWorkspace = new PolicyWorkspace(); + this.tabSheet.addComponent(this.policyWorkspace); + this.tabSheet.getTab(this.policyWorkspace).setCaption("Policy Workspace"); + } else { + this.policyWorkspace = null; + } + + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_READ, + XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) { + this.attributeDictionary = new AttributeDictionary(); + this.tabSheet.addComponent(this.attributeDictionary); + this.tabSheet.getTab(this.attributeDictionary).setCaption("Attribute Dictionary"); + + this.obadvice = new ObadviceDictionary(); + this.tabSheet.addComponent(this.obadvice); + this.tabSheet.getTab(this.obadvice).setCaption("Obligation/Advice Dictionary"); + } else { + this.attributeDictionary = null; + this.obadvice = null; + } + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_READ, + XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN)) { + this.pdp = new PDPManagement(((XacmlAdminUI)UI.getCurrent()).getPAPEngine()); + this.tabSheet.addComponent(this.pdp); + this.tabSheet.getTab(this.pdp).setCaption("PDP Management"); + } else { + this.pdp = null; + } + + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_READ, + XacmlAdminAuthorization.AdminResource.RESOURCE_PIP_ADMIN)) { + this.pip = new PIPManagement(); + this.tabSheet.addComponent(this.pip); + this.tabSheet.getTab(this.pip).setCaption("PIP Management"); + } else { + this.pip = null; + } + /* + * TODO - figure out how to add this in + * + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_READ, + XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) { + this.user = new UserManagement(); + this.tabSheet.addComponent(this.user); + this.tabSheet.getTab(this.user).setCaption("User Management"); + } + */ + + if (logger.isDebugEnabled()) { + logger.debug("Done creating tabs."); + } + } + + public void refreshAttributes() { + this.attributeDictionary.refreshContainer(); + } + public void refreshObadvice() { + this.obadvice.refreshContainer(); + } + + public void refreshPIPConfiguration() { + this.pip.refreshContainer(); + } + + public void refreshPDPGroups() { + this.pdp.refreshContainer(); + } + + public TabSheet getTabSheet() { return tabSheet;} + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("100%"); + mainLayout.setMargin(true); + + // top-level component properties + setWidth("100.0%"); + setHeight("100.0%"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + // tabSheet + tabSheet = new TabSheet(); + tabSheet.setImmediate(false); + tabSheet.setWidth("100.0%"); + tabSheet.setHeight("100.0%"); + mainLayout.addComponent(tabSheet); + mainLayout.setExpandRatio(tabSheet, 1.0f); + + // labelCopyright + labelCopyright = new Label(); + labelCopyright.setImmediate(false); + labelCopyright.setWidth("-1px"); + labelCopyright.setHeight("40px"); + labelCopyright + .setValue("<center>Copyright © 2015 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</center>"); + mainLayout.addComponent(labelCopyright); + mainLayout.setComponentAlignment(labelCopyright, new Alignment(48)); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("100.0%"); + horizontalLayout_1.setHeight("40px"); + horizontalLayout_1.setMargin(false); + + // embedded_1 + embedded_1 = new Embedded(); + embedded_1.setImmediate(false); + embedded_1.setWidth("30px"); + embedded_1.setHeight("30px"); + embedded_1.setSource(new ThemeResource("img/att.png")); + embedded_1.setType(1); + embedded_1.setMimeType("image/png"); + horizontalLayout_1.addComponent(embedded_1); + horizontalLayout_1.setComponentAlignment(embedded_1, new Alignment(33)); + + // caption + caption = new Label(); + caption.setImmediate(false); + caption.setWidth("-1px"); + caption.setHeight("-1px"); + caption.setValue("Apache OpenAZ Admin Console"); + horizontalLayout_1.addComponent(caption); + horizontalLayout_1.setExpandRatio(caption, 1.0f); + horizontalLayout_1.setComponentAlignment(caption, new Alignment(33)); + + // labelWelcome + labelWelcome = new Label(); + labelWelcome.setImmediate(false); + labelWelcome.setWidth("-1px"); + labelWelcome.setHeight("40px"); + labelWelcome.setValue("Label"); + horizontalLayout_1.addComponent(labelWelcome); + horizontalLayout_1.setComponentAlignment(labelWelcome, + new Alignment(34)); + + return horizontalLayout_1; + } + + @Override + public void enter(ViewChangeEvent event) { + // + // This needs to be implemented + // + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java new file mode 100644 index 0000000..fa48543 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java
@@ -0,0 +1,97 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import java.io.IOException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.vaadin.annotations.Push; +import com.vaadin.annotations.VaadinServletConfiguration; +import com.vaadin.server.VaadinServlet; + +import org.apache.openaz.xacml.rest.XACMLRest; + + +// +// The Servlet underlying the Vaadin Servlet +// +@Push +@WebServlet( + value = "/*", + description = "XACML Admin Console", + asyncSupported = true, + loadOnStartup=1, + initParams = { + @WebInitParam(name = "XACML_PROPERTIES_NAME", value = "xacml.admin.properties", description = "The location of the properties file holding configuration information.") +}) +@VaadinServletConfiguration(productionMode = false, ui = XacmlAdminUI.class) +public class XacmlAdminServlet extends VaadinServlet { + // + // All static declarations + // + private static Log logger = LogFactory.getLog(XacmlAdminServlet.class); //NOPMD + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + super.init(servletConfig); + // + // Common initialization + // + XACMLRest.xacmlInit(servletConfig); + + // Initialization + XacmlAdminUI.servletInit(); + } + + @Override + public void destroy() { + XacmlAdminUI.servletDestroy(); + super.destroy(); + } + + /** + * + * Called by: + * - PAP to notify Vaadin GUIs that something has changed + * + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // watch for notifications from the PAP + if (request.getMethod().equals("PUT") && request.getParameter("PAPNotification") != null) { + XacmlAdminUI.doPAPNotification(request, response); + return; + } + + // not a PAP notification, so let Vaadin handle normally + super.service(request,response); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java new file mode 100644 index 0000000..e553749 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java
@@ -0,0 +1,801 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.util.Properties; +import java.util.UUID; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.InvalidRemoteException; +import org.eclipse.jgit.api.errors.TransportException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.StoredConfig; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import org.eclipse.persistence.config.PersistenceUnitProperties; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization.AdminAction; +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization.AdminResource; +import org.apache.openaz.xacml.admin.converters.XacmlConverterFactory; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.jpa.ObadviceExpression; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.jpa.PIPType; +import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms; +import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms; +import org.apache.openaz.xacml.admin.model.MatchFunctionQueryDelegate; +import org.apache.openaz.xacml.admin.util.RESTfulPAPEngine; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PAPException; +import org.apache.openaz.xacml.rest.XACMLRestProperties; +import org.apache.openaz.xacml.util.XACMLProperties; +import com.google.gwt.thirdparty.guava.common.base.Joiner; +import com.google.gwt.thirdparty.guava.common.base.Splitter; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.annotations.Push; +import com.vaadin.annotations.Theme; +import com.vaadin.data.util.sqlcontainer.SQLContainer; +import com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool; +import com.vaadin.data.util.sqlcontainer.query.FreeformQuery; +import com.vaadin.navigator.Navigator; +import com.vaadin.server.VaadinRequest; +import com.vaadin.server.VaadinServletService; +import com.vaadin.ui.UI; + +@Push +@SuppressWarnings("serial") +@Theme("xacml_pap_admin") +public class XacmlAdminUI extends UI implements PAPNotificationBroadcaster.PAPNotificationBroadcastListener { + // + // All static declarations + // + public static final String PERSISTENCE_UNIT = "XACML-PAP-ADMIN"; + private static Log logger = LogFactory.getLog(XacmlAdminUI.class); //NOPMD + + /* + * These objects are shared amongst sessions. + */ + private static Path repositoryPath; + private static Repository repository; + private static EntityManagerFactory emf; + private static JDBCConnectionPool pool; + + /* + * These objects are created each session. + */ + private Path workspacePath; + private Path gitPath; + // + // Our Persistence Fields. For general use. NOTE: Be careful applying + // filters to these container objects. If one window applies a filter, then + // when another window uses the object, that filter will show up and cause confusion. + // If filters are needed within a window, then create another instance instead of + // using one of these pointers. + // + private EntityManager em; + private JPAContainer<Attribute> attributes; + private JPAContainer<ConstraintType> constraintTypes; + private JPAContainer<Obadvice> obadvice; + private JPAContainer<ObadviceExpression> obadviceExpressions; + private JPAContainer<Category> categories; + private JPAContainer<Datatype> datatypes; + private JPAContainer<PolicyAlgorithms> policyAlgorithms; + private JPAContainer<RuleAlgorithms> ruleAlgorithms; + private JPAContainer<PIPConfiguration> pipConfigurations; + private JPAContainer<PIPResolver> pipResolvers; + private JPAContainer<PIPType> pipTypes; + private JPAContainer<FunctionDefinition> functionDefinitions; + private JPAContainer<FunctionArgument> functionArguments; + private SQLContainer matchFunctionContainer; + private SQLContainer higherorderBagContainer; + // + // Our authorization object + // + XacmlAdminAuthorization authorizer = new XacmlAdminAuthorization(); + // + // The PAP Engine + // + private PAPEngine papEngine; + // + // GUI navigation + // + private Navigator navigator = null; + private XacmlAdminConsole console = null; + // + // Vaadin Init + // + @Override + protected void init(VaadinRequest request) { + // + // Set our title + // + this.getPage().setTitle("Apache OpenAZ Admin Console"); + // + // Create our authorization object + // + this.authorizer = new XacmlAdminAuthorization(); + // + // Is the user authorized to use the application? + // + if (this.authorizer.isAuthorized(this.getUserid(), + XacmlAdminAuthorization.AdminAction.ACTION_ACCESS, + XacmlAdminAuthorization.AdminResource.RESOURCE_APPLICATION) == false) { + logger.error("user " + this.getUserid() + " is not authorized."); + // + // Create a navigator to manage all our views + // + this.navigator = new Navigator(this, this); + // + // Redirect to an error page + // + this.navigator.addView(XacmlErrorHandler.VIEWNAME, new XacmlErrorHandler("User " + this.getUserid() + " is not authorized to access application", null)); + this.navigator.navigateTo(XacmlErrorHandler.VIEWNAME); + return; + } + try { + // + // Initialize user's Git repository + // + this.workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_WORKSPACE), this.getUserid()); + this.gitPath = XacmlAdminUI.initializeUserRepository(this.workspacePath, this.getUserid(), this.getUserEmail()); + } catch (Exception e) { + logger.error("Git Setup failure", e); + // + // Create a navigator to manage all our views + // + this.navigator = new Navigator(this, this); + // + // Redirect to an error page + // + this.navigator.addView(XacmlErrorHandler.VIEWNAME, new XacmlErrorHandler(e.getMessage(), null)); + this.navigator.navigateTo(XacmlErrorHandler.VIEWNAME); + return; + } + // + // Create a navigator to manage all our views + // + this.navigator = new Navigator(this, this); + // + // Set our converter factory + // + this.getSession().setConverterFactory(new XacmlConverterFactory()); + // + // Initialize our data objects + // + try { + // + // Initialize JPA and SQL. Create our custom entity manager. + // + logger.info("Creating Persistence Entity Manager"); + // + // Now create the entity manager. This is used throughout the application to create JPA + // containers of the entities located in the database. + // + this.em = XacmlAdminUI.emf.createEntityManager(); + // + // Our Read-Only containers + // + logger.info("Creating JPA read-only containers"); + this.constraintTypes = new JPAContainer<ConstraintType>(ConstraintType.class); + this.constraintTypes.setEntityProvider(new CachingLocalEntityProvider<ConstraintType>(ConstraintType.class, this.em)); + + this.categories = new JPAContainer<Category>(Category.class); + this.categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, this.em)); + + this.datatypes = new JPAContainer<Datatype>(Datatype.class); + this.datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, this.em)); + + this.policyAlgorithms = new JPAContainer<PolicyAlgorithms>(PolicyAlgorithms.class); + this.policyAlgorithms.setEntityProvider(new CachingLocalEntityProvider<PolicyAlgorithms>(PolicyAlgorithms.class, this.em)); + + this.ruleAlgorithms = new JPAContainer<RuleAlgorithms>(RuleAlgorithms.class); + this.ruleAlgorithms.setEntityProvider(new CachingLocalEntityProvider<RuleAlgorithms>(RuleAlgorithms.class, this.em)); + + this.pipTypes = new JPAContainer<PIPType>(PIPType.class); + this.pipTypes.setEntityProvider(new CachingLocalEntityProvider<PIPType>(PIPType.class, this.em)); + + this.functionDefinitions = new JPAContainer<FunctionDefinition>(FunctionDefinition.class); + this.functionDefinitions.setEntityProvider(new CachingLocalEntityProvider<FunctionDefinition>(FunctionDefinition.class, this.em)); + + this.functionArguments = new JPAContainer<FunctionArgument>(FunctionArgument.class); + this.functionArguments.setEntityProvider(new CachingLocalEntityProvider<FunctionArgument>(FunctionArgument.class, this.em)); + // + // Our writable containers. NOTE: The dictionaries have their own JPA instance since they can + // apply filters to their table views. If you update these, then refresh the dictionary containers + // by calling the appropriate refresh method defined in XacmlAdminUI. + // + logger.info("Creating JPA writable containers"); + this.attributes = new JPAContainer<Attribute>(Attribute.class); + this.attributes.setEntityProvider(new CachingMutableLocalEntityProvider<Attribute>(Attribute.class, this.em)); + + this.obadvice = new JPAContainer<Obadvice>(Obadvice.class); + this.obadvice.setEntityProvider(new CachingMutableLocalEntityProvider<Obadvice>(Obadvice.class, this.em)); + + this.obadviceExpressions = new JPAContainer<ObadviceExpression>(ObadviceExpression.class); + this.obadviceExpressions.setEntityProvider(new CachingMutableLocalEntityProvider<ObadviceExpression>(ObadviceExpression.class, this.em)); + + this.pipConfigurations = new JPAContainer<PIPConfiguration>(PIPConfiguration.class); + this.pipConfigurations.setEntityProvider(new CachingMutableLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, this.em)); + + this.pipResolvers = new JPAContainer<PIPResolver>(PIPResolver.class); + this.pipResolvers.setEntityProvider(new CachingMutableLocalEntityProvider<PIPResolver>(PIPResolver.class, this.em)); + // + // Sort our persistence data + // + logger.info("Sorting containers"); + this.categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); + this.datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true}); + this.policyAlgorithms.sort(new String[]{"xacmlId"}, new boolean[]{true}); + this.ruleAlgorithms.sort(new String[]{"xacmlId"}, new boolean[]{true}); + this.functionDefinitions.sort(new String[]{"xacmlid"}, new boolean[]{true}); + //this.functionArguments.sort(new String[]{"datatypeBean"}, new boolean[]{true}); + // + // Create our special query for MatchType functions. We need a custom + // QueryDelegate because these functions are accessible via a View (vs a Table). + // The basic FreeformQuery does not work with filters on a View (via Vaadin). + // + // TODO: Consider putting this into a couple of Map's. Doing so would speed up + // access. However, if we want to support custom functions, then there needs to + // be a way for those custom functions to get into the Map. This is why a database + // is being used to store ALL the functions, both standard and custom. + // + logger.info("Creating SQL Queries"); + MatchFunctionQueryDelegate delegate = new MatchFunctionQueryDelegate(); + FreeformQuery query = new FreeformQuery("SELECT * FROM match_functions", XacmlAdminUI.pool, new String[] {}); + query.setDelegate(delegate); + this.matchFunctionContainer = new SQLContainer(query); + // + // Same for this one + // + delegate = new MatchFunctionQueryDelegate(); + query = new FreeformQuery("SELECT * FROM higherorder_bag_functions", XacmlAdminUI.pool, new String[] {}); + query.setDelegate(delegate); + this.higherorderBagContainer = new SQLContainer(query); + // + // Load our PAP engine + // + logger.info("Creating PAP engine"); + String myRequestURL = VaadinServletService.getCurrentServletRequest().getRequestURL().toString(); + try { + // + // Set the URL for the RESTful PAP Engine + // + papEngine = new RESTfulPAPEngine(myRequestURL); + } catch (PAPException e ) { + logger.error("Failed to create PAP engine", e); + } catch (Exception e) { + logger.error("Failed to create PAP engine", e); + } + logger.info("done creating connections"); + } catch(Exception e) { + // + // Redirect to an error page + // + logger.error(e); + e.printStackTrace(); + this.navigator.addView("", new XacmlErrorHandler(e.getMessage(), null)); + this.navigator.navigateTo(""); + return; + } + logger.info("Creating main layout"); + // + // Create our main component layout + // + this.console = new XacmlAdminConsole(); + this.navigator.addView("", console); + this.navigator.setErrorView(new XacmlErrorHandler(null, null)); + // + // Navigate to our view + // + this.navigator.navigateTo(""); + // + // Register to receive PAP change notifications broadcasts + // + PAPNotificationBroadcaster.register(this); + } + + public static void servletInit() throws ServletException { + // + // Initialize GIT repository. + // + XacmlAdminUI.initializeGitRepository(); + // + // Initialize Entity Factory + // + XacmlAdminUI.initializeEntityFactory(); + // + // If we get here, then the configuration information + // seems ok. + // + } + + public static void servletDestroy() { + if (XacmlAdminUI.repository != null) { + XacmlAdminUI.repository.close(); + } + } + + /** + * An Update Notification has arrived from the PAP. + * Tell the Vaadin users to change their data. + * + * @param request + * @param response + * @throws ServletException + * @throws IOException + */ + public static void doPAPNotification(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + try { + // + // Notify all user instances to update groups + // + PAPNotificationBroadcaster.updateAllGroups(); + } catch (Exception e) { + logger.error("Unable to process PAP request: "+e, e); + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + } + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + } + + // Must unregister when the UI expires + @Override + public void detach() { + PAPNotificationBroadcaster.unregister(this); + super.detach(); + } + + /** + * This will initialize the JPA Entity Manager Factory. This will determine if + * the database connection settings are correct. + * + * @throws ServletException + */ + private static void initializeEntityFactory() throws ServletException { + logger.info("intializing Persistence Entity Factory"); + // + // Pull custom persistence settings + // + Properties properties; + try { + properties = XACMLProperties.getProperties(); + } catch (IOException e) { + throw new ServletException(e.getMessage(), e.getCause()); + } + // + // Create the factory + // + emf = Persistence.createEntityManagerFactory(XacmlAdminUI.PERSISTENCE_UNIT, properties); + // + // Did it get created? + // + if (emf == null) { + throw new ServletException("Unable to create Entity Manager Factory"); + } + // + // Create our JDBC connection pool + // + try { + logger.info("intializing JDBC Connection Pool"); + XacmlAdminUI.pool = new XacmlJDBCConnectionPool( + properties.getProperty(PersistenceUnitProperties.JDBC_DRIVER), + properties.getProperty(PersistenceUnitProperties.JDBC_URL), + properties.getProperty(PersistenceUnitProperties.JDBC_USER), + properties.getProperty(PersistenceUnitProperties.JDBC_PASSWORD)); + } catch (SQLException e) { + throw new ServletException(e.getMessage(), e.getCause()); + } + } + + private static void initializeGitRepository() throws ServletException { + XacmlAdminUI.repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_REPOSITORY)); + FileRepositoryBuilder builder = new FileRepositoryBuilder(); + try { + XacmlAdminUI.repository = builder.setGitDir(XacmlAdminUI.repositoryPath.toFile()).readEnvironment().findGitDir().setBare().build(); + if (Files.notExists(XacmlAdminUI.repositoryPath) || Files.notExists(Paths.get(XacmlAdminUI.repositoryPath.toString(), "HEAD"))) { + // + // Create it if it doesn't exist. As a bare repository + // + logger.info("Creating bare git repository: " + XacmlAdminUI.repositoryPath.toString()); + XacmlAdminUI.repository.create(); + // + // Add the magic file so remote works. + // + Path daemon = Paths.get(XacmlAdminUI.repositoryPath.toString(), "git-daemon-export-ok"); + Files.createFile(daemon); + } + } catch (IOException e) { + logger.error("Failed to build repository: " + repository, e); + throw new ServletException(e.getMessage(), e.getCause()); + } + // + // Make sure the workspace directory is created + // + Path workspace = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_WORKSPACE)); + workspace = workspace.toAbsolutePath(); + if (Files.notExists(workspace)) { + try { + Files.createDirectory(workspace); + } catch (IOException e) { + logger.error("Failed to build workspace: " + workspace, e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + // + // Create the user workspace directory + // + workspace = Paths.get(workspace.toString(), "pe"); + if (Files.notExists(workspace)) { + try { + Files.createDirectory(workspace); + } catch (IOException e) { + logger.error("Failed to create directory: " + workspace, e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + // + // Get the path to where the repository is going to be + // + Path gitPath = Paths.get(workspace.toString(), XacmlAdminUI.repositoryPath.getFileName().toString()); + if (Files.notExists(gitPath)) { + try { + Files.createDirectory(gitPath); + } catch (IOException e) { + logger.error("Failed to create directory: " + gitPath, e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + // + // Initialize the domain structure + // + String base = null; + String domain = XacmlAdminUI.getDomain(); + if (domain != null) { + for (String part : Splitter.on(':').trimResults().split(domain)) { + if (base == null) { + base = part; + } + Path subdir = Paths.get(gitPath.toString(), part); + if (Files.notExists(subdir)) { + try { + Files.createDirectory(subdir); + Files.createFile(Paths.get(subdir.toString(), ".svnignore")); + } catch (IOException e) { + logger.error("Failed to create: " + subdir, e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + } + } else { + try { + Files.createFile(Paths.get(workspace.toString(), ".svnignore")); + base = ".svnignore"; + } catch (IOException e) { + logger.error("Failed to create file", e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + try { + // + // These are the sequence of commands that must be done initially to + // finish setting up the remote bare repository. + // + Git git = Git.init().setDirectory(gitPath.toFile()).setBare(false).call(); + git.add().addFilepattern(base).call(); + git.commit().setMessage("Initialize Bare Repository").call(); + StoredConfig config = git.getRepository().getConfig(); + config.setString("remote", "origin", "url", XacmlAdminUI.repositoryPath.toAbsolutePath().toString()); + config.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*"); + config.save(); + git.push().setRemote("origin").add("master").call(); + /* + * This will not work unless git.push().setRemote("origin").add("master").call(); + * is called first. Otherwise it throws an exception. However, if the push() is + * called then calling this function seems to add nothing. + * + git.branchCreate().setName("master") + .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM) + .setStartPoint("origin/master").setForce(true).call(); + */ + } catch (GitAPIException | IOException e) { + logger.error(e); + throw new ServletException(e.getMessage(), e.getCause()); + } + } + + /** + * Initializes a user's git repository. + * + * + * @param workspacePath + * @param userId + * @param email + * @return + * @throws IOException + * @throws InvalidRemoteException + * @throws TransportException + * @throws GitAPIException + */ + private static Path initializeUserRepository(Path workspacePath, String userId, URI email) throws IOException, InvalidRemoteException, TransportException, GitAPIException { + Path gitPath = null; + // + // Initialize the User's Git repository + // + if (Files.notExists(workspacePath)) { + logger.info("Creating user workspace: " + workspacePath.toAbsolutePath().toString()); + // + // Create our user's directory + // + Files.createDirectory(workspacePath); + } + gitPath = Paths.get(workspacePath.toString(), XacmlAdminUI.repositoryPath.getFileName().toString()); + if (Files.notExists(gitPath)) { + // + // It doesn't exist yet, so Clone it and check it out + // + logger.info("Cloning user git directory: " + gitPath.toAbsolutePath().toString()); + Git.cloneRepository().setURI(XacmlAdminUI.repositoryPath.toUri().toString()) + .setDirectory(gitPath.toFile()) + .setNoCheckout(false) + .call(); + // + // Set userid + // + Git git = Git.open(gitPath.toFile()); + StoredConfig config = git.getRepository().getConfig(); + config.setString("user", null, "name", userId); + if (email != null && email.getPath() != null) { + config.setString("user", null, "email", email.toString()); + } + config.save(); + } + return gitPath; + } + + + public static String getDomain() { + return XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_DOMAIN, "urn"); + } + + public static JDBCConnectionPool getConnectionPool() { + return pool; + } + + public SQLContainer getMatchFunctionContainer() { + return this.matchFunctionContainer; + } + + public SQLContainer getHigherOrderBagContainer() { + return this.higherorderBagContainer; + } + + public EntityManager getEntityManager() { + return this.em; + } + + public JPAContainer<Attribute> getAttributes() { + return this.attributes; + } + + public void refreshAttributes() { + this.attributes.refresh(); + this.console.refreshAttributes(); + } + + public JPAContainer<ConstraintType> getConstraintTypes() { + return this.constraintTypes; + } + + public JPAContainer<Category> getCategories() { + return this.categories; + } + + public JPAContainer<Datatype> getDatatypes() { + return this.datatypes; + } + + public JPAContainer<PolicyAlgorithms> getPolicyAlgorithms() { + return this.policyAlgorithms; + } + + public JPAContainer<RuleAlgorithms> getRuleAlgorithms() { + return this.ruleAlgorithms; + } + + public JPAContainer<Obadvice> getObadvice() { + return this.obadvice; + } + + public JPAContainer<ObadviceExpression> getObadviceExpressions() { + return this.obadviceExpressions; + } + + public void refreshObadvice() { + this.obadvice.refresh(); + this.obadviceExpressions.refresh(); + this.console.refreshObadvice(); + } + + public JPAContainer<FunctionDefinition> getFunctionDefinitions() { + return this.functionDefinitions; + } + + public JPAContainer<FunctionArgument> getFunctionArguments() { + return this.functionArguments; + } + + public JPAContainer<PIPConfiguration> getPIPConfigurations() { + return this.pipConfigurations; + } + + public JPAContainer<PIPResolver> getPIPResolvers() { + return this.pipResolvers; + } + + public JPAContainer<PIPType> getPIPTypes() { + return this.pipTypes; + } + + public void refreshPIPConfiguration() { + this.pipConfigurations.refresh(); + this.console.refreshPIPConfiguration(); + } + + public Category getDefaultCategory() throws Exception { + for (Object id : categories.getItemIds()) { + Category cat = categories.getItem(id).getEntity(); + if (cat.getIdentifer().equals(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT)) { + return cat; + } + } + throw new Exception("There is no default category."); + } + + public Datatype getDefaultDatatype() throws Exception { + for (Object id: this.datatypes.getItemIds()) { + Datatype dt = this.datatypes.getItem(id).getEntity(); + if (dt.getIdentifer().equals(XACML3.ID_DATATYPE_STRING)) { + return dt; + } + } + throw new Exception("There is no default datatype."); + } + + public XacmlAdminAuthorization getAuthorizer() { + return this.authorizer; + } + + public boolean isAuthorized(AdminAction action, AdminResource resource) { + return this.authorizer.isAuthorized(this.getUserid(), action, resource); + } + + public String getUserid() { + Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.id"); + if (id == null) { + return XACMLProperties.getProperty("xacml.rest.admin.user.id", "guest"); + } + String str = id.toString(); + if (str == null || str.isEmpty()) { + return "guest"; + } + return str; + } + + public String getUserName() { + Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.name"); + if (id == null) { + return XACMLProperties.getProperty("xacml.rest.admin.user.name", "guest"); + } + String str = id.toString(); + if (str == null || str.isEmpty()) { + return "guest"; + } + return str; + } + + public URI getUserEmail() { + Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.email"); + if (id == null) { + return URI.create(XACMLProperties.getProperty("xacml.rest.admin.user.email", "guest")); + } + String str = id.toString(); + if (str == null || str.isEmpty()) { + return null; + } + return URI.create(str); + } + + public Path getUserWorkspace() { + return this.workspacePath; + } + + public Path getUserGitPath() { + return this.gitPath; + } + + public PAPEngine getPAPEngine() { + return this.papEngine; + } + + public String newPolicyID() { + return Joiner.on(':').skipNulls().join((XacmlAdminUI.getDomain().startsWith("urn") ? null : "urn"), + XacmlAdminUI.getDomain().replaceAll("[/\\\\.]", ":"), + "xacml", "policy", "id", UUID.randomUUID()); + } + + public String newRuleID() { + return Joiner.on(':').skipNulls().join((XacmlAdminUI.getDomain().startsWith("urn") ? null : "urn"), + XacmlAdminUI.getDomain().replaceAll("[/\\\\.]", ":"), + "xacml", "rule", "id", UUID.randomUUID()); + } + // + // PAPNotificationBroadcaster Interface implementation + // + /** + * Got a notification that the PAP has changed the PDP data, + * so update ALL PDPGroups. + * This is called once for each Vaadin instance for each PAP change Notification. + */ + public void updateAllGroups() { + access(new Runnable() { + @Override + public void run() { + // + // locking is needed to avoid race conditions. + // Shows up as Exception: "A connector should not be marked as dirty while a response is being written." + // + getUI().getSession().lock(); + try { + // + // Tell the console to refresh its PDP group information + // + console.refreshPDPGroups(); + } finally { + getUI().getSession().unlock(); + } + } + }); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java new file mode 100644 index 0000000..dd014dd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java
@@ -0,0 +1,106 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.navigator.View; +import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; + +public class XacmlErrorHandler extends CustomComponent implements View { + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Button buttonGo; + + @AutoGenerated + private Label labelError; + + public static String VIEWNAME="ErrorHandler.View"; + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + private static final long serialVersionUID = 1L; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public XacmlErrorHandler(String message, String button) { + buildMainLayout(); + setCompositionRoot(mainLayout); + this.labelError.setValue(message); + if (button != null) { + this.buttonGo.setCaption(button); + } else { + this.buttonGo.setVisible(false); + } + } + + @Override + public void enter(ViewChangeEvent event) { + // TODO Auto-generated method stub + + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("100.0%"); + setHeight("-1px"); + + // labelError + labelError = new Label(); + labelError.setImmediate(false); + labelError.setWidth("100.0%"); + labelError.setHeight("80px"); + labelError.setValue("This holds error messages."); + mainLayout.addComponent(labelError); + + // buttonGo + buttonGo = new Button(); + buttonGo.setCaption("Ok"); + buttonGo.setImmediate(true); + buttonGo.setWidth("-1px"); + buttonGo.setHeight("-1px"); + mainLayout.addComponent(buttonGo); + mainLayout.setComponentAlignment(buttonGo, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java new file mode 100644 index 0000000..a11707d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java
@@ -0,0 +1,239 @@ +/* + * 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 org.apache.openaz.xacml.admin; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool; + +public class XacmlJDBCConnectionPool implements JDBCConnectionPool { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(XacmlJDBCConnectionPool.class); + + private int initialConnections = 5; + private int maxConnections = 300; + + private String driverName; + private String connectionUri; + private String userName; + private String password; + + private transient Set<Connection> availableConnections; + private transient Set<Connection> reservedConnections; + + private boolean initialized; + + public XacmlJDBCConnectionPool(String driverName, String connectionUri, String userName, String password) throws SQLException { + if (driverName == null) { + throw new IllegalArgumentException( + "JDBC driver class name must be given."); + } + if (connectionUri == null) { + throw new IllegalArgumentException( + "Database connection URI must be given."); + } + if (userName == null) { + throw new IllegalArgumentException( + "Database username must be given."); + } + if (password == null) { + throw new IllegalArgumentException( + "Database password must be given."); + } + this.driverName = driverName; + this.connectionUri = connectionUri; + this.userName = userName; + this.password = password; + + /* Initialize JDBC driver */ + try { + Class.forName(driverName).newInstance(); + } catch (Exception ex) { + throw new RuntimeException("Specified JDBC Driver: " + driverName + + " - initialization failed.", ex); + } + } + + public XacmlJDBCConnectionPool(String driverName, String connectionUri, + String userName, String password, int initialConnections, + int maxConnections) throws SQLException { + this(driverName, connectionUri, userName, password); + this.initialConnections = initialConnections; + this.maxConnections = maxConnections; + } + + private void initializeConnections() throws SQLException { + availableConnections = new HashSet<Connection>(initialConnections); + reservedConnections = new HashSet<Connection>(initialConnections); + for (int i = 0; i < initialConnections; i++) { + availableConnections.add(createConnection()); + } + initialized = true; + } + + @Override + public synchronized Connection reserveConnection() throws SQLException { + if (!initialized) { + initializeConnections(); + } + Connection c = null; + do { + if (availableConnections.isEmpty()) { + if (reservedConnections.size() < maxConnections) { + logger.info("creating new connection"); + availableConnections.add(createConnection()); + } else { + throw new SQLException("Connection limit has been reached."); + } + } + // + // Get first available + // + c = availableConnections.iterator().next(); + // + // It is still valid? + // + if (!this.isValid(c)) { + try { + logger.warn("Removing invalid connection."); + // + // No close it + // + c.close(); + // + // Remove from our list + // + this.availableConnections.remove(c); + // + // Try again + // + c = null; + } catch (SQLException e) { // NOPMD + // If removing the connection fails, ignore + } + } else { + // + // Yes + // + availableConnections.remove(c); + break; + } + } while (c == null); + // + // Add it to our reserved list + // + reservedConnections.add(c); + return c; + } + + @Override + public synchronized void releaseConnection(Connection conn) { + if (conn == null || !initialized) { + return; + } + /* Try to roll back if necessary */ + try { + if (!conn.getAutoCommit()) { + conn.rollback(); + } + } catch (SQLException e) { + /* Roll back failed, close and discard connection */ + try { + conn.close(); + } catch (SQLException e1) { // NOPMD + /* Nothing needs to be done */ + } + reservedConnections.remove(conn); + return; + } + reservedConnections.remove(conn); + availableConnections.add(conn); + } + + private Connection createConnection() throws SQLException { + Connection c = DriverManager.getConnection(connectionUri, userName, + password); + c.setAutoCommit(false); + if (driverName.toLowerCase().contains("mysql")) { + try { + Statement s = c.createStatement(); + s.execute("SET SESSION sql_mode = 'ANSI'"); + s.close(); + } catch (Exception e) { // NOPMD + // Failed to set ansi mode; continue + } + } + return c; + } + + @Override + public void destroy() { + for (Connection c : availableConnections) { + try { + c.close(); + } catch (SQLException e) { // NOPMD + // No need to do anything + } + } + for (Connection c : reservedConnections) { + try { + c.close(); + } catch (SQLException e) { // NOPMD + // No need to do anything + } + } + + } + + private void writeObject(java.io.ObjectOutputStream out) throws IOException { + initialized = false; + out.defaultWriteObject(); + } + + private final boolean isValid(final Connection con) throws SQLException { + final String bogusQuery = "SELECT 1"; + + try (Statement st = con.createStatement(); ResultSet res = st.executeQuery(bogusQuery)) { + return true; + } catch (final SQLException sqlx) { + return false; + } + } + + @Override + public String toString() { + return "XacmlJDBCConnectionPool [initialConnections=" + + initialConnections + ", maxConnections=" + maxConnections + + ", driverName=" + driverName + ", connectionUri=" + + connectionUri + ", userName=" + userName + ", password=" + + password + ", initialized=" + initialized + "]"; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java new file mode 100644 index 0000000..f0069a7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java
@@ -0,0 +1,503 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization; +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.view.windows.AttributeEditorWindow; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Container.Filter; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class AttributeDictionary extends CustomComponent { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table table; + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + @AutoGenerated + private ComboBox comboBoxFilterDatatype; + @AutoGenerated + private ComboBox comboBoxFilterCategory; + @AutoGenerated + private Button buttonClone; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonNew; + private static final long serialVersionUID = 4553719412188869190L; + private static final Log logger = LogFactory.getLog(AttributeDictionary.class); + private static final Object[] visibleColumns = new Object[] { "xacmlId", "description", "categoryBean", "datatypeBean", "constraintType", "modifiedBy", "modifiedDate", "createdBy", "createdDate"}; + private static final String[] columnHeaders = new String[] { "Attribute ID", "Description", "Category", "DataType", "Constraint", "Modified By", "Modified Date", "Created By", "Created Date"}; + + private AttributeDictionary self = this; + + private final JPAContainer<Attribute> attributes = new JPAContainer<Attribute>(Attribute.class); + private final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); + private final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeDictionary() { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Finish initializing the container + // + boolean isReadOnly; + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_WRITE, + XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) { + if (logger.isDebugEnabled()) { + logger.debug("write access"); + } + // + // Make it mutable + // + isReadOnly = false; + this.attributes.setEntityProvider(new CachingMutableLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + } else { + if (logger.isDebugEnabled()) { + logger.debug("read access"); + } + // + // Make it read-only + // + isReadOnly = true; + this.attributes.setEntityProvider(new CachingLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + } + this.categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + this.categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); + this.datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + this.datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true}); + // + // Initialize + // + this.initializeTable(isReadOnly); + this.initializeButtons(isReadOnly); + this.initializeCategoryComboFilter(); + this.initializeDatatypeComboFilter(); + } + + protected void initializeTable(boolean isReadOnly) { + // + // This is the data source + // + this.table.setContainerDataSource(this.attributes); + // + // Setup table + // + this.table.setVisibleColumns(visibleColumns); + this.table.setColumnHeaders(columnHeaders); + this.table.setImmediate(true); + this.table.setColumnCollapsingAllowed(true); + // + // Read only? + // + if (isReadOnly) { + if (logger.isDebugEnabled()) { + logger.debug("read only table"); + } + return; + } + this.table.setSelectable(true); + // + // Respond to clicks + // + this.table.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + // + // Create our editor window + // + final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(self.attributes.getItem(event.getItemId())); + attributeEditor.setCaption("Edit Attribute"); + attributeEditor.setModal(true); + attributeEditor.center(); + UI.getCurrent().addWindow(attributeEditor); + } + } + }); + // + // Respond to selections + // + this.table.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = self.table.getValue(); + if (value == null) { + self.buttonRemove.setEnabled(false); + self.buttonClone.setEnabled(false); + } else { + self.buttonRemove.setEnabled(true); + self.buttonClone.setEnabled(true); + } + } + }); + } + + protected void initializeButtons(boolean isReadOnly) { + if (isReadOnly) { + this.buttonNew.setVisible(false); + this.buttonRemove.setVisible(false); + this.buttonClone.setVisible(false); + return; + } + this.buttonNew.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + AttributeDictionary.createNewAttributeWindow(); + } + + }); + + this.buttonRemove.setEnabled(false); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Get the selected item + // + Object id = self.table.getValue(); + // + // Sanity check + // + if (id == null) { + return; + } + // + // Remove the attribute + // + self.attributes.removeItem(id); + // + // Unfortunately, removing the item does NOT result + // in a ValueChange event being generated. So we must + // trigger it ourselves. + // + self.table.select(self.table.getNullSelectionItemId()); + } + }); + + this.buttonClone.setEnabled(false); + this.buttonClone.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object id = self.table.getValue(); + if (id == null) { + return; + } + Item item = self.table.getItem(id); + if (item instanceof EntityItem) { + @SuppressWarnings("unchecked") + // + // Get the entity + // + EntityItem<Attribute> entityItem = (EntityItem<Attribute>) item; + // + // Clone it + // + Attribute newAttribute = new Attribute(entityItem.getEntity(), ((XacmlAdminUI)UI.getCurrent()).getUserid()); + // + // Add it to the database + // + id = self.attributes.addEntity(newAttribute); + // + // Now select it + // + self.table.select(id); + // + // Refresh it to get the latest modified date + // + self.attributes.refreshItem(id); + } + } + }); + } + + protected void initializeCategoryComboFilter() { + // + // Set data source + // + this.comboBoxFilterCategory.setContainerDataSource(self.categories); + this.comboBoxFilterCategory.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxFilterCategory.setItemCaptionPropertyId("xacmlId"); + // + // Initialize GUI properties + // + this.comboBoxFilterCategory.setNullSelectionAllowed(true); + this.comboBoxFilterCategory.setImmediate(true); + // + // Respond to value changes + // + this.comboBoxFilterCategory.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + Filter currentFilter = null; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Remove filter + // + if (currentFilter != null) { + self.attributes.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Set the new one + // + Object id = self.comboBoxFilterCategory.getValue(); + if (id == null) { + return; + } + Category cat = self.categories.getItem(id).getEntity(); + this.currentFilter = new Compare.Equal("categoryBean", cat); + self.attributes.addContainerFilter(this.currentFilter); + } + }); + } + + protected void initializeDatatypeComboFilter() { + // + // Set data source + // + this.comboBoxFilterDatatype.setContainerDataSource(self.datatypes); + this.comboBoxFilterDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxFilterDatatype.setItemCaptionPropertyId("xacmlId"); + // + // Initialize GUI properties + // + this.comboBoxFilterDatatype.setNullSelectionAllowed(true); + this.comboBoxFilterDatatype.setImmediate(true); + // + // Respond to value changes + // + this.comboBoxFilterDatatype.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + Filter currentFilter = null; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Remove filter + // + if (currentFilter != null) { + self.attributes.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Set the new one + // + Object id = self.comboBoxFilterDatatype.getValue(); + if (id == null) { + return; + } + Datatype cat = self.datatypes.getItem(id).getEntity(); + this.currentFilter = new Compare.Equal("datatypeBean", cat); + self.attributes.addContainerFilter(this.currentFilter); + } + }); + } + + public void refreshContainer() { + this.attributes.refresh(); + this.categories.refresh(); + this.datatypes.refresh(); + } + + public static void createNewAttributeWindow() { + // + // Create our new attribute + // + String domain = XacmlAdminUI.getDomain(); + String userid = ((XacmlAdminUI)UI.getCurrent()).getUserid(); + final Attribute newAttribute = new Attribute(domain, userid); + try { + newAttribute.setCategoryBean(((XacmlAdminUI)UI.getCurrent()).getDefaultCategory()); + newAttribute.setDatatypeBean(((XacmlAdminUI)UI.getCurrent()).getDefaultDatatype()); + } catch (Exception e) { + logger.error(e); + return; + } + // + // Create our editor window + // + final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(((XacmlAdminUI)UI.getCurrent()).getAttributes().createEntityItem(newAttribute)); + attributeEditor.setCaption("Add New Attribute"); + attributeEditor.setModal(true); + attributeEditor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user hit save? + // + if (attributeEditor.isSaved()) { + // + // Add the new attribute + // + ((XacmlAdminUI)UI.getCurrent()).getAttributes().addEntity(newAttribute); + ((XacmlAdminUI)UI.getCurrent()).refreshAttributes(); + } + } + + }); + attributeEditor.center(); + UI.getCurrent().addWindow(attributeEditor); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + + // table + table = new Table(); + table.setImmediate(false); + table.setWidth("100.0%"); + table.setHeight("-1px"); + mainLayout.addComponent(table); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(false); + horizontalLayoutToolbar.setSpacing(true); + + // buttonNew + buttonNew = new Button(); + buttonNew.setCaption("New"); + buttonNew.setImmediate(true); + buttonNew.setDescription("Create a new attribute"); + buttonNew.setWidth("70px"); + buttonNew.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonNew); + horizontalLayoutToolbar.setComponentAlignment(buttonNew, new Alignment( + 9)); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove"); + buttonRemove.setImmediate(true); + buttonRemove.setDescription("Remove the selected attribute(s)"); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonRemove); + horizontalLayoutToolbar.setComponentAlignment(buttonRemove, + new Alignment(9)); + + // buttonClone + buttonClone = new Button(); + buttonClone.setCaption("Clone"); + buttonClone.setImmediate(true); + buttonClone.setDescription("Clone an attribute."); + buttonClone.setWidth("-1px"); + buttonClone.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonClone); + horizontalLayoutToolbar.setComponentAlignment(buttonClone, + new Alignment(9)); + + // comboBoxFilterCategory + comboBoxFilterCategory = new ComboBox(); + comboBoxFilterCategory.setCaption("Filter By Category"); + comboBoxFilterCategory.setImmediate(false); + comboBoxFilterCategory.setWidth("-1px"); + comboBoxFilterCategory.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(comboBoxFilterCategory); + + // comboBoxFilterDatatype + comboBoxFilterDatatype = new ComboBox(); + comboBoxFilterDatatype.setCaption("Filter By Data Type"); + comboBoxFilterDatatype.setImmediate(false); + comboBoxFilterDatatype.setWidth("-1px"); + comboBoxFilterDatatype.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(comboBoxFilterDatatype); + + return horizontalLayoutToolbar; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java new file mode 100644 index 0000000..1b1edd4 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java
@@ -0,0 +1,347 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization; +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.view.windows.ObadviceEditorWindow; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class ObadviceDictionary extends CustomComponent { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table table; + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + @AutoGenerated + private ComboBox comboBoxFilter; + @AutoGenerated + private Button buttonClone; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonNew; + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(ObadviceDictionary.class); + private final ObadviceDictionary self = this; + + private static final Object[] visibleColumns = new Object[] { "type", "xacmlId", "description", "fulfillOn", "modifiedBy", "modifiedDate", "createdBy", "createdDate"}; + private static final String[] columnHeaders = new String[] { "Type", "Attribute ID", "Description", "FulFill/Apply", "Modified By", "Modified Date", "Created By", "Created Date"}; + + private final JPAContainer<Obadvice> obadvice = new JPAContainer<Obadvice>(Obadvice.class); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param jpaContainer + */ + public ObadviceDictionary() { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Setup container + // + boolean isReadOnly; + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_WRITE, + XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) { + if (logger.isDebugEnabled()) { + logger.debug("write access"); + } + isReadOnly = false; + this.obadvice.setEntityProvider(new CachingMutableLocalEntityProvider<Obadvice>(Obadvice.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + } else { + if (logger.isDebugEnabled()) { + logger.debug("read only access"); + } + isReadOnly = true; + this.obadvice.setEntityProvider(new CachingLocalEntityProvider<Obadvice>(Obadvice.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + } + // + // initialize + // + this.initializeTable(isReadOnly); + this.initializeButtons(isReadOnly); + this.initializeCombo(); + } + + protected void initializeTable(boolean isReadOnly) { + // + // Set our container + // + this.table.setContainerDataSource(this.obadvice); + // + // Initialize GUI properties + // + this.table.setVisibleColumns(visibleColumns); + this.table.setColumnHeaders(columnHeaders); + this.table.setImmediate(true); + this.table.setColumnCollapsingAllowed(true); + // + // Is read only + // + if (isReadOnly) { + return; + } + this.table.setSelectable(true); + // + // Respond to selections + // + this.table.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.buttonRemove.setEnabled(self.table.getValue() != null); + self.buttonClone.setEnabled(self.table.getValue() != null); + } + }); + } + + protected void initializeButtons(boolean isReadOnly) { + if (isReadOnly) { + this.buttonNew.setVisible(false); + this.buttonRemove.setVisible(false); + this.buttonClone.setVisible(false); + return; + } + // + // NEW button + // + this.buttonNew.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Create window + // + String domain = XacmlAdminUI.getDomain(); + String userid = ((XacmlAdminUI)UI.getCurrent()).getUserid(); + final Obadvice oa = new Obadvice(domain, userid); + final EntityItem<Obadvice> entity = self.obadvice.createEntityItem(oa); + final ObadviceEditorWindow editor = new ObadviceEditorWindow(entity); + editor.setCaption("Add New Obligation/Advice"); + editor.setCloseShortcut(KeyCode.ESCAPE); + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + if (editor.isSaved()) { + self.obadvice.addEntity(oa); + logger.info("Added new obligation/advice: " + oa); + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + }); + // + // Disable remove/clone buttons to start + // + this.buttonRemove.setEnabled(false); + this.buttonClone.setEnabled(false); + // + // REMOVE button + // + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.obadvice.removeItem(self.table.getValue()); + } + }); + // + // CLONE button + // + this.buttonClone.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // TODO + } + }); + } + + protected void initializeCombo() { + // + // Add filter values + // + this.comboBoxFilter.addItem(Obadvice.OBLIGATION); + this.comboBoxFilter.addItem(Obadvice.ADVICE); + // + // Initialize GUI properties + // + this.comboBoxFilter.setImmediate(true); + this.comboBoxFilter.setNullSelectionAllowed(true); + // + // + this.comboBoxFilter.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Remove filters + // + self.obadvice.removeAllContainerFilters(); + // + // What was selected? + // + Object id = self.comboBoxFilter.getValue(); + if (id != null) { + // + // Add filter + // + if (id.equals(Obadvice.OBLIGATION)) { + self.obadvice.addContainerFilter(new Compare.Equal("type", Obadvice.OBLIGATION)); + } else if (id.equals(Obadvice.ADVICE)) { + self.obadvice.addContainerFilter(new Compare.Equal("type", Obadvice.ADVICE)); + } + } + } + }); + } + + public void refreshContainer() { + this.obadvice.refresh(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("100.0%"); + setHeight("-1px"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + + // table + table = new Table(); + table.setImmediate(true); + table.setWidth("-1px"); + table.setHeight("-1px"); + mainLayout.addComponent(table); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(false); + horizontalLayoutToolbar.setSpacing(true); + + // buttonNew + buttonNew = new Button(); + buttonNew.setCaption("New"); + buttonNew.setImmediate(true); + buttonNew + .setDescription("Add a new advice or obligation to the dictionary."); + buttonNew.setWidth("-1px"); + buttonNew.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonNew); + horizontalLayoutToolbar.setComponentAlignment(buttonNew, new Alignment( + 24)); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove"); + buttonRemove.setImmediate(true); + buttonRemove + .setDescription("Remove the selected advice or obligation from the dictionary."); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonRemove); + horizontalLayoutToolbar.setComponentAlignment(buttonRemove, + new Alignment(24)); + + // buttonClone + buttonClone = new Button(); + buttonClone.setCaption("Clone"); + buttonClone.setImmediate(true); + buttonClone.setDescription("Clone the selected obligation/advice."); + buttonClone.setWidth("-1px"); + buttonClone.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonClone); + horizontalLayoutToolbar.setComponentAlignment(buttonClone, + new Alignment(24)); + + // comboBoxFilter + comboBoxFilter = new ComboBox(); + comboBoxFilter.setCaption("Filter By Type"); + comboBoxFilter.setImmediate(false); + comboBoxFilter.setWidth("-1px"); + comboBoxFilter.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(comboBoxFilter); + + return horizontalLayoutToolbar; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java new file mode 100644 index 0000000..56fd9cd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java
@@ -0,0 +1,862 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.vaadin.dialogs.ConfirmDialog; +import org.vaadin.dialogs.ConfirmDialog.ContentMode; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization; +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.model.PDPContainer; +import org.apache.openaz.xacml.admin.model.PDPGroupContainer; +import org.apache.openaz.xacml.admin.model.PDPPIPContainer; +import org.apache.openaz.xacml.admin.model.PDPPolicyContainer; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.view.windows.EditPDPGroupWindow; +import org.apache.openaz.xacml.admin.view.windows.EditPDPWindow; +import org.apache.openaz.xacml.admin.view.windows.PDPStatusWindow; +import org.apache.openaz.xacml.admin.view.windows.SelectPDPGroupWindow; +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PAPException; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPGroupStatus; +import org.apache.openaz.xacml.api.pap.PDPStatus; +import org.apache.openaz.xacml.std.pap.StdPDPGroup; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Table; +import com.vaadin.ui.Table.ColumnGenerator; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + + +public class PDPManagement extends CustomComponent { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Table table; + + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + + @AutoGenerated + private Button buttonRemove; + + @AutoGenerated + private Button buttonCreate; + + private static final long serialVersionUID = 1L; + private final PDPManagement self = this; + private static final Log logger = LogFactory.getLog(PDPManagement.class); + + private PDPGroupContainer container; + + private static final Action CREATE_GROUP = new Action ("Create Group"); + private static final Action REPAIR_GROUP = new Action ("Repair Group"); + private static final Action EDIT_GROUP = new Action ("Edit Group"); + private static final Action DELETE_GROUP = new Action ("Delete Group"); + private static final Action SYNCHRONIZE = new Action ("Synchronize"); + private static final Action MAKE_DEFAULT = new Action ("Make Default"); + private static final Action CREATE_PDP = new Action ("Create PDP"); + private static final Action EDIT_PDP = new Action ("Edit PDP"); + private static final Action DELETE_PDP = new Action ("Delete PDP"); + private static final Action MOVE_PDP = new Action ("Move PDP"); + private static final Action GET_PDP_STATUS = new Action ("View Status"); + + private PAPEngine papEngine; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PDPManagement(PAPEngine engine) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Initialize + // + this.papEngine = engine; + // + // Initialize + // + this.initialize(); + // + // setup the buttons + // + this.setupButtons(); + } + + protected void initialize() { + // + // Don't create a container if the engine doesn't exist + // + if (this.papEngine == null) { + // + // remove all the components + // + this.mainLayout.removeAllComponents(); + // + // Add a label + // + this.mainLayout.addComponent(new Label("PDP Management unavailable - PAP servlet unavailable.")); + // + // done + // + return; + } + // + // Create our container + // + this.container = new PDPGroupContainer(this.papEngine); + // + // Determine authorization level + // + boolean isAdmin = ((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_ADMIN, + XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN); + try { + this.initializeTree(isAdmin); + this.initializeButtons(isAdmin); + } catch (Exception e) { + logger.error("UNABLE TO START PDPManagement: " + e, e); + // check if PAP servlet is up + try { + Set<PDPGroup> groups = this.papEngine.getPDPGroups(); + if (groups == null) { + throw new PAPException("PAP not running"); + } + } catch (PAPException | NullPointerException e1) { + setCompositionRoot(new Label("Cannot use PDP Management because the PAP servlet was not running when Admin Console Servlet first initialized.")); + return; + } + setCompositionRoot(new Label("Cannot use PDP Management because of error during initialization: " + e.getMessage())); + } + } + + protected void initializeTree(final boolean isAdmin) { + // + // Set the data source + // + this.table.setContainerDataSource(this.container); + // + // Setup the GUI properties + // + this.table.setVisibleColumns("Name", "Description", "Status", "Default", "PDPs", "Policies", "PIP Configurations"); + this.table.setColumnHeaders("Name", "Description", "Status", "Default", "PDP's", "Policies", "PIP Configurations"); + // + // The description should be a text area + // + this.table.addGeneratedColumn("Description", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + TextArea area = new TextArea(); + area.setValue(((PDPGroup) itemId).getDescription()); + area.setReadOnly(true); + return area; + } + + }); + // + // Generate a GUI element for the PDP's + // + this.table.addGeneratedColumn("PDPs", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + final Table table = new Table(); + final PDPContainer container = new PDPContainer((PDPGroup) itemId); + // + // Setup the container data + // + table.setContainerDataSource(container); + // + // Save the group for easy access + // + table.setData(itemId); + // + // GUI properties + // + table.setPageLength(table.getContainerDataSource().size() + 2); + table.setVisibleColumns("Name", "Status", "Description"); + table.setColumnCollapsingAllowed(true); + table.setColumnCollapsed("Description", true); + table.setWidth("100%"); + // + // If an admin, then it is editable + // + if (isAdmin) { + // + // Set it as selectable + // + table.setSelectable(true); + // + // Add actions + // + table.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {CREATE_PDP}; + } + if (target instanceof PDP) { + if (self.container.size() > 1) { + return new Action[] {EDIT_PDP, GET_PDP_STATUS, MOVE_PDP, DELETE_PDP}; + } else { + return new Action[] {EDIT_PDP, GET_PDP_STATUS, DELETE_PDP}; + } + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == CREATE_PDP) { + self.editPDP(null, (PDPGroup) table.getData()); + return; + } + if (action == EDIT_PDP) { + assert target instanceof PDP; + self.editPDP((PDP) target, (PDPGroup) table.getData()); + return; + } + if (action == MOVE_PDP) { + assert target instanceof PDP; + self.movePDP((PDP) target, (PDPGroup) table.getData()); + return; + } + if (action == DELETE_PDP) { + assert target instanceof PDP; + self.deletePDP((PDP) target, (PDPGroup) table.getData()); + return; + } + if (action == GET_PDP_STATUS) { + assert target instanceof PDP; + self.getPDPStatus((PDP) target, (PDPGroup) table.getData()); + } + } + }); + // + // Respond to events + // + table.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + self.editPDP((PDP) event.getItemId(), (PDPGroup) table.getData()); + } + } + }); + } + return table; + } + }); + // + // Generate a GUI element for the policies + // + this.table.addGeneratedColumn("Policies", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + Table table = new Table(); + table.setContainerDataSource(new PDPPolicyContainer((PDPGroup) itemId)); + table.setPageLength(table.getContainerDataSource().size() + 2); + + table.setVisibleColumns("Root", "Name", "Version", "Description"); + table.setColumnCollapsingAllowed(true); + table.setColumnCollapsed("Description", true); + + table.setWidth("100%"); + + return table; + } + }); + // + // Generate a GUI element for the PIP configurations + // + this.table.addGeneratedColumn("PIP Configurations", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + Table table = new Table(); + if (itemId instanceof PDPGroup) { + table.setContainerDataSource(new PDPPIPContainer((PDPGroup) itemId)); + table.setPageLength(table.getContainerDataSource().size() + 2); + } + if (itemId instanceof PDP) { + table.setContainerDataSource(new PDPPIPContainer((PDP) itemId)); + table.setVisible(false); + table.setPageLength(0); + } + table.setVisibleColumns("Name", "Description"); + table.setColumnCollapsingAllowed(true); + table.setColumnCollapsed("Description", true); + + table.setWidth("100%"); + + return table; + } + }); + // + // Check the user's authorization level + // + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_ADMIN, + XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN)) { + this.table.setSelectable(true); + } else { + if (logger.isDebugEnabled()) { + logger.debug("No admin access to pdp management"); + } + return; + } + // + // Setup Action Handlers + // + this.table.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + // + // Nothing is selected, they right-clicked empty space. + // Only one action. + // + return new Action[] {CREATE_GROUP}; + } + if (target instanceof PDPGroup) { + List<Action> actions = new ArrayList<Action>(); + PDPGroupStatus.Status status = ((PDPGroup)target).getStatus().getStatus(); + if (status == PDPGroupStatus.Status.LOAD_ERRORS) { + actions.add(REPAIR_GROUP); + } + if (((PDPGroup)target).isDefaultGroup() == false) { + actions.add(MAKE_DEFAULT); + } + actions.add(EDIT_GROUP); + if (status == PDPGroupStatus.Status.OUT_OF_SYNCH) { + actions.add(SYNCHRONIZE); + } + if (((PDPGroup)target).isDefaultGroup() == false) { + actions.add(DELETE_GROUP); + } + actions.add(CREATE_PDP); + // Throws a class cast exception +// return (Action[]) actions.toArray(); + Action[] actions2 = new Action[actions.size()]; + int index = 0; + for (Action a : actions) { + actions2[index++] = a; + } + return actions2; + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == CREATE_GROUP) { + self.editPDPGroup(null); + return; + } + if (action == EDIT_GROUP) { + assert target instanceof PDPGroup; + self.editPDPGroup((PDPGroup) target); + return; + } + if (action == DELETE_GROUP) { + self.deleteGroup((PDPGroup) target); + return; + } + if (action == REPAIR_GROUP) { + if (target instanceof PDPGroup) { + ((PDPGroup) target).repair(); + } else { + String message = "Action '" + REPAIR_GROUP.getCaption() + "' called on non-group target '" + target + "'"; + logger.error(message); + AdminNotification.error(message); + } + return; + } + if (action == MAKE_DEFAULT) { + if (target instanceof PDPGroup) { + try { + self.container.makeDefault((PDPGroup) target); + } catch (Exception e) { + AdminNotification.error("Make Default failed. Reason:\n" + e.getMessage()); + } + } else { + String message = "Action '" + MAKE_DEFAULT.getCaption() + "' called on non-group target '" + target + "'"; + logger.error(message); + AdminNotification.error(message); + } + return; + } + if (action == SYNCHRONIZE) { + if (target instanceof PDPGroup) { +logger.error("SYNCHRONIZE NOT YET IMPLMENTED"); +AdminNotification.error("Synchronize not yet implemented"); + } else { + String message = "Action '" + SYNCHRONIZE.getCaption() + "' called on non-group target '" + target + "'"; + logger.error(message); + AdminNotification.error(message); + } + return; + } + if (action == CREATE_PDP) { + if (target instanceof PDPGroup) { + self.editPDP(null, ((PDPGroup)target)); + } else { + String message = "Action '" + CREATE_PDP.getCaption() + "' called on non-group target '" + target + "'"; + logger.error(message); + AdminNotification.error(message); + } + return; + } + } + }); + // + // Listen for item change notifications + // + this.table.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + assert event.getItemId() instanceof PDPGroup; + self.editPDPGroup((PDPGroup) event.getItemId()); + } + } + }); + // + // Respond to selection events + // + this.table.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object id = self.table.getValue(); + if (id == null) { + self.buttonRemove.setEnabled(false); + } else { + // + // Make sure its not the default group + // + if (((PDPGroup) id).isDefaultGroup()) { + self.buttonRemove.setEnabled(false); + } else { + self.buttonRemove.setEnabled(true); + } + } + } + }); + // + // Maximize the table + // + this.table.setSizeFull(); + } + + protected void initializeButtons(final boolean isAdmin) { + if (isAdmin == false) { + return; + } + this.buttonCreate.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.editPDPGroup(null); + } + }); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object id = self.table.getValue(); + assert id != null; + assert id instanceof PDPGroup; + self.deleteGroup((PDPGroup) id); + self.table.select(self.table.getNullSelectionItemId()); + } + }); + } + + protected void setupButtons() { + if (this.table.getValue() == null) { + this.buttonRemove.setEnabled(false); + } else { + this.buttonRemove.setEnabled(true); + } + } + + protected void editPDP(final PDP pdp, final PDPGroup group) { + final EditPDPWindow editor = new EditPDPWindow(pdp, this.container.getGroups()); + if (pdp == null) { + editor.setCaption("Create New PDP"); + } else { + editor.setCaption("Edit PDP " + pdp.getId()); + } + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + if (editor.isSaved() == false) { + return; + } + try { + // + // Adding a new PDP? + // + if (pdp == null) { + // + // Yes tell the container to add it + // + self.container.addNewPDP(editor.getPDPId(), group, editor.getPDPName(), editor.getPDPDescription()); + } else { + // + // No tell the container to update it + // + pdp.setName(editor.getPDPName()); + pdp.setDescription(editor.getPDPDescription()); + self.container.updatePDP(pdp); + } + } catch (Exception e) { + String message = "Unable to create PDP. Reason:\n" + e.getMessage(); + logger.error(message); + AdminNotification.error(message); + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void editPDPGroup(final PDPGroup group) { + // + // copy the group + // + final StdPDPGroup copyGroup = (group == null ? null : new StdPDPGroup(group)); + // + // + // + final EditPDPGroupWindow editor = new EditPDPGroupWindow(copyGroup, this.container.getGroups(), papEngine); + if (group == null) { + editor.setCaption("Create PDP Group"); + } else { + editor.setCaption("Edit PDP Group " + ((PDPGroup) group).getName()); + } + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + if (editor.isSaved() == false) { + return; + } + if (group == null) { + // + // Creating a new group + // + try { + self.container.addNewGroup(editor.getGroupName(), editor.getGroupDescription()); + } catch (Exception e) { + String message = "Unable to create Group. Reason:\n" + e.getMessage(); + logger.error(message); + AdminNotification.error(message); + } + } else { + // + // Update group + // + self.container.updateGroup(editor.getUpdatedObject()); + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void deletePDP(final PDP pdp, final PDPGroup pdpGroup) { + String message = "Are you sure you want to delete <B>" + (pdp.getName() == null ? "" : pdp.getName()) + "</B> group?"; + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm PDP Deletion", message, "Delete", "Cancel"); + dialog.setContentMode(ContentMode.HTML); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed()) { + try { + self.container.removePDP(pdp, pdpGroup); + } catch (PAPException e) { + logger.warn("Failed to remove pdp"); + AdminNotification.warn("Failed to remove PDP"); + } + } + } + }, true); + } + + protected void movePDP(final PDP pdp, final PDPGroup currentGroup) { + List<PDPGroup> currentGroups = this.container.getGroups(); + Set<PDPGroup> otherGroups = new HashSet<PDPGroup>(currentGroups); + if (otherGroups.remove(currentGroup) == false) { + logger.warn("Group list inconsistency - failed to move pdp to selected group"); + return; + } + final SelectPDPGroupWindow editor = new SelectPDPGroupWindow(otherGroups, "What was this?"); + editor.setCaption("Move PDP to group"); + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + if (editor.isSaved()) { + self.container.movePDP((PDP) pdp, editor.selectedGroup()); + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void getPDPStatus(final PDP pdp, final PDPGroup group) { + PDPStatus status; + try { + status = papEngine.getStatus(pdp); + } catch (Exception e) { + AdminNotification.error("Unable to get details for pdp '" + pdp.getId() + "' with summary status: " + pdp.getStatus().getStatus()); + return; + } + logger.info(status); + PDPStatusWindow window = new PDPStatusWindow(status); + window.setCaption("Status for PDP " + pdp.getName()); + window.setModal(true); + window.center(); + UI.getCurrent().addWindow(window); + } + + private void deleteGroup(final PDPGroup group) { + // + // Cannot be the default group + // + if (group.isDefaultGroup()) { + logger.error("Cannot delete the Default group"); + return; + } + // + // Any PDPs in the group? + // + Set<PDP> pdps = group.getPdps(); + if (pdps.isEmpty()) { + // + // There are no PDP's, so just prompt to remove it + // + String message = "Are you sure you want to delete <B>" + (group.getName() == null ? "" : group.getName()) + "</B> group?"; + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Group Deletion", message, "Delete", "Cancel"); + dialog.setContentMode(ContentMode.HTML); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed()) { + try { + self.container.removeGroup(group, null); + } catch (Exception e1) { + logger.warn("Container failed to remove group"); + AdminNotification.error("Unable to delete group '" + group.getId() + "'. Reason:\n" + e1.getMessage()); + } + return; + } + } + }, true); + return; + } + // + // Get our set of groups + // + List<PDPGroup> currentGroups = this.container.getGroups(); + Set<PDPGroup> otherGroups = new HashSet<PDPGroup>(currentGroups); + if (otherGroups.remove(group) == false) { + logger.warn("Group list inconsistency - failed to remove group we are attempting to delete"); + return; + } + // + // We should have at least one group + // + if (otherGroups.isEmpty()) { + logger.error("Group list inconsistency - no other groups to choose from."); + return; + } + // + // If there is only one group, it SHOULD be the default group + // + if (otherGroups.size() == 1) { + PDPGroup loneGroup = otherGroups.iterator().next(); + if (loneGroup.isDefaultGroup() == false) { + logger.error("Group list inconsistency - lone group is NOT default."); + return; + } + } + // + // Create our confirmation window + // + final SelectPDPGroupWindow window = new SelectPDPGroupWindow(otherGroups, "Select New Group for PDPs"); + window.setCaption("Confirm Group " + group.getName() + " Deletion"); + window.setCloseShortcut(KeyCode.ESCAPE); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + + @Override + public void windowClose(CloseEvent e) { + if (window.isSaved()) { + PDPGroup newGroup = window.selectedGroup(); + if (newGroup == null) { + logger.warn("No group selected for moving PDPs into"); + AdminNotification.warn("No group selected for moving PDPs into. Group '" + group.getId() + "' not deleted"); + return; + } + try { + self.container.removeGroup(group, newGroup); + } catch (Exception e1) { + logger.warn("Container failed to remove group: " + e1, e1); + AdminNotification.error("Unable to delete group '" + group.getId() + "'. Reason:\n" + e1.getMessage()); + } + } + } + + }); + getUI().addWindow(window); + } + + public void refreshContainer() { + if (this.container != null) { + this.container.refreshGroups(); + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("100%"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("100.0%"); + setHeight("100.0%"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + + // tree + table = new Table(); + table.setImmediate(false); + table.setWidth("-1px"); + table.setHeight("-1px"); + mainLayout.addComponent(table); + mainLayout.setExpandRatio(table, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(true); + horizontalLayoutToolbar.setSpacing(true); + + // buttonCreate + buttonCreate = new Button(); + buttonCreate.setCaption("Create Group"); + buttonCreate.setImmediate(false); + buttonCreate.setWidth("-1px"); + buttonCreate.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonCreate); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove Group"); + buttonRemove.setImmediate(false); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonRemove); + + return horizontalLayoutToolbar; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java new file mode 100644 index 0000000..c25f018 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java
@@ -0,0 +1,538 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Collection; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.vaadin.dialogs.ConfirmDialog; +import org.vaadin.dialogs.ConfirmDialog.ContentMode; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization; +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.view.components.PIPResolverComponent; +import org.apache.openaz.xacml.admin.view.windows.PIPConfigurationEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.PIPImportWindow; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.Table.ColumnGenerator; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class PIPManagement extends CustomComponent { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table tablePIP; + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + @AutoGenerated + private Button buttonImport; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonClone; + @AutoGenerated + private Button buttonAdd; + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPManagement.class); + private static final Object[] visibleColumns = new Object[] { "name", "description", "piptype", "issuer"}; + private static final String[] columnHeaders = new String[] { "Name", "Description", "Type", "Issuer"}; + + private final Action ADD_CONFIGURATION = new Action("Add Configuration"); + private final Action EDIT_CONFIGURATION = new Action("Edit Configuration"); + private final Action CLONE_CONFIGURATION = new Action("Clone Configuration"); + private final Action REMOVE_CONFIGURATION = new Action("Remove Configuration"); + private final Action ADD_RESOLVER = new Action("Add Resolver"); + private final Action PUBLISH_CONFIGURATION = new Action("Publish Configuration"); + + private final PIPManagement self = this; + private final JPAContainer<PIPConfiguration> container = new JPAContainer<PIPConfiguration>(PIPConfiguration.class); + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPManagement() { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Setup containers + // + boolean isReadOnly; + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_WRITE, + XacmlAdminAuthorization.AdminResource.RESOURCE_PIP_ADMIN)) { + // + // Writable container + // + container.setEntityProvider(new CachingMutableLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + isReadOnly = false; + } else { + // + // Read only container + // + container.setEntityProvider(new CachingLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + isReadOnly = true; + } + // + // Finish initialization + // + this.initializeTree(isReadOnly); + this.initializeButtons(isReadOnly); + // + // Setup + // + this.setupButtons(); + } + + protected void initializeTree(boolean isReadOnly) { + // + // Initialize GUI properties + // + this.tablePIP.setImmediate(true); + this.tablePIP.setContainerDataSource(this.container); + this.tablePIP.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.tablePIP.setItemCaptionPropertyId("name"); + this.tablePIP.setVisibleColumns(visibleColumns); + this.tablePIP.setColumnHeaders(columnHeaders); + this.tablePIP.setSizeFull(); + // + // Access? + // + if (isReadOnly) { + if (logger.isDebugEnabled()) { + logger.debug("read only pip access"); + } + return; + } + this.tablePIP.setSelectable(true); + // + // Setup click handler + // + this.tablePIP.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + PIPManagement.editConfiguration(self.container.getItem(event.getItemId())); + } + } + }); + // + // Setup action handler + // + this.tablePIP.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {ADD_CONFIGURATION}; + } + // + // Target is an Object ID + // + EntityItem<PIPConfiguration> config = self.container.getItem(target); + if (config != null && config.getEntity().isReadOnly() == false) { + if (config.getEntity().requiresResolvers()) { + return new Action[] {EDIT_CONFIGURATION, CLONE_CONFIGURATION, REMOVE_CONFIGURATION, PUBLISH_CONFIGURATION, ADD_RESOLVER}; + } else { + return new Action[] {EDIT_CONFIGURATION, CLONE_CONFIGURATION, REMOVE_CONFIGURATION, PUBLISH_CONFIGURATION}; + } + } + if (logger.isDebugEnabled()) { + logger.debug("Could not find item: " + target); + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + EntityItem<PIPConfiguration> config = self.container.getItem(target); + if (config == null) { + if (logger.isDebugEnabled()) { + logger.debug("Could not find item: " + target); + } + return; + } + if (action == ADD_CONFIGURATION) { + PIPManagement.editConfiguration(self.container.createEntityItem(new PIPConfiguration())); + return; + } + if (action == EDIT_CONFIGURATION) { + PIPManagement.editConfiguration(config); + return; + } + if (action == CLONE_CONFIGURATION) { + self.cloneConfiguration(config); + return; + } + if (action == REMOVE_CONFIGURATION) { + self.removeConfiguration(config); + return; + } + if (action == ADD_RESOLVER) { + PIPResolverComponent.addResolver(config.getEntity(), null); + return; + } + if (action == PUBLISH_CONFIGURATION) { + PIPResolverComponent.publishConfiguration(config); + return; + } + } + }); + // + // When a selection changes listener + // + this.tablePIP.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupButtons(); + } + }); + this.tablePIP.addGeneratedColumn("description", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + EntityItem<PIPConfiguration> entity = self.container.getItem(itemId); + if (entity != null && entity.getEntity() != null) { + TextArea area = new TextArea(); + area.setValue(entity.getEntity().getDescription()); + area.setNullRepresentation(""); + area.setSizeFull(); + area.setReadOnly(true); + return area; + } + return null; + } + }); + this.tablePIP.addGeneratedColumn("piptype", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + EntityItem<PIPConfiguration> entity = self.container.getItem(itemId); + if (entity != null && entity.getEntity() != null) { + return entity.getEntity().getPiptype().getType(); + } + return null; + } + }); + // + // Customize the resolver column + // + this.tablePIP.addGeneratedColumn("Resolvers", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + EntityItem<PIPConfiguration> entity = self.container.getItem(itemId); + if (entity != null && entity.getEntity() != null && entity.getEntity().requiresResolvers()) { + PIPResolverComponent component = new PIPResolverComponent(entity.getEntity()); + return component; + } + return null; + } + }); + } + + protected void initializeButtons(boolean isReadOnly) { + if (isReadOnly) { + this.buttonAdd.setVisible(false); + this.buttonRemove.setVisible(false); + this.buttonClone.setVisible(false); + return; + } + this.buttonAdd.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + PIPManagement.editConfiguration(self.container.createEntityItem(new PIPConfiguration())); + } + + }); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.removeConfiguration(self.container.getItem(self.tablePIP.getValue())); + } + + }); + this.buttonClone.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.cloneConfiguration(self.container.getItem(self.tablePIP.getValue())); + } + }); + this.buttonImport.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + final PIPImportWindow window = new PIPImportWindow(); + window.setCaption("Import PIP Configuration"); + window.setModal(true); + window.center(); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + String file = window.getUploadedFile(); + if (file == null) { + return; + } + self.importConfiguration(file); + } + }); + UI.getCurrent().addWindow(window); + } + }); + } + + protected void importConfiguration(String file) { + Properties properties = new Properties(); + try { + properties.load(new FileInputStream(file)); + Collection<PIPConfiguration> configs = PIPConfiguration.importPIPConfigurations(properties); + if (configs == null || configs.isEmpty()) { + AdminNotification.warn("There were no PIP Engine configurations found."); + } else { + for (PIPConfiguration config : configs) { + this.container.addEntity(config); + } + } + } catch (IOException e) { + String message = "Failed to load properties: " + e.getLocalizedMessage(); + logger.error(message); + AdminNotification.error(message); + } + } + + public static void editConfiguration(final EntityItem<PIPConfiguration> entity) { + final PIPConfigurationEditorWindow editor = new PIPConfigurationEditorWindow(entity); + if (entity.isPersistent()) { + editor.setCaption("Edit PIP Configuration " + entity.getEntity().getName()); + } else { + editor.setCaption("Create New PIP Configuration"); + } + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + if (editor.isSaved()) { + if (entity.isPersistent() == false) { + ((XacmlAdminUI)UI.getCurrent()).getPIPConfigurations().addEntity(entity.getEntity()); + } + ((XacmlAdminUI)UI.getCurrent()).refreshPIPConfiguration(); + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void removeConfiguration(final EntityItem<PIPConfiguration> entity) { + // + // Sanity checks + // + if (entity == null || entity.getEntity() == null) { + logger.error("Removing a null entity"); + return; + } + String message = "Are you sure you want to remove the " + entity.getEntity().getName() + " configuration?"; + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm PIP Configuration Deletion", message, "Remove", "Cancel"); + dialog.setContentMode(ContentMode.HTML); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed()) { + if (self.container.removeItem(entity.getItemId()) == false) { + logger.warn("Failed to remove PIP configuration"); + AdminNotification.warn("Failed to remove PIP configuration."); + } else { + self.setupButtons(); + } + } + } + }, true); + } + + protected void cloneConfiguration(final EntityItem<PIPConfiguration> entity) { + // + // Sanity checks + // + if (entity == null || entity.getEntity() == null) { + logger.warn("Cloning a null entity, the buttons were not reset. Resetting them."); + this.setupButtons(); + return; + } + // + // Clone it + // + PIPManagement.editConfiguration(this.container.createEntityItem(new PIPConfiguration(entity.getEntity(), ((XacmlAdminUI)UI.getCurrent()).getUserid()))); + } + + protected void setupButtons() { + if (this.tablePIP.getValue() != null) { + Object id = this.tablePIP.getValue(); + EntityItem<PIPConfiguration> entity = this.container.getItem(id); + if (entity == null || entity.getEntity().isReadOnly()) { + this.buttonRemove.setEnabled(false); + this.buttonClone.setEnabled(false); + } else { + this.buttonRemove.setEnabled(true); + this.buttonClone.setEnabled(true); + } + } else { + this.buttonRemove.setEnabled(false); + this.buttonClone.setEnabled(false); + } + } + + public void refreshContainer() { + this.container.refresh(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("100.0%"); + setHeight("-1px"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + + // tablePIP + tablePIP = new Table(); + tablePIP.setCaption("PIP Configurations"); + tablePIP.setImmediate(false); + tablePIP.setWidth("100.0%"); + tablePIP.setHeight("-1px"); + mainLayout.addComponent(tablePIP); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(false); + horizontalLayoutToolbar.setSpacing(true); + + // buttonAdd + buttonAdd = new Button(); + buttonAdd.setCaption("Add Configuration"); + buttonAdd.setImmediate(true); + buttonAdd.setWidth("-1px"); + buttonAdd.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonAdd); + + // buttonClone + buttonClone = new Button(); + buttonClone.setCaption("Clone Configuration"); + buttonClone.setImmediate(true); + buttonClone.setWidth("-1px"); + buttonClone.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonClone); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove Configuration"); + buttonRemove.setImmediate(true); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonRemove); + + // buttonImport + buttonImport = new Button(); + buttonImport.setCaption("Import Configuration"); + buttonImport.setImmediate(false); + buttonImport + .setDescription("Imports a configuration from a properties file."); + buttonImport.setWidth("-1px"); + buttonImport.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonImport); + + return horizontalLayoutToolbar; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java new file mode 100644 index 0000000..f6ab0f8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java
@@ -0,0 +1,1679 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.model.GitRepositoryContainer; +import org.apache.openaz.xacml.admin.model.PolicyContainer; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.windows.AttributeSelectionWindow; +import org.apache.openaz.xacml.admin.view.windows.AttributeValueEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.ExpressionBuilderComponent; +import org.apache.openaz.xacml.admin.view.windows.MatchEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.ObligationAdviceEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.PolicyEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.PolicySetEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.RuleEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.VariableDefinitionEditorWindow; +import org.apache.openaz.xacml.util.XACMLObjectCopy; +import org.apache.openaz.xacml.util.XACMLPolicyWriter; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Container.ItemSetChangeEvent; +import com.vaadin.data.Container.ItemSetChangeListener; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.DataBoundTransferable; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction; +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.event.dd.DropHandler; +import com.vaadin.event.dd.acceptcriteria.AcceptAll; +import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; +import com.vaadin.server.BrowserWindowOpener; +import com.vaadin.server.FileDownloader; +import com.vaadin.server.StreamResource; +import com.vaadin.shared.ui.dd.VerticalDropLocation; +import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.TabSheet.Tab; +import com.vaadin.ui.Table.TableDragMode; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class PolicyEditor extends CustomComponent { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private TreeTable tree; + + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + + @AutoGenerated + private Button buttonExport; + + @AutoGenerated + private Button buttonViewXML; + + @AutoGenerated + private Button buttonSave; + + @AutoGenerated + private CheckBox checkBoxAutoSave; + + @AutoGenerated + private CheckBox checkBoxReadOnly; + + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PolicyEditor.class); + private final PolicyEditor self = this; + + private static final Action CREATE_POLICY = new Action ("New Policy"); + private static final Action CREATE_POLICYSET = new Action ("New Policy Set"); + private static final Action CREATE_RULE = new Action ("New Rule"); + private static final Action EDIT_POLICY = new Action ("Edit Policy"); + private static final Action EDIT_POLICYSET = new Action ("Edit Policy Set"); + private static final Action EDIT_RULE = new Action ("Edit Rule"); + private static final Action DELETE_POLICYSET = new Action ("Delete Policy Set"); + private static final Action DELETE_POLICY = new Action ("Delete Policy"); + private static final Action DELETE_RULE = new Action ("Delete Rule"); + private static final Action CREATE_NEWANYOF = new Action ("New Any Of (Match)"); + private static final Action CREATE_NEWALLOF = new Action ("New All Of (Match)"); + private static final Action CREATE_NEWMATCH = new Action ("New Match"); + private static final Action DELETE_ANYOF = new Action ("Delete Any Of"); + private static final Action DELETE_ALLOF = new Action ("Delete All Of"); + private static final Action DELETE_MATCH = new Action ("Delete Match"); + private static final Action EDIT_MATCH = new Action ("Edit Match"); + private static final Action EDIT_OBLIGATIONS = new Action ("Edit Obligations"); + private static final Action DELETE_OBLIGATIONS = new Action ("Delete Obligations"); + private static final Action EDIT_ADVICE = new Action ("Edit Advice"); + private static final Action DELETE_ADVICE = new Action ("Delete Advice"); + private static final Action CREATE_VARIABLE = new Action ("Create Variable"); + private static final Action EDIT_VARIABLE = new Action ("Edit Variable"); + private static final Action DELETE_VARIABLE = new Action ("Delete Variable"); + private static final Action CREATE_TARGET = new Action ("Create Target"); + private static final Action CREATE_CONDITION = new Action ("Create Condition"); + private static final Action EDIT_CONDITION = new Action ("Edit Condition"); + private static final Action DELETE_CONDITION = new Action ("Delete Condition"); + private static final Action EDIT_EXPRESSIONS = new Action ("Edit Expressions"); + + private static final Action CLIPBOARD_CUT = new ShortcutAction ("Cut", ShortcutAction.KeyCode.S, new int[] {ShortcutAction.ModifierKey.CTRL}); + private static final Action CLIPBOARD_COPY = new ShortcutAction ("Copy", ShortcutAction.KeyCode.C, new int[] {ShortcutAction.ModifierKey.CTRL}); + private static final Action CLIPBOARD_PASTE = new ShortcutAction ("Paste", ShortcutAction.KeyCode.V, new int[] {ShortcutAction.ModifierKey.CTRL}); + + private static final Object[] VISIBLE_COLUMNS = new Object[] {PolicyContainer.PROPERTY_NAME, PolicyContainer.PROPERTY_SHORTALGORITHM, PolicyContainer.PROPERTY_DESCRIPTION}; + private static final String[] COLUMN_HEADERS = new String[] { "Name", "Algorithm or Effect", "Description"}; + + private final File file; + private final GitRepositoryContainer gitContainer; + private final PolicyContainer policyContainer; + private Tab tab = null; + private boolean isModified = false; + + private Object clipboardObject = null; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @throws IOException + */ + public PolicyEditor(File policyFile, GitRepositoryContainer gitContainer, boolean readOnly) throws IOException { + buildMainLayout(); + setCompositionRoot(mainLayout); + this.mainLayout.setSizeFull(); + // + // Save + // + this.file = policyFile; + this.gitContainer = gitContainer; + this.policyContainer = new PolicyContainer(this.file); + // + // Its our data also + // + this.setData(policyFile); + // + // Initialize GUI + // + this.initializeCheckboxes(readOnly); + this.initializeButtons(); + this.initializeDownload(); + this.initializeTree(); +// PLD TODO next release this.initializeContextMenu(); + // + // setup the caption etc. + // + this.setupCaption(); + this.resetComponents(); + } + + protected void initializeCheckboxes(boolean readOnly) { + // + // The readonly check box + // + this.checkBoxReadOnly.setImmediate(true); + this.checkBoxReadOnly.setValue(readOnly); + this.checkBoxReadOnly.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.resetComponents(); + self.setupCaption(); + } + + }); + // + // The autosave check box + // + this.checkBoxAutoSave.setImmediate(true); + this.checkBoxAutoSave.setValue(true); + } + + protected void initializeButtons() { + // + // The Save button + // + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.savePolicy(); + } + }); + // + // Attach a window opener to the View XML button + // + BrowserWindowOpener opener = new BrowserWindowOpener(new StreamResource(new StreamResource.StreamSource() { + private static final long serialVersionUID = 1L; + + @Override + public InputStream getStream() { + try { + if (logger.isDebugEnabled()) { + logger.debug("Setting view xml button to: " + self.file.getAbsolutePath()); + } + return new FileInputStream(self.file); + } catch (Exception e) { + logger.error("Failed to open input stream " + self.file); + } + return null; + } + }, self.file.getName())); + opener.setWindowName("_new"); + opener.extend(this.buttonViewXML); + } + + protected void initializeDownload() { + // + // Create a stream resource pointing to the file + // + StreamResource r = new StreamResource(new StreamResource.StreamSource() { + private static final long serialVersionUID = 1L; + + @Override + public InputStream getStream() { + try { + return new FileInputStream(self.file); + } catch (Exception e) { + logger.error("Failed to open input stream " + self.file); + } + return null; + } + }, self.file.getName()); + r.setCacheTime(-1); + r.setMIMEType("application/xml"); + // + // Extend a downloader to attach to the Export Button + // + FileDownloader downloader = new FileDownloader(r); + downloader.extend(this.buttonExport); + } + + public void setTab(Tab tab) { + this.tab = tab; + this.setupCaption(); + } + + public boolean isAutoSave() { + if (this.checkBoxAutoSave.isEnabled() == false) { + return false; + } + return this.checkBoxAutoSave.getValue(); + } + + public boolean isReadOnly() { + return this.checkBoxReadOnly.getValue(); + } + + protected void initializeTree() { + // + // Create our container and set it as the tree's data source + // + this.tree.setContainerDataSource(this.policyContainer); + this.tree.setItemIconPropertyId("Icon"); + this.tree.setVisibleColumns(VISIBLE_COLUMNS); + this.tree.setColumnHeaders(COLUMN_HEADERS); + this.tree.setSelectable(true); + this.tree.setSizeFull(); + // + // Expand it down a few items + // + for (Object id : this.tree.getItemIds()) { + this.tree.setCollapsed(id, false); + for (Object child : this.tree.getChildren(id)) { + this.tree.setCollapsed(child, false); + } + } + // + // Respond to double-click's + // + this.tree.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + if (self.isReadOnly()) { + AdminNotification.info("You are in read-only mode."); + return; + } + Object target = event.getItemId(); + if (target instanceof PolicySetType) { + self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target)); + } else if (target instanceof PolicyType) { + self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target)); + } else if (target instanceof RuleType) { + self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target)); + } else if (target instanceof ConditionType) { + self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target)); + } else if (target instanceof VariableDefinitionType) { + self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target)); + } else if (target instanceof MatchType) { + self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match"); + } else if (target instanceof ObligationExpressionType) { + self.editObAdvice(true, self.policyContainer.getParent(target)); + } else if (target instanceof AdviceExpressionType) { + self.editObAdvice(false, self.policyContainer.getParent(target)); + } + } + } + + }); + // + // Respond to container changes + // + this.policyContainer.addItemSetChangeListener(new ItemSetChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void containerItemSetChange(ItemSetChangeEvent event) { + self.isModified = true; + if (self.isAutoSave()) { + self.savePolicy(); + } else { + self.setupCaption(); + self.buttonSave.setEnabled(true); + } + } + }); + // + // Implement drag-n-drop + // + this.tree.setDropHandler(new DropHandler() { + private static final long serialVersionUID = 1L; + + @Override + public void drop(DragAndDropEvent event) { + DataBoundTransferable t = (DataBoundTransferable) event.getTransferable(); + AbstractSelectTargetDetails target = (AbstractSelectTargetDetails) event.getTargetDetails(); + + // + // Get ids of the dragged item and the target item + // + Object sourceItemId = t.getData("itemId"); + Object targetItemId = target.getItemIdOver(); + VerticalDropLocation location = target.getDropLocation(); + if (logger.isDebugEnabled()) { + logger.debug("Drop " + sourceItemId + " target " + targetItemId + " location " + location); + } + // + // Tell our container what to do + // + try { + if (location == VerticalDropLocation.MIDDLE) { + // + // Drop right on top of item making it a child + // + self.policyContainer.setParent(sourceItemId, targetItemId); + } + + /* + } else if (location == VerticalDropLocation.TOP) { + // + // Drop at the top of the tree making it the previous + // + Object parent = self.policyContainer.getParent(targetItemId); + self.policyContainer.setParent(sourceItemId, parent); + self.policyContainer.moveAfterSibling(sourceItemId, targetItemId); + self.policyContainer.moveAfterSibling(targetItemId, sourceItemId); + } else if (location == VerticalDropLocation.BOTTOM) { + // + // Drop below another item + // + Object parent = self.policyContainer.getParent(targetItemId); + self.policyContainer.setParent(sourceItemId, targetItemId); + self.policyContainer.moveAfterSibling(sourceItemId, targetItemId); + } + */ + } catch (UnsupportedOperationException e) { + logger.error("Unsupported " + e.getLocalizedMessage()); + } + } + + @Override + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + }); + } + + protected void removeObject(Object target) { + if (target instanceof PolicySetType) { + this.removePolicySet((PolicySetType) target); + } else if (target instanceof PolicyType) { + this.removePolicy((PolicyType) target); + } else if (target instanceof RuleType) { + this.removeRule((RuleType) target); + } else if (target instanceof ConditionType) { + this.removeCondition((ConditionType) target); + } else if (target instanceof VariableDefinitionType) { + this.removeVariable((VariableDefinitionType) target); + } else if (target instanceof AdviceExpressionType) { + this.removeAdvice((AdviceExpressionType) target); + } else if (target instanceof ObligationExpressionType) { + this.removeObligations((ObligationExpressionType) target); + } + } + + protected void removeAdvice(AdviceExpressionType target) { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove advice."); + } + } + + protected void removeVariable(VariableDefinitionType target) { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove variable."); + } + } + + protected void removeCondition(ConditionType target) { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove condition."); + } + } + + protected void removeObligations(ObligationExpressionType target) { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove obligations."); + } + } + + protected void removeRule(RuleType target) { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove rule."); + } + } + + protected void removePolicy(PolicyType target) { + Object parent = this.tree.getParent(target); + if (parent == null) { + this.deleteRoot(target); + } else { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove policy."); + } + } + } + + protected void removePolicySet(PolicySetType target) { + Object parent = this.tree.getParent(target); + if (parent == null) { + this.deleteRoot(target); + } else { + if (this.tree.removeItem(target) == false) { + logger.error("Failed to remove policy set."); + } + } + } + + /* + protected void initializeContextMenu() { + ContextMenu menu = new ContextMenu(); + menu.setAsTableContextMenu(this.tree); + menu.addContextMenuTableListener(new TableListener() { + + @Override + public void onContextMenuOpenFromFooter( + ContextMenuOpenedOnTableFooterEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void onContextMenuOpenFromHeader( + ContextMenuOpenedOnTableHeaderEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void onContextMenuOpenFromRow(ContextMenuOpenedOnTableRowEvent event) { + logger.info("context menu row"); + } + }); + menu.addItem("test"); + } + */ + + protected void savePolicy() { + if (this.isReadOnly()) { + logger.warn("Should not call savePolicy when in read only mode."); + return; + } + Collection<?> roots = this.policyContainer.rootItemIds(); + if (roots.size() > 1) { + logger.warn("More than one root policy."); + } + // + // There should only be one root + // Save the policy to disk. + // + for (Object root : roots) { + logger.info("Saving policy: " + this.file.getName()); + // + // TODO - Bump the version? + // + if (root instanceof PolicySetType) { + XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicySetType) root); + } else if (root instanceof PolicyType) { + XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicyType) root); + } + // + // TODO ???? + // + this.gitContainer.updateItem(this.file); + break; // NOPMD + } + // + // No longer modified + // + this.isModified = false; + this.setupCaption(); + this.resetComponents(); + } + + protected void installTreeActionHandler() { + // + // Remove any existing action handlers + // + this.tree.removeAllActionHandlers(); + // + // Are we read-only? + // + if (this.isReadOnly()) { + // + // Yes - no action handler's allowed + // + return; + } + // + // Setup our action handlers + // + this.tree.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + // + // Are we read-only? + // + if (self.isReadOnly()) { + if (logger.isDebugEnabled()) { + logger.debug("Policy is read-only"); + } + return null; + } + if (target == null) { + // + // Nothing is selected, they right-clicked empty space + // + if (logger.isDebugEnabled()) { + logger.debug("action tree target is null"); + } + return null; + } + if (target instanceof PolicySetType) { + List<Action> actions = new ArrayList<Action>(); + actions.add(EDIT_POLICYSET); + if (((PolicySetType) target).getTarget() == null) { + actions.add(CREATE_TARGET); + } + /* + actions.add(CLIPBOARD_CUT); + actions.add(CLIPBOARD_COPY); + actions.add(CLIPBOARD_PASTE); + */ + actions.add(CREATE_POLICYSET); + actions.add(CREATE_POLICY); + actions.add(EDIT_OBLIGATIONS); + actions.add(EDIT_ADVICE); + actions.add(DELETE_POLICYSET); + return (Action[]) actions.toArray(new Action[0]); + } + if (target instanceof PolicyType) { + List<Action> actions = new ArrayList<Action>(); + actions.add(EDIT_POLICY); + if (((PolicyType) target).getTarget() == null) { + actions.add(CREATE_TARGET); + } + /* + actions.add(CLIPBOARD_CUT); + actions.add(CLIPBOARD_COPY); + actions.add(CLIPBOARD_PASTE); + */ + actions.add(CREATE_RULE); + actions.add(CREATE_VARIABLE); + actions.add(EDIT_OBLIGATIONS); + actions.add(EDIT_ADVICE); + actions.add(DELETE_POLICY); + return (Action[]) actions.toArray(new Action[0]); + } + if (target instanceof RuleType) { + List<Action> actions = new ArrayList<Action>(); + actions.add(EDIT_RULE); + if (((RuleType) target).getTarget() == null) { + actions.add(CREATE_TARGET); + } + /* + actions.add(CLIPBOARD_CUT); + actions.add(CLIPBOARD_COPY); + actions.add(CLIPBOARD_PASTE); + */ + if (((RuleType)target).getCondition() == null) { + actions.add(CREATE_CONDITION); + } + actions.add(EDIT_OBLIGATIONS); + actions.add(EDIT_ADVICE); + actions.add(DELETE_RULE); + return (Action[]) actions.toArray(new Action[0]); + } + if (target instanceof TargetType) { + return new Action[] {CREATE_NEWANYOF}; + } + if (target instanceof AnyOfType) { + return new Action[] {CREATE_NEWALLOF, DELETE_ANYOF}; + } + if (target instanceof AllOfType) { + return new Action[] {CREATE_NEWMATCH, DELETE_ALLOF}; + } + if (target instanceof MatchType) { + return new Action[] {EDIT_MATCH, DELETE_MATCH}; + } + if (target instanceof ConditionType) { + return new Action[] {EDIT_CONDITION, DELETE_CONDITION}; + } + if (target instanceof VariableDefinitionType) { + return new Action[] {EDIT_VARIABLE, DELETE_VARIABLE}; + } + if (target instanceof ObligationExpressionType) { + return new Action[] {EDIT_OBLIGATIONS, DELETE_OBLIGATIONS}; + } + if (target instanceof AdviceExpressionType) { + return new Action[] {EDIT_ADVICE, DELETE_ADVICE}; + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == CLIPBOARD_CUT) { + assert target != null; + self.clipboardObject = XACMLObjectCopy.deepCopy(target); + self.removeObject(target); + return; + } + if (action == CLIPBOARD_COPY) { + assert target != null; + self.clipboardObject = XACMLObjectCopy.deepCopy(target); + return; + } + if (action == CLIPBOARD_PASTE) { + assert target != null; + self.clipboardPaste(target, true); + return; + } + if (action == CREATE_POLICYSET) { + assert target instanceof PolicySetType; + self.editPolicySet(null, (PolicySetType) target); + return; + } + if (action == CREATE_POLICY) { + assert target instanceof PolicySetType; + self.editPolicy(null, (PolicySetType) target); + return; + } + if (action == CREATE_RULE) { + assert target instanceof PolicyType; + self.editRule(null, (PolicyType) target); + return; + } + if (action == CREATE_TARGET) { + assert target instanceof RuleType || target instanceof PolicyType || target instanceof PolicySetType; + TargetType newTarget = new TargetType(); + self.policyContainer.addItem(newTarget, target); + return; + } + if (action == EDIT_POLICYSET) { + assert target instanceof PolicySetType; + self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target)); + return; + } + if (action == EDIT_POLICY) { + assert target instanceof PolicyType; + self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target)); + return; + } + if (action == EDIT_RULE) { + assert target instanceof RuleType; + self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target)); + return; + } + if (action == DELETE_POLICYSET) { + assert target instanceof PolicySetType; + self.removePolicySet((PolicySetType) target); + return; + } + if (action == DELETE_POLICY) { + assert target instanceof PolicyType; + self.removePolicy((PolicyType) target); + return; + } + if (action == DELETE_RULE) { + assert target instanceof RuleType; + self.removeRule((RuleType) target); + return; + } + if (action == CREATE_NEWANYOF) { + assert target instanceof TargetType; + self.editMatch(null, null, null, (TargetType) target, "Create New Match"); + return; + } + if (action == CREATE_NEWALLOF) { + assert target instanceof AnyOfType; + self.editMatch(null, null, (AnyOfType) target, null, "Create New Match"); + return; + } + if (action == CREATE_NEWMATCH) { + if (target instanceof AllOfType) { + self.editMatch(null, (AllOfType) target, null, null, "Create New Match"); + } else if (target instanceof TargetType) { + self.editMatch(null, null, null, (TargetType) target, "Create New Match"); + } else { + assert false; + } + return; + } + if (action == DELETE_ANYOF) { + assert target instanceof AnyOfType; + self.removeAnyOf((AnyOfType) target, (TargetType) self.policyContainer.getParent(target)); + return; + } + if (action == DELETE_ALLOF) { + assert target instanceof AllOfType; + self.removeAllOf((AllOfType) target, (AnyOfType) self.policyContainer.getParent(target)); + return; + } + if (action == DELETE_MATCH) { + assert target instanceof MatchType; + self.removeMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target)); + return; + } + if (action == EDIT_MATCH) { + assert target instanceof MatchType; + self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match"); + return; + } + if (action == EDIT_OBLIGATIONS) { + assert target instanceof RuleType || + target instanceof PolicyType || + target instanceof PolicySetType || + target instanceof ObligationExpressionType; + if (target instanceof ObligationExpressionType) { + self.editObAdvice(true, self.policyContainer.getParent(target)); + } else { + self.editObAdvice(true, target); + } + return; + } + if (action == DELETE_OBLIGATIONS) { + assert target instanceof ObligationExpressionType; + self.removeObligations((ObligationExpressionType) target); + return; + } + if (action == EDIT_ADVICE) { + assert target instanceof RuleType || + target instanceof PolicyType || + target instanceof PolicySetType || + target instanceof AdviceExpressionType; + if (target instanceof AdviceExpressionType) { + self.editObAdvice(false, self.policyContainer.getParent(target)); + } else { + self.editObAdvice(false, target); + } + return; + } + if (action == DELETE_ADVICE) { + assert target instanceof AdviceExpressionType; + self.removeAdvice((AdviceExpressionType) target); + return; + } + if (action == CREATE_VARIABLE) { + assert target instanceof PolicyType; + self.editVariable(null, (PolicyType) target); + return; + } + if (action == CREATE_CONDITION) { + assert target instanceof RuleType; + self.editCondition(null, (RuleType) target); + return; + } + if (action == EDIT_CONDITION) { + assert target instanceof ConditionType; + self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target)); + return; + } + if (action == DELETE_CONDITION) { + assert target instanceof ConditionType; + self.removeCondition((ConditionType) target); + return; + } + if (action == EDIT_EXPRESSIONS) { + return; + } + if (action == DELETE_VARIABLE) { + assert target instanceof VariableDefinitionType; + self.removeVariable((VariableDefinitionType) target); + return; + } + if (action == EDIT_VARIABLE) { + assert target instanceof VariableDefinitionType; + self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target)); + return; + } + } + }); + } + + protected void resetComponents() { + if (this.isReadOnly()) { + this.checkBoxAutoSave.setEnabled(false); + this.buttonSave.setEnabled(false); + this.tree.setDragMode(TableDragMode.NONE); + this.tree.removeAllActionHandlers(); + this.tree.setReadOnly(true); + } else { + this.checkBoxAutoSave.setEnabled(true); + this.buttonSave.setEnabled(this.isModified); + this.tree.setReadOnly(false); + this.tree.setDragMode(TableDragMode.ROW); + this.installTreeActionHandler(); + } + } + + public void setupCaption() { + String caption = this.file.getName(); + if (this.isModified) { + caption = caption + " *"; + } + if (this.isReadOnly()) { + caption = caption + " (Read-Only)"; + } + if (this.tab != null) { + this.tab.setCaption(caption); + } + } + + protected void editPolicySet(final PolicySetType policy, final PolicySetType parent) { + logger.info("editPolicySet: " + policy + " parent " + parent); + // + // Create a copy + // + final PolicySetType newPolicySet = (policy == null ? new PolicySetType() : XACMLObjectCopy.copy(policy)); + // + // Create window + // + final PolicySetEditorWindow window = new PolicySetEditorWindow(newPolicySet); + window.setCaption(policy == null ? "Create New Policy Set" : "Edit Policy Set"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + if (logger.isDebugEnabled()) { + logger.debug("user did NOT save"); + } + return; + } + // + // Was it a new Policy Set? + // + if (policy == null) { + logger.info("adding new policy set " + newPolicySet.getPolicySetId()); + // + // Yes - new add it in + // + if (newPolicySet.getTarget() == null) { + newPolicySet.setTarget(new TargetType()); + } + if (self.policyContainer.addItem(newPolicySet, parent) == null) { + logger.error("Failed to add new policy set"); + } else { + self.tree.setCollapsed(parent, false); + self.tree.setCollapsed(newPolicySet, false); + self.tree.select(newPolicySet); + } + } else { + logger.info("updating new policy set " + newPolicySet.getPolicySetId()); + // + // No - copy everything + // + policy.setDescription(newPolicySet.getDescription()); + policy.setVersion(newPolicySet.getVersion()); + policy.setPolicyCombiningAlgId(newPolicySet.getPolicyCombiningAlgId()); + // + // Update + // + self.policyContainer.updateItem(policy); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editPolicy(final PolicyType policy, final PolicySetType parent) { + // + // Create a copy + // + final PolicyType newPolicy = (policy == null ? new PolicyType() : XACMLObjectCopy.copy(policy)); + // + // Create window + // + final PolicyEditorWindow window = new PolicyEditorWindow(newPolicy); + window.setCaption(policy == null ? "Create New Policy" : "Edit Policy"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Was it a new Policy? + // + if (policy == null) { + // + // Yes - new add it in + // + if (newPolicy.getTarget() == null) { + newPolicy.setTarget(new TargetType()); + } + if (self.policyContainer.addItem(newPolicy, parent) == null) { + logger.error("Failed to add policy"); + } else { + self.tree.setCollapsed(parent, false); + self.tree.setCollapsed(newPolicy, false); + self.tree.select(newPolicy); + } + } else { + // + // No - copy everything + // + policy.setDescription(newPolicy.getDescription()); + policy.setVersion(newPolicy.getVersion()); + policy.setRuleCombiningAlgId(newPolicy.getRuleCombiningAlgId()); + // + // Update + // + self.policyContainer.updateItem(policy); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editRule(final RuleType rule, final PolicyType parent) { + // + // Create a copy + // + final RuleType newRule = (rule == null ? new RuleType() : XACMLObjectCopy.copy(rule)); + // + // Create window + // + final RuleEditorWindow window = new RuleEditorWindow(newRule); + window.setCaption(rule == null ? "Create New Rule" : "Edit Rule"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Was this a new rule? + // + if (rule == null) { + // + // Yes a new rule + // + if (newRule.getTarget() == null) { + newRule.setTarget(new TargetType()); + } + if (self.policyContainer.addItem(newRule, parent) == null) { + logger.error("Failed to add new rule"); + } else { + self.tree.setCollapsed(parent, false); + self.tree.setCollapsed(newRule, false); + self.tree.select(newRule); + } + } else { + // + // No - editing existing rule. Copy everything + // + rule.setEffect(newRule.getEffect()); + rule.setDescription(newRule.getDescription()); + self.policyContainer.updateItem(rule); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editCondition(final ConditionType condition, final RuleType rule) { + // + // Make a copy of it first, in case the user manipulates it + // and then decides to NOT save it + // + final ConditionType copyCondition = (condition == null ? new ConditionType() : XACMLObjectCopy.copy(condition)); + // + // Create the window + // + final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyCondition, + (copyCondition.getExpression() != null ? copyCondition.getExpression().getValue() : null), + null, + self.policyContainer.getVariables()); + if (condition == null) { + expression.setCaption("Create An Expression For The Condition"); + } else { + expression.setCaption("Edit The Condition Expression"); + } + expression.setModal(true); + // + // Add the close listener + // + expression.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user hit save? + // + if (expression.isSaved() == false) { + return; + } + // + // Were we creating something new? + // + if (condition == null) { + // + // Yes add the new one into the container + // + if (self.policyContainer.addItem(copyCondition, rule) == null) { + logger.error("Failed to add condition"); + } else { + self.tree.setCollapsed(rule, false); + self.tree.setCollapsed(copyCondition, false); + self.tree.select(copyCondition); + } + } else { + // + // We were editing an existing condition, so copy + // over the new edited expression. + // + condition.setExpression(copyCondition.getExpression()); + // + // Update the container + // + self.policyContainer.updateItem(condition); + } + } + }); + expression.center(); + UI.getCurrent().addWindow(expression); + } + + protected void editVariable(final VariableDefinitionType variable, final PolicyType parent) { + // + // Make a copy of it first, in case the user manipulates it + // and then decides to NOT save it + // + final VariableDefinitionType copyVariable = (variable == null ? new VariableDefinitionType(): XACMLObjectCopy.copy(variable)); + // + // Have the user create or edit the Variables ID + // + final VariableDefinitionEditorWindow editor = new VariableDefinitionEditorWindow(copyVariable); + if (variable == null) { + editor.setCaption("Create Variable"); + } else { + editor.setCaption("Edit Variable" + (copyVariable.getVariableId() == null ? "" : copyVariable.getVariableId())); + } + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save button? + // + if (editor.isSaved() == false) { + return; + } + // + // Create the window + // + final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyVariable, + (copyVariable.getExpression() != null ? copyVariable.getExpression().getValue() : null), + null, + self.policyContainer.getVariables()); + expression.setCaption("Edit The Variable \"" + copyVariable.getVariableId() + "\" Expression"); + // + // Add the close listener + // + expression.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save button? + // + if (expression.isSaved() == false) { + return; + } + // + // Was it a new variable or were we editing an existing one? + // + if (variable == null) { + // + // New one, add it to the container + // + if (self.policyContainer.addItem(copyVariable, parent) == null) { + logger.error("Failed to add variable"); + } else { + self.tree.setCollapsed(parent, false); + self.tree.setCollapsed(copyVariable, false); + self.tree.select(copyVariable); + } + } else { + // + // We were editing one, copy it back over. + // + variable.setVariableId(copyVariable.getVariableId()); + variable.setExpression(copyVariable.getExpression()); + // + // Update the container + // + self.policyContainer.updateItem(variable); + } + } + }); + expression.center(); + UI.getCurrent().addWindow(expression); + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void editMatch(final MatchType match, final AllOfType allOf, final AnyOfType anyOf, final TargetType target, final String caption) { + // + // Create an empty match or copy the one we are going to edit. + // + final MatchType newMatch = (match == null ? new MatchType() : XACMLObjectCopy.copy(match)); + // + // Have user select an attribute + // + final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, + (newMatch.getAttributeDesignator() != null ? newMatch.getAttributeDesignator() : newMatch.getAttributeSelector())); + selection.setCaption("Select Attribute To Match Against"); + selection.setModal(true); + selection.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user save anything? + // + if (selection.isSaved() == false) { + return; + } + // + // Save the selected attribute + // + final Attribute attribute = selection.getAttribute(); + if (attribute.isDesignator()) { + newMatch.setAttributeDesignator(JPAUtils.createDesignator(attribute)); + } else { + newMatch.setAttributeSelector(JPAUtils.createSelector(attribute)); + } + // + // Yes - now match it up to a function + // + final MatchEditorWindow editor = new MatchEditorWindow(newMatch, attribute.getDatatypeBean()); + editor.setCaption(caption); + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user hit save? + // + if (editor.isSaved() == false) { + return; + } + // + // Yes - now we need the value to check the attribute against + // + final AttributeValueType copyAttributeValue = (newMatch.getAttributeValue() == null ? new AttributeValueType() : newMatch.getAttributeValue()); +// String currentValue = null; +// if (newMatch.getAttributeValue() != null) { +// currentValue = XACMLObjectCopy.getContent(newMatch.getAttributeValue().getContent()); +// } + final AttributeValueEditorWindow value = new AttributeValueEditorWindow(copyAttributeValue, attribute.getDatatypeBean()); + value.setCaption("Set the value the attribute should match against."); + value.setModal(true); + value.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user save? + // + if (value.isSaved() == false) { + return; + } + // + // Yes - copy the value into the match + // + AttributeValueType val = new AttributeValueType(); + val.getContent().add(value.getValue()); + val.setDataType(value.getDatatype().getXacmlId()); + newMatch.setAttributeValue(val); + // + // Was this a new match or were we editing an + // existing match? + // + if (match != null) { + // + // Editing - now we can save it + // + match.setAttributeDesignator(newMatch.getAttributeDesignator()); + match.setAttributeSelector(newMatch.getAttributeSelector()); + match.setAttributeValue(newMatch.getAttributeValue()); + match.setMatchId(newMatch.getMatchId()); + // + // Update the container + // + self.policyContainer.updateItem(match); + } else { + // + // Do we have a parent(s)? + // + AllOfType allOfParent = allOf; + AnyOfType anyOfParent = anyOf; + if (allOfParent == null) { + // + // No direct AllOfParent + // + if (anyOfParent == null) { + // + // No AnyOfParent + // + if (target == null) { + logger.error("We should NOT get this"); + return; + } + anyOfParent = new AnyOfType(); + if (self.policyContainer.addItem(anyOfParent, target) == null) { + logger.error("Failed to add anyOf parent"); + assert false; + } + self.tree.setCollapsed(anyOfParent, false); + } + allOfParent = new AllOfType(); + if (self.policyContainer.addItem(allOfParent, anyOfParent) == null) { + logger.error("Failed to add allOf parent"); + assert false; + } + self.tree.setCollapsed(allOfParent, false); + } + // + // Add the MatchType into the Tree + // + if (self.policyContainer.addItem(newMatch, allOfParent) == null) { + logger.error("Failed to add match"); + assert false; + } + self.tree.select(newMatch); + } + } + }); + value.center(); + UI.getCurrent().addWindow(value); + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + }); + selection.center(); + UI.getCurrent().addWindow(selection); + } + + protected void deleteRoot(Object root) { + // + // TODO - prompt user for new root object + // + + } + + protected void editObAdvice(boolean isObligation, final Object target) { + // + // Get the object + // + String caption; + Object expressionsObject = null; + if (target instanceof RuleType) { + if (isObligation) { + expressionsObject = ((RuleType) target).getObligationExpressions(); + if (expressionsObject == null) { + caption = "Create New Obligation for Rule"; + } else { + caption = "Edit Obligations for Rule"; + } + } else { + expressionsObject = ((RuleType) target).getAdviceExpressions(); + if (expressionsObject == null) { + caption = "Create New Advice for Rule"; + } else { + caption = "Edit Advice for Rule"; + } + } + } else if (target instanceof PolicyType) { + if (isObligation) { + expressionsObject = ((PolicyType) target).getObligationExpressions(); + if (expressionsObject == null) { + caption = "Create New Obligation for Policy"; + } else { + caption = "Edit Obligations for Policy"; + } + } else { + expressionsObject = ((PolicyType) target).getAdviceExpressions(); + if (expressionsObject == null) { + caption = "Create New Advice for Policy"; + } else { + caption = "Edit Advice for Policy"; + } + } + } else if (target instanceof PolicySetType) { + if (isObligation) { + expressionsObject = ((PolicySetType) target).getObligationExpressions(); + if (expressionsObject == null) { + caption = "Create New Obligation for Policy Set"; + } else { + caption = "Edit Obligation for Policy Set"; + } + } else { + expressionsObject = ((PolicySetType) target).getAdviceExpressions(); + if (expressionsObject == null) { + caption = "Create New Advice for Policy Set"; + } else { + caption = "Edit Advice for Policy Set"; + } + } + } else { + throw new IllegalArgumentException("Expected a rule/policy/policyset."); + } + // + // Make a copy + // + final Object originalExpressions = expressionsObject; + final Object copyExpression = (originalExpressions == null + ? (isObligation ? new ObligationExpressionsType() : new AdviceExpressionsType()) + : originalExpressions instanceof ObligationExpressionsType + ? XACMLObjectCopy.copy((ObligationExpressionsType) originalExpressions) + : XACMLObjectCopy.copy((AdviceExpressionsType) originalExpressions)) + ; + // + // Invoke the editor window + // + final ObligationAdviceEditorWindow window = new ObligationAdviceEditorWindow(copyExpression, this.policyContainer.getVariables()); + window.setCaption(caption); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (window.isSaved() == false) { + return; + } + // + // It was saved - is this a new object? + // + if (originalExpressions == null) { + // + // New object + // + if (self.policyContainer.addItem(copyExpression, target) == null) { + logger.error("Failed to add expression"); + assert false; + } + } else { + // + // Editing an existing object. + // + if (originalExpressions instanceof ObligationExpressionsType) { + // + // Remove old obligations + // + while (((ObligationExpressionsType) originalExpressions).getObligationExpression().isEmpty() == false) { +// for (ObligationExpressionType old : ((ObligationExpressionsType) originalExpressions).getObligationExpression()) { + ObligationExpressionType old = ((ObligationExpressionsType) originalExpressions).getObligationExpression().get(0); + self.policyContainer.removeItem(old); + } + // + // Copy new ones in + // + for (ObligationExpressionType newObligation : ((ObligationExpressionsType) copyExpression).getObligationExpression()) { + self.policyContainer.addItem(newObligation, (ObligationExpressionsType) originalExpressions); + } + } else if (originalExpressions instanceof AdviceExpressionsType) { + ((AdviceExpressionsType) originalExpressions).getAdviceExpression().clear(); + ((AdviceExpressionsType) originalExpressions).getAdviceExpression().addAll(((AdviceExpressionsType) copyExpression).getAdviceExpression()); + } + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void removeMatch(MatchType match, AllOfType parent) { + assert match != null && parent != null; + if (self.policyContainer.removeItem(match) == false) { + logger.error("Failed to remove match"); + assert false; + } + // + // Check for empty AllOf's + // + if (parent.getMatch().isEmpty()) { + this.removeAllOf(parent, (AnyOfType) this.policyContainer.getParent(parent)); + } + } + + protected void removeAllOf(AllOfType allOf, AnyOfType parent) { + assert allOf != null && parent != null; + if (self.policyContainer.removeItem(allOf) == false) { + logger.error("Failed to remove AllOf"); + assert false; + } + // + // Check for empty AnyOf's + // + if (parent.getAllOf().isEmpty()) { + this.removeAnyOf(parent, (TargetType) this.policyContainer.getParent(parent)); + } + } + + protected void removeAnyOf(AnyOfType anyOf, TargetType parent) { + assert anyOf != null && parent != null; + if (self.policyContainer.removeItem(anyOf) == false) { + logger.error("Failed to remove anyOf"); + assert false; + } + } + + protected boolean clipboardPaste(final Object target, boolean performPaste) { + if (this.clipboardObject == null) { + if (logger.isDebugEnabled()) { + logger.debug("nothing in clipboard."); + } + return false; + } + boolean doPaste = false; + if (this.clipboardObject instanceof PolicySetType && target instanceof PolicySetType) { + doPaste = true; + } + if (this.clipboardObject instanceof PolicyType && target instanceof PolicySetType) { + doPaste = true; + } + if (this.clipboardObject instanceof RuleType && target instanceof PolicyType) { + doPaste = true; + } + if (doPaste == false) { + // + // Pasting clipboard object onto target not + // possible. + // + return false; + } + if (performPaste == false) { + // + // They did not ask to do the actual paste, + // but the called wanted to know if it was + // possible. + // + return true; + } + // + // Do the actual paste + // + Item item = this.policyContainer.addItem(XACMLObjectCopy.deepCopy(this.clipboardObject), target); + assert item != null; + this.tree.select(this.clipboardObject); + + return true; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("100.0%"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("100.0%"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + mainLayout.setExpandRatio(horizontalLayoutToolbar, 1.0f); + + // tree + tree = new TreeTable(); + tree.setImmediate(true); + tree.setWidth("100.0%"); + tree.setHeight("100.0%"); + mainLayout.addComponent(tree); + mainLayout.setExpandRatio(tree, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(true); + horizontalLayoutToolbar.setSpacing(true); + + // checkBoxReadOnly + checkBoxReadOnly = new CheckBox(); + checkBoxReadOnly.setCaption("Read Only"); + checkBoxReadOnly.setImmediate(false); + checkBoxReadOnly + .setDescription("Check this to turn-off policy editing."); + checkBoxReadOnly.setWidth("-1px"); + checkBoxReadOnly.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(checkBoxReadOnly); + + // checkBoxAutoSave + checkBoxAutoSave = new CheckBox(); + checkBoxAutoSave.setCaption("Auto Save"); + checkBoxAutoSave.setImmediate(false); + checkBoxAutoSave + .setDescription("Check this to turn-on automatic saving of policy when a change occurs."); + checkBoxAutoSave.setWidth("-1px"); + checkBoxAutoSave.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(checkBoxAutoSave); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setDescription("Click to save the policy."); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonSave); + + // buttonViewXML + buttonViewXML = new Button(); + buttonViewXML.setCaption("View XML"); + buttonViewXML.setImmediate(true); + buttonViewXML.setWidth("-1px"); + buttonViewXML.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonViewXML); + + // buttonExport + buttonExport = new Button(); + buttonExport.setCaption("Export Policy"); + buttonExport.setImmediate(false); + buttonExport.setWidth("-1px"); + buttonExport.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonExport); + + return horizontalLayoutToolbar; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java new file mode 100644 index 0000000..8e006d1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java
@@ -0,0 +1,1640 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Collection; +import java.util.Iterator; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheEntry; +import org.eclipse.jgit.errors.NoWorkTreeException; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.PushResult; +import org.vaadin.dialogs.ConfirmDialog; +import org.vaadin.dialogs.ConfirmDialog.ContentMode; + +import org.apache.openaz.xacml.admin.XacmlAdminAuthorization; +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.model.GitRepositoryContainer; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.util.OnDemandFileDownloader; +import org.apache.openaz.xacml.admin.util.OnDemandFileDownloader.OnDemandStreamResource; +import org.apache.openaz.xacml.admin.util.XACMLPolicyImporter; +import org.apache.openaz.xacml.admin.view.windows.GitPushWindow; +import org.apache.openaz.xacml.admin.view.windows.GitSynchronizeWindow; +import org.apache.openaz.xacml.admin.view.windows.PolicyNameEditorWindow; +import org.apache.openaz.xacml.admin.view.windows.PolicyUploadWindow; +import org.apache.openaz.xacml.admin.view.windows.RenamePolicyFileWindow; +import org.apache.openaz.xacml.admin.view.windows.SubDomainEditorWindow; +import org.apache.openaz.xacml.std.pap.StdPDPPolicy; +import org.apache.openaz.xacml.util.XACMLPolicyScanner; +import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult; +import org.apache.openaz.xacml.util.XACMLPolicyWriter; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Item; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.event.Transferable; +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.event.dd.DropHandler; +import com.vaadin.event.dd.acceptcriteria.AcceptAll; +import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; +import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.HorizontalSplitPanel; +import com.vaadin.ui.Notification; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.TabSheet.CloseHandler; +import com.vaadin.ui.TabSheet.Tab; +import com.vaadin.ui.Table.TableDragMode; +import com.vaadin.ui.Table.TableTransferable; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +/** + * The class represents Policy Editor in Policy Authoring Tool + */ +public class PolicyWorkspace extends CustomComponent implements DropHandler, OnDemandStreamResource { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private HorizontalSplitPanel horizontalSplitPanel; + + @AutoGenerated + private VerticalLayout verticalLayoutRightPanel; + + @AutoGenerated + private TabSheet tabSheet; + + @AutoGenerated + private HorizontalLayout horizontalLayoutRightToolbar; + + @AutoGenerated + private Button buttonRight; + + @AutoGenerated + private VerticalLayout verticalLayoutLeftPanel; + + @AutoGenerated + private TreeTable treeWorkspace; + + @AutoGenerated + private HorizontalLayout horizontalLayoutLeftToolbar; + + @AutoGenerated + private Button buttonLeft; + + @AutoGenerated + private HorizontalLayout horizontalLayoutLeftToolbarLeft; + + @AutoGenerated + private Button buttonExport; + + @AutoGenerated + private Button buttonSynchronize; + + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PolicyWorkspace.class); + private final PolicyWorkspace self = this; + private final OnDemandFileDownloader downloader = new OnDemandFileDownloader(this); + + private GitRepositoryContainer treeContainer; + + private static final Action EXPORT_REPOSITORY = new Action ("Export Repository"); + private static final Action SYNCHRONIZE_REPOSITORY =new Action ("Synchronize"); + private static final Action PUSH_CHANGES = new Action ("Push Changes"); + private static final Action CREATE_SUBDOMAIN = new Action("Create Sub Domain"); + private static final Action RENAME_SUBDOMAIN = new Action("Rename Sub Domain"); + private static final Action CREATE_NEWPOLICY = new Action ("Create New Policy"); + private static final Action RENAME_POLICY = new Action ("Rename Policy"); + private static final Action IMPORT_POLICY = new Action ("Import Policy"); + private static final Action DELETE_SUBDOMAIN = new Action ("Delete Sub Domain"); + private static final Action CLONE_POLICY = new Action ("Clone Policy"); + private static final Action VIEW_POLICY = new Action ("View Policy"); + private static final Action EDIT_POLICY = new Action ("Edit Policy"); + private static final Action EXPORT_POLICY = new Action ("Export Policy"); + private static final Action DELETE_POLICY = new Action ("Delete Policy"); + + public static final String VIEWNAME = PolicyWorkspace.class.getCanonicalName(); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PolicyWorkspace() { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Initialize GUI + // + this.initializeTree(); + this.initializeButtons(); + } + + protected void initializeButtons() { + buttonLeft.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + if (horizontalSplitPanel.getSplitPosition() == 100.0) + horizontalSplitPanel.setSplitPosition(36, Unit.PERCENTAGE); + else + horizontalSplitPanel.setSplitPosition(0); + } + }); + buttonRight.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + if (horizontalSplitPanel.getSplitPosition() == 0.0) + horizontalSplitPanel.setSplitPosition(36, Unit.PERCENTAGE); + else + horizontalSplitPanel.setSplitPosition(100, Unit.PERCENTAGE); + } + }); + // + // Check user write-access + // + if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( + XacmlAdminAuthorization.AdminAction.ACTION_WRITE, + XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) { + this.buttonSynchronize.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.synchronizeRepository(); + } + }); + } else { + logger.info("user not authorized to write, removing synchronize button."); + this.buttonSynchronize.setVisible(false); + } + // + // The export button is attached to dynamic downloader + // + downloader.extend(this.buttonExport); + } + + protected void initializeTree() { + // + // This is where the user's Git repository is located + // + final Path gitPath = ((XacmlAdminUI)UI.getCurrent()).getUserGitPath(); + // + // Create our Git file system container + // + this.treeContainer = new GitRepositoryContainer(gitPath, gitPath.toFile()); + // + // Create our own filter to filter out File extensions and + // also the Git directory. + // + this.treeContainer.setFilter(new FilenameFilter() { + + @Override + public boolean accept(File dir, String name) { + // + // We don't want any of the hidden files + // + if (name.startsWith(".git") || name.equals(".DS_Store")) { + return false; + } + // + // We definitely want xml files + // + if (name.endsWith(".xml")) { + return true; + } + // + // We should test if its a directory, we want those + // included. + // + Path path = Paths.get(dir.getAbsolutePath(), name); + if (Files.isDirectory(path)) { + return true; + } + logger.warn("Filtering out: " + path.toString()); + return false; + } + + }); + // + // Set TreeTables datasource as our git container + // + this.treeWorkspace.setContainerDataSource(this.treeContainer); + // + // Setup other properties etc. + // + this.treeWorkspace.setItemIconPropertyId("Icon"); + this.treeWorkspace.setVisibleColumns(new Object[]{"Name", "Version", "Size", "Last Modified", "Status"}); + this.treeWorkspace.setSizeFull(); + this.treeWorkspace.setSelectable(true); + this.treeWorkspace.setEditable(false); + // + // Expand the first couple of directories + // + for (Object id : this.treeWorkspace.getItemIds()) { + this.treeWorkspace.setCollapsed(id, false); + for (Object child : this.treeWorkspace.getChildren(id)) { + this.treeWorkspace.setCollapsed(child, false); + } + } + // + // Respond to table selections + // + /* + this.treeWorkspace.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + File selection = (File) self.treeWorkspace.getValue(); + if (selection != null) { + self.buttonImport.setEnabled(selection.isDirectory()); + self.buttonExport.setEnabled(selection.isFile()); + } else { + + } + } + + }); + */ + this.treeWorkspace.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick() && + event.getItemId() instanceof File && + ((File) event.getItemId()).isFile()) { + self.openPolicyTab((File) event.getItemId(), true); + } + } + }); + // + // Setup our action handlers + // + this.treeWorkspace.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + // + // Nothing is selected, they right-clicked empty space + // + return new Action[] {SYNCHRONIZE_REPOSITORY, EXPORT_REPOSITORY, CREATE_SUBDOMAIN}; + } + if (! (target instanceof File)) { + return null; + } + if (((File)target).isDirectory()) { + // + // Selected a directory + // + return new Action[] {CREATE_SUBDOMAIN, RENAME_SUBDOMAIN, DELETE_SUBDOMAIN, CREATE_NEWPOLICY, IMPORT_POLICY, PUSH_CHANGES}; + } + if (((File)target).isFile()) { + // + // Selected a policy file + // + return new Action[] {VIEW_POLICY, EDIT_POLICY, CLONE_POLICY, EXPORT_POLICY, RENAME_POLICY, DELETE_POLICY, PUSH_CHANGES}; + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == SYNCHRONIZE_REPOSITORY) { + self.synchronizeRepository(); + return; + } + if (action == EXPORT_REPOSITORY) { + self.exportRepository(); + return; + } + if (action == PUSH_CHANGES) { + self.pushChanges((File) target); + return; + } + if (action == CREATE_SUBDOMAIN) { + self.editSubDomain((File) target, null); + return; + } + if (action == RENAME_SUBDOMAIN) { + self.editSubDomain((File) self.treeWorkspace.getParent(target), ((File)target).getName()); + return; + } + if (action == CREATE_NEWPOLICY) { + self.createPolicy((File) target); + return; + } + if (action == RENAME_POLICY) { + self.renamePolicy((File) target); + return; + + } + if (action == IMPORT_POLICY) { + self.importPolicy((File) target); + return; + } + if (action == DELETE_SUBDOMAIN) { + self.deleteSubDomain((File) target); + return; + } + if (action == CLONE_POLICY) { + self.clonePolicy((File) target); + return; + } + if (action == VIEW_POLICY) { + self.openPolicyTab((File) target, true); + return; + } + if (action == EDIT_POLICY) { + self.openPolicyTab((File) target, false); + return; + } + if (action == EXPORT_POLICY) { + return; + + } + if (action == DELETE_POLICY) { + self.deletePolicy((File) target); + return; + } + } + }); + // + // Set the drop handler + // + this.treeWorkspace.setDragMode(TableDragMode.ROW); + this.treeWorkspace.setDropHandler(this); + // + // Detect when a tab closes and remove it from the + // tab sheet. + // + this.tabSheet.setCloseHandler(new CloseHandler() { + private static final long serialVersionUID = 1L; + + @Override + public void onTabClose(TabSheet tabsheet, Component tabContent) { + logger.info("tabsheet closing: " + tabsheet.getCaption()); + tabsheet.removeTab(tabsheet.getTab(tabContent)); + } + + }); + } + + protected void editSubDomain(final File parent, final String subdomain) { + final SubDomainEditorWindow editor = new SubDomainEditorWindow(null); + editor.setCaption((subdomain == null ? "Create New SubDomain" : "Edit SubDomain")); + editor.setCloseShortcut(KeyCode.ESCAPE); + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user save it + // + if (editor.isSaved() == false) { + return; + } + String newSubDomain = editor.getSubDomain(); + if (newSubDomain == null) { + logger.warn("Shouldn't have a null subdomain if the user clicked save button"); + return; + } + // + // New subdomain? + // + if (subdomain == null) { + // + // Create new one + // + Path createDir; + if (parent == null) { + // + // New Root domain + // + createDir = Paths.get(((XacmlAdminUI)UI.getCurrent()).getUserGitPath().toAbsolutePath().toString(), newSubDomain); + } else { + // + // New subdomain + // + createDir = Paths.get(parent.getAbsolutePath(), newSubDomain); + } + try { + // + // Does the new subdomain exist? + // + Path newDir; + if (Files.exists(createDir)) { + // + // It already exists + // + newDir = createDir; + } else { + // + // Create it + // + newDir = Files.createDirectory(createDir); + // + // Create empty .gitignore file + // + Files.createFile(Paths.get(newDir.toString(), ".gitignore")); + } + // + // Setup the TreeTable + // + File file = newDir.toFile(); + if (parent == null) { + Item item = self.treeWorkspace.addItem(file); + if (item != null) { + self.treeWorkspace.setCollapsed(file, false); + self.treeWorkspace.select(file); + } + } else { + Item item = self.treeWorkspace.addItem(file); + if (item != null) { + self.treeWorkspace.setParent(file, parent); + self.treeWorkspace.setCollapsed(parent, false); + self.treeWorkspace.select(file); + } + } + } catch (IOException e) { + logger.error("Failed to create subdomain: " + createDir.toString(), e); + } + } else { + // + // Get our paths + // + Path oldDir = Paths.get(parent.getAbsolutePath(), subdomain); + Path newDir = Paths.get(parent.getAbsolutePath(), newSubDomain); + try { + // + // Rename the subdomain + // + Files.move(oldDir, newDir); + // + // Add to the TreeTable + // + File newFile = newDir.toFile(); + File oldFile = oldDir.toFile(); + Item item = self.treeWorkspace.addItem(newFile); + if (item != null) { + self.treeWorkspace.setChildrenAllowed(newFile, true); + // + // Make sure its parent is the same as the old one, unless they + // renamed the top-level. + // + Object parent = self.treeWorkspace.getParent(oldFile); + if (parent != null) { + self.treeWorkspace.setParent(newFile, parent); + } + // + // Make any children of the old subdomain now children + // of the new subdomain. + // + Collection<?> children = self.treeWorkspace.getChildren(oldFile); + Iterator<?> iter = children.iterator(); + while (iter.hasNext()) { + Object child = iter.next(); + self.treeWorkspace.setParent(child, newFile); + } + // + // Finally remove the old subdomain + // + self.treeWorkspace.removeItem(oldFile); + } + } catch (IOException e) { + logger.error("Failed to rename subdomain: " + oldDir.toString() + " to: " + newDir.toString(), e); + } + } + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected void deleteSubDomain(final File subdomain) { + String message = "Are you sure you want to delete subdomain\n" + subdomain.getName() + "\nThis will remove <B>ALL</B> of its subdomains and policy files."; + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm SubDomain Deletion", message, "Delete", "Cancel"); + dialog.setContentMode(ContentMode.HTML); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed()) { + // + // Iterate the subdomain + // + try { + Files.walkFileTree(Paths.get(subdomain.getAbsolutePath()), new SimpleFileVisitor<Path>() { + @Override + public FileVisitResult visitFile(Path deleteFile, BasicFileAttributes attrs) + throws IOException { + try { + boolean removeFromTree = deleteFile.getFileName().toString().endsWith(".xml"); + Files.delete(deleteFile); + if (removeFromTree) { + self.treeWorkspace.removeItem(deleteFile.toFile()); + } + if (logger.isDebugEnabled()) { + logger.debug("Deleted file: " + deleteFile.toString()); + } + } catch (IOException e) { + logger.error("Failed to delete file: " + deleteFile.toString(), e); + return FileVisitResult.TERMINATE; + } + return super.visitFile(deleteFile, attrs); + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) + throws IOException { + try { + Files.delete(dir); + self.treeWorkspace.removeItem(dir.toFile()); + if (logger.isDebugEnabled()) { + logger.debug("Deleted dir: " + dir.toString()); + } + } catch (IOException e) { + logger.error("Failed to delete directory: " + dir.toString(), e); + return FileVisitResult.TERMINATE; + } + return super.postVisitDirectory(dir, exc); + } + + }); + } catch (IOException e) { + logger.error("Failed to walk subdomain: " + subdomain.getAbsolutePath(), e); + } + } + } + + }, true); + + } + + protected void createPolicy(final File parentDirectory) { + // + // Construct our parameters + // + Path parent = Paths.get(parentDirectory.getAbsolutePath()); + Path newFile = this.getNextFilename(parent, "Policy"); + // + // Run the window + // + this.runPolicyWindow("Create New Policy", parent, newFile, null, null); + } + + protected void renamePolicy(final File policy) { + // + // Run the rename window + // + final RenamePolicyFileWindow window = new RenamePolicyFileWindow(policy.getName()); + window.setCaption("Rename Policy"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + String newFilename = window.getNewFilename(); + if (newFilename == null) { + // + // User cancelled + // + return; + } + Path newPolicy = Paths.get(policy.getParent(), newFilename); + if (Files.exists(newPolicy)) { + Notification.show("Cannot rename to an existing file", Notification.Type.ERROR_MESSAGE); + return; + } + try { + if (policy.renameTo(newPolicy.toFile()) == false) { + throw new Exception("No known error, rename failed"); + } + self.treeContainer.updateItem(newPolicy.getParent().toFile()); + } catch (Exception e) { + Notification.show("Failed to rename file: " + e.getLocalizedMessage()); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void clonePolicy(final File policy) { + // + // Figure out a new name for the cloned policy + // + Path policyClone = Paths.get(policy.getAbsolutePath()); + Path newFile = this.getNextFilename(policyClone.getParent(), policy.getName()); + if (newFile == null) { + return; + } + // + // Scan the policy in, replace policy ID's and rule ID's + // + Object policyData = new XACMLPolicyScanner(policyClone, new XACMLPolicyScanner.SimpleCallback() { + + @Override + public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) { + rule.setRuleId(((XacmlAdminUI)getUI()).newRuleID()); + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicySet(PolicySetType parent, PolicySetType policySet) { + policySet.setPolicySetId(((XacmlAdminUI)getUI()).newPolicyID()); + policySet.setVersion("1"); + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicy(PolicySetType parent, PolicyType policy) { + policy.setPolicyId(((XacmlAdminUI)getUI()).newPolicyID()); + policy.setVersion("1"); + return CallbackResult.CONTINUE; + } + + }).scan(); + // + // Run the window + // + this.runPolicyWindow("Clone Policy", newFile.getParent(), newFile.getFileName(), policyData, null); + } + + protected void runPolicyWindow(String caption, final Path parentPath, final Path policyPath, final Object policyData, final Path oldPolicyFile) { + // + // Create our editor window + // + final PolicyNameEditorWindow editor = new PolicyNameEditorWindow((policyPath != null ? policyPath.getFileName().toString() : null), + policyData, + ((XacmlAdminUI)getUI()).getPolicyAlgorithms(), + ((XacmlAdminUI)getUI()).getRuleAlgorithms()); + editor.setCaption(caption); + editor.setCloseShortcut(KeyCode.ESCAPE); + editor.setModal(true); + editor.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user hit save button or esc? + // + if (editor.isSaved() == false) { + return; + } + final Object data = editor.getPolicyData(); + String filename = editor.getPolicyFilename(); + if (filename == null || data == null) { + logger.warn("Editor said is was saved but filename/data is null."); + return; + } + // + // Determine new path + // + final Path newPolicyPath = Paths.get(parentPath.toString(), filename); + // + // Is it ok to overwrite the new file? + // + try { + // + // Handle if we are not replacing an old file and we are overwriting + // an existing file. + // + if (self.isOverwritingAPolicy(newPolicyPath, oldPolicyFile) == false && Files.exists(newPolicyPath)) { + // + // Confirm they wanted to do this, and figure out + // new version number. + // + String message = "You are overwriting a file: " + newPolicyPath.getFileName().toString(); + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Policy File Overwriting", message, "Overwrite", "Cancel"); + dialog.setData(false); + dialog.setContentMode(ContentMode.HTML); + dialog.setModal(true); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed()) { + // + // Yep the user wants to overwrite it + // + self.savePolicy(newPolicyPath, data, oldPolicyFile); + // + // Open it for editing + // + self.openPolicyTab(newPolicyPath.toFile(), false); + } + } + + }, true); + // + // Exit out of this thread + // + return; + } + } catch (Exception e) { + logger.error(e); + return; + } + // + // Save it off + // + self.savePolicy(newPolicyPath, data, oldPolicyFile); + // + // Open it for editing + // + self.openPolicyTab(newPolicyPath.toFile(), false); + } + }); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + protected Path getNextFilename(Path parent, String filename) { + filename = FilenameUtils.removeExtension(filename); + Path newFile = null; + int i = 0; + while (true) { + newFile = Paths.get(parent.toString(), String.format("%s(%02d)", filename, i++) + ".xml"); + if (Files.notExists(newFile)) { + return newFile; + } + if (i == 100) { + logger.error("Could not construct a new name for cloned policy."); + return null; + } + } + + } + + protected boolean isOverwritingAPolicy(Path newPolicyPath, Path oldPolicyPath) throws Exception { + // + // Check to see if we were editing an existing file. Then check if the + // new file actually exists. Then check if we are overwriting the original old file + // + if (oldPolicyPath != null && Files.exists(newPolicyPath) && Files.isSameFile(newPolicyPath, oldPolicyPath)) { + // + // Yes its the same, overwriting it is expected. + // + logger.info("isOverwritingAPolicy"); + return true; + } + return false; + } + + protected void savePolicy(final Path newPolicyPath, final Object policyData, Path oldPolicyPath) { + // + // Are they overwriting another policy? + // + String version = "1.0"; + boolean delete = false; + if (oldPolicyPath != null) { + // + // This policy name was being edited. Is it still the same? + // + try { + delete = true; + if (Files.exists(newPolicyPath) && Files.isSameFile(newPolicyPath, oldPolicyPath)) { + delete = false; + } + } catch (Exception e) { + logger.error("Could not determine if same file", e); + return; + } + logger.info("Deleting old file: " + delete); + } + // + // Are we now overwriting another file? + // + if (Files.exists(newPolicyPath)) { + // + // Yes + // + logger.info("Overwriting file"); + // + // Overwrite is happening. Bump the version (IF WE CAN) + // +//TODO - What if user wants to change something other than the last number? For example, changing 1.5.23 to 2.0.0. +//TODO We need a mechanism that allows the user to specify the new policy version (disallowing backtracking) if they desire +//TODO and get that new number (if any) passed down to here. This code then becomes the "then" branch of "If new version has been specified..." + try { + int[] versionArray = StdPDPPolicy.versionStringToArray(XACMLPolicyScanner.getVersion(newPolicyPath)); + // increment the right-most digit + versionArray[versionArray.length - 1]++; + version = StdPDPPolicy.versionArrayToString(versionArray); + } catch (NumberFormatException | IOException e) { + try { + logger.warn("Previous version '" + XACMLPolicyScanner.getVersion(newPolicyPath) + "' not a series of itegers"); + } catch (IOException e1) { + logger.error("could not get previous version"); + } +//TODO - This may not be wise since the intent is to increase the version number. Perhaps we should abort this an go back to the user? + version = "1.0"; + } + if (policyData instanceof PolicySetType) { + ((PolicySetType) policyData).setVersion(version); + } else if (policyData instanceof PolicyType) { + ((PolicyType) policyData).setVersion(version); + } + } else { + // + // Nope, a completely new file + // + logger.info("New file"); + } + // + // Is the root a PolicySet or Policy? + // + Path finalPolicyPath; + if (policyData instanceof PolicySetType) { + // + // Write it out + // + finalPolicyPath = XACMLPolicyWriter.writePolicyFile(newPolicyPath, (PolicySetType) policyData); + } else if (policyData instanceof PolicyType) { + // + // Write it out + // + finalPolicyPath = XACMLPolicyWriter.writePolicyFile(newPolicyPath, (PolicyType) policyData); + } else { + logger.error("Unknown data type sent back."); + return; + } + // + // Did it get written? + // + if (finalPolicyPath == null || ! Files.exists(finalPolicyPath)) { + logger.error("Failed to write policy file."); + return; + } + // + // Add it into our tree + // + this.addPolicyFileToTree(finalPolicyPath.getParent().toFile(), finalPolicyPath.toFile()); + // + // Do we need to delete the old file? + // + if (oldPolicyPath != null && delete) { + try { + Files.delete(oldPolicyPath); + } catch (Exception e) { + logger.error("Failed to delete old policy", e); + } + if (self.treeWorkspace.removeItem(oldPolicyPath.toFile()) == false) { + logger.warn("Failed to remove old policy path"); + } + } + } + + protected void deletePolicy(final File policy) { + String message = "Are you sure you want to delete policy: " + policy.getName(); + ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Policy File Deletion", message, "Delete", "Cancel"); + dialog.setContentMode(ContentMode.HTML); + dialog.show(getUI(), new ConfirmDialog.Listener() { + private static final long serialVersionUID = 1L; + + @Override + public void onClose(ConfirmDialog dialog) { + if (dialog.isConfirmed() && policy.delete()) { + self.treeWorkspace.removeItem(policy); + if (logger.isDebugEnabled()) { + logger.debug("Deleted file: " + policy.toString()); + } + } + } + + }, true); + + } + + protected void importPolicy(final File domain) { + // + // Get the current domain + // + if (! domain.isDirectory()) { + logger.error("Table must have a directory selected to import the file."); + return; + } + // + // Create the upload window + // + final PolicyUploadWindow upload = new PolicyUploadWindow(Paths.get(domain.toURI())); + upload.setCaption("Import Xacml 3.0 Policy File"); + upload.setCloseShortcut(KeyCode.ESCAPE); + upload.setModal(true); + upload.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Was it successful? + // + Path newFile = upload.getUploadedFile(); + if (newFile == null) { + return; + } + // + // Add it + // + self.addPolicyFileToTree(domain, newFile.toFile()); + // + // Are we importing anything in the policy file? + // + boolean importAttributes = upload.importAttributes(); + boolean importObligations = upload.importObligations(); + boolean importAdvice = upload.importAdvice(); + if (importAttributes || importObligations || importAdvice) { + // + // Create our importer + // + XACMLPolicyImporter importer = new XACMLPolicyImporter(); + importer.setImportAttributes(importAttributes); + importer.setImportObligations(importObligations); + importer.setImportAdvice(importAdvice); + importer.setIgnoreStandardAttributes(upload.ignoreStandard()); + // + // Yes load and scan the policy + // + new XACMLPolicyScanner(newFile, importer).scan(); + } + } + }); + upload.center(); + UI.getCurrent().addWindow(upload); + } + + protected void addPolicyFileToTree(File domain, File file) { + // + // Add it into our tree + // + if (this.treeWorkspace.addItem(file) != null) { + // + // Make sure it has the right parent + // + this.treeWorkspace.setParent(file, domain); + // + // Select our new policy + // + self.treeWorkspace.select(file); + } else { + logger.error("Failed to add policy to workspace tree"); + } + } + + /* + protected void publishPolicy(final File policy) { + // + // Get its ID + // + Item item = this.treeContainer.getItem(policy); + if (item == null) { + logger.error("Failed to get the item"); + return; + } + Object policyData = item.getItemProperty("Data"); + if (policyData == null) { + logger.error("Failed to get item data property."); + return; + } + String fullId = XACMLPolicyScanner.getID(policyData); + String version = XACMLPolicyScanner.getVersion(policyData); + if (fullId == null || version == null) { + logger.error("Failed to get policy Id"); + return; + } + List<String> ids = Lists.newArrayList(Splitter.on(':').split(fullId)); + if (ids.isEmpty()) { + logger.error("Couldn't parse policy Id"); + return; + } + final String id = ids.get(ids.size() - 1) + "." + version; + // + // Is there only one group? + // + PAPEngine engine = ((XacmlAdminUI)getUI()).getPAPEngine(); + Set<PDPGroup> groups; + PDPGroup defaultGroup; + try { + groups = engine.getPDPGroups(); + } catch (PAPException e) { + String message = "Unable to retrieve Groups from server: " + e; + logger.error(message, e); + throw new RuntimeException(message); + } + try { + defaultGroup = engine.getDefaultGroup(); + } catch (PAPException e) { + String message = "Unable to retrieve Default Group from server: " + e; + logger.error(message, e); + throw new RuntimeException(message); + } + if (groups.size() == 1) { + this.doPublish(id, policy, defaultGroup); + return; + } + // + // Have user select a group + // + final SelectPDPGroupWindow window = new SelectPDPGroupWindow(groups, "Select PDP Group to publish in"); + window.setCaption("Select PDP Group"); + window.setCloseShortcut(KeyCode.ESCAPE); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + PDPGroup group = window.selectedGroup(); + if (group != null) { + self.doPublish(id, policy, group); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + + } + + protected void doPublish(String id, File policy, PDPGroup group) { + // + // The policy status must be up-to-date + // + // TODO + + // + // TODO - get list of referenced policies and publish + // them first. + // + + // + // Publish the policy + // + + PAPEngine engine = ((XacmlAdminUI)getUI()).getPAPEngine(); + try (InputStream is = new FileInputStream(policy)) { + engine.publishPolicy(id, policy.getName(), true, is, group); + } catch (PAPException | IOException e) { + logger.error("Failed to publish policy: ", e); + } + } + */ + + protected void pushChanges(final File target) { + try { + // + // Grab our working repository + // + Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath(); + final Git git = Git.open(repoPath.toFile()); + // + // Get our status + // + final String base; + Status status; + if (target == null) { + base = "."; + } else { + Path relativePath = repoPath.relativize(Paths.get(target.getPath())); + base = relativePath.toString(); + } + if (logger.isDebugEnabled()) { + logger.debug("Status on base: " + base); + } + status = git.status().addPath(base).call(); + // + // Check if its clean + // + if (status.isClean()) { + // + // Its clean + // + AdminNotification.warn(target.getName() + " is clean!"); + return; + } + // + // Create the window + // + final GitPushWindow window = new GitPushWindow(git, target, status); + window.setCaption("Push Changes"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + if (window.isSaved() == false) { + return; + } + try { + // + // Needs to be added first + // + DirCache cache = git.add().addFilepattern(base).call(); + for (int i = 0; i < cache.getEntryCount(); i++) { + DirCacheEntry entry = cache.getEntry(i); + if (logger.isDebugEnabled()) { + logger.debug("Entry: " + entry); + } + } + // + // Next they need to be committed + // + RevCommit rev = git.commit().setMessage(window.getComment()).call(); + if (logger.isDebugEnabled()) { + logger.debug("RevCommit: " + rev); + } + // + // Now we can push changes to the Git repository + // + Iterable<PushResult> results = git.push().call(); + for (PushResult result : results) { + logger.info(result); + } + // + // Have the container fire an item set change notification + // + self.treeContainer.updateItem(target); + } catch (NoWorkTreeException | GitAPIException e1) { + logger.error(e); + AdminNotification.error("Exception occurred while trying to push: " + e1); + } + } + + }); + window.center(); + UI.getCurrent().addWindow(window); + } catch (IOException | GitAPIException e) { + logger.error(e); + AdminNotification.error("Exception occurred while trying to get status: " + e); + } + } + + protected void synchronizeRepository() { + final GitSynchronizeWindow window = new GitSynchronizeWindow(); + window.setCaption("Synchronize with server repository?"); + window.setModal(true); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void exportRepository() { + this.buttonExport.click(); + } + + @Override + public String getFilename() { + return "Repository.tgz"; + } + + @Override + public InputStream getStream() { + // + // Grab our working repository + // + final Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath(); + Path workspacePath = ((XacmlAdminUI)getUI()).getUserWorkspace(); + final Path tarFile = Paths.get(workspacePath.toString(), "Repository.tgz"); + + try (OutputStream os = Files.newOutputStream(tarFile)) { + try (GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(os)) { + try (TarArchiveOutputStream tarOut = new TarArchiveOutputStream(gzOut)) { + + tarOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + + Files.walkFileTree(repoPath, new SimpleFileVisitor<Path>() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (dir.getFileName().toString().startsWith(".git")) { + return FileVisitResult.SKIP_SUBTREE; + } + Path relative = repoPath.relativize(dir); + if (relative.toString().isEmpty()) { + return super.preVisitDirectory(dir, attrs); + } + TarArchiveEntry entry = new TarArchiveEntry(relative.toFile()); + tarOut.putArchiveEntry(entry); + tarOut.closeArchiveEntry(); + return super.preVisitDirectory(dir, attrs); + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (file.getFileName().toString().endsWith(".xml") == false) { + return super.visitFile(file, attrs); + } + Path relative = repoPath.relativize(file); + TarArchiveEntry entry = new TarArchiveEntry(relative.toFile()); + entry.setSize(Files.size(file)); + tarOut.putArchiveEntry(entry); + try { + IOUtils.copy(Files.newInputStream(file), tarOut); + } catch (IOException e) { + logger.error(e); + } + tarOut.closeArchiveEntry(); + return super.visitFile(file, attrs); + } + + }); + tarOut.finish(); + } + } + } catch (IOException e) { + logger.error(e); + } + try { + return Files.newInputStream(tarFile); + } catch (IOException e) { + logger.error(e); + } + return null; + } + + protected void openPolicyTab(File policy, boolean readOnly) { + // + // Sanity check + // + assert policy != null; + assert policy.isFile(); + if (policy == null || ! policy.isFile()) { + throw new IllegalArgumentException("You must specify a file."); + } + Status status; + Path relativePath; + String base; + try { + // + // Grab our working repository + // + Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath(); + final Git git = Git.open(repoPath.toFile()); + // + // Get our status + // + relativePath = repoPath.relativize(Paths.get(policy.getPath())); + base = relativePath.toString(); + if (logger.isDebugEnabled()) { + logger.debug("Status on base: " + base); + } + status = git.status().addPath(base).call(); + } catch (NoWorkTreeException | IOException | GitAPIException e) { + logger.error("Failed to get status on " + policy + " " + e); + AdminNotification.error("Could not get Git status on the file."); + return; + } + // + // Check if its clean + // + if (status.isClean() == false) { + // + // Check if its conflicting + // + for (String conflict : status.getConflicting()) { + if (conflict.equals(base)) { + // + // Yes - we won't be able to edit it + // + AdminNotification.error("Policy has conflicts with master, please synchronize the repository."); + return; + } + } + } + // + // Check to see if there already is a tab open + // + Iterator<Component> iter = self.tabSheet.iterator(); + while (iter.hasNext()) { + Component c = iter.next(); + if (c instanceof PolicyEditor) { + Object data = ((PolicyEditor) c).getData(); + if (data != null && data instanceof File && ((File)data).equals(policy)) { + self.tabSheet.setSelectedTab(c); + return; + } + } + } + // + // No tab is open, create a new one + // + PolicyEditor editor = null; + try { + editor = new PolicyEditor(policy, this.treeContainer, readOnly); + } catch (IOException e) { + logger.error("Failed to open policy"); + editor = null; + } + if (editor != null) { + editor.setWidth("100%"); + Tab tab = self.tabSheet.addTab(editor); + editor.setTab(tab); + tab.setClosable(true); + + self.tabSheet.setSelectedTab(editor); + } else { + AdminNotification.error("The Policy File is not a Xacml 3.0 policy."); + } + } + + @Override + public void drop(DragAndDropEvent event) { + Transferable t = event.getTransferable(); + Component source = t.getSourceComponent(); + if (source != this.treeWorkspace) { + assert false; + throw new IllegalArgumentException(); + } + TableTransferable tt = (TableTransferable) t; + File sourceFile = (File) tt.getItemId(); + + AbstractSelectTargetDetails target = (AbstractSelectTargetDetails)event.getTargetDetails(); + File targetFile = (File) target.getItemIdOver(); + + if (sourceFile.isFile() && targetFile != null && targetFile.isDirectory()) { + // + // Construct destination filename + // + Path dest = targetFile.toPath().resolve(sourceFile.getName()); + // + // Check if the target domain exists + // + if (Files.exists(dest)) { + // + // Prompt the user + // + Notification.show("A policy file with that name already exists in that directory.", Notification.Type.ERROR_MESSAGE); + } else { + // + // Go ahead and rename it + // + this.renamePolicyFile(sourceFile, dest.toFile(), targetFile); + } + } + } + + protected void renamePolicyFile(File sourceFile, File dest, File parent) { + try { + if (sourceFile.renameTo(dest)) { + this.treeContainer.setParent(sourceFile, parent); + this.treeContainer.updateItem(parent); + } + } catch (Exception e) { + String error = "Failed to rename " + sourceFile + " to: " + dest + System.lineSeparator() + e.getLocalizedMessage(); + logger.error(error); + AdminNotification.error(error); + } + } + + @Override + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("100%"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("100.0%"); + setHeight("100.0%"); + + // horizontalSplitPanel + horizontalSplitPanel = buildHorizontalSplitPanel(); + mainLayout.addComponent(horizontalSplitPanel); + mainLayout.setExpandRatio(horizontalSplitPanel, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalSplitPanel buildHorizontalSplitPanel() { + // common part: create layout + horizontalSplitPanel = new HorizontalSplitPanel(); + horizontalSplitPanel.setImmediate(false); + horizontalSplitPanel.setWidth("100.0%"); + horizontalSplitPanel.setHeight("100.0%"); + + // verticalLayoutLeftPanel + verticalLayoutLeftPanel = buildVerticalLayoutLeftPanel(); + horizontalSplitPanel.addComponent(verticalLayoutLeftPanel); + + // verticalLayoutRightPanel + verticalLayoutRightPanel = buildVerticalLayoutRightPanel(); + horizontalSplitPanel.addComponent(verticalLayoutRightPanel); + + return horizontalSplitPanel; + } + + @AutoGenerated + private VerticalLayout buildVerticalLayoutLeftPanel() { + // common part: create layout + verticalLayoutLeftPanel = new VerticalLayout(); + verticalLayoutLeftPanel.setImmediate(false); + verticalLayoutLeftPanel.setWidth("100.0%"); + verticalLayoutLeftPanel.setHeight("100.0%"); + verticalLayoutLeftPanel.setMargin(true); + verticalLayoutLeftPanel.setSpacing(true); + + // horizontalLayoutLeftToolbar + horizontalLayoutLeftToolbar = buildHorizontalLayoutLeftToolbar(); + verticalLayoutLeftPanel.addComponent(horizontalLayoutLeftToolbar); + + // treeWorkspace + treeWorkspace = new TreeTable(); + treeWorkspace.setImmediate(true); + treeWorkspace.setWidth("100.0%"); + treeWorkspace.setHeight("100.0%"); + verticalLayoutLeftPanel.addComponent(treeWorkspace); + verticalLayoutLeftPanel.setExpandRatio(treeWorkspace, 1.0f); + + return verticalLayoutLeftPanel; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutLeftToolbar() { + // common part: create layout + horizontalLayoutLeftToolbar = new HorizontalLayout(); + horizontalLayoutLeftToolbar.setImmediate(false); + horizontalLayoutLeftToolbar.setWidth("100.0%"); + horizontalLayoutLeftToolbar.setHeight("-1px"); + horizontalLayoutLeftToolbar.setMargin(false); + horizontalLayoutLeftToolbar.setSpacing(true); + + // horizontalLayoutLeftToolbarLeft + horizontalLayoutLeftToolbarLeft = buildHorizontalLayoutLeftToolbarLeft(); + horizontalLayoutLeftToolbar + .addComponent(horizontalLayoutLeftToolbarLeft); + + // buttonLeft + buttonLeft = new Button(); + buttonLeft.setCaption("<<"); + buttonLeft.setImmediate(true); + buttonLeft.setDescription("Minimize left panel."); + buttonLeft.setWidth("-1px"); + buttonLeft.setHeight("-1px"); + horizontalLayoutLeftToolbar.addComponent(buttonLeft); + horizontalLayoutLeftToolbar.setComponentAlignment(buttonLeft, + new Alignment(34)); + + return horizontalLayoutLeftToolbar; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutLeftToolbarLeft() { + // common part: create layout + horizontalLayoutLeftToolbarLeft = new HorizontalLayout(); + horizontalLayoutLeftToolbarLeft.setImmediate(false); + horizontalLayoutLeftToolbarLeft.setWidth("-1px"); + horizontalLayoutLeftToolbarLeft.setHeight("-1px"); + horizontalLayoutLeftToolbarLeft.setMargin(false); + horizontalLayoutLeftToolbarLeft.setSpacing(true); + + // buttonSynchronize + buttonSynchronize = new Button(); + buttonSynchronize.setCaption("Synchronize Repository"); + buttonSynchronize.setImmediate(true); + buttonSynchronize + .setDescription("Synchronize local repository with main branch."); + buttonSynchronize.setWidth("-1px"); + buttonSynchronize.setHeight("-1px"); + horizontalLayoutLeftToolbarLeft.addComponent(buttonSynchronize); + + // buttonExport + buttonExport = new Button(); + buttonExport.setCaption("Export Workspace"); + buttonExport.setImmediate(true); + buttonExport.setDescription("Export your workspace to your local drive."); + buttonExport.setWidth("-1px"); + buttonExport.setHeight("-1px"); + horizontalLayoutLeftToolbarLeft.addComponent(buttonExport); + + return horizontalLayoutLeftToolbarLeft; + } + + @AutoGenerated + private VerticalLayout buildVerticalLayoutRightPanel() { + // common part: create layout + verticalLayoutRightPanel = new VerticalLayout(); + verticalLayoutRightPanel.setImmediate(false); + verticalLayoutRightPanel.setWidth("100.0%"); + verticalLayoutRightPanel.setHeight("-1px"); + verticalLayoutRightPanel.setMargin(true); + verticalLayoutRightPanel.setSpacing(true); + + // horizontalLayoutRightToolbar + horizontalLayoutRightToolbar = buildHorizontalLayoutRightToolbar(); + verticalLayoutRightPanel.addComponent(horizontalLayoutRightToolbar); + + // tabSheet + tabSheet = new TabSheet(); + tabSheet.setImmediate(true); + tabSheet.setWidth("100.0%"); + tabSheet.setHeight("-1px"); + verticalLayoutRightPanel.addComponent(tabSheet); + verticalLayoutRightPanel.setExpandRatio(tabSheet, 1.0f); + + return verticalLayoutRightPanel; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutRightToolbar() { + // common part: create layout + horizontalLayoutRightToolbar = new HorizontalLayout(); + horizontalLayoutRightToolbar.setImmediate(false); + horizontalLayoutRightToolbar.setWidth("100.0%"); + horizontalLayoutRightToolbar.setHeight("-1px"); + horizontalLayoutRightToolbar.setMargin(false); + horizontalLayoutRightToolbar.setSpacing(true); + + // buttonRight + buttonRight = new Button(); + buttonRight.setCaption(">>"); + buttonRight.setImmediate(true); + buttonRight.setDescription("Restore left panel."); + buttonRight.setWidth("-1px"); + buttonRight.setHeight("-1px"); + horizontalLayoutRightToolbar.addComponent(buttonRight); + + return horizontalLayoutRightToolbar; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java new file mode 100644 index 0000000..c554568 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java
@@ -0,0 +1,69 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.annotations.Theme; +import com.vaadin.server.VaadinRequest; +import com.vaadin.ui.AbsoluteLayout; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.UI; + +public class Simulator extends CustomComponent { + + @AutoGenerated + private AbsoluteLayout mainLayout; + + private static final long serialVersionUID = 1L; + + @Theme("xacml_pap_admin") + public static class SimulatorUI extends UI { + private static final long serialVersionUID = 1L; + + @Override + protected void init(VaadinRequest request) { + // TODO Auto-generated method stub + + } + + } + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public Simulator() { + buildMainLayout(); + setCompositionRoot(mainLayout); + + // TODO add user code here + } + + @AutoGenerated + private void buildMainLayout() { + // the main layout and components will be created here + mainLayout = new AbsoluteLayout(); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java new file mode 100644 index 0000000..a883dec --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java
@@ -0,0 +1,114 @@ +/* + * 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 org.apache.openaz.xacml.admin.components; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.Button; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; + +public class UserManagement extends CustomComponent { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table tableUsers; + @AutoGenerated + private HorizontalLayout horizontalLayoutToolbar; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonAdd; + private static final long serialVersionUID = 1L; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public UserManagement() { + buildMainLayout(); + setCompositionRoot(mainLayout); + + // TODO add user code here + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("100.0%"); + setHeight("-1px"); + + // horizontalLayoutToolbar + horizontalLayoutToolbar = buildHorizontalLayoutToolbar(); + mainLayout.addComponent(horizontalLayoutToolbar); + + // tableUsers + tableUsers = new Table(); + tableUsers.setImmediate(false); + tableUsers.setWidth("100.0%"); + tableUsers.setHeight("-1px"); + mainLayout.addComponent(tableUsers); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayoutToolbar() { + // common part: create layout + horizontalLayoutToolbar = new HorizontalLayout(); + horizontalLayoutToolbar.setImmediate(false); + horizontalLayoutToolbar.setWidth("-1px"); + horizontalLayoutToolbar.setHeight("-1px"); + horizontalLayoutToolbar.setMargin(true); + horizontalLayoutToolbar.setSpacing(true); + + // buttonAdd + buttonAdd = new Button(); + buttonAdd.setCaption("Add User"); + buttonAdd.setImmediate(false); + buttonAdd.setWidth("-1px"); + buttonAdd.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonAdd); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove User"); + buttonRemove.setImmediate(false); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayoutToolbar.addComponent(buttonRemove); + + return horizontalLayoutToolbar; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java new file mode 100644 index 0000000..947702e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java
@@ -0,0 +1,28 @@ +/* + * 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. + * + */ + +/** + * + */ +/** + * @author pameladragosh + * + */ +package org.apache.openaz.xacml.admin.components;
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java new file mode 100644 index 0000000..4229a4e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java
@@ -0,0 +1,71 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import java.util.Locale; + +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.api.Identifier; +import com.vaadin.data.util.converter.Converter; + +public class CategoryConverter implements Converter<Object, Category> { + private static final long serialVersionUID = 1L; + + @Override + public Category convertToModel(Object value, + Class<? extends Category> targetType, Locale locale) + throws Converter.ConversionException { + Category category = new Category(); + if (value == null) { + return category; + } + if (value instanceof Identifier) { + category.setXacmlId(((Identifier)value).stringValue()); + } else { + category.setXacmlId(value.toString()); + } + return category; + } + + @Override + public Object convertToPresentation(Category value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (targetType.getName().equals(String.class.getName())) { + return value.getXacmlId(); + } + if (targetType.getName().equals(Identifier.class.getName())) { + return value.getIdentifer(); + } + return value.getIdentifer(); + } + + @Override + public Class<Category> getModelType() { + return Category.class; + } + + @Override + public Class<Object> getPresentationType() { + return Object.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java new file mode 100644 index 0000000..c6705ca --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java
@@ -0,0 +1,79 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import java.util.Locale; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import com.vaadin.data.util.converter.Converter; + +public class ConstraintTypeConverter implements Converter<Object, ConstraintType> { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(ConstraintTypeConverter.class); + + @Override + public ConstraintType convertToModel(Object value, + Class<? extends ConstraintType> targetType, Locale locale) + throws Converter.ConversionException { + if (logger.isTraceEnabled()) { + logger.trace("convertToModel:" + value + " target " + targetType); + } + ConstraintType constraintValue = new ConstraintType(); + if (value == null) { + return constraintValue; + } + // PLD TODO?? + return constraintValue; + } + + @Override + public Object convertToPresentation(ConstraintType value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (logger.isTraceEnabled()) { + logger.trace("convertToPresentation:" + value + " target " + targetType); + } + if (value == null) { + return null; + } + if (targetType.isAssignableFrom(String.class)) { + return value.getConstraintType(); + } + if (targetType.isInstance(Integer.class)) { + return value.getId(); + } + return null; + } + + @Override + public Class<ConstraintType> getModelType() { + return ConstraintType.class; + } + + @Override + public Class<Object> getPresentationType() { + return Object.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java new file mode 100644 index 0000000..03c76be --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java
@@ -0,0 +1,73 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import java.util.Locale; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import com.vaadin.data.util.converter.Converter; + +public class ConstraintValueConverter implements Converter<Object, ConstraintValue> { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(ConstraintValueConverter.class); + + @Override + public ConstraintValue convertToModel(Object value, + Class<? extends ConstraintValue> targetType, Locale locale) + throws Converter.ConversionException { + if (logger.isTraceEnabled()) { + logger.trace("convertToModel:" + value + " target " + targetType); + } + ConstraintValue newValue = new ConstraintValue(); + if (value == null) { + return newValue; + } + // PLD TODO? + return newValue; + } + + @Override + public Object convertToPresentation(ConstraintValue value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (logger.isTraceEnabled()) { + logger.trace("convertToPresentation:" + value + " target " + targetType); + } + if (value == null) { + return null; + } + return value.getProperty(); + } + + @Override + public Class<ConstraintValue> getModelType() { + return ConstraintValue.class; + } + + @Override + public Class<Object> getPresentationType() { + return Object.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java new file mode 100644 index 0000000..8817428 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java
@@ -0,0 +1,76 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import java.util.Locale; + +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.api.Identifier; +import com.vaadin.data.util.converter.Converter; + +public class DatatypeConverter implements Converter<Object, Datatype> { + private static final long serialVersionUID = 1L; + + @Override + public Datatype convertToModel(Object value, + Class<? extends Datatype> targetType, Locale locale) + throws Converter.ConversionException { + Datatype datatype = new Datatype(); + if (value == null) { + return datatype; + } + if (value instanceof Identifier) { + datatype.setXacmlId(((Identifier)value).stringValue()); + } else { + datatype.setXacmlId(value.toString()); + } + return datatype; + } + + @Override + public Object convertToPresentation(Datatype value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (value == null) { + return null; + } + if (targetType.isInstance(String.class) || + targetType.getName().equals(String.class.getName())) { + return value.getXacmlId(); + } + if (targetType.isInstance(Identifier.class) || + targetType.getName().equals(Identifier.class.getName())) { + return value.getIdentifer(); + } + return value.getIdentifer(); + } + + @Override + public Class<Datatype> getModelType() { + return Datatype.class; + } + + @Override + public Class<Object> getPresentationType() { + return Object.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java new file mode 100644 index 0000000..07b810d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java
@@ -0,0 +1,61 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import java.util.Locale; + +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.std.IdentifierImpl; +import com.vaadin.data.util.converter.Converter; + + +public class IdentifierConverter implements Converter<Object, Identifier> { + private static final long serialVersionUID = 1L; + + @Override + public Identifier convertToModel(Object value, + Class<? extends Identifier> targetType, Locale locale) + throws Converter.ConversionException { + return new IdentifierImpl(value.toString()); + } + + @Override + public Object convertToPresentation(Identifier value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (targetType.isInstance(String.class) || + targetType.getName().equals(String.class.getName())) { + return value.stringValue(); + } + return null; + } + + @Override + public Class<Identifier> getModelType() { + return Identifier.class; + } + + @Override + public Class<Object> getPresentationType() { + return Object.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java new file mode 100644 index 0000000..32fb8bf --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java
@@ -0,0 +1,83 @@ +/* + * 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 org.apache.openaz.xacml.admin.converters; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.api.Identifier; +import com.vaadin.data.util.converter.Converter; +import com.vaadin.data.util.converter.DefaultConverterFactory; + +public class XacmlConverterFactory extends DefaultConverterFactory { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(XacmlConverterFactory.class); + + @SuppressWarnings("unchecked") + @Override + public <PRESENTATION, MODEL> Converter<PRESENTATION, MODEL> + createConverter(Class<PRESENTATION> presentationType, + Class<MODEL> modelType) { + if (logger.isTraceEnabled()) { + logger.trace("createConverter: " + presentationType + " from model " + modelType); + } + // + // Handle one particular type conversion for Categories + // + if (Category.class == modelType) { + return (Converter<PRESENTATION, MODEL>) new CategoryConverter(); + } + // + // Handle one particular type conversion for Datatypes + // + if (Datatype.class == modelType) { + return (Converter<PRESENTATION, MODEL>) new DatatypeConverter(); + } + // + // Handle one particular type conversion for ConstraintType + // + if (ConstraintType.class == modelType) { + return (Converter<PRESENTATION, MODEL>) new ConstraintTypeConverter(); + } + // + // Handle one particular type conversion for ConstraintType + // + if (ConstraintValue.class == modelType) { + return (Converter<PRESENTATION, MODEL>) new ConstraintValueConverter(); + } + // + // Handle one particular type conversion for Identifiers + // + if (Identifier.class == modelType) { + return (Converter<PRESENTATION, MODEL>) new IdentifierConverter(); + } + // + // Default to the supertype + // + return super.createConverter(presentationType, + modelType); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java new file mode 100644 index 0000000..84ec82a --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java
@@ -0,0 +1,327 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.std.IdentifierImpl; + + +/** + * The persistent class for the Attribute database table. + * + */ +@Entity +@Table(name="Attribute") +@NamedQuery(name="Attribute.findAll", query="SELECT a FROM Attribute a") +public class Attribute implements Serializable { + private static final long serialVersionUID = 1L; + + public static String ATTRIBUTE_DESIGNATOR = "Attribute Designator"; + public static String ATTRIBUTE_SELECTOR = "Attribute Selector"; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + //bi-directional many-to-one association to Category + @ManyToOne + @JoinColumn(name="constraint_type", nullable=true) + private ConstraintType constraintType; + + @Column(name="created_by", nullable=false, length=255) + private String createdBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="created_date", updatable=false) + private Date createdDate; + + @Column(name="description", nullable=true, length=2048) + private String description; + + @Column(name="modified_by", nullable=false, length=255) + private String modifiedBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="modified_date", nullable=false) + private Date modifiedDate; + + @Column(name="xacml_id", nullable=false) + private String xacmlId = "urn"; + + //bi-directional many-to-one association to ConstraintValue + @OneToMany(mappedBy="attribute", orphanRemoval=true, cascade=CascadeType.REMOVE) + private Set<ConstraintValue> constraintValues = new HashSet<ConstraintValue>(); + + //bi-directional many-to-one association to Category + @ManyToOne + @JoinColumn(name="category") + private Category categoryBean; + + //bi-directional many-to-one association to Datatype + @ManyToOne + @JoinColumn(name="datatype") + private Datatype datatypeBean; + + @Column(name="is_designator", nullable=false) + private char isDesignator = '1'; + + @Column(name="selector_path", nullable=true, length=2048) + private String selectorPath; + + @Transient + private String issuer = null; + + @Transient + private boolean mustBePresent = false; + + public Attribute() { + } + + public Attribute(String domain) { + this.xacmlId = domain; + } + + public Attribute(String domain, String user) { + this(domain); + this.createdBy = user; + this.modifiedBy = user; + } + public Attribute(Attribute copy, String user) { + this(copy.getXacmlId() + ":(0)", user); + this.constraintType = copy.getConstraintType(); + this.categoryBean = copy.getCategoryBean(); + this.datatypeBean = copy.getDatatypeBean(); + this.description = copy.getDescription(); + for (ConstraintValue value : copy.getConstraintValues()) { + ConstraintValue newValue = new ConstraintValue(value); + newValue.setAttribute(this); + this.addConstraintValue(newValue); + } + } + + @PrePersist + public void prePersist() { + Date date = new Date(); + this.createdDate = date; + this.modifiedDate = date; + } + + @PreUpdate + public void preUpdate() { + this.modifiedDate = new Date(); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public ConstraintType getConstraintType() { + return this.constraintType; + } + + public void setConstraintType(ConstraintType constraintType) { + this.constraintType = constraintType; + } + + public String getCreatedBy() { + return this.createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedDate() { + return this.createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getModifiedBy() { + return this.modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public Date getModifiedDate() { + return this.modifiedDate; + } + + public void setModifiedDate(Date modifiedDate) { + this.modifiedDate = modifiedDate; + } + + public String getXacmlId() { + return this.xacmlId; + } + + @Transient + public Identifier getXacmlIdentifier() { + return new IdentifierImpl(this.xacmlId); + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public Set<ConstraintValue> getConstraintValues() { + return this.constraintValues; + } + + public void setConstraintValues(Set<ConstraintValue> constraintValues) { + for (ConstraintValue value : this.constraintValues) { + value.setAttribute(this); + } + this.constraintValues = constraintValues; + } + + public ConstraintValue addConstraintValue(ConstraintValue constraintValue) { + if (this.constraintValues == null) { + this.constraintValues = new HashSet<ConstraintValue>(); + } + this.constraintValues.add(constraintValue); + constraintValue.setAttribute(this); + + return constraintValue; + } + + public ConstraintValue removeConstraintValue(ConstraintValue constraintValue) { + this.constraintValues.remove(constraintValue); + constraintValue.setAttribute(null); + + return constraintValue; + } + + public void removeAllConstraintValues() { + if (this.constraintValues == null) { + return; + } + for (ConstraintValue value : this.constraintValues) { + value.setAttribute(null); + } + this.constraintValues.clear(); + } + + public Category getCategoryBean() { + return this.categoryBean; + } + + public void setCategoryBean(Category categoryBean) { + this.categoryBean = categoryBean; + } + + public Datatype getDatatypeBean() { + return this.datatypeBean; + } + + public void setDatatypeBean(Datatype datatypeBean) { + this.datatypeBean = datatypeBean; + } + + public char getIsDesignator() { + return this.isDesignator; + } + + public void setIsDesignator(char is) { + this.isDesignator = is; + } + + public String getSelectorPath() { + return this.selectorPath; + } + + public void setSelectorPath(String path) { + this.selectorPath = path; + } + + @Transient + public String getIssuer() { + return issuer; + } + + @Transient + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + @Transient + public boolean isMustBePresent() { + return mustBePresent; + } + + @Transient + public void setMustBePresent(boolean mustBePresent) { + this.mustBePresent = mustBePresent; + } + + @Transient + public boolean isDesignator() { + return this.isDesignator == '1'; + } + + @Transient + public void setIsDesignator(boolean is) { + if (is) { + this.isDesignator = '1'; + } else { + this.isDesignator = '0'; + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java new file mode 100644 index 0000000..344b7f8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java
@@ -0,0 +1,94 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + + +/** + * The persistent class for the ObadviceExpressions database table. + * + */ +@Entity +@Table(name="AttributeAssignment") +@NamedQuery(name="AttributeAssignment.findAll", query="SELECT a FROM AttributeAssignment a") +public class AttributeAssignment implements Serializable { + private static final long serialVersionUID = 1L; + + public static final String EXPRESSION_APPLY = "Apply"; + public static final String EXPRESSION_SELECTOR = "AttributeSelector"; + public static final String EXPRESSION_VALUE = "AttributeValue"; + public static final String EXPRESSION_FUNCTION = "Function"; + public static final String EXPRESSION_REFERENCE = "VarableReference"; + public static final String EXPRESSION_DESIGNATOR = "AttributeDesignator"; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="attribute_id") + private int attributeId; + + //bi-directional many-to-one association to Obadvice + @Column(name="expression", nullable=false) + private String expression; + + //bi-directional many-to-one association to Obadvice + @ManyToOne + private Obadvice obadvice; //NOPMD + + public AttributeAssignment() { + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public int getAttributeId() { + return this.attributeId; + } + + public void setAttributeId(int attributeId) { + this.attributeId = attributeId; + } + + public String getExpression() { + return expression; + } + + public void setExpression(String expression) { + this.expression = expression; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java new file mode 100644 index 0000000..fdcbd3d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java
@@ -0,0 +1,216 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.std.IdentifierImpl; + + +/** + * The persistent class for the Categories database table. + * + */ +@Entity +@Table(name="Category") +@NamedQuery(name="Category.findAll", query="SELECT c FROM Category c") +public class Category implements Serializable { + private static final long serialVersionUID = 1L; + + public static final char STANDARD = 'S'; + public static final char CUSTOM = 'C'; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="grouping", nullable=false, length=64) + private String grouping; + + @Column(name="is_standard", nullable=false) + private char isStandard; + + @Column(name="xacml_id", nullable=false, unique=true, length=255) + private String xacmlId; + + @Column(name="short_name", nullable=false, length=64) + private String shortName; + + //bi-directional many-to-one association to Attribute + @OneToMany(mappedBy="categoryBean") + private Set<Attribute> attributes = new HashSet<>(); + + public Category() { + this.xacmlId = XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue(); + this.grouping = "subject"; + this.isStandard = Category.STANDARD; + this.shortName = "subject"; + } + + public Category(Identifier cat, String grouping, char isStandard) { + if (cat != null) { + this.xacmlId = cat.stringValue(); + } + this.isStandard = isStandard; + if (grouping != null) { + this.grouping = grouping; + } else { + this.grouping = Category.extractGrouping(this.xacmlId); + } + } + + public Category(Identifier cat, String grouping) { + this(cat, grouping, Category.STANDARD); + } + + public Category(Identifier cat, char standard) { + this(cat, null, standard); + } + + public Category(Identifier cat) { + this(cat, Category.STANDARD); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getGrouping() { + return this.grouping; + } + + public void setGrouping(String grouping) { + this.grouping = grouping; + } + + public char getIsStandard() { + return this.isStandard; + } + + public void setIsStandard(char isStandard) { + this.isStandard = isStandard; + } + + public String getXacmlId() { + return this.xacmlId; + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public String getShortName() { + return this.shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public Set<Attribute> getAttributes() { + return this.attributes; + } + + public void setAttributes(Set<Attribute> attributes) { + this.attributes = attributes; + } + + public Attribute addAttribute(Attribute attribute) { + getAttributes().add(attribute); + attribute.setCategoryBean(this); + + return attribute; + } + + public Attribute removeAttribute(Attribute attribute) { + getAttributes().remove(attribute); + attribute.setCategoryBean(null); + + return attribute; + } + + @Transient + public boolean isStandard() { + return this.isStandard == Category.STANDARD; + } + + @Transient + public boolean isCustom() { + return this.isStandard == Category.CUSTOM; + } + + @Transient + public static String extractGrouping(String xacmlId) { + if (xacmlId == null) { + return null; + } + if (xacmlId.matches(".*:attribute\\-category:.*")) { + String[] parts = xacmlId.split("[:]"); + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + } else if (xacmlId.matches(".*:[a-zA-Z]+[\\-]category:.*")) { + String[] parts = xacmlId.split("[:]"); + if (parts != null && parts.length > 0) { + for (String part : parts) { + int index = part.indexOf("-category"); + if (index > 0) { + return part.substring(0, index); + } + } + } + } + return null; + } + + @Transient + public Identifier getIdentifer() { + return new IdentifierImpl(this.xacmlId); + } + + @Transient + @Override + public String toString() { + return "Category [id=" + id + ", grouping=" + grouping + + ", isStandard=" + isStandard + ", xacmlId=" + xacmlId + + ", attributes=" + attributes + "]"; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java new file mode 100644 index 0000000..14b9008 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java
@@ -0,0 +1,117 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +@Entity +@Table(name="ConstraintType") +@NamedQuery(name="ConstraintType.findAll", query="SELECT a FROM ConstraintType a") +public class ConstraintType implements Serializable { + private static final long serialVersionUID = 1L; + + public static String ENUMERATION_TYPE = "Enumeration"; + public static String RANGE_TYPE = "Range"; + public static String REGEXP_TYPE = "Regular Expression"; + + public static Map<String, String> defaults = new HashMap<String, String>(); + static { + defaults.put(ENUMERATION_TYPE, "Enumerate a set of values that the attribute may be set to during policy creation."); + defaults.put(RANGE_TYPE, "Set a range of min and/or max integer/double values the attribute can be set to during policy creation."); + defaults.put(REGEXP_TYPE, "Define a regular expression the attribute must match against during policy creation."); + } + public static final String[] RANGE_TYPES = {"minExclusive", "minInclusive", "maxExclusive", "maxInclusive"}; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="constraint_type", nullable=false, length=64) + private String constraintType; + + @Column(name="description", nullable=false, length=255) + private String description; + + //bi-directional many-to-one association to Attribute + @OneToMany(mappedBy="constraintType") + private Set<Attribute> attributes = new HashSet<>(); + + public ConstraintType() { + + } + + public ConstraintType(String constraintType) { + this(); + this.constraintType = constraintType; + } + + public ConstraintType(String constraintType, String description) { + this(constraintType); + this.description = description; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getConstraintType() { + return constraintType; + } + + public void setConstraintType(String constraintType) { + this.constraintType = constraintType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Set<Attribute> getAttributes() { + return attributes; + } + + public void setAttributes(Set<Attribute> attributes) { + this.attributes = attributes; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java new file mode 100644 index 0000000..e1f66d4 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java
@@ -0,0 +1,116 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + + +/** + * The persistent class for the ConstraintValues database table. + * + */ +@Entity +@Table(name="ConstraintValues") +@NamedQuery(name="ConstraintValue.findAll", query="SELECT c FROM ConstraintValue c") +public class ConstraintValue implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="property") + private String property; + + @Column(name="value") + private String value; + + //bi-directional many-to-one association to Attribute + @ManyToOne + @JoinColumn(name="attribute_id") + private Attribute attribute; + + public ConstraintValue() { + } + + public ConstraintValue(String property, String value) { + this.property = property; + this.value = value; + } + + public ConstraintValue(ConstraintValue value) { + this.property = value.getProperty(); + this.value = value.getValue(); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getProperty() { + return this.property; + } + + public void setProperty(String property) { + this.property = property; + } + + public String getValue() { + return this.value; + } + + public void setValue(String value) { + this.value = value; + } + + public Attribute getAttribute() { + return this.attribute; + } + + public void setAttribute(Attribute attribute) { + this.attribute = attribute; + } + + public ConstraintValue clone() { + ConstraintValue constraint = new ConstraintValue(); + + constraint.property = this.property; + constraint.value = this.value; + constraint.attribute = this.attribute; + + return constraint; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java new file mode 100644 index 0000000..50d4488 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java
@@ -0,0 +1,230 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.std.IdentifierImpl; + + +/** + * The persistent class for the Datatype database table. + * + */ +@Entity +@Table(name="Datatype") +@NamedQuery(name="Datatype.findAll", query="SELECT d FROM Datatype d") +public class Datatype implements Serializable { + private static final long serialVersionUID = 1L; + + public static final char STANDARD = 'S'; + public static final char CUSTOM = 'C'; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="is_standard", nullable=false) + private char isStandard; + + @Column(name="xacml_id", nullable=false, unique=true, length=255) + private String xacmlId; + + @Column(name="short_name", nullable=false, length=64) + private String shortName; + + //bi-directional many-to-one association to Attribute + @OneToMany(mappedBy="datatypeBean") + private Set<Attribute> attributes = new HashSet<>(); + + //bi-directional many-to-one association to Attribute + @OneToMany(mappedBy="datatypeBean") + private Set<FunctionDefinition> functions = new HashSet<>(); + + //bi-directional many-to-one association to Attribute + @OneToMany(mappedBy="datatypeBean") + private Set<FunctionArgument> arguments = new HashSet<>(); + + public Datatype() { + this.xacmlId = XACML3.ID_DATATYPE_STRING.stringValue(); + this.isStandard = Datatype.STANDARD; + } + + public Datatype(int id, Datatype dt) { + this.id = id; + this.isStandard = dt.isStandard; + this.xacmlId = dt.xacmlId; + this.shortName = dt.shortName; + // + // Make a copy? + // + this.attributes = new HashSet<>(); + } + + public Datatype(Identifier identifier, char standard) { + if (identifier != null) { + this.xacmlId = identifier.stringValue(); + } + this.isStandard = standard; + } + + public Datatype(Identifier identifier) { + this(identifier, Datatype.STANDARD); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public char getIsStandard() { + return this.isStandard; + } + + public void setIsStandard(char isStandard) { + this.isStandard = isStandard; + } + + public String getXacmlId() { + return this.xacmlId; + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public Set<Attribute> getAttributes() { + return this.attributes; + } + + public void setAttributes(Set<Attribute> attributes) { + this.attributes = attributes; + } + + public Attribute addAttribute(Attribute attribute) { + getAttributes().add(attribute); + attribute.setDatatypeBean(this); + + return attribute; + } + + public Attribute removeAttribute(Attribute attribute) { + getAttributes().remove(attribute); + attribute.setDatatypeBean(null); + + return attribute; + } + + public Set<FunctionDefinition> getFunctions() { + return this.functions; + } + + public void setFunctions(Set<FunctionDefinition> functions) { + this.functions = functions; + } + + public FunctionDefinition addFunction(FunctionDefinition function) { + getFunctions().add(function); + function.setDatatypeBean(this); + + return function; + } + + public FunctionDefinition removeAttribute(FunctionDefinition function) { + getFunctions().remove(function); + function.setDatatypeBean(null); + + return function; + } + + public Set<FunctionArgument> getArguments() { + return this.arguments; + } + + public void setArguments(Set<FunctionArgument> argument) { + this.arguments = argument; + } + + public FunctionArgument addArgument(FunctionArgument argument) { + getArguments().add(argument); + argument.setDatatypeBean(this); + + return argument; + } + + public FunctionArgument removeArgument(FunctionArgument argument) { + getArguments().remove(argument); + argument.setDatatypeBean(null); + + return argument; + } + + @Transient + public Identifier getIdentifer() { + return new IdentifierImpl(this.xacmlId); + } + + @Transient + public boolean isStandard() { + return this.isStandard == Datatype.STANDARD; + } + + @Transient + public boolean isCustom() { + return this.isStandard == Datatype.CUSTOM; + } + + @Transient + @Override + public String toString() { + return "Datatype [id=" + id + ", isStandard=" + isStandard + + ", xacmlId=" + xacmlId + ", shortName=" + shortName + + ", attributes=" + attributes + ", functions=" + functions + + ", arguments=" + arguments + "]"; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java new file mode 100644 index 0000000..109e26d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java
@@ -0,0 +1,122 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.*; + + +/** + * The persistent class for the FunctionArguments database table. + * + */ +@Entity +@Table(name="FunctionArguments") +@NamedQuery(name="FunctionArgument.findAll", query="SELECT f FROM FunctionArgument f") +public class FunctionArgument implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="is_bag", nullable=false) + private int isBag; + + //bi-directional many-to-one association to FunctionDefinition + @ManyToOne + @JoinColumn(name="function_id") + private FunctionDefinition functionDefinition; + + @Column(name="arg_index", nullable=false) + private int argIndex; + + //bi-directional many-to-one association to Datatype + @ManyToOne + @JoinColumn(name="datatype_id") + private Datatype datatypeBean; + + public FunctionArgument() { + } + + public FunctionArgument(final FunctionArgument argument) { + this.argIndex = argument.argIndex; + this.datatypeBean = argument.datatypeBean; + this.isBag = argument.isBag; + this.functionDefinition = argument.functionDefinition; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public int getArgIndex() { + return this.argIndex; + } + + public void setArgIndex(int argIndex) { + this.argIndex = argIndex; + } + + public Datatype getDatatypeBean() { + return this.datatypeBean; + } + + public void setDatatypeBean(Datatype datatypeBean) { + this.datatypeBean = datatypeBean; + } + + public FunctionDefinition getFunctionDefinition() { + return this.functionDefinition; + } + + public int getIsBag() { + return isBag; + } + + public void setIsBag(int isBag) { + this.isBag = isBag; + } + + public void setFunctionDefinition(FunctionDefinition functionDefinition) { + this.functionDefinition = functionDefinition; + } + + @Transient + @Override + public String toString() { + return "FunctionArgument [id=" + id + ", argIndex=" + argIndex + + ", datatypeBean=" + datatypeBean + ", isBag=" + isBag + + ", functionDefinition=" + functionDefinition + "]"; + } + + @Transient + public boolean isBag() { + return this.isBag == 1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java new file mode 100644 index 0000000..fc0cc91 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java
@@ -0,0 +1,217 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.*; + +import java.util.List; + + +/** + * The persistent class for the FunctionDefinition database table. + * + */ +@Entity +@Table(name="FunctionDefinition") +@NamedQuery(name="FunctionDefinition.findAll", query="SELECT f FROM FunctionDefinition f") +public class FunctionDefinition implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="short_name", nullable=false, length=64) + private String shortname; + + @Column(name="xacml_id", nullable=false, length=255) + private String xacmlid; + + //bi-directional many-to-one association to Datatype + @ManyToOne + @JoinColumn(name="return_datatype", nullable=true) + private Datatype datatypeBean; + + @Column(name="is_bag_return", nullable=false) + private int isBagReturn; + + @Column(name="is_higher_order", nullable=false) + private int isHigherOrder; + + @Column(name="arg_lb", nullable=false) + private int argLb; + + @Column(name="arg_ub", nullable=false) + private int argUb; + + @Column(name="ho_arg_lb", nullable=true) + private int higherOrderArg_LB; + + @Column(name="ho_arg_ub", nullable=true) + private int higherOrderArg_UB; + + @Column(name="ho_primitive", nullable=true) + private char higherOrderIsPrimitive; + + //bi-directional many-to-one association to FunctionArgument + @OneToMany(mappedBy="functionDefinition") + private List<FunctionArgument> functionArguments; + + public FunctionDefinition() { + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public int getArgLb() { + return this.argLb; + } + + public void setArgLb(int argLb) { + this.argLb = argLb; + } + + public int getArgUb() { + return this.argUb; + } + + public void setArgUb(int argUb) { + this.argUb = argUb; + } + + public int getIsBagReturn() { + return isBagReturn; + } + + public void setIsBagReturn(int isBagReturn) { + this.isBagReturn = isBagReturn; + } + + public int getIsHigherOrder() { + return isHigherOrder; + } + + public void setIsHigherOrder(int isHigherOrder) { + this.isHigherOrder = isHigherOrder; + } + + public Datatype getDatatypeBean() { + return this.datatypeBean; + } + + public void setDatatypeBean(Datatype datatypeBean) { + this.datatypeBean = datatypeBean; + } + + public String getShortname() { + return this.shortname; + } + + public void setShortname(String shortname) { + this.shortname = shortname; + } + + public String getXacmlid() { + return this.xacmlid; + } + + public void setXacmlid(String xacmlid) { + this.xacmlid = xacmlid; + } + + public int getHigherOrderArg_LB() { + return higherOrderArg_LB; + } + + public void setHigherOrderArg_LB(int higherOrderArg_LB) { + this.higherOrderArg_LB = higherOrderArg_LB; + } + + public int getHigherOrderArg_UB() { + return higherOrderArg_UB; + } + + public void setHigherOrderArg_UB(int higherOrderArg_UB) { + this.higherOrderArg_UB = higherOrderArg_UB; + } + + public char getHigherOrderIsPrimitive() { + return higherOrderIsPrimitive; + } + + public void setHigherOrderIsPrimitive(char higherOrderIsPrimitive) { + this.higherOrderIsPrimitive = higherOrderIsPrimitive; + } + + public List<FunctionArgument> getFunctionArguments() { + return this.functionArguments; + } + + public void setFunctionArguments(List<FunctionArgument> functionArguments) { + this.functionArguments = functionArguments; + } + + public FunctionArgument addFunctionArgument(FunctionArgument functionArgument) { + getFunctionArguments().add(functionArgument); + functionArgument.setFunctionDefinition(this); + + return functionArgument; + } + + public FunctionArgument removeFunctionArgument(FunctionArgument functionArgument) { + getFunctionArguments().remove(functionArgument); + functionArgument.setFunctionDefinition(null); + + return functionArgument; + } + + @Transient + @Override + public String toString() { + return "FunctionDefinition [id=" + id + ", argLb=" + argLb + ", argUb=" + + argUb + ", isBagReturn=" + isBagReturn + ", isHigherOrder=" + + isHigherOrder + ", datatypeBean=" + datatypeBean + + ", shortname=" + shortname + ", xacmlid=" + xacmlid + + ", higherOrderArg_LB=" + higherOrderArg_LB + + ", higherOrderArg_UB=" + higherOrderArg_UB + + ", higherOrderIsPrimitive=" + higherOrderIsPrimitive + + ", functionArguments=" + functionArguments + "]"; + } + + @Transient + public boolean isBagReturn() { + return this.isBagReturn == 1; + } + + @Transient + public boolean isHigherOrder() { + return this.isHigherOrder == 1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java new file mode 100644 index 0000000..cda5802 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java
@@ -0,0 +1,227 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; + +/** + * The persistent class for the Obadvice database table. + * + */ +@Entity +@Table(name="Obadvice") +@NamedQuery(name="Obadvice.findAll", query="SELECT o FROM Obadvice o") +public class Obadvice implements Serializable { + private static final long serialVersionUID = 1L; + + public static final String OBLIGATION = "Obligation"; + public static final String ADVICE = "Advice"; + public static final String EFFECT_PERMIT = "Permit"; + public static final String EFFECT_DENY = "Deny"; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="type", nullable=false) + private String type; + + @Column(name="xacml_id", nullable=false, length=255) + private String xacmlId; + + @Column(name="fulfill_on", nullable=true, length=32) + private String fulfillOn; + + @Column(name="description", nullable=true, length=2048) + private String description; + + //bi-directional one-to-many association to Attribute Assignment + @OneToMany(mappedBy="obadvice", orphanRemoval=true, cascade=CascadeType.REMOVE) + private Set<ObadviceExpression> obadviceExpressions = new HashSet<ObadviceExpression>(2); + + @Column(name="created_by", nullable=false, length=255) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="created_date", nullable=false, updatable=false) + private Date createdDate; //NOPMD + + @Column(name="modified_by", nullable=false, length=255) + private String modifiedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="modified_date", nullable=false) + private Date modifiedDate; //NOPMD + + public Obadvice() { + this.type = Obadvice.OBLIGATION; + this.fulfillOn = Obadvice.EFFECT_PERMIT; + } + + public Obadvice(String domain, String userid) { + this.xacmlId = domain; + this.type = Obadvice.OBLIGATION; + this.fulfillOn = Obadvice.EFFECT_PERMIT; + this.createdBy = userid; + this.modifiedBy = userid; + } + + public Obadvice(Identifier id, String userid) { + this(id.stringValue(), userid); + } + + @PrePersist + public void prePersist() { + Date date = new Date(); + this.createdDate = date; + this.modifiedDate = date; + } + + @PreUpdate + public void preUpdate() { + this.modifiedDate = new Date(); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCreatedBy() { + return this.createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFulfillOn() { + return this.fulfillOn; + } + + public void setFulfillOn(String fulfillOn) { + this.fulfillOn = fulfillOn; + } + + public String getModifiedBy() { + return this.modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + + public String getXacmlId() { + return this.xacmlId; + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public Set<ObadviceExpression> getObadviceExpressions() { + return this.obadviceExpressions; + } + + public void setObadviceExpressions(Set<ObadviceExpression> obadviceExpressions) { + this.obadviceExpressions = obadviceExpressions; + } + + public ObadviceExpression addObadviceExpression(ObadviceExpression obadviceExpression) { + this.obadviceExpressions.add(obadviceExpression); + obadviceExpression.setObadvice(this); + + return obadviceExpression; + } + + public ObadviceExpression removeObadviceExpression(ObadviceExpression obadviceExpression) { + this.obadviceExpressions.remove(obadviceExpression); + obadviceExpression.setObadvice(null); + + return obadviceExpression; + } + + public void removeAllExpressions() { + if (this.obadviceExpressions == null) { + return; + } + for (ObadviceExpression expression : this.obadviceExpressions) { + expression.setObadvice(null); + } + this.obadviceExpressions.clear(); + } + + @Transient + public Obadvice clone() { + Obadvice obadvice = new Obadvice(); + + obadvice.type = this.type; + obadvice.xacmlId = this.xacmlId; + obadvice.fulfillOn = this.fulfillOn; + obadvice.description = this.description; + obadvice.createdBy = this.createdBy; + obadvice.modifiedBy = this.modifiedBy; + for (ObadviceExpression exp: this.obadviceExpressions) { + obadvice.addObadviceExpression(exp.clone()); + } + + return obadvice; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java new file mode 100644 index 0000000..2a79639 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java
@@ -0,0 +1,124 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +// import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToOne; +import javax.persistence.Table; + + +/** + * The persistent class for the ObadviceExpressions database table. + * + */ +@Entity +@Table(name="ObadviceExpressions") +@NamedQuery(name="ObadviceExpression.findAll", query="SELECT o FROM ObadviceExpression o") +public class ObadviceExpression implements Serializable { + private static final long serialVersionUID = 1L; + + public static final String EXPRESSION_APPLY = "Apply"; + public static final String EXPRESSION_SELECTOR = "Attribute Selector"; + public static final String EXPRESSION_VALUE = "Attribute Value"; + public static final String EXPRESSION_FUNCTION = "Function"; + public static final String EXPRESSION_REFERENCE = "Varable Reference"; + public static final String EXPRESSION_DESIGNATOR = "Attribute Designator"; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + //unidirectional one-to-one association to Attribute + @OneToOne + @JoinColumn(name="attribute_id") + private Attribute attribute; + + @Column(name="type", nullable=false) + private String type; + + /* + @Lob + @Column(name="expression", nullable=false) + private byte[] expression; + */ + + //bi-directional many-to-one association to Obadvice + @ManyToOne + @JoinColumn(name="obadvice_id") + private Obadvice obadvice; + + public ObadviceExpression() { + type = EXPRESSION_VALUE; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public Attribute getAttribute() { + return this.attribute; + } + + public void setAttribute(Attribute attribute) { + this.attribute = attribute; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + + public Obadvice getObadvice() { + return this.obadvice; + } + + public void setObadvice(Obadvice obadvice) { + this.obadvice = obadvice; + } + + public ObadviceExpression clone() { + ObadviceExpression expression = new ObadviceExpression(); + + expression.attribute = this.attribute; + expression.type = this.type; + expression.obadvice = this.obadvice; + + return expression; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java new file mode 100644 index 0000000..a4c4a16 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java
@@ -0,0 +1,147 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.*; + + +/** + * The persistent class for the PIPConfigParams database table. + * + */ +@Entity +@Table(name="PIPConfigParams") +@NamedQuery(name="PIPConfigParam.findAll", query="SELECT p FROM PIPConfigParam p") +public class PIPConfigParam implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="PARAM_NAME", nullable=false, length=1024) + private String paramName; + + @Column(name="PARAM_VALUE", nullable=false, length=2048) + private String paramValue; + + @Column(name="PARAM_DEFAULT", nullable=true, length=2048) + private String paramDefault = null; + + @Column(name="REQUIRED", nullable=false) + private char required = '0'; + + //bi-directional many-to-one association to PIPConfiguration + @ManyToOne + @JoinColumn(name="PIP_ID") + private PIPConfiguration pipconfiguration; + + public PIPConfigParam() { + } + + public PIPConfigParam(String param) { + this.paramName = param; + } + + public PIPConfigParam(String param, String value) { + this(param); + this.paramValue = value; + } + + public PIPConfigParam(PIPConfigParam param) { + this(param.getParamName(), param.getParamValue()); + this.paramDefault = param.getParamDefault(); + this.required = param.required; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getParamName() { + return this.paramName; + } + + public void setParamName(String paramName) { + this.paramName = paramName; + } + + public String getParamValue() { + return this.paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getParamDefault() { + return paramDefault; + } + + public void setParamDefault(String paramDefault) { + this.paramDefault = paramDefault; + } + + public char getRequired() { + return required; + } + + public void setRequired(char required) { + this.required = required; + } + + public PIPConfiguration getPipconfiguration() { + return this.pipconfiguration; + } + + public void setPipconfiguration(PIPConfiguration pipconfiguration) { + this.pipconfiguration = pipconfiguration; + } + + @Transient + public boolean isRequired() { + return this.required == '1'; + } + + @Transient + public void setRequired(boolean required) { + if (required) { + this.setRequired('1'); + } else { + this.setRequired('0'); + } + } + + @Transient + @Override + public String toString() { + return "PIPConfigParam [id=" + id + ", paramName=" + paramName + + ", paramValue=" + paramValue + ", required=" + required + "]"; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java new file mode 100644 index 0000000..d540e2b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java
@@ -0,0 +1,554 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.api.pip.PIPException; +import org.apache.openaz.xacml.std.pip.engines.StdConfigurableEngine; +import org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine; +import org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine; +import org.apache.openaz.xacml.std.pip.engines.jdbc.JDBCEngine; +import org.apache.openaz.xacml.std.pip.engines.ldap.LDAPEngine; +import org.apache.openaz.xacml.util.XACMLProperties; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.vaadin.ui.UI; + + +/** + * The persistent class for the PIPConfiguration database table. + * + */ +@Entity +@Table(name="PIPConfiguration") +@NamedQuery(name="PIPConfiguration.findAll", query="SELECT p FROM PIPConfiguration p") +public class PIPConfiguration implements Serializable { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPConfiguration.class); + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="DESCRIPTION", nullable=true, length=2048) + private String description; + + @Column(name="NAME", nullable=false, length=255) + private String name; + + @Column(name="CLASSNAME", nullable=false, length=2048) + private String classname; + + @Column(name="ISSUER", nullable=true, length=1024) + private String issuer; + + @Column(name="READ_ONLY", nullable=false) + private char readOnly = '0'; + + @Column(name="REQUIRES_RESOLVER", nullable=false) + private char requiresResolvers; + + @Column(name="CREATED_BY", nullable=false, length=255) + private String createdBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="CREATED_DATE", nullable=false, updatable=false) + private Date createdDate; + + @Column(name="MODIFIED_BY", nullable=false, length=255) + private String modifiedBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="MODIFIED_DATE", nullable=false) + private Date modifiedDate; + + //bi-directional many-to-one association to PIPConfigParam + @OneToMany(mappedBy="pipconfiguration", orphanRemoval=true, cascade=CascadeType.REMOVE) + private Set<PIPConfigParam> pipconfigParams = new HashSet<PIPConfigParam>(); + + //bi-directional many-to-one association to PIPType + @ManyToOne + @JoinColumn(name="TYPE") + private PIPType piptype; + + //bi-directional many-to-one association to PIPResolver + @OneToMany(mappedBy="pipconfiguration", orphanRemoval=true, cascade=CascadeType.REMOVE) + private Set<PIPResolver> pipresolvers = new HashSet<PIPResolver>(); + + public PIPConfiguration() { + } + + public PIPConfiguration(PIPConfiguration config, String user) { //NOPMD + this.description = config.description; + this.name = config.name; + this.classname = config.classname; + this.issuer = config.issuer; + this.requiresResolvers = config.requiresResolvers; + this.readOnly = config.readOnly; + this.piptype = config.piptype; + for (PIPConfigParam param : config.pipconfigParams) { + this.addPipconfigParam(new PIPConfigParam(param)); + } + for (PIPResolver resolver : config.pipresolvers) { + this.addPipresolver(new PIPResolver(resolver)); + } + } + + public PIPConfiguration(String id, Properties properties) throws PIPException { + this.readProperties(id, properties); + } + + public PIPConfiguration(String id, Properties properties, String user) throws PIPException { + this.createdBy = user; + this.modifiedBy = user; + this.readProperties(id, properties); + } + + @PrePersist + public void prePersist() { + Date date = new Date(); + this.createdDate = date; + this.modifiedDate = date; + } + + @PreUpdate + public void preUpdate() { + this.modifiedDate = new Date(); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public String getIssuer() { + return issuer; + } + + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + public char getReadOnly() { + return readOnly; + } + + public void setReadOnly(char readOnly) { + this.readOnly = readOnly; + } + + public char getRequiresResolvers() { + return requiresResolvers; + } + + public void setRequiresResolvers(char requireResolvers) { + this.requiresResolvers = requireResolvers; + } + + public Set<PIPConfigParam> getPipconfigParams() { + return this.pipconfigParams; + } + + public void setPipconfigParams(Set<PIPConfigParam> pipconfigParams) { + this.pipconfigParams = pipconfigParams; + } + + public PIPConfigParam addPipconfigParam(PIPConfigParam pipconfigParam) { + getPipconfigParams().add(pipconfigParam); + pipconfigParam.setPipconfiguration(this); + + return pipconfigParam; + } + + public PIPConfigParam removePipconfigParam(PIPConfigParam pipconfigParam) { + if (pipconfigParam == null) { + return pipconfigParam; + } + getPipconfigParams().remove(pipconfigParam); + pipconfigParam.setPipconfiguration(null); + + return pipconfigParam; + } + + @Transient + public void clearConfigParams() { + while (this.pipconfigParams.isEmpty() == false) { + this.removePipconfigParam(this.pipconfigParams.iterator().next()); + } + } + + public PIPType getPiptype() { + return this.piptype; + } + + public void setPiptype(PIPType piptype) { + this.piptype = piptype; + } + + public Set<PIPResolver> getPipresolvers() { + return this.pipresolvers; + } + + public void setPipresolvers(Set<PIPResolver> pipresolvers) { + this.pipresolvers = pipresolvers; + } + + public PIPResolver addPipresolver(PIPResolver pipresolver) { + getPipresolvers().add(pipresolver); + pipresolver.setPipconfiguration(this); + + return pipresolver; + } + + public PIPResolver removePipresolver(PIPResolver pipresolver) { + getPipresolvers().remove(pipresolver); + pipresolver.setPipconfiguration(null); + + return pipresolver; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getModifiedBy() { + return modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public Date getModifiedDate() { + return modifiedDate; + } + + public void setModifiedDate(Date modifiedDate) { + this.modifiedDate = modifiedDate; + } + + @Transient + public boolean isReadOnly() { + return this.readOnly == '1'; + } + + @Transient + public void setReadOnly(boolean readOnly) { + if (readOnly) { + this.readOnly = '1'; + } else { + this.readOnly = '0'; + } + } + + @Transient + public boolean requiresResolvers() { + return this.requiresResolvers == '1'; + } + + @Transient + public void setRequiresResolvers(boolean requires) { + if (requires) { + this.requiresResolvers = '1'; + } else { + this.requiresResolvers = '0'; + } + } + + @Transient + public static Collection<PIPConfiguration> importPIPConfigurations(Properties properties) { + Collection<PIPConfiguration> configurations = new ArrayList<PIPConfiguration>(); + String engines = properties.getProperty(XACMLProperties.PROP_PIP_ENGINES); + if (engines == null || engines.isEmpty()) { + return configurations; + } + for (String id : Splitter.on(',').trimResults().omitEmptyStrings().split(engines)) { + PIPConfiguration configuration; + try { + String user = ((XacmlAdminUI)UI.getCurrent()).getUserid(); + configuration = new PIPConfiguration(id, properties, user); + configuration.setCreatedBy(user); + configuration.setModifiedBy(user); + configurations.add(configuration); + } catch (PIPException e) { + logger.error("Import failed: " + e.getLocalizedMessage()); + } + } + + return configurations; + } + + @Transient + protected void readProperties(String id, Properties properties) throws PIPException { + // + // Save the id if we don't have one already + // + if (this.id == 0) { + try { + this.id = Integer.parseInt(id); + } catch (NumberFormatException e) { + logger.error("Convert id to integer failed: " + id); + } + } + // + // Get its classname, this MUST exist. + // + this.classname = properties.getProperty(id + ".classname"); + if (this.classname == null) { + throw new PIPException("PIP Engine defined without a classname"); + } + // + // These classes we know for sure require resolvers. + // + if (this.classname.equals(JDBCEngine.class.getCanonicalName())) { + this.setRequiresResolvers(true); + this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_SQL)); + } else if (this.classname.equals(LDAPEngine.class.getCanonicalName())) { + this.setRequiresResolvers(true); + this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_LDAP)); + } else if (this.classname.equals(HyperCSVEngine.class.getCanonicalName())) { + this.setRequiresResolvers(true); + this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_HYPERCSV)); + } else if (this.classname.equals(CSVEngine.class.getCanonicalName())) { + this.setRequiresResolvers(true); + this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_CSV)); + } else { + // + // Assume it does not require resolvers for now, if we encounter + // one then we will change it. The user can always change it via the gui. + // + this.setRequiresResolvers(false); + this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_CUSTOM)); + } + // + // Go through each property + // + for (Object name : properties.keySet()) { + if (name.toString().startsWith(id) == false || name.equals(id + ".classname")) { + continue; + } + if (name.equals(id + "." + StdConfigurableEngine.PROP_NAME)) { + this.name = properties.getProperty(name.toString()); + } else if (name.equals(id + "." + StdConfigurableEngine.PROP_DESCRIPTION)) { + this.description = properties.getProperty(name.toString()); + } else if (name.equals(id + "." + StdConfigurableEngine.PROP_ISSUER)) { + this.issuer = properties.getProperty(name.toString()); + } else if (name.equals(id + ".resolvers")) { + // + // It has resolvers, make sure this is set to true if + // it has been already. + // + this.setRequiresResolvers(true); + // + // Parse the resolvers + // + Collection<PIPResolver> resolvers = PIPResolver.importResolvers(id + ".resolver", + properties.getProperty(name.toString()), + properties, + ((XacmlAdminUI)UI.getCurrent()).getUserid()); + for (PIPResolver resolver : resolvers) { + this.addPipresolver(resolver); + } + // Ignore {id}.resolver: the PIPResolver will parse these values + } else if (! name.toString().startsWith(id + ".resolver")) { + // + // Config Parameter + // + this.addPipconfigParam(new PIPConfigParam(name.toString().substring(id.length() + 1), + properties.getProperty(name.toString()))); + } + } + // + // Make sure we have a name at least + // + if (this.name == null) { + this.name = id; + } + } + + + @Transient + public Map<String, String> getConfiguration(String name) { + String prefix; + if (name == null) { + prefix = Integer.toString(this.id); + } else { + prefix = name; + } + if (prefix.endsWith(".") == false) { + prefix = prefix + "."; + } + Map<String, String> map = new HashMap<String, String>(); + map.put(prefix + "classname", this.classname); + map.put(prefix + "name", this.name); + if (this.description != null) { + map.put(prefix + "description", this.description); + } + if (this.issuer != null) { + map.put(prefix + "issuer", this.issuer); + } + + for (PIPConfigParam param : this.pipconfigParams) { + map.put(prefix + param.getParamName(), param.getParamValue()); + } + + List<String> ids = new ArrayList<String>(); + Iterator<PIPResolver> iter = this.pipresolvers.iterator(); + while (iter.hasNext()) { + PIPResolver resolver = iter.next(); + String id = Integer.toString(resolver.getId()); + Map<String, String> resolverMap = resolver.getConfiguration(prefix + "resolver." + id); + map.putAll(resolverMap); + ids.add(id); + } + if (ids.size() > 0) { + map.put(prefix + "resolvers", Joiner.on(',').join(ids)); + } + return map; + } + + @Transient + public Properties generateProperties(String name) { + String prefix; + if (name == null) { + prefix = Integer.toString(this.id); + } else { + if (name.endsWith(".")) { + prefix = name; + } else { + prefix = name + "."; + } + } + Properties props = new Properties(); + props.setProperty("xacml.pip.engines", name); + props.setProperty(prefix + "classname", this.classname); + props.setProperty(prefix + "name", this.name); + if (this.description != null) { + props.setProperty(prefix + "description", this.description); + } + if (this.issuer != null && this.issuer.isEmpty() == false) { + props.setProperty(prefix + "issuer", this.issuer); + } + + for (PIPConfigParam param : this.pipconfigParams) { + props.setProperty(prefix + param.getParamName(), param.getParamValue()); + } + + List<String> ids = new ArrayList<String>(); + Iterator<PIPResolver> iter = this.pipresolvers.iterator(); + while (iter.hasNext()) { + PIPResolver resolver = iter.next(); + String id = Integer.toString(resolver.getId()); + resolver.generateProperties(props, prefix + "resolver." + id); + ids.add(id); + } + if (ids.size() > 0) { + props.setProperty(prefix + "resolvers", Joiner.on(',').join(ids)); + } + return props; + } + + @Transient + @Override + public String toString() { + return "PIPConfiguration [id=" + id + ", piptype=" + piptype + + ", classname=" + classname + ", name=" + name + + ", description=" + description + ", issuer=" + issuer + + ", readOnly=" + readOnly + ", requiresResolvers=" + + requiresResolvers + ", createdBy=" + createdBy + + ", createdDate=" + createdDate + ", modifiedBy=" + modifiedBy + + ", modifiedDate=" + modifiedDate + ", pipconfigParams=" + + pipconfigParams + ", pipresolvers=" + pipresolvers + "]"; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java new file mode 100644 index 0000000..59c9307 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java
@@ -0,0 +1,362 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.pip.PIPException; +import org.apache.openaz.xacml.std.pip.engines.StdConfigurableEngine; +import com.google.common.base.Splitter; + + +/** + * The persistent class for the PIPResolver database table. + * + */ +@Entity +@Table(name="PIPResolver") +@NamedQuery(name="PIPResolver.findAll", query="SELECT p FROM PIPResolver p") +public class PIPResolver implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="DESCRIPTION", nullable=true, length=2048) + private String description; + + @Column(name="NAME", nullable=false, length=255) + private String name; + + @Column(name="ISSUER", nullable=true, length=1024) + private String issuer; + + @Column(name="CLASSNAME", nullable=false, length=2048) + private String classname; + + @Column(name="READ_ONLY", nullable=false) + private char readOnly = '0'; + + @Column(name="CREATED_BY", nullable=false, length=255) + private String createdBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="CREATED_DATE", nullable=false, updatable=false) + private Date createdDate; + + @Column(name="MODIFIED_BY", nullable=false, length=255) + private String modifiedBy = "guest"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="MODIFIED_DATE", nullable=false) + private Date modifiedDate; + + //bi-directional many-to-one association to PIPConfiguration + @ManyToOne + @JoinColumn(name="PIP_ID") + private PIPConfiguration pipconfiguration; + + //bi-directional many-to-one association to PIPResolverParam + @OneToMany(mappedBy="pipresolver", orphanRemoval=true, cascade=CascadeType.REMOVE) + private Set<PIPResolverParam> pipresolverParams = new HashSet<PIPResolverParam>(); + + public PIPResolver() { + } + + public PIPResolver(String prefix, Properties properties, String user) throws PIPException { + this.createdBy = user; + this.modifiedBy = user; + this.readOnly = '0'; + this.readProperties(prefix, properties); + } + + public PIPResolver(PIPResolver resolver) { + this.name = resolver.name; + this.description = resolver.description; + this.issuer = resolver.issuer; + this.classname = resolver.classname; + this.readOnly = resolver.readOnly; + for (PIPResolverParam param : this.pipresolverParams) { + this.addPipresolverParam(new PIPResolverParam(param)); + } + } + + @PrePersist + public void prePersist() { + Date date = new Date(); + this.createdDate = date; + this.modifiedDate = date; + } + + @PreUpdate + public void preUpdate() { + this.modifiedDate = new Date(); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIssuer() { + return issuer; + } + + public void setIssuer(String issuer) { + this.issuer = issuer; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public char getReadOnly() { + return readOnly; + } + + public void setReadOnly(char readOnly) { + this.readOnly = readOnly; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public String getModifiedBy() { + return modifiedBy; + } + + public void setModifiedBy(String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public Date getModifiedDate() { + return modifiedDate; + } + + public void setModifiedDate(Date modifiedDate) { + this.modifiedDate = modifiedDate; + } + + public PIPConfiguration getPipconfiguration() { + return this.pipconfiguration; + } + + public void setPipconfiguration(PIPConfiguration pipconfiguration) { + this.pipconfiguration = pipconfiguration; + } + + public Set<PIPResolverParam> getPipresolverParams() { + return this.pipresolverParams; + } + + public void setPipresolverParams(Set<PIPResolverParam> pipresolverParams) { + this.pipresolverParams = pipresolverParams; + } + + public PIPResolverParam addPipresolverParam(PIPResolverParam pipresolverParam) { + getPipresolverParams().add(pipresolverParam); + pipresolverParam.setPipresolver(this); + + return pipresolverParam; + } + + public PIPResolverParam removePipresolverParam(PIPResolverParam pipresolverParam) { + if (pipresolverParam == null) { + return pipresolverParam; + } + getPipresolverParams().remove(pipresolverParam); + pipresolverParam.setPipresolver(null); + + return pipresolverParam; + } + + @Transient + public void clearParams() { + while (this.pipresolverParams.isEmpty() == false) { + this.removePipresolverParam(this.pipresolverParams.iterator().next()); + } + } + + @Transient + public boolean isReadOnly() { + return this.readOnly == '1'; + } + + @Transient + public void setReadOnly(boolean readOnly) { + if (readOnly) { + this.readOnly = '1'; + } else { + this.readOnly = '0'; + } + } + + @Transient + public static Collection<PIPResolver> importResolvers(String prefix, String list, Properties properties, String user) throws PIPException { + Collection<PIPResolver> resolvers = new ArrayList<PIPResolver>(); + for (String id : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) { + resolvers.add(new PIPResolver(prefix + "." + id, properties, user)); + } + return resolvers; + } + + @Transient + protected void readProperties(String prefix, Properties properties) throws PIPException { + // + // Get its classname, this MUST exist. + // + this.classname = properties.getProperty(prefix + ".classname"); + if (this.classname == null) { + throw new PIPException("PIP Engine defined without a classname"); + } + // + // Go through each property + // + for (Object name : properties.keySet()) { + if (name.toString().startsWith(prefix) == false || name.equals(prefix + ".classname")) { + continue; + } + + if (name.equals(prefix + "." + StdConfigurableEngine.PROP_NAME)) { + this.name = properties.getProperty(name.toString()); + } else if (name.equals(prefix + "." + StdConfigurableEngine.PROP_DESCRIPTION)) { + this.description = properties.getProperty(name.toString()); + } else if (name.equals(prefix + "." + StdConfigurableEngine.PROP_ISSUER)) { + this.issuer = properties.getProperty(name.toString()); + } else { + this.addPipresolverParam(new PIPResolverParam(name.toString().substring(prefix.length() + 1), + properties.getProperty(name.toString()))); + } + } + } + + @Transient + public Map<String, String> getConfiguration(String prefix) { + Map<String, String> map = new HashMap<String, String>(); + if (prefix.endsWith(".") == false) { + prefix = prefix + "."; + } + map.put(prefix + "classname", this.classname); + map.put(prefix + "name", this.name); + if (this.description != null) { + map.put(prefix + "description", this.description); + } + if (this.issuer != null && this.issuer.isEmpty() != false) { + map.put(prefix + "issuer", this.issuer); + } + for (PIPResolverParam param : this.pipresolverParams) { + map.put(prefix + param.getParamName(), param.getParamValue()); + } + return map; + } + + @Transient + public void generateProperties(Properties props, String prefix) { + if (prefix.endsWith(".") == false) { + prefix = prefix + "."; + } + props.setProperty(prefix + "classname", this.classname); + props.setProperty(prefix + "name", this.name); + if (this.description != null) { + props.setProperty(prefix + "description", this.description); + } + if (this.issuer != null && this.issuer.isEmpty() != false) { + props.setProperty(prefix + "issuer", this.issuer); + } + for (PIPResolverParam param : this.pipresolverParams) { + props.setProperty(prefix + param.getParamName(), param.getParamValue()); + } + } + + @Transient + @Override + public String toString() { + return "PIPResolver [id=" + id + ", classname=" + classname + ", name=" + + name + ", description=" + description + ", issuer=" + issuer + + ", readOnly=" + readOnly + ", createdBy=" + createdBy + + ", createdDate=" + createdDate + ", modifiedBy=" + modifiedBy + + ", modifiedDate=" + modifiedDate + ", pipresolverParams=" + + pipresolverParams + "]"; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java new file mode 100644 index 0000000..917ce5b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java
@@ -0,0 +1,147 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.*; + + +/** + * The persistent class for the PIPResolverParams database table. + * + */ +@Entity +@Table(name="PIPResolverParams") +@NamedQuery(name="PIPResolverParam.findAll", query="SELECT p FROM PIPResolverParam p") +public class PIPResolverParam implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="PARAM_NAME", nullable=false, length=1024) + private String paramName; + + @Column(name="PARAM_VALUE", nullable=false, length=2048) + private String paramValue; + + @Column(name="PARAM_DEFAULT", nullable=true, length=2048) + private String paramDefault; + + @Column(name="REQUIRED", nullable=false) + private char required = '0'; + + //bi-directional many-to-one association to PIPResolver + @ManyToOne + @JoinColumn(name="ID_RESOLVER") + private PIPResolver pipresolver; + + public PIPResolverParam() { + } + + public PIPResolverParam(String name) { + this.paramName = name; + } + + public PIPResolverParam(String name, String value) { + this(name); + this.paramValue = value; + } + + public PIPResolverParam(PIPResolverParam param) { + this(param.getParamName(), param.getParamValue()); + this.paramDefault = param.getParamDefault(); + this.required = param.required; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getParamName() { + return this.paramName; + } + + public void setParamName(String paramName) { + this.paramName = paramName; + } + + public String getParamValue() { + return this.paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + public String getParamDefault() { + return paramDefault; + } + + public void setParamDefault(String paramDefault) { + this.paramDefault = paramDefault; + } + + public char getRequired() { + return required; + } + + public void setRequired(char required) { + this.required = required; + } + + public PIPResolver getPipresolver() { + return this.pipresolver; + } + + public void setPipresolver(PIPResolver pipresolver) { + this.pipresolver = pipresolver; + } + + @Transient + public boolean isRequired() { + return this.required == '1'; + } + + @Transient + public void setRequired(boolean required) { + if (required) { + this.required = '1'; + } else { + this.required = '0'; + } + } + + @Transient + @Override + public String toString() { + return "PIPResolverParam [id=" + id + ", paramName=" + paramName + + ", paramValue=" + paramValue + ", required=" + required + "]"; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java new file mode 100644 index 0000000..7208b76 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java
@@ -0,0 +1,131 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Transient; + + +/** + * The persistent class for the PIPType database table. + * + */ +@Entity +@Table(name="PIPType") +@NamedQuery(name="PIPType.findAll", query="SELECT p FROM PIPType p") +public class PIPType implements Serializable { + private static final long serialVersionUID = 1L; + + public static final String TYPE_SQL = "SQL"; + public static final String TYPE_LDAP = "LDAP"; + public static final String TYPE_CSV = "CSV"; + public static final String TYPE_HYPERCSV = "Hyper-CSV"; + public static final String TYPE_CUSTOM = "Custom"; + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="type", nullable=false, length=45) + private String type; + + //bi-directional many-to-one association to PIPConfiguration + @OneToMany(mappedBy="piptype") + private Set<PIPConfiguration> pipconfigurations; + + public PIPType() { + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + + public Set<PIPConfiguration> getPipconfigurations() { + return this.pipconfigurations; + } + + public void setPipconfigurations(Set<PIPConfiguration> pipconfigurations) { + this.pipconfigurations = pipconfigurations; + } + + public PIPConfiguration addPipconfiguration(PIPConfiguration pipconfiguration) { + getPipconfigurations().add(pipconfiguration); + pipconfiguration.setPiptype(this); + + return pipconfiguration; + } + + public PIPConfiguration removePipconfiguration(PIPConfiguration pipconfiguration) { + getPipconfigurations().remove(pipconfiguration); + pipconfiguration.setPiptype(null); + + return pipconfiguration; + } + + @Transient + public boolean isSQL() { + return this.type.equals(TYPE_SQL); + } + + @Transient + public boolean isLDAP() { + return this.type.equals(TYPE_LDAP); + } + + @Transient + public boolean isCSV() { + return this.type.equals(TYPE_CSV); + } + + @Transient + public boolean isHyperCSV() { + return this.type.equals(TYPE_HYPERCSV); + } + + @Transient + public boolean isCustom() { + return this.type.equals(TYPE_CUSTOM); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java new file mode 100644 index 0000000..d91e221 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java
@@ -0,0 +1,116 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; + +@Entity +@Table(name="PolicyAlgorithms") +@NamedQuery(name="PolicyAlgorithms.findAll", query="SELECT d FROM PolicyAlgorithms d") +public class PolicyAlgorithms implements Serializable { + private static final long serialVersionUID = 1L; + + public static final char STANDARD = 'S'; + public static final char CUSTOM = 'C'; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="is_standard", nullable=false) + private char isStandard; + + @Column(name="xacml_id", nullable=false, unique=true, length=255) + private String xacmlId; + + @Column(name="short_name", nullable=false, length=64) + private String shortName; + + public PolicyAlgorithms(Identifier identifier, char standard) { + this.isStandard = standard; + if (identifier != null) { + this.xacmlId = identifier.stringValue(); + } + } + + public PolicyAlgorithms(Identifier identifier) { + this(identifier, PolicyAlgorithms.STANDARD); + } + + public PolicyAlgorithms() { + this(null, PolicyAlgorithms.STANDARD); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public char getIsStandard() { + return this.isStandard; + } + + public void setIsStandard(char isStandard) { + this.isStandard = isStandard; + } + + @Transient + public boolean isStandard() { + return this.isStandard == PolicyAlgorithms.STANDARD; + } + + @Transient + public boolean isCustom() { + return this.isStandard == PolicyAlgorithms.CUSTOM; + } + + public String getXacmlId() { + return this.xacmlId; + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java new file mode 100644 index 0000000..961984e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java
@@ -0,0 +1,115 @@ +/* + * 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 org.apache.openaz.xacml.admin.jpa; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.apache.openaz.xacml.api.Identifier; + +@Entity +@Table(name="RuleAlgorithms") +@NamedQuery(name="RuleAlgorithms.findAll", query="SELECT d FROM RuleAlgorithms d") +public class RuleAlgorithms implements Serializable { + private static final long serialVersionUID = 1L; + + public static final char STANDARD = 'S'; + public static final char CUSTOM = 'C'; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + private int id; + + @Column(name="is_standard", nullable=false) + private char isStandard; + + @Column(name="xacml_id", nullable=false, unique=true, length=255) + private String xacmlId; + + @Column(name="short_name", nullable=false, length=64) + private String shortName; + + public RuleAlgorithms(Identifier id, char standard) { + if (id != null) { + this.xacmlId = id.stringValue(); + } + this.isStandard = standard; + } + public RuleAlgorithms(Identifier id) { + this(id, RuleAlgorithms.STANDARD); + } + + public RuleAlgorithms() { + this(null, RuleAlgorithms.STANDARD); + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public char getIsStandard() { + return this.isStandard; + } + + public void setIsStandard(char isStandard) { + this.isStandard = isStandard; + } + + @Transient + public boolean isStandard() { + return this.isStandard == RuleAlgorithms.STANDARD; + } + + @Transient + public boolean isCustom() { + return this.isStandard == RuleAlgorithms.CUSTOM; + } + + public String getXacmlId() { + return this.xacmlId; + } + + public void setXacmlId(String xacmlId) { + this.xacmlId = xacmlId; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java new file mode 100644 index 0000000..85d06f5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java
@@ -0,0 +1,28 @@ +/* + * 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. + * + */ + +/** + * + */ +/** + * @author pameladragosh + * + */ +package org.apache.openaz.xacml.admin.jpa;
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java new file mode 100644 index 0000000..37d2fd4 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java
@@ -0,0 +1,500 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.api.AttributeValue; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.util.XACMLPolicyAggregator; +import org.apache.openaz.xacml.util.XACMLPolicyScanner; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.ui.Table; + +public class AttributeContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(AttributeContainer.class); + //private final AttributeContainer self = this; + private final Map<Category, Map<Datatype, Map<String, Set<ContainerAttribute>>>> mapAttributes = new HashMap<Category, Map<Datatype, Map<String, Set<ContainerAttribute>>>>(); + + class ContainerAttribute { + Path policy; + boolean isRoot; + AttributeValue<?> value; + + public ContainerAttribute(Path policy, boolean isRoot, AttributeValue<?> value) { + this.policy = policy; + this.isRoot = isRoot; + this.value = value; + } + + public Path getPolicy() { + return policy; + } + + public boolean isRoot() { + return isRoot; + } + + public AttributeValue<?> getValue() { + return value; + } + + public boolean isCustom() { + return this.policy == null; + } + } + /** + * String identifier of an object's "id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of an object's "category" property. + */ + public static String PROPERTY_CATEGORY = "Category"; + + /** + * String identifier of an object's "datatype" property. + */ + public static String PROPERTY_DATATYPE = "Datatype"; + + /** + * String identifier of an object's "value" property. + */ + public static String PROPERTY_VALUES = "Values"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> ATTRIBUTE_PROPERTIES; + + private final static Method ATTRIBUTEITEM_ID; + private final static Method ATTRIBUTEITEM_CATEGORY; + private final static Method ATTRIBUTEITEM_DATATYPE; + private final static Method ATTRIBUTEITEM_VALUES; + static { + ATTRIBUTE_PROPERTIES = new ArrayList<String>(); + ATTRIBUTE_PROPERTIES.add(PROPERTY_ID); + ATTRIBUTE_PROPERTIES.add(PROPERTY_CATEGORY); + ATTRIBUTE_PROPERTIES.add(PROPERTY_DATATYPE); + ATTRIBUTE_PROPERTIES.add(PROPERTY_VALUES); + ATTRIBUTE_PROPERTIES = Collections.unmodifiableCollection(ATTRIBUTE_PROPERTIES); + try { + ATTRIBUTEITEM_ID = AttributeItem.class.getMethod("getId", new Class[]{}); + ATTRIBUTEITEM_CATEGORY = AttributeItem.class.getMethod("getCategory", new Class[]{}); + ATTRIBUTEITEM_DATATYPE = AttributeItem.class.getMethod("getDatatype", new Class[]{}); + ATTRIBUTEITEM_VALUES = AttributeItem.class.getMethod("getValues", new Class[]{}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException("Internal error finding methods in AttributeContainer"); + } + } + + public AttributeContainer(Path rootPolicy, Collection<Path> referencedPolicies) { + super(); + this.setContainer(this); + this.initialize(rootPolicy, referencedPolicies); + } + + protected void initialize(Path rootPolicy, Collection<Path> referencedPolicies) { + XACMLPolicyAggregator aggregator = new XACMLPolicyAggregator(); + // + // Scan the policy + // + new XACMLPolicyScanner(rootPolicy, aggregator).scan(); + this.addAttributes(aggregator, rootPolicy, true); + aggregator = new XACMLPolicyAggregator(); + // + // Scan the referenced policies + // + for (Path policy : referencedPolicies) { + new XACMLPolicyScanner(policy, aggregator).scan(); + this.addAttributes(aggregator, policy, false); + aggregator = new XACMLPolicyAggregator(); + } + } + + protected void addAttributes(XACMLPolicyAggregator aggregator, Path policy, boolean isRoot) { + for (Identifier cat : aggregator.getAttributeMap().keySet()) { + Category category = JPAUtils.findCategory(cat); + if (category == null) { + logger.warn("Could not find category: " + cat); + continue; + } + if (this.mapAttributes.containsKey(category) == false) { + this.mapAttributes.put(category, new HashMap<Datatype, Map<String, Set<ContainerAttribute>>>()); + } + Map<Datatype, Map<String, Set<ContainerAttribute>>> datatypeMap = this.mapAttributes.get(category); + for (Identifier dt : aggregator.getAttributeMap().get(cat).keySet()) { + Datatype datatype = JPAUtils.findDatatype(dt); + if (datatype == null) { + logger.warn("Could not find datatype: " + dt); + } + // + // Need a unique datatype object + // + datatype = new Datatype((int) System.currentTimeMillis(), datatype); + if (datatypeMap.containsKey(datatype) == false) { + datatypeMap.put(datatype, new HashMap<String, Set<ContainerAttribute>>()); + } + Map<String, Set<ContainerAttribute>> attributeMap = datatypeMap.get(datatype); + for (Identifier id : aggregator.getAttributeMap().get(cat).get(dt).keySet()) { + if (attributeMap.containsKey(id.stringValue()) == false) { + attributeMap.put(id.stringValue(), new HashSet<ContainerAttribute>()); + } + for (AttributeValue<?> attribute : aggregator.getAttributeMap().get(cat).get(dt).get(id)) { + attributeMap.get(id.stringValue()).add(new ContainerAttribute(policy, isRoot, attribute)); + } + } + } + } + } + + protected boolean isObjectSupported(Object itemId) { + if (itemId instanceof Category || + itemId instanceof Datatype || + itemId instanceof String || + itemId instanceof ContainerAttribute) { + return true; + } + return false; + } + + @Override + public Item getItem(Object itemId) { + if (this.isObjectSupported(itemId)) { + return new AttributeItem(itemId); + } + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return ATTRIBUTE_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + for (Category category : this.mapAttributes.keySet()) { + items.add(category); + for (Datatype datatype : this.mapAttributes.get(category).keySet()) { + items.add(datatype); + for (String id : this.mapAttributes.get(category).get(datatype).keySet()) { + items.add(id); + for (ContainerAttribute attribute : this.mapAttributes.get(category).get(datatype).get(id)) { + items.add(attribute); + } + } + } + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeItem(itemId), ATTRIBUTEITEM_ID, null); + } + if (propertyId.equals(PROPERTY_CATEGORY)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeItem(itemId), ATTRIBUTEITEM_CATEGORY, null); + } + if (propertyId.equals(PROPERTY_DATATYPE)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeItem(itemId), ATTRIBUTEITEM_DATATYPE, null); + } + if (propertyId.equals(PROPERTY_VALUES)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeItem(itemId), ATTRIBUTEITEM_VALUES, null); + } + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_CATEGORY)) { + return Category.class; + } + if (propertyId.equals(PROPERTY_DATATYPE)) { + return Datatype.class; + } + if (propertyId.equals(PROPERTY_VALUES)) { + return Table.class; + } + return null; + } + + @Override + public int size() { + return this.mapAttributes.size(); + } + + @Override + public boolean containsId(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return false; + } + if (itemId instanceof Category) { + return this.mapAttributes.containsKey(itemId); + } + for (Category category : this.mapAttributes.keySet()) { + if (itemId instanceof Datatype) { + return this.mapAttributes.get(category).containsKey(itemId); + } + for (Datatype datatype : this.mapAttributes.get(category).keySet()) { + if (itemId instanceof String) { + return this.mapAttributes.get(category).get(datatype).containsKey(itemId); + } + for (String id : this.mapAttributes.get(category).get(datatype).keySet()) { + if (itemId instanceof ContainerAttribute) { + return this.mapAttributes.get(category).get(datatype).get(id).contains(itemId); + } + } + } + } + return false; + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Use addItem(Category, Datatype, AttributeValue<?>) instead."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Use addItem(Category, Datatype, AttributeValue<?>) instead."); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't remove all the items. You can remove custom user attributes."); + } + + @Override + public Collection<?> getChildren(Object itemId) { + // + // PLD TODO - this may not work for Datatype + // + final Collection<Object> items = new ArrayList<Object>(); + for (Category category : this.mapAttributes.keySet()) { + for (Datatype datatype : this.mapAttributes.get(category).keySet()) { + if (itemId instanceof Category) { + items.add(datatype); + } + for (String id : this.mapAttributes.get(category).get(datatype).keySet()) { + if (itemId instanceof Category || + itemId instanceof Datatype) { + items.add(id); + items.addAll(this.mapAttributes.get(category).get(datatype).get(id)); + } else if (itemId instanceof String) { + items.addAll(this.mapAttributes.get(category).get(datatype).get(id)); + } + } + } + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Object getParent(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + // TODO Auto-generated method stub + return null; + } + + @Override + public Collection<?> rootItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + items.add(this.mapAttributes.keySet()); + return Collections.unmodifiableCollection(items); + } + + @Override + public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't move attributes around. Use addItem(Category, Datatype, Attribute)."); + } + + @Override + public boolean areChildrenAllowed(Object itemId) { + if (itemId instanceof Category || + itemId instanceof Datatype || + itemId instanceof String) { + return true; + } + return false; + } + + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) + throws UnsupportedOperationException { + if (itemId instanceof Category || + itemId instanceof Datatype || + itemId instanceof String) { + if (areChildrenAllowed) { + return true; + } + return false; + } + if (areChildrenAllowed == false) { + return true; + } + return false; + } + + @Override + public boolean isRoot(Object itemId) { + return this.mapAttributes.containsKey(itemId); + } + + @Override + public boolean hasChildren(Object itemId) { + if (itemId instanceof ContainerAttribute) { + return false; + } + if (itemId instanceof Category) { + if (this.mapAttributes.containsKey(itemId)) { + return this.mapAttributes.get(itemId).size() > 0; + } + return false; + } + // + // PLD TODO - this may not work. Datatype may prove difficult + // to distinguish which category it is in. + // + for (Category category : this.mapAttributes.keySet()) { + if (itemId instanceof Datatype) { + if (this.mapAttributes.get(category).containsKey(itemId)) { + return this.mapAttributes.get(category).get(itemId).size() > 0; + } + continue; + } + for (Datatype datatype : this.mapAttributes.get(category).keySet()) { + if (itemId instanceof String) { + if (this.mapAttributes.get(category).get(datatype).containsKey(itemId)) { + return this.mapAttributes.get(category).get(datatype).get(itemId).size() > 0; + } + continue; + } + } + } + return false; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (! (itemId instanceof ContainerAttribute)) { + return false; + } + for (Category category : this.mapAttributes.keySet()) { + for (Datatype datatype : this.mapAttributes.get(category).keySet()) { + for (String id : this.mapAttributes.get(category).get(datatype).keySet()) { + if (this.mapAttributes.get(category).get(datatype).get(id).contains(itemId)) { + return this.mapAttributes.get(category).get(datatype).get(id).remove(itemId); + } + } + } + } + return false; + } + + public class AttributeItem implements Item { + private static final long serialVersionUID = 1L; + private final Object data; + + public AttributeItem(Object data) { + this.data = data; + } + + public String getId() { + return null; + } + + public Category getCategory() { + return null; + } + + public Datatype getDatatype() { + return null; + } + + public Table getValues() { + return null; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.data, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Attribute container does not support adding new properties"); + } + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Attribute container does not support removing properties"); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java new file mode 100644 index 0000000..1074936 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java
@@ -0,0 +1,300 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.model.AttributeContainer.ContainerAttribute; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class AttributeValueContainer extends ItemSetChangeNotifier implements Container.Ordered, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private final Datatype datatype; //NOPMD + private final List<ContainerAttribute> attributes; + + /** + * String identifier of an object's "Value" property. + */ + public static String PROPERTY_VALUE = "Value"; + + /** + * String identifier of an object's "Source" property. + */ + public static String PROPERTY_SOURCE = "Source"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> ATTRIBUTEVALUE_PROPERTIES; + + private final static Method ATTRIBUTEVALUEITEM_VALUE; + private final static Method ATTRIBUTEVALUEITEM_SOURCE; + static { + ATTRIBUTEVALUE_PROPERTIES = new ArrayList<String>(); + ATTRIBUTEVALUE_PROPERTIES.add(PROPERTY_VALUE); + ATTRIBUTEVALUE_PROPERTIES.add(PROPERTY_SOURCE); + ATTRIBUTEVALUE_PROPERTIES = Collections.unmodifiableCollection(ATTRIBUTEVALUE_PROPERTIES); + try { + ATTRIBUTEVALUEITEM_VALUE = AttributeValueItem.class.getMethod("getValue", new Class[]{}); + ATTRIBUTEVALUEITEM_SOURCE = AttributeValueItem.class.getMethod("getSource", new Class[]{}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException("Internal error finding methods in AttributeValueContainer"); + } + } + + public AttributeValueContainer(Datatype datatype, List<ContainerAttribute> attributes) { + this.datatype = datatype; + this.attributes = attributes; + } + + public boolean isObjectSupported(Object itemId) { + return itemId instanceof ContainerAttribute; + } + + @Override + public Item getItem(Object itemId) { + if (itemId instanceof ContainerAttribute) { + return new AttributeValueItem((ContainerAttribute) itemId); + } + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return ATTRIBUTEVALUE_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + return Collections.unmodifiableList(this.attributes); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + if (propertyId.equals(PROPERTY_VALUE)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeValueItem((ContainerAttribute) itemId), ATTRIBUTEVALUEITEM_VALUE, null); + } + + if (propertyId.equals(PROPERTY_SOURCE)) { + return new MethodProperty<Object>(getType(propertyId), + new AttributeValueItem((ContainerAttribute) itemId), ATTRIBUTEVALUEITEM_SOURCE, null); + } + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_VALUE)) { + return String.class; + } + if (propertyId.equals(PROPERTY_SOURCE)) { + return String.class; + } + return null; + } + + @Override + public int size() { + return this.attributes.size(); + } + + @Override + public boolean containsId(Object itemId) { + return this.attributes.contains(itemId); + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + if (this.isObjectSupported(itemId) == false) { + return null; + } + return new AttributeValueItem((ContainerAttribute) itemId); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Please use addItem(Object itemId) - setup the container attribute first."); + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (this.isObjectSupported(itemId) == false) { + return false; + } + throw new UnsupportedOperationException("TODO"); +// return this.attributes.remove(itemId); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("TODO"); +// this.attributes.clear(); +// return true; + } + + @Override + public Object nextItemId(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + int index = this.getItemIndex((ContainerAttribute) itemId); + if (index == -1 || index >= this.attributes.size()) { + return null; + } + return this.attributes.get(index + 1); + } + + @Override + public Object prevItemId(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + int index = this.getItemIndex((ContainerAttribute) itemId); + if (index == -1 || index == 0) { + return null; + } + return this.attributes.get(index - 1); + } + + @Override + public Object firstItemId() { + if (this.attributes.size() > 0) { + return this.attributes.get(0); + } + return null; + } + + @Override + public Object lastItemId() { + if (this.attributes.size() > 0) { + return this.attributes.get(this.attributes.size() - 1); + } + return null; + } + + @Override + public boolean isFirstId(Object itemId) { + if (this.attributes.size() > 0) { + return this.attributes.get(0).equals(itemId); + } + return false; + } + + @Override + public boolean isLastId(Object itemId) { + if (this.attributes.size() > 0) { + return this.attributes.get(this.attributes.size() - 1).equals(itemId); + } + return false; + } + + @Override + public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Use addItemAfter(Object previousItemId, Object newItemId) - please create the object yourself."); + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { + if (this.isObjectSupported(previousItemId) == false || this.isObjectSupported(newItemId) == false) { + return null; + } + int index = this.getItemIndex((ContainerAttribute) previousItemId); + if (index >= 0) { + this.attributes.add(index, (ContainerAttribute) newItemId); + } + return null; + } + + protected int getItemIndex(ContainerAttribute itemId) { + int index; + for (index = 0; index < this.attributes.size(); index++) { + if (this.attributes.get(index).equals(itemId)) { + return index; + } + } + return -1; + } + + public class AttributeValueItem implements Item { + private static final long serialVersionUID = 1L; + private final ContainerAttribute attribute; + + public AttributeValueItem(ContainerAttribute attribute) { + this.attribute = attribute; + } + + public String getValue() { + if (this.attribute == null) { + return null; + } + return this.attribute.value.toString(); + } + + public String getSource() { + if (this.attribute == null) { + return null; + } + return this.attribute.value.toString(); + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.attribute, id); + } + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Attribute Value container does not support adding new properties"); + } + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Attribute Value container does not support removing properties"); + } + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java new file mode 100644 index 0000000..30c8670 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java
@@ -0,0 +1,1215 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.JAXBElement; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.util.XACMLFunctionValidator; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class ExpressionContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(ExpressionContainer.class); + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of an object's "id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of an object's "datatype" property. + */ + public static String PROPERTY_DATATYPE_SHORT = "shortDatatype"; + + /** + * String identifier of an object's "id" property. + */ + public static String PROPERTY_ID_SHORT = "shortId"; + + /** + * String identifier of an object's "datatype" property. + */ + public static String PROPERTY_DATATYPE = "Datatype"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> EXPRESSION_PROPERTIES; + + private final static Method EXPRESSIONITEM_NAME; + + private final static Method EXPRESSIONITEM_ID; + + private final static Method EXPRESSIONITEM_DATATYPE; + + private final static Method EXPRESSIONITEM_ID_SHORT; + + private final static Method EXPRESSIONITEM_DATATYPE_SHORT; + + static { + EXPRESSION_PROPERTIES = new ArrayList<String>(); + EXPRESSION_PROPERTIES.add(PROPERTY_NAME); + EXPRESSION_PROPERTIES.add(PROPERTY_ID); + EXPRESSION_PROPERTIES.add(PROPERTY_DATATYPE); + EXPRESSION_PROPERTIES.add(PROPERTY_ID_SHORT); + EXPRESSION_PROPERTIES.add(PROPERTY_DATATYPE_SHORT); + EXPRESSION_PROPERTIES = Collections.unmodifiableCollection(EXPRESSION_PROPERTIES); + try { + EXPRESSIONITEM_NAME = ExpressionItem.class.getMethod("getName", new Class[]{}); + EXPRESSIONITEM_ID = ExpressionItem.class.getMethod("getId", new Class[]{}); + EXPRESSIONITEM_DATATYPE = ExpressionItem.class.getMethod("getDatatype", new Class[]{}); + EXPRESSIONITEM_ID_SHORT = ExpressionItem.class.getMethod("getIdShort", new Class[]{}); + EXPRESSIONITEM_DATATYPE_SHORT = ExpressionItem.class.getMethod("getDatatypeShort", new Class[]{}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PolicyContainer"); + } + } + + protected class ApplyParent { + ApplyType apply; + FunctionArgument argument; + + public ApplyParent(ApplyType apply, FunctionArgument argument) { + this.apply = apply; + this.argument = argument; + } + + public ApplyType getApply() { + return apply; + } + + public void setApply(ApplyType apply) { + this.apply = apply; + } + + public FunctionArgument getArgument() { + return argument; + } + + public void setArgument(FunctionArgument argument) { + this.argument = argument; + } + } + // + // Our parent object information and which argument we are + // from our parent (relevant to the Apply). + // + private final Object parent; + private final FunctionArgument argument; + // + // The root object of the expression + // + private Object root; + // + // Our helper tables for organization purposes and to + // make sure the correct functions/datatypes are being + // setup. + // + private Map<ApplyType, ApplyParent> applys = new HashMap<ApplyType, ApplyParent>(); + private Map<FunctionType, ApplyParent> functions = new HashMap<FunctionType, ApplyParent>(); + private Map<AttributeValueType, ApplyParent> values = new HashMap<AttributeValueType, ApplyParent>(); + private Map<AttributeDesignatorType, ApplyParent> designators = new HashMap<AttributeDesignatorType, ApplyParent>(); + private Map<AttributeSelectorType, ApplyParent> selectors = new HashMap<AttributeSelectorType, ApplyParent>(); + private Map<VariableReferenceType, ApplyParent> variables = new HashMap<VariableReferenceType, ApplyParent>(); + private Map<ExpressionType, ApplyParent> expressions = new HashMap<ExpressionType, ApplyParent>(); + + public ExpressionContainer(Object parent, Object root, FunctionArgument argument) { + super(); + this.setContainer(this); + this.parent = parent; + this.root = root; + this.argument = argument; + this.initialize(); + } + + private void initialize() { + if (logger.isTraceEnabled()) { + logger.trace("Initializing: " + this.parent + " " + this.argument + " " + this.root); + } + // + // Make sure we support the parent object + // + @SuppressWarnings("unused") + JAXBElement<?> rootElement = null; + if (this.parent instanceof ConditionType) { + rootElement = ((ConditionType) this.parent).getExpression(); + } else if (this.parent instanceof VariableDefinitionType) { + rootElement = ((VariableDefinitionType) this.parent).getExpression(); + } else if (this.parent instanceof AttributeAssignmentExpressionType) { + rootElement = ((AttributeAssignmentExpressionType) this.parent).getExpression(); + } else if (this.parent instanceof ApplyType) { + // + // They must tell us which argument we are + // + if (this.argument == null) { + throw new IllegalArgumentException("Must supply Argument object when editing a parent ApplyType's child node"); + } + // + // Finish the initialization + // + this.initializeRoot(); + } else { + throw new IllegalArgumentException("Unsupported Parent Object: " + this.parent.getClass().getCanonicalName()); + } + /* + // + // Check if there actually is a root + // + if (rootElement == null || rootElement.getValue() == null) { + // + // Creating a new one + // + return; + } + // + // Save the root + // + this.root = rootElement.getValue(); + */ + // + // Finish initializing + // + this.initializeRoot(); + } + + private void initializeRoot() { + // + // Sanity check + // + if (this.root == null) { + return; + } + // + // Figure out the expression type + // + if (this.root instanceof ApplyType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Apply"); + } + // + // Save it + // + this.applys.put((ApplyType) this.root, null); + // + // Determine the function for this Apply + // + Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap(); + FunctionDefinition function = functions.get(((ApplyType) this.root).getFunctionId()); + if (function == null) { + logger.warn("root apply does not have a function defined"); + return; + } + // + // Bring in its children + // + this.initializeChildren((ApplyType) this.root, function); + } else if (this.root instanceof AttributeValueType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Attribute Value"); + } + // + // Save it + // + this.values.put((AttributeValueType) this.root, null); + } else if (this.root instanceof AttributeDesignatorType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Attribute Designator"); + } + // + // Save it + // + this.designators.put((AttributeDesignatorType) this.root, null); + } else if (this.root instanceof AttributeSelectorType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Attribute Selector"); + } + // + // Save it + // + this.selectors.put((AttributeSelectorType) this.root, null); + } else if (this.root instanceof VariableReferenceType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Variable Reference"); + } + // + // Save it + // + this.variables.put((VariableReferenceType) this.root, null); + } else if (this.root instanceof FunctionType) { + if (logger.isTraceEnabled()) { + logger.trace("Root Is Function"); + } + // + // Save it - Really? I don't think the root would ever be a function. + // + this.functions.put((FunctionType) this.root, null); + } else { + throw new IllegalArgumentException("Unsupported Expression Root Item: " + this.root.getClass().getCanonicalName()); + } + } + + private void initializeChildren(ApplyType apply, FunctionDefinition function) { + int index = 1; + for (JAXBElement<?> child : apply.getExpression()) { + // + // Validate the child + // + if (child.getValue() == null) { + logger.warn("child element " + index + "has a null object."); + index++; + continue; + } + if (logger.isTraceEnabled()) { + logger.trace("Child " + index + " is " + child.getValue()); + } + // + // Get the argument for this child + // + if (function == null) { + throw new IllegalArgumentException("Apply has children but no function defined."); + } + FunctionArgument argument = XACMLFunctionValidator.getFunctionArgument(index, function); + if (logger.isTraceEnabled()) { + logger.trace("Child's argument is: " + argument); + } + if (argument == null) { + //throw new Exception("Unable to find function argument: " + index + " " + function.getId() + " " + function.getShortname()); + return; + } + // + // See if its another apply type + // + if (child.getValue() instanceof ApplyType) { + // + // Save it + // + this.applys.put((ApplyType) child.getValue(), new ApplyParent(apply, argument)); + // + // Get its function information + // + Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap(); + FunctionDefinition childFunction = functions.get(((ApplyType) child.getValue()).getFunctionId()); + if (childFunction == null) { + logger.warn("Apply object " + index + " does not have a function defined"); + } else { + // + // Bring in its children + // + this.initializeChildren((ApplyType) child.getValue(), childFunction); + } + } else if (child.getValue() instanceof AttributeValueType) { + // + // Save it + // + this.values.put((AttributeValueType) child.getValue(), new ApplyParent(apply, argument)); + } else if (child.getValue() instanceof AttributeDesignatorType) { + // + // Save it + // + this.designators.put((AttributeDesignatorType) child.getValue(), new ApplyParent(apply, argument)); + } else if (child.getValue() instanceof AttributeSelectorType) { + // + // Save it + // + this.selectors.put((AttributeSelectorType) child.getValue(), new ApplyParent(apply, argument)); + } else if (child.getValue() instanceof VariableReferenceType) { + // + // Save it + // + this.variables.put((VariableReferenceType) child.getValue(), new ApplyParent(apply, argument)); + } else if (child.getValue() instanceof FunctionType) { + // + // Save it + // + this.functions.put((FunctionType) child.getValue(), new ApplyParent(apply, argument)); + } else if (child.getValue() instanceof ExpressionType) { + // + // Save it + // + this.expressions.put((ExpressionType) child.getValue(), new ApplyParent(apply, argument)); + } else { + logger.error("Unknown child type: " + child.getClass().getCanonicalName()); + } + index++; + } + } + + protected boolean isObjectSupported(Object itemId) { + if (itemId instanceof ApplyType || + itemId instanceof AttributeValueType || + itemId instanceof AttributeDesignatorType || + itemId instanceof AttributeSelectorType || + itemId instanceof VariableReferenceType || + itemId instanceof FunctionType || + itemId instanceof ExpressionType) { + return true; + } + return false; + } + + protected boolean isParentObjectSupport(Object parent) { + if (parent instanceof ApplyType || + parent instanceof ConditionType || + parent instanceof VariableDefinitionType || + parent instanceof AttributeAssignmentExpressionType) { + return true; + } + return false; + } + + public void updateItem(Object itemId) { + // + // Sanity check + // + if (this.isObjectSupported(itemId) == false) { + return;// null; + } + // + // Notify - the real reason for this function + // + this.fireItemSetChange(); + // + // Return the item + // + //return new ExpressionItem(itemId); + } + + @Override + public Item getItem(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + return new ExpressionItem(itemId); + } + + @Override + public Collection<?> getContainerPropertyIds() { + return EXPRESSION_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + if (this.root != null) { + // + // Add the root object + // + items.add(this.root); + // + // If its an apply, it could have children + // + if (this.root instanceof ApplyType) { + items.add(this.getChildrenIds((ApplyType) this.root, true)); + } + } + if (logger.isTraceEnabled()) { + logger.trace("getItemIds (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + protected Collection<?> getChildrenIds(ApplyType apply, boolean recursive) { + Collection<Object> items = new ArrayList<Object>(); + for (JAXBElement<?> child : apply.getExpression()) { + // + // Make sure there's a value + // + if (child.getValue() == null) { + continue; + } + // + // What kind is it? + // + if (child.getValue() instanceof ApplyType) { + items.add(child.getValue()); + // + // Do we add its children? + // + if (recursive) { + items.addAll(this.getChildrenIds((ApplyType) child.getValue(), true)); + } + } else if (child.getValue() instanceof AttributeValueType) { + items.add(child.getValue()); + } else if (child.getValue() instanceof AttributeDesignatorType) { + items.add(child.getValue()); + } else if (child.getValue() instanceof AttributeSelectorType) { + items.add(child.getValue()); + } else if (child.getValue() instanceof VariableReferenceType) { + items.add(child.getValue()); + } else if (child.getValue() instanceof FunctionType) { + items.add(child.getValue()); + } else if (child.getValue() instanceof ExpressionType) { + items.add(child.getValue()); + } + } + if (logger.isTraceEnabled()) { + logger.trace("getChildrenIds " + apply.getFunctionId() + " (" + items.size() + "):" + items); + } + return items; + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new ExpressionItem(itemId), EXPRESSIONITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new ExpressionItem(itemId), EXPRESSIONITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_DATATYPE)) { + return new MethodProperty<Object>(getType(propertyId), + new ExpressionItem(itemId), EXPRESSIONITEM_DATATYPE, null); + } + + if (propertyId.equals(PROPERTY_ID_SHORT)) { + return new MethodProperty<Object>(getType(propertyId), + new ExpressionItem(itemId), EXPRESSIONITEM_ID_SHORT, null); + } + + if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) { + return new MethodProperty<Object>(getType(propertyId), + new ExpressionItem(itemId), EXPRESSIONITEM_DATATYPE_SHORT, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DATATYPE)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ID_SHORT)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) { + return String.class; + } + return null; + } + + @Override + public int size() { + int size = 0; + size += this.applys.size(); + size += this.designators.size(); + size += this.functions.size(); + size += this.selectors.size(); + size += this.values.size(); + size += this.variables.size(); + size += this.expressions.size(); + return size; + } + + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + itemId); + } + if (itemId instanceof ApplyType) { + return this.applys.containsKey(itemId); + } + if (itemId instanceof AttributeValueType) { + return this.values.containsKey(itemId); + } + if (itemId instanceof AttributeDesignatorType) { + return this.designators.containsKey(itemId); + } + if (itemId instanceof AttributeSelectorType) { + return this.selectors.containsKey(itemId); + } + if (itemId instanceof VariableReferenceType) { + return this.variables.containsKey(itemId); + } + if (itemId instanceof FunctionType) { + return this.functions.containsKey(itemId); + } + if (itemId instanceof ExpressionType) { + return this.expressions.containsKey(itemId); + } + return false; + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Please use the addItem(Object, Object) method instead."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("use addItem(Object itemId)"); + } + + public Item addItem(Object itemId, ApplyType parent, FunctionArgument argument) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItem: " + itemId + " " + parent + " " + argument); + } + // + // Make sure we support the object + // + if (this.isObjectSupported(itemId) == false) { + return null; + } + // + // Is is a root? + // + if (parent == null) { + // + // Setting root + // + if (this.root != null) { + throw new UnsupportedOperationException("Cannot add another root item. Remove the current root first."); + } + // + // Save the root information + // + this.root = itemId; + // + // Add its children + // + this.initializeRoot(); + // + // Add it to our root container + // + if (this.parent instanceof ApplyType) { + ((ApplyType) this.parent).getExpression().add(this.createElement(this.root)); + } else if (this.parent instanceof ConditionType) { + ((ConditionType) this.parent).setExpression(this.createElement(this.root)); + } else if (this.parent instanceof VariableDefinitionType) { + ((VariableDefinitionType) this.parent).setExpression(this.createElement(this.root)); + } else if (this.parent instanceof AttributeAssignmentExpressionType) { + ((AttributeAssignmentExpressionType) this.parent).setExpression(this.createElement(this.root)); + } else { + logger.error("unknown parent class: " + this.parent.getClass().getCanonicalName()); + } + // + // Notify that we changed + // + this.fireItemSetChange(); + // + // Return new item + // + return new ExpressionItem(this.root); + } + // + // Check what kind of item this is + // + if (itemId instanceof ApplyType) { + // + this.applys.put((ApplyType) itemId, new ApplyParent(parent, argument)); + ((ApplyType) parent).getExpression().add(new ObjectFactory().createApply((ApplyType) itemId)); + // + // Get its function information + // + Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap(); + FunctionDefinition childFunction = functions.get(((ApplyType) itemId).getFunctionId()); + if (childFunction == null) { + // + // NO function defined + // + logger.warn("no function defined for apply being added."); + } else { + // + // Add its children + // + this.initializeChildren((ApplyType) itemId, childFunction); + } + } else if (itemId instanceof AttributeValueType) { + // + this.values.put((AttributeValueType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createAttributeValue((AttributeValueType) itemId)); + // + } else if (itemId instanceof AttributeDesignatorType) { + // + this.designators.put((AttributeDesignatorType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) itemId)); + // + } else if (itemId instanceof AttributeSelectorType) { + // + this.selectors.put((AttributeSelectorType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createAttributeSelector((AttributeSelectorType) itemId)); + // + } else if (itemId instanceof VariableReferenceType) { + // + this.variables.put((VariableReferenceType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createVariableReference((VariableReferenceType) itemId)); + // + } else if (itemId instanceof FunctionType) { + // + this.functions.put((FunctionType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createFunction((FunctionType) itemId)); + // + } else if (itemId instanceof ExpressionType) { + // + this.expressions.put((ExpressionType) itemId, new ApplyParent(parent, argument)); + parent.getExpression().add(new ObjectFactory().createExpression((ExpressionType) itemId)); + } else { + logger.error("unknown itemId class: " + itemId.getClass().getCanonicalName()); + return null; + } + // + // Notify + // + this.fireItemSetChange(); + return new ExpressionItem(itemId); + } + + private JAXBElement<?> createElement(Object item) { + if (item instanceof ApplyType) { + return new ObjectFactory().createApply((ApplyType) item); + } else if (item instanceof AttributeValueType) { + return new ObjectFactory().createAttributeValue((AttributeValueType) item); + } else if (item instanceof AttributeDesignatorType) { + return new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) item); + } else if (item instanceof AttributeSelectorType) { + return new ObjectFactory().createAttributeSelector((AttributeSelectorType) item); + } else if (item instanceof VariableReferenceType) { + return new ObjectFactory().createVariableReference((VariableReferenceType) item); + } else if (item instanceof FunctionType) { + return new ObjectFactory().createFunction((FunctionType) item); + } else if (item instanceof ExpressionType) { + return new ObjectFactory().createExpression((ExpressionType) item); + } + return null; + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeAllItems: "); + } + boolean result = this.doRemoveAllItems(); + if (result == false) { + return false; + } + // + // Notify + // + this.fireItemSetChange(); + // + // Done + // + return true; + } + + public boolean doRemoveAllItems() throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("doRemoveAllItems: "); + } + // + // Removing the root item, make sure its removed from + // the parent. + // + if (this.parent instanceof ConditionType) { + ((ConditionType) this.parent).setExpression(null); + } else if (this.parent instanceof VariableDefinitionType) { + ((VariableDefinitionType) this.parent).setExpression(null); + } else if (this.parent instanceof AttributeAssignmentExpressionType) { + ((AttributeAssignmentExpressionType) this.parent).setExpression(null); + } else if (this.parent instanceof ApplyType) { + // + // TODO ?? Special case + // + return false; + } else { + return false; + } + // + // Null our root + // + this.root = null; + // + // Clear out our maps + // + this.applys.clear(); + this.designators.clear(); + this.functions.clear(); + this.values.clear(); + this.selectors.clear(); + this.variables.clear(); + this.expressions.clear(); + // + // Done + // + return true; + } + + @Override + public Collection<?> getChildren(Object itemId) { + final Collection<Object> items = new ArrayList<Object>(); + if (itemId instanceof ApplyType) { + items.addAll(this.getChildrenIds((ApplyType) itemId, false)); + } + if (logger.isTraceEnabled()) { + logger.trace("getChildren " + itemId + " (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + public FunctionArgument getArgument(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getArgument: " + itemId); + } + // + // First check if its a root + // + if (this.isRoot(itemId)) { + return null; + } + // + // Not a root - should be in the maps + // + if (itemId instanceof ApplyType) { + return this.applys.get(itemId).getArgument(); + } + if (itemId instanceof AttributeValueType) { + return this.values.get(itemId).getArgument(); + } + if (itemId instanceof AttributeDesignatorType) { + return this.designators.get(itemId).getArgument(); + } + if (itemId instanceof AttributeSelectorType) { + return this.selectors.get(itemId).getArgument(); + } + if (itemId instanceof VariableReferenceType) { + return this.variables.get(itemId).getArgument(); + } + if (itemId instanceof FunctionType) { + return this.functions.get(itemId).getArgument(); + } + if (itemId instanceof ExpressionType) { + return this.expressions.get(itemId).getArgument(); + } + return null; + } + + @Override + public Object getParent(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getParent: " + itemId); + } + // + // First check if its a root + // + if (this.isRoot(itemId)) { + return null; + } + // + // Not a root - should be in the maps + // + if (itemId instanceof ApplyType) { + return this.applys.get(itemId).getApply(); + } + if (itemId instanceof AttributeValueType) { + return this.values.get(itemId).getApply(); + } + if (itemId instanceof AttributeDesignatorType) { + return this.designators.get(itemId).getApply(); + } + if (itemId instanceof AttributeSelectorType) { + return this.selectors.get(itemId).getApply(); + } + if (itemId instanceof VariableReferenceType) { + return this.variables.get(itemId).getApply(); + } + if (itemId instanceof FunctionType) { + return this.functions.get(itemId).getApply(); + } + if (itemId instanceof ExpressionType) { + return this.expressions.get(itemId).getApply(); + } + return null; + } + + @Override + public Collection<?> rootItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + if (this.root != null) { + items.add(this.root); + } + if (logger.isTraceEnabled()) { + logger.trace("rootItemIds " + " (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + // + // TODO we can support this later + // + throw new UnsupportedOperationException("Should we support this? Can be tricky. Most likely user dragging an item from one area to another. For now, use removeItem, addItem."); + } + + @Override + public boolean areChildrenAllowed(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("areChildrenAllowed: " + itemId); + } + if (itemId instanceof ApplyType) { + return true; + } + return false; + } + + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) + throws UnsupportedOperationException { + if (itemId instanceof ApplyType && areChildrenAllowed) { + return true; + } + if (! areChildrenAllowed) { + return true; + } + return false; + } + + @Override + public boolean isRoot(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isRoot: " + itemId); + } + if (itemId == null) { + logger.error("isRoot itemId is NULL"); + } + return this.root == itemId; + } + + @Override + public boolean hasChildren(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("hasChildren: " + itemId); + } + if (itemId instanceof ApplyType) { + return ((ApplyType)itemId).getExpression().size() > 0; + } + return false; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + itemId); + } + // + // Check if they are removing the root + // + if (this.root == itemId) { + // + // Removing the root item, make sure its removed from + // the parent. + // + boolean result = this.doRemoveAllItems(); + if (result == false) { + return false; + } + // + // Notify + // + this.fireItemSetChange(); + return true; + } + // + // There should be a parent + // + ApplyParent parent = null; + // + // Remove the item from the maps + // + if (itemId instanceof ApplyType) { + parent = this.applys.get(itemId); + if (parent == null) { + return false; + } + if (this.applys.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof AttributeValueType) { + parent = this.values.get(itemId); + if (this.values.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof AttributeDesignatorType) { + parent = this.designators.get(itemId); + if (this.designators.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof AttributeSelectorType) { + parent = this.selectors.get(itemId); + if (this.selectors.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof VariableReferenceType) { + parent = this.variables.get(itemId); + if (this.variables.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof FunctionType) { + parent = this.functions.get(itemId); + if (this.functions.remove(itemId) == null) { + return false; + } + } else if (itemId instanceof ExpressionType) { + parent = this.expressions.get(itemId); + if (this.expressions.remove(itemId) != null) { + return false; + } + } else { + return false; + } + // + // Remove it from the parent Apply + // + boolean removed = false; + for (JAXBElement<?> element : parent.getApply().getExpression()) { + if (element.getValue().equals(itemId)) { + if (parent.getApply().getExpression().remove(element)) { + removed = true; + break; + } + break; + } + } + if (! removed) { + // + // Out of sync + // + logger.warn("Removing item from parent returned false, although we were able to remove it from our maps."); + } + // + // Notify + // + this.fireItemSetChange(); + return true; + } + + public class ExpressionItem implements Item { + private static final long serialVersionUID = 1L; + private final Object data; + + public ExpressionItem(Object data) { + this.data = data; + } + + public String getName() { + if (this.data instanceof ApplyType) { + if (((ApplyType) this.data).getDescription() != null) { + return "Apply - " + ((ApplyType) this.data).getDescription(); + } + return "Apply"; + } + if (this.data instanceof AttributeValueType) { + return "Attribute Value"; + } + if (this.data instanceof AttributeDesignatorType) { + return "Attribute Designator"; + } + if (this.data instanceof AttributeSelectorType) { + return "Attribute Selector"; + } + if (this.data instanceof VariableReferenceType) { + return "Variable Reference"; + } + if (this.data instanceof FunctionType) { + return "Function"; + } + if (this.data instanceof ExpressionType) { + return "<Argument Placeholder>"; + } + return null; + } + + public String getId() { + if (this.data instanceof ApplyType) { + return ((ApplyType) this.data).getFunctionId(); + } + if (this.data instanceof AttributeValueType) { + StringBuilder builder = new StringBuilder(); + for (Object content : ((AttributeValueType) this.data).getContent()) { + builder.append(content); + } + return builder.toString(); + } + if (this.data instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) this.data).getAttributeId(); + } + if (this.data instanceof AttributeSelectorType) { + return ((AttributeSelectorType) this.data).getPath(); + } + if (this.data instanceof VariableReferenceType) { + return ((VariableReferenceType) this.data).getVariableId(); + } + if (this.data instanceof FunctionType) { + return ((FunctionType) this.data).getFunctionId(); + } + return null; + } + + public String getIdShort() { + String id = this.getId(); + if (id == null) { + return id; + } + // + // Make it short + // + String[] parts = id.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + return id; + } + + public String getDatatype() { + if (this.data instanceof ApplyType) { + + Map<String, FunctionDefinition> map = JPAUtils.getFunctionIDMap(); + FunctionDefinition function = map.get(((ApplyType) this.data).getFunctionId()); + if (function != null) { + return function.getDatatypeBean().getXacmlId(); + } + } + if (this.data instanceof AttributeValueType) { + return ((AttributeValueType) this.data).getDataType(); + } + if (this.data instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) this.data).getDataType(); + } + if (this.data instanceof AttributeSelectorType) { + return ((AttributeSelectorType) this.data).getDataType(); + } + + /* + if (this.data instanceof VariableReferenceType) { + if (this.function instanceof FunctionArgument) { + return ((FunctionArgument) this.function).getDatatypeBean().getXacmlId(); + } + } + */ + /* + if (this.data instanceof FunctionType) { + if (this.function instanceof FunctionArgument) { + return ((FunctionArgument) this.function).getDatatypeBean().getXacmlId(); + } + } + */ + return null; + } + + public String getDatatypeShort() { + String dt = this.getDatatype(); + if (dt == null) { + return dt; + } + // + // Get short part + // + int index = dt.lastIndexOf('#'); + if (index == -1) { + String[] parts = dt.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + } else { + return dt.substring(index + 1); + } + return dt; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.data, id); + } + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Expression container does not support adding new properties"); + } + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Expression container does not support removing properties"); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java new file mode 100644 index 0000000..8cecf31 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java
@@ -0,0 +1,1210 @@ +/* + * 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. + * + */ + +/* + * Copyright 2000-2013 Vaadin Ltd. + * + * Licensed 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 org.apache.openaz.xacml.admin.model; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.Serializable; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.errors.NoWorkTreeException; + +import org.apache.openaz.xacml.util.XACMLPolicyScanner; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.server.Resource; +import com.vaadin.ui.TextArea; +import com.vaadin.util.FileTypeResolver; + +/** + * A hierarchical container wrapper for a filesystem. + * + * @author Vaadin Ltd. + * @since 3.0 + */ +@SuppressWarnings("serial") +public class GitRepositoryContainer extends ItemSetChangeNotifier implements Container.Hierarchical { + private Log logger = LogFactory.getLog(GitRepositoryContainer.class); + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "size" property. + */ + public static String PROPERTY_SIZE = "Size"; + + /** + * String identifier of a file's "icon" property. + */ + public static String PROPERTY_ICON = "Icon"; + + /** + * String identifier of a file's "last modified" property. + */ + public static String PROPERTY_LASTMODIFIED = "Last Modified"; + + /** + * String identifier of a file's "version" property. + */ + public static String PROPERTY_VERSION = "Version"; + + /** + * String identifier of a file's "status" property. + */ + public static String PROPERTY_STATUS = "Status"; + + /** + * String identifier of a file's "data" property. + */ + public static String PROPERTY_DATA = "Data"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> FILE_PROPERTIES; + + private final static Method FILEITEM_LASTMODIFIED; + + private final static Method FILEITEM_NAME; + + private final static Method FILEITEM_ICON; + + private final static Method FILEITEM_SIZE; + + private final static Method FILEITEM_VERSION; + + private final static Method FILEITEM_STATUS; + + private final static Method FILEITEM_DATA; + + static { + + FILE_PROPERTIES = new ArrayList<String>(); + FILE_PROPERTIES.add(PROPERTY_NAME); + FILE_PROPERTIES.add(PROPERTY_ICON); + FILE_PROPERTIES.add(PROPERTY_SIZE); + FILE_PROPERTIES.add(PROPERTY_LASTMODIFIED); + FILE_PROPERTIES.add(PROPERTY_VERSION); + FILE_PROPERTIES.add(PROPERTY_STATUS); + FILE_PROPERTIES.add(PROPERTY_DATA); + FILE_PROPERTIES = Collections.unmodifiableCollection(FILE_PROPERTIES); + try { + FILEITEM_VERSION = FileItem.class.getMethod("getVersion", new Class[]{}); + FILEITEM_LASTMODIFIED = FileItem.class.getMethod("lastModified", new Class[] {}); + FILEITEM_NAME = FileItem.class.getMethod("getName", new Class[] {}); + FILEITEM_ICON = FileItem.class.getMethod("getIcon", new Class[] {}); + FILEITEM_SIZE = FileItem.class.getMethod("getSize", new Class[] {}); + FILEITEM_STATUS = FileItem.class.getMethod("getStatus", new Class[] {}); + FILEITEM_DATA = FileItem.class.getMethod("getData", new Class[] {}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in FilesystemContainer"); + } + } + + private File[] roots = new File[] {}; + + private FilenameFilter filter = null; + + private boolean recursive = true; + + private Path repository = null; + + /** + * Constructs a new <code>FileSystemContainer</code> with the specified file + * as the root of the filesystem. The files are included recursively. + * + * @param root + * the root file for the new file-system container. Null values + * are ignored. + */ + public GitRepositoryContainer(Path repository, File root) { + super(); + this.repository = repository; + if (root != null) { + roots = new File[] { root }; + } + this.setContainer(this); + } + + /** + * Constructs a new <code>FileSystemContainer</code> with the specified file + * as the root of the filesystem. The files are included recursively. + * + * @param root + * the root file for the new file-system container. + * @param recursive + * should the container recursively contain subdirectories. + */ + public GitRepositoryContainer(Path repository, File root, boolean recursive) { + this(repository, root); + setRecursive(recursive); + this.setContainer(this); + } + + /** + * Constructs a new <code>FileSystemContainer</code> with the specified file + * as the root of the filesystem. + * + * @param root + * the root file for the new file-system container. + * @param extension + * the Filename extension (w/o separator) to limit the files in + * container. + * @param recursive + * should the container recursively contain subdirectories. + */ + public GitRepositoryContainer(Path repository, File root, String extension, boolean recursive) { + this(repository, root); + this.setFilter(extension); + setRecursive(recursive); + this.setContainer(this); + } + + /** + * Constructs a new <code>FileSystemContainer</code> with the specified root + * and recursivity status. + * + * @param root + * the root file for the new file-system container. + * @param filter + * the Filename filter to limit the files in container. + * @param recursive + * should the container recursively contain subdirectories. + */ + public GitRepositoryContainer(Path repository, File root, FilenameFilter filter, boolean recursive) { + this(repository, root); + this.setFilter(filter); + setRecursive(recursive); + } + + /** + * Adds new root file directory. Adds a file to be included as root file + * directory in the <code>FilesystemContainer</code>. + * + * @param root + * the File to be added as root directory. Null values are + * ignored. + */ + public void addRoot(File root) { + if (root != null) { + final File[] newRoots = new File[roots.length + 1]; + for (int i = 0; i < roots.length; i++) { + newRoots[i] = roots[i]; + } + newRoots[roots.length] = root; + roots = newRoots; + } + } + + /** + * Tests if the specified Item in the container may have children. Since a + * <code>FileSystemContainer</code> contains files and directories, this + * method returns <code>true</code> for directory Items only. + * + * @param itemId + * the id of the item. + * @return <code>true</code> if the specified Item is a directory, + * <code>false</code> otherwise. + */ + @Override + public boolean areChildrenAllowed(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("areChildrenAllowed: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + return itemId instanceof File && ((File) itemId).canRead() + && ((File) itemId).isDirectory(); + } + + /* + * Gets the ID's of all Items who are children of the specified Item. Don't + * add a JavaDoc comment here, we use the default documentation from + * implemented interface. + */ + @Override + public Collection<File> getChildren(Object itemId) { + + if (!(itemId instanceof File)) { + return Collections.unmodifiableCollection(new LinkedList<File>()); + } + File[] f; + if (filter != null) { + f = ((File) itemId).listFiles(filter); + } else { + f = ((File) itemId).listFiles(); + } + + if (f == null) { + return Collections.unmodifiableCollection(new LinkedList<File>()); + } + + final List<File> l = Arrays.asList(f); + Collections.sort(l); + + return Collections.unmodifiableCollection(l); + } + + /* + * Gets the parent item of the specified Item. Don't add a JavaDoc comment + * here, we use the default documentation from implemented interface. + */ + @Override + public Object getParent(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getParent: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return null; + } + return ((File) itemId).getParentFile(); + } + + /* + * Tests if the specified Item has any children. Don't add a JavaDoc comment + * here, we use the default documentation from implemented interface. + */ + @Override + public boolean hasChildren(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("hasChildren: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return false; + } + String[] l; + if (filter != null) { + l = ((File) itemId).list(filter); + } else { + l = ((File) itemId).list(); + } + return l != null && l.length > 0; + } + + /* + * Tests if the specified Item is the root of the filesystem. Don't add a + * JavaDoc comment here, we use the default documentation from implemented + * interface. + */ + @Override + public boolean isRoot(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isRoot: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return false; + } + for (int i = 0; i < roots.length; i++) { + if (roots[i].equals(itemId)) { + return true; + } + } + return false; + } + + /* + * Gets the ID's of all root Items in the container. Don't add a JavaDoc + * comment here, we use the default documentation from implemented + * interface. + */ + @Override + public Collection<File> rootItemIds() { + + File[] f; + + // in single root case we use children + if (roots.length == 1) { + if (filter != null) { + f = roots[0].listFiles(filter); + } else { + f = roots[0].listFiles(); + } + } else { + f = roots; + } + + if (f == null) { + return Collections.unmodifiableCollection(new LinkedList<File>()); + } + + final List<File> l = Arrays.asList(f); + Collections.sort(l); + + return Collections.unmodifiableCollection(l); + } + + /** + * Returns <code>false</code> when conversion from files to directories is + * not supported. + * + * @param itemId + * the ID of the item. + * @param areChildrenAllowed + * the boolean value specifying if the Item can have children or + * not. + * @return <code>true</code> if the operaton is successful otherwise + * <code>false</code>. + * @throws UnsupportedOperationException + * if the setChildrenAllowed is not supported. + */ + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) + throws UnsupportedOperationException { + + throw new UnsupportedOperationException( + "Conversion file to/from directory is not supported"); + } + + /** + * Returns <code>false</code> when moving files around in the filesystem is + * not supported. + * + * @param itemId + * the ID of the item. + * @param newParentId + * the ID of the Item that's to be the new parent of the Item + * identified with itemId. + * @return <code>true</code> if the operation is successful otherwise + * <code>false</code>. + * @throws UnsupportedOperationException + * if the setParent is not supported. + */ + @Override + public boolean setParent(Object itemId, Object newParentId) + throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("setParent: " + + ((File)itemId).hashCode() + " " + + ((File)itemId).getName() + " to: " + + ((File)newParentId).hashCode() + " " + + ((File)newParentId).getName()); + } + + Path path = Paths.get(((File) itemId).getAbsolutePath()); + Path parent = Paths.get(((File) newParentId).getAbsolutePath()); + boolean ok = path.getParent() == parent; + + if (ok) { + fireItemSetChange(); + } + return ok; + } + + /* + * Tests if the filesystem contains the specified Item. Don't add a JavaDoc + * comment here, we use the default documentation from implemented + * interface. + */ + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return false; + } + boolean val = false; + + // Try to match all roots + for (int i = 0; i < roots.length; i++) { + try { + val |= ((File) itemId).getCanonicalPath().startsWith( + roots[i].getCanonicalPath()); + } catch (final IOException e) { //NOPMD + // Exception ignored + } + + } + if (val && filter != null) { + val &= filter.accept(((File) itemId).getParentFile(), + ((File) itemId).getName()); + } + return val; + } + + /* + * Gets the specified Item from the filesystem. Don't add a JavaDoc comment + * here, we use the default documentation from implemented interface. + */ + @Override + public Item getItem(Object itemId) { + + if (logger.isTraceEnabled()) { + logger.trace("getItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return null; + } + return new FileItem((File) itemId); + } + + public Item updateItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("updateItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + if (!(itemId instanceof File)) { + return null; + } + + this.fireItemSetChange(); + + return new FileItem((File) itemId); + } + + /** + * Internal recursive method to add the files under the specified directory + * to the collection. + * + * @param col + * the collection where the found items are added + * @param f + * the root file where to start adding files + */ + private void addItemIds(Collection<File> col, File f) { + File[] l; + if (filter != null) { + l = f.listFiles(filter); + } else { + l = f.listFiles(); + } + if (l == null) { + // File.listFiles returns null if File does not exist or if there + // was an IO error (permission denied) + return; + } + final List<File> ll = Arrays.asList(l); + Collections.sort(ll); + + for (final Iterator<File> i = ll.iterator(); i.hasNext();) { + final File lf = i.next(); + col.add(lf); + if (lf.isDirectory()) { + addItemIds(col, lf); + } + } + } + + /* + * Gets the IDs of Items in the filesystem. Don't add a JavaDoc comment + * here, we use the default documentation from implemented interface. + */ + @Override + public Collection<File> getItemIds() { + + if (recursive) { + final Collection<File> col = new ArrayList<File>(); + for (int i = 0; i < roots.length; i++) { + addItemIds(col, roots[i]); + } + return Collections.unmodifiableCollection(col); + } else { + File[] f; + if (roots.length == 1) { + if (filter != null) { + f = roots[0].listFiles(filter); + } else { + f = roots[0].listFiles(); + } + } else { + f = roots; + } + + if (f == null) { + return Collections + .unmodifiableCollection(new LinkedList<File>()); + } + + final List<File> l = Arrays.asList(f); + Collections.sort(l); + return Collections.unmodifiableCollection(l); + } + + } + + /** + * Gets the specified property of the specified file Item. The available + * file properties are "Name", "Size" and "Last Modified". If propertyId is + * not one of those, <code>null</code> is returned. + * + * @param itemId + * the ID of the file whose property is requested. + * @param propertyId + * the property's ID. + * @return the requested property's value, or <code>null</code> + */ + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + + if (!(itemId instanceof File)) { + return null; + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_ICON)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_ICON, null); + } + + if (propertyId.equals(PROPERTY_SIZE)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_SIZE, null); + } + + if (propertyId.equals(PROPERTY_LASTMODIFIED)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_LASTMODIFIED, null); + } + + if (propertyId.equals(PROPERTY_VERSION)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_VERSION, null); + } + + if (propertyId.equals(PROPERTY_STATUS)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_STATUS, null); + } + + if (propertyId.equals(PROPERTY_DATA)) { + return new MethodProperty<Object>(getType(propertyId), + new FileItem((File) itemId), FILEITEM_DATA, null); + } + + return null; + } + + /** + * Gets the collection of available file properties. + * + * @return Unmodifiable collection containing all available file properties. + */ + @Override + public Collection<String> getContainerPropertyIds() { + return FILE_PROPERTIES; + } + + /** + * Gets the specified property's data type. "Name" is a <code>String</code>, + * "Size" is a <code>Long</code>, "Last Modified" is a <code>Date</code>. If + * propertyId is not one of those, <code>null</code> is returned. + * + * @param propertyId + * the ID of the property whose type is requested. + * @return data type of the requested property, or <code>null</code> + */ + @Override + public Class<?> getType(Object propertyId) { + + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ICON)) { + return Resource.class; + } + if (propertyId.equals(PROPERTY_SIZE)) { + return Long.class; + } + if (propertyId.equals(PROPERTY_LASTMODIFIED)) { + return Date.class; + } + if (propertyId.equals(PROPERTY_VERSION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_STATUS)) { + return TextArea.class; + } + if (propertyId.equals(PROPERTY_DATA)) { + return Object.class; + } + return null; + } + + /** + * Internal method to recursively calculate the number of files under a root + * directory. + * + * @param f + * the root to start counting from. + */ + private int getFileCounts(File f) { + File[] l; + if (filter != null) { + l = f.listFiles(filter); + } else { + l = f.listFiles(); + } + + if (l == null) { + return 0; + } + int ret = l.length; + for (int i = 0; i < l.length; i++) { + if (l[i].isDirectory()) { + ret += getFileCounts(l[i]); + } + } + return ret; + } + + /** + * Gets the number of Items in the container. In effect, this is the + * combined amount of files and directories. + * + * @return Number of Items in the container. + */ + @Override + public int size() { + + if (recursive) { + int counts = 0; + for (int i = 0; i < roots.length; i++) { + counts += getFileCounts(roots[i]); + } + return counts; + } else { + File[] f; + if (roots.length == 1) { + if (filter != null) { + f = roots[0].listFiles(filter); + } else { + f = roots[0].listFiles(); + } + } else { + f = roots; + } + + if (f == null) { + return 0; + } + return f.length; + } + } + + + /** + * A Item wrapper for files in a filesystem. + * + * @author Vaadin Ltd. + * @since 3.0 + */ + public class FileItem implements Item { + + /** + * The wrapped file. + */ + private final File file; + + private Object data = null; + + /** + * Constructs a FileItem from a existing file. + */ + private FileItem(File file) { + if (logger.isTraceEnabled()) { + logger.trace("FileItem constructor: " + file.hashCode() + " " + file.getName()); + } + this.file = file; + } + + /* + * Gets the specified property of this file. Don't add a JavaDoc comment + * here, we use the default documentation from implemented interface. + */ + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(file, id); + } + + /* + * Gets the IDs of all properties available for this item Don't add a + * JavaDoc comment here, we use the default documentation from + * implemented interface. + */ + @Override + public Collection<String> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + /** + * Calculates a integer hash-code for the Property that's unique inside + * the Item containing the Property. Two different Properties inside the + * same Item contained in the same list always have different + * hash-codes, though Properties in different Items may have identical + * hash-codes. + * + * @return A locally unique hash-code as integer + */ + @Override + public int hashCode() { + return file.hashCode() ^ GitRepositoryContainer.this.hashCode(); + } + + /** + * Tests if the given object is the same as the this object. Two + * Properties got from an Item with the same ID are equal. + * + * @param obj + * an object to compare with this object. + * @return <code>true</code> if the given object is the same as this + * object, <code>false</code> if not + */ + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof FileItem)) { + return false; + } + final FileItem fi = (FileItem) obj; + return fi.getHost() == getHost() && fi.file.equals(file); + } + + /** + * Gets the host of this file. + */ + private GitRepositoryContainer getHost() { + return GitRepositoryContainer.this; + } + + /** + * Gets the file's version + * + * @return Integer + */ + + public String getVersion() { + /* + * If its a directory, there is no version + */ + if (this.file.isDirectory()) { + return null; + } + try { + return XACMLPolicyScanner.getVersion(Paths.get(this.file.getAbsolutePath())); + } catch (IOException e) { + logger.error("Could not get version: " + e); + return "n/a"; + } + } + + /** + * Gets the last modified date of this file. + * + * @return Date + */ + public Date lastModified() { + return new Date(file.lastModified()); + } + + /** + * Gets the name of this file. + * + * @return file name of this file. + */ + public String getName() { + return file.getName(); + } + + public File getFile() { + return file; + } + + /** + * Gets the icon of this file. + * + * @return the icon of this file. + */ + public Resource getIcon() { + return FileTypeResolver.getIcon(file); + } + + /** + * Gets the size of this file. + * + * @return size + */ + public Long getSize() { + if (file.isDirectory()) { + return null; + } + return file.length(); + } + + /** + * Gets the status of this file. + * + * @return status of this file. + */ + public TextArea getStatus() { + TextArea area = null; + try { + Path repoPath = this.getHost().repository; + Git git = Git.open(repoPath.toFile()); + + // + // I would like to use absolutePath, but that seems to barf when + // we try to relativize this if a full path is not given. + // + Path relativePath = repoPath.relativize(Paths.get(this.file.getPath())); + + Status status = git.status().addPath(relativePath.toString()).call(); + if (logger.isDebugEnabled()) { + logger.debug(this.file.getAbsolutePath()); + logger.debug("Added: " + status.getAdded()); + logger.debug("Changed: " + status.getChanged()); + logger.debug("Conflicting: " + status.getConflicting()); + logger.debug("Missing: " + status.getMissing()); + logger.debug("Modified: " + status.getModified()); + logger.debug("Removed: " + status.getRemoved()); + logger.debug("Uncommitted: " + status.getUncommittedChanges()); + logger.debug("Untracked: " + status.getUntracked()); + logger.debug("Untracked folders; " + status.getUntrackedFolders()); + } + // + // Are we a file or directory? + // + StringBuffer buffer = new StringBuffer(); + int length = 0; + if (this.file.isFile()) { + if (status.getAdded().contains(relativePath.toString())) { + buffer.append("Added" + "\n"); + length++; + } + if (status.getChanged().contains(relativePath.toString())) { + buffer.append("Changed" + "\n"); + length++; + } + if (status.getConflicting().contains(relativePath.toString())) { + buffer.append("Conflicting" + "\n"); + length++; + } + if (status.getMissing().contains(relativePath.toString())) { + buffer.append("Missing" + "\n"); + length++; + } + if (status.getModified().contains(relativePath.toString())) { + buffer.append("Modified" + "\n"); + length++; + } + if (status.getRemoved().contains(relativePath.toString())) { + buffer.append("Removed" + "\n"); + length++; + } + if (status.getUncommittedChanges().contains(relativePath.toString())) { + buffer.append("Uncommitted" + "\n"); + length++; + } + if (status.getUntracked().contains(relativePath.toString())) { + buffer.append("Untracked (New)" + "\n"); + length++; + } + if (status.getUntrackedFolders().contains(relativePath.toString())) { + buffer.append("Untracked Folders (New)" + "\n"); + length++; + } + } else if (this.file.isDirectory()) { + if (status.getUntracked().size() > 0) { + buffer.append("Untracked (New)" + "\n"); + length++; + } + if (status.getUntrackedFolders().size() > 0) { + buffer.append("Untracked Folders (New)" + "\n"); + length++; + } + } + if (length > 0) { + area = new TextArea(); + area.setValue(buffer.toString().trim()); + area.setWidth("100.0%"); + area.setRows(length); + area.setReadOnly(true); + } + } catch (IOException | NoWorkTreeException | GitAPIException e) { + logger.error(e); + } + return area; + } + + /** + * Gets the file's data + * + * @return file data + */ + public Object getData() { + return this.data; + } + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { +// if ("".equals(file.getName())) { + // return file.getAbsolutePath(); + // } + return file.getName(); + } + + /** + * Filesystem container does not support adding new properties. + * + * @see com.vaadin.data.Item#addItemProperty(Object, Property) + */ + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Filesystem container does not support adding new properties"); + } + + /** + * Filesystem container does not support removing properties. + * + * @see com.vaadin.data.Item#removeItemProperty(Object) + */ + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Filesystem container does not support property removal"); + } + } + + /** + * Generic file extension filter for displaying only files having certain + * extension. + * + * @author Vaadin Ltd. + * @since 3.0 + */ + public class FileExtensionFilter implements FilenameFilter, Serializable { + + private final String filter; + + /** + * Constructs a new FileExtensionFilter using given extension. + * + * @param fileExtension + * the File extension without the separator (dot). + */ + public FileExtensionFilter(String fileExtension) { + filter = "." + fileExtension; + } + + /** + * Allows only files with the extension and directories. + * + * @see java.io.FilenameFilter#accept(File, String) + */ + @Override + public boolean accept(File dir, String name) { + if (name.endsWith(filter)) { + return true; + } + return new File(dir, name).isDirectory(); + } + + } + + /** + * Returns the file filter used to limit the files in this container. + * + * @return Used filter instance or null if no filter is assigned. + */ + public FilenameFilter getFilter() { + return filter; + } + + /** + * Sets the file filter used to limit the files in this container. + * + * @param filter + * The filter to set. <code>null</code> disables filtering. + */ + public void setFilter(FilenameFilter filter) { + this.filter = filter; + } + + /** + * Sets the file filter used to limit the files in this container. + * + * @param extension + * the Filename extension (w/o separator) to limit the files in + * container. + */ + public void setFilter(String extension) { + filter = new FileExtensionFilter(extension); + } + + /** + * Is this container recursive filesystem. + * + * @return <code>true</code> if container is recursive, <code>false</code> + * otherwise. + */ + public boolean isRecursive() { + return recursive; + } + + /** + * Sets the container recursive property. Set this to false to limit the + * files directly under the root file. + * <p> + * Note : This is meaningful only if the root really is a directory. + * </p> + * + * @param recursive + * the New value for recursive property. + */ + public void setRecursive(boolean recursive) { + this.recursive = recursive; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#addContainerProperty(java.lang.Object, + * java.lang.Class, java.lang.Object) + */ + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "File system container does not support this operation"); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#addItem() + */ + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "Git repository container does not support this operation"); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#addItem(java.lang.Object) + */ + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + if (! (itemId instanceof File)) { + throw new UnsupportedOperationException( + "Git repository container does not support this operation for Objects that are not files."); + } + if (logger.isTraceEnabled()) { + logger.trace("addItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + fireItemSetChange(); + + return new FileItem((File) itemId); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#removeAllItems() + */ + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "File system container does not support this operation"); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#removeItem(java.lang.Object) + */ + @Override + public boolean removeItem(Object itemId) + throws UnsupportedOperationException { + + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName()); + } + + fireItemSetChange(); + return true; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.data.Container#removeContainerProperty(java.lang.Object ) + */ + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "File system container does not support this operation"); + } + + public Object getRoot(int index) { + if (index >= this.roots.length) { + return null; + } + return this.roots[index]; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java new file mode 100644 index 0000000..fbc5ea2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java
@@ -0,0 +1,552 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.lib.IndexDiff; + +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class GitStatusContainer extends ItemSetChangeNotifier implements Container.Ordered, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private Log logger = LogFactory.getLog(GitStatusContainer.class); + + /** + * String identifier of a git file/directory's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a git file/directory's "status" property. + */ + public static String PROPERTY_STATUS = "Status"; + + /** + * String identifier of a git file/directory's "entry" property. + */ + public static String PROPERTY_ENTRY = "Entry"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> GITSTATUS_PROPERTIES; + + private final static Method GITSTATUSITEM_NAME; + + private final static Method GITSTATUSITEM_STATUS; + + private final static Method GITSTATUSITEM_ENTRY; + + static { + GITSTATUS_PROPERTIES = new ArrayList<String>(); + GITSTATUS_PROPERTIES.add(PROPERTY_NAME); + GITSTATUS_PROPERTIES.add(PROPERTY_STATUS); + GITSTATUS_PROPERTIES.add(PROPERTY_ENTRY); + GITSTATUS_PROPERTIES = Collections.unmodifiableCollection(GITSTATUS_PROPERTIES); + try { + GITSTATUSITEM_NAME = StatusItem.class.getMethod("getName", new Class[]{}); + GITSTATUSITEM_STATUS = StatusItem.class.getMethod("getStatus", new Class[]{}); + GITSTATUSITEM_ENTRY = StatusItem.class.getMethod("getGitEntry", new Class[]{}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException("Internal error finding methods in GitStatusContainer"); + } + } + + public class GitEntry { + String name; + boolean added = false; + boolean changed = false; + boolean conflicting = false; + boolean ignoredNotInIndex = false; + boolean missing = false; + boolean modified = false; + boolean removed = false; + boolean uncommitted = false; + boolean untracked = false; + boolean untrackedFolders = false; + + public GitEntry(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isAdded() { + return added; + } + + public void setAdded(boolean added) { + this.added = added; + } + + public boolean isChanged() { + return changed; + } + + public void setChanged(boolean changed) { + this.changed = changed; + } + + public boolean isConflicting() { + return conflicting; + } + + public void setConflicting(boolean conflicting) { + this.conflicting = conflicting; + } + + public boolean isIgnoredNotInIndex() { + return ignoredNotInIndex; + } + + public void setIgnoredNotInIndex(boolean ignoredNotInIndex) { + this.ignoredNotInIndex = ignoredNotInIndex; + } + + public boolean isMissing() { + return missing; + } + + public void setMissing(boolean missing) { + this.missing = missing; + } + + public boolean isModified() { + return modified; + } + + public void setModified(boolean modified) { + this.modified = modified; + } + + public boolean isRemoved() { + return removed; + } + + public void setRemoved(boolean removed) { + this.removed = removed; + } + + public boolean isUncommitted() { + return uncommitted; + } + + public void setUncommitted(boolean uncommitted) { + this.uncommitted = uncommitted; + } + + public boolean isUntracked() { + return untracked; + } + + public void setUntracked(boolean untracked) { + this.untracked = untracked; + } + + public boolean isUntrackedFolders() { + return untrackedFolders; + } + + public void setUntrackedFolders(boolean untrackedFolders) { + this.untrackedFolders = untrackedFolders; + } + + public String getStatus() { + StringBuilder builder = new StringBuilder(); + if (this.isAdded()) { + builder.append("Added" + System.lineSeparator()); + } + if (this.isChanged()) { + builder.append("Changed" + System.lineSeparator()); + } + if (this.isConflicting()) { + builder.append("Conflicting" + System.lineSeparator()); + } + if (this.isMissing()) { + builder.append("Missing" + System.lineSeparator()); + } + if (this.isModified()) { + builder.append("Modified" + System.lineSeparator()); + } + if (this.isRemoved()) { + builder.append("Removed" + System.lineSeparator()); + } + if (this.isUncommitted()) { + builder.append("Uncommitted" + System.lineSeparator()); + } + if (this.isUntracked()) { + builder.append("Untracked" + System.lineSeparator()); + } + if (this.isUntrackedFolders()) { + builder.append("Untracked Folders" + System.lineSeparator()); + } + return builder.toString(); + } + + @Override + public String toString() { + return "GitEntry [name=" + name + ", added=" + added + ", changed=" + + changed + ", conflicting=" + conflicting + + ", ignoredNotInIndex=" + ignoredNotInIndex + ", missing=" + + missing + ", modified=" + modified + ", removed=" + + removed + ", uncommitted=" + uncommitted + ", untracked=" + + untracked + ", untrackedFolders=" + untrackedFolders + + "]"; + } + } + + // + // This is our data, a sorted map + // + private TreeMap<String, GitEntry> map = null; + private Map<String, IndexDiff.StageState> conflictingStage = null; + int conflictCount = 0; + + public GitStatusContainer(Status status) { + super(); + this.setContainer(this); + // + // Initialize + // + this.refreshStatus(status); + } + + public void refreshStatus(Status status) { + // + // Save this + // + this.conflictingStage = status.getConflictingStageState(); + if (logger.isDebugEnabled()) { + logger.debug("conflictingStage: " + this.conflictingStage.size()); + } + // + // Re-create this + // + this.map = new TreeMap<String, GitEntry>(); + this.conflictCount = 0; + // + // Iterate through everything + // + for (String id : status.getAdded()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setAdded(true); + } + for (String id : status.getChanged()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setChanged(true); + } + for (String id : status.getConflicting()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setConflicting(true); + // + // + // + conflictCount++; + } + for (String id : status.getMissing()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setMissing(true); + } + for (String id : status.getModified()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setModified(true); + } + for (String id : status.getRemoved()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setRemoved(true); + } + for (String id : status.getUncommittedChanges()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setUncommitted(true); + } + for (String id : status.getUntracked()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setUntracked(true); + } + for (String id : status.getUntrackedFolders()) { + if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) { + continue; + } + GitEntry entry = this.map.get(id); + if (entry == null) { + entry = new GitEntry(id); + this.map.put(id, entry); + } + entry.setUntrackedFolders(true); + } + } + + public Map<String, IndexDiff.StageState> getConflictingStageState() { + return this.conflictingStage; + } + + public int getConflictCount() { + return this.conflictCount; + } + + @Override + public Item getItem(Object itemId) { + return new StatusItem(map.get(itemId)); + } + + @Override + public Collection<?> getContainerPropertyIds() { + return GITSTATUS_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<String> items = new ArrayList<String>(); + items.addAll(this.map.keySet()); + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<Object> getContainerProperty(Object itemId, Object propertyId) { + GitEntry entry = this.map.get(itemId); + if (entry == null) { +// logger.error("unknown itemId: " + itemId); + return null; + } + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new StatusItem(entry), GITSTATUSITEM_NAME, null); + } + if (propertyId.equals(PROPERTY_STATUS)) { + return new MethodProperty<Object>(getType(propertyId), + new StatusItem(entry), GITSTATUSITEM_STATUS, null); + } + if (propertyId.equals(PROPERTY_ENTRY)) { + return new MethodProperty<Object>(getType(propertyId), + new StatusItem(entry), GITSTATUSITEM_ENTRY, null); + } + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_STATUS)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ENTRY)) { + return GitEntry.class; + } + return null; + } + + @Override + public int size() { + return this.map.size(); + } + + @Override + public boolean containsId(Object itemId) { + return this.map.containsKey(itemId); + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't add items."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't add items."); + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't remove items."); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't add properties."); + } + + @Override + public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't remove properties."); + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't remove items."); + } + + @Override + public Object nextItemId(Object itemId) { + return this.map.higherKey((String) itemId); + } + + @Override + public Object prevItemId(Object itemId) { + return this.map.lowerKey((String) itemId); + } + + @Override + public Object firstItemId() { + return this.map.firstKey(); + } + + @Override + public Object lastItemId() { + return this.map.lastKey(); + } + + @Override + public boolean isFirstId(Object itemId) { + return itemId.equals(this.map.firstKey()); + } + + @Override + public boolean isLastId(Object itemId) { + return itemId.equals(this.map.lastKey()); + } + + @Override + public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't add items."); + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Can't add items."); + } + + public class StatusItem implements Item { + private static final long serialVersionUID = 1L; + private final GitEntry entry; + + public StatusItem(GitEntry itemId) { + this.entry = itemId; + } + + public String getName() { + return this.entry.getName(); + } + + public String getStatus() { + return this.entry.getStatus(); + } + + public GitEntry getGitEntry() { + return this.entry; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.entry, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Container does not support adding new properties"); + } + + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Container does not support removing properties"); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java new file mode 100644 index 0000000..7ad49ca --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java
@@ -0,0 +1,118 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.io.Serializable; +import java.util.Collection; +import java.util.EventObject; +import java.util.LinkedList; + +import com.vaadin.data.Container; +import com.vaadin.data.Container.ItemSetChangeEvent; +import com.vaadin.data.Container.ItemSetChangeListener; + +public class ItemSetChangeNotifier implements Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private Collection<Container.ItemSetChangeListener> itemSetChangeListeners = null; + private Container container = null; + + public ItemSetChangeNotifier() { + } + + protected void setContainer(Container c) { + this.container = c; + } + + @Override + public void addItemSetChangeListener(ItemSetChangeListener listener) { + if (getItemSetChangeListeners() == null) { + setItemSetChangeListeners(new LinkedList<Container.ItemSetChangeListener>()); + } + getItemSetChangeListeners().add(listener); } + + // TODO - Container.ItemSetChangeNotifier.addListener has been deprecated and replaced with + // Container.ItemSetChangeNotifier.addItemSetChangeListener + @Override + public void addListener(ItemSetChangeListener listener) { + addItemSetChangeListener(listener); + } + + @Override + public void removeItemSetChangeListener(ItemSetChangeListener listener) { + if (getItemSetChangeListeners() != null) { + getItemSetChangeListeners().remove(listener); + } + } + + // TODO - Container.ItemSetChangeNotifier.removeListener has been deprecated and replaced with + // Container.ItemSetChangeNotifier.removeItemSetChangeListener + @Override + public void removeListener(ItemSetChangeListener listener) { + removeItemSetChangeListener(listener); + } + + protected static class BaseItemSetChangeEvent extends EventObject implements + Container.ItemSetChangeEvent, Serializable { + private static final long serialVersionUID = 1L; + + protected BaseItemSetChangeEvent(Container source) { + super(source); + } + + @Override + public Container getContainer() { + return (Container) getSource(); + } + } + + protected void setItemSetChangeListeners( + Collection<Container.ItemSetChangeListener> itemSetChangeListeners) { + this.itemSetChangeListeners = itemSetChangeListeners; + } + protected Collection<Container.ItemSetChangeListener> getItemSetChangeListeners() { + return itemSetChangeListeners; + } + /** + * Sends a simple Item set change event to all interested listeners, + * indicating that anything in the contents may have changed (items added, + * removed etc.). + */ + protected void fireItemSetChange() { + fireItemSetChange(new BaseItemSetChangeEvent(this.container)); + } + + /** + * Sends an Item set change event to all registered interested listeners. + * + * @param event + * the item set change event to send, optionally with additional + * information + */ + protected void fireItemSetChange(ItemSetChangeEvent event) { + if (getItemSetChangeListeners() != null) { + final Object[] l = getItemSetChangeListeners().toArray(); + for (int i = 0; i < l.length; i++) { + ((Container.ItemSetChangeListener) l[i]) + .containerItemSetChange(event); + } + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java new file mode 100644 index 0000000..a187ef7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java
@@ -0,0 +1,143 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +import com.vaadin.data.Container.Filter; +import com.vaadin.data.util.sqlcontainer.RowItem; +import com.vaadin.data.util.sqlcontainer.SQLUtil; +import com.vaadin.data.util.sqlcontainer.query.FreeformStatementDelegate; +import com.vaadin.data.util.sqlcontainer.query.OrderBy; +import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; +import com.vaadin.data.util.sqlcontainer.query.generator.filter.QueryBuilder; + +public class MatchFunctionQueryDelegate implements FreeformStatementDelegate { + private static final long serialVersionUID = 1L; + private List<Filter> filters = null; + private List<OrderBy> orderBys = null; + + public MatchFunctionQueryDelegate() { + } + + @Override + public String getQueryString(int offset, int limit) + throws UnsupportedOperationException { + throw new UnsupportedOperationException("use getQueryStatement"); + } + + @Override + public String getCountQuery() throws UnsupportedOperationException { + throw new UnsupportedOperationException("getCountStatement"); + } + + @Override + public void setFilters(List<Filter> filters) + throws UnsupportedOperationException { + this.filters = filters; + } + + @Override + public void setOrderBy(List<OrderBy> orderBys) + throws UnsupportedOperationException { + this.orderBys = orderBys; + } + + @Override + public int storeRow(Connection conn, RowItem row) + throws UnsupportedOperationException, SQLException { + throw new UnsupportedOperationException("Cannot store anything"); + } + + @Override + public boolean removeRow(Connection conn, RowItem row) + throws UnsupportedOperationException, SQLException { + throw new UnsupportedOperationException("Cannot remove anything"); + } + + @Override + public String getContainsRowQueryString(Object... keys) + throws UnsupportedOperationException { + throw new UnsupportedOperationException("use getContainsRowQueryStatement"); + } + + @Override + public StatementHelper getQueryStatement(int offset, int limit) + throws UnsupportedOperationException { + StatementHelper sh = new StatementHelper(); + StringBuffer query = new StringBuffer("SELECT * FROM match_functions "); + if (this.filters != null && this.filters.isEmpty() == false) { + query.append(QueryBuilder.getWhereStringForFilters(this.filters, sh)); + } + query.append(getOrderByString()); + if (offset != 0 || limit != 0) { + query.append(" LIMIT ").append(limit); + query.append(" OFFSET ").append(offset); + } + sh.setQueryString(query.toString()); + return sh; + } + + @Override + public StatementHelper getCountStatement() + throws UnsupportedOperationException { + StatementHelper sh = new StatementHelper(); + StringBuffer query = new StringBuffer("SELECT COUNT(*) FROM match_functions "); + if (this.filters != null && this.filters.isEmpty() == false) { + query.append(QueryBuilder.getWhereStringForFilters(this.filters, sh)); + } + query.append(getOrderByString()); + sh.setQueryString(query.toString()); + return sh; + } + + @Override + public StatementHelper getContainsRowQueryStatement(Object... keys) + throws UnsupportedOperationException { + StatementHelper sh = new StatementHelper(); + StringBuffer query = new StringBuffer("SELECT * FROM match_functions WHERE ARGUMENT_ID = ?"); + sh.addParameterValue(keys[0]); + sh.setQueryString(query.toString()); + return sh; + } + + private String getOrderByString() { + StringBuffer orderBuffer = new StringBuffer(""); + if (this.orderBys != null && !this.orderBys.isEmpty()) { + orderBuffer.append(" ORDER BY "); + OrderBy lastOrderBy = this.orderBys.get(this.orderBys.size() - 1); + for (OrderBy orderBy : this.orderBys) { + orderBuffer.append(SQLUtil.escapeSQL(orderBy.getColumn())); + if (orderBy.isAscending()) { + orderBuffer.append(" ASC"); + } else { + orderBuffer.append(" DESC"); + } + if (orderBy != lastOrderBy) { + orderBuffer.append(", "); + } + } + } + return orderBuffer.toString(); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java new file mode 100644 index 0000000..65f8a3c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java
@@ -0,0 +1,1385 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.JAXBElement; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class ObligationAdviceContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(ObligationAdviceContainer.class); + + public static String PROPERTY_NAME = "Name"; + public static String PROPERTY_ID = "Id"; + public static String PROPERTY_ID_SHORT = "ShortId"; + public static String PROPERTY_EFFECT = "Effect"; + public static String PROPERTY_CATEGORY = "Category"; + public static String PROPERTY_CATEGORY_SHORT = "ShortCategory"; + public static String PROPERTY_DATATYPE = "Datatype"; + public static String PROPERTY_DATATYPE_SHORT = "ShortDatatype"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> OBADVICE_PROPERTIES; + + private final static Method OBADVICE_ITEM_NAME; + + private final static Method OBADVICE_ITEM_ID; + + private final static Method OBADVICE_ITEM_ID_SHORT; + + private final static Method OBADVICE_ITEM_EFFECT; + + private final static Method OBADVICE_ITEM_DATATYPE; + + private final static Method OBADVICE_ITEM_DATATYPE_SHORT; + + private final static Method OBADVICE_ITEM_CATEGORY; + + private final static Method OBADVICE_ITEM_CATEGORY_SHORT; + + static { + OBADVICE_PROPERTIES = new ArrayList<String>(); + OBADVICE_PROPERTIES.add(PROPERTY_NAME); + OBADVICE_PROPERTIES.add(PROPERTY_ID); + OBADVICE_PROPERTIES.add(PROPERTY_ID_SHORT); + OBADVICE_PROPERTIES.add(PROPERTY_EFFECT); + OBADVICE_PROPERTIES.add(PROPERTY_CATEGORY); + OBADVICE_PROPERTIES.add(PROPERTY_DATATYPE_SHORT); + OBADVICE_PROPERTIES.add(PROPERTY_DATATYPE); + OBADVICE_PROPERTIES.add(PROPERTY_CATEGORY_SHORT); + OBADVICE_PROPERTIES = Collections.unmodifiableCollection(OBADVICE_PROPERTIES); + try { + OBADVICE_ITEM_NAME = ObAdviceItem.class.getMethod("getName", new Class[]{}); + OBADVICE_ITEM_ID = ObAdviceItem.class.getMethod("getId", new Class[]{}); + OBADVICE_ITEM_ID_SHORT = ObAdviceItem.class.getMethod("getIdShort", new Class[]{}); + OBADVICE_ITEM_EFFECT = ObAdviceItem.class.getMethod("getEffect", new Class[]{}); + OBADVICE_ITEM_DATATYPE = ObAdviceItem.class.getMethod("getDatatype", new Class[]{}); + OBADVICE_ITEM_DATATYPE_SHORT = ObAdviceItem.class.getMethod("getDatatypeShort", new Class[]{}); + OBADVICE_ITEM_CATEGORY = ObAdviceItem.class.getMethod("getCategory", new Class[]{}); + OBADVICE_ITEM_CATEGORY_SHORT = ObAdviceItem.class.getMethod("getCategoryShort", new Class[]{}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in ObligationAdviceContainer"); + } + } + // + // Our root object + // + private final Object root; + // + // Our helper maps to control the hierarchy + // + private List<AdviceExpressionType> rootAdvice = new ArrayList<AdviceExpressionType>(); + private List<ObligationExpressionType> rootObligations = new ArrayList<ObligationExpressionType>(); + private Map<AttributeAssignmentExpressionType, AdviceExpressionType> adviceExpressions = new HashMap<AttributeAssignmentExpressionType, AdviceExpressionType>(); + private Map<AttributeAssignmentExpressionType, ObligationExpressionType> obligationExpressions = new HashMap<AttributeAssignmentExpressionType, ObligationExpressionType>(); + private Map<AttributeValueType, AttributeAssignmentExpressionType> values = new HashMap<AttributeValueType, AttributeAssignmentExpressionType>(); + private Map<AttributeDesignatorType, AttributeAssignmentExpressionType> designators = new HashMap<AttributeDesignatorType, AttributeAssignmentExpressionType>(); + private Map<AttributeSelectorType, AttributeAssignmentExpressionType> selectors = new HashMap<AttributeSelectorType, AttributeAssignmentExpressionType>(); + private Map<ApplyType, AttributeAssignmentExpressionType> applys = new HashMap<ApplyType, AttributeAssignmentExpressionType>(); + + public ObligationAdviceContainer(Object root) { + super(); + this.setContainer(this); + // + // Save + // + this.root = root; + // + // Initialize + // + this.initialize(); + } + + protected void initialize() { + if (this.root instanceof AdviceExpressionsType) { + for (AdviceExpressionType advice : ((AdviceExpressionsType) this.root).getAdviceExpression()) { + this.rootAdvice.add(advice); + for (AttributeAssignmentExpressionType assignment : advice.getAttributeAssignmentExpression()) { + this.adviceExpressions.put(assignment, advice); + this.addExpression(assignment.getExpression(), assignment); + } + } + } else if (this.root instanceof ObligationExpressionsType) { + for (ObligationExpressionType obligation : ((ObligationExpressionsType) this.root).getObligationExpression()) { + this.rootObligations.add(obligation); + for (AttributeAssignmentExpressionType assignment : obligation.getAttributeAssignmentExpression()) { + this.obligationExpressions.put(assignment, obligation); + this.addExpression(assignment.getExpression(), assignment); + } + } + } else { + throw new IllegalArgumentException("This container supports only advice or obligation expressions."); + } + } + + private void addExpression(JAXBElement<?> element, AttributeAssignmentExpressionType parent) { + if (element.getValue() == null) { + return; + } + if (element.getValue() instanceof AttributeValueType) { + this.values.put((AttributeValueType) element.getValue(), parent); + } else if (element.getValue() instanceof AttributeDesignatorType) { + this.designators.put((AttributeDesignatorType) element.getValue(), parent); + } else if (element.getValue() instanceof AttributeSelectorType) { + this.selectors.put((AttributeSelectorType) element.getValue(), parent); + } else if (element.getValue() instanceof ApplyType) { + this.applys.put((ApplyType) element.getValue(), parent); + } else { + // + // TODO + // + logger.error("Adding unknown expression type"); + } + } + + public boolean isObjectSupported(Object itemId) { + if (itemId instanceof AdviceExpressionType) { + return true; + } + if (itemId instanceof ObligationExpressionType) { + return true; + } + if (itemId instanceof AttributeAssignmentExpressionType) { + return true; + } + if (itemId instanceof AttributeValueType) { + return true; + } + if (itemId instanceof AttributeDesignatorType) { + return true; + } + if (itemId instanceof AttributeSelectorType) { + return true; + } + if (itemId instanceof ApplyType) { + return true; + } + return false; + } + + public void updateItem(Object itemId) { + this.fireItemSetChange(); + } + + @Override + public Item getItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getItem: " + itemId); + } + if (this.isObjectSupported(itemId) == false) { + return null; + } + return new ObAdviceItem(itemId); + } + + @Override + public Collection<?> getContainerPropertyIds() { + return OBADVICE_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + if (this.root instanceof ObligationExpressionsType) { + items.addAll(this.rootObligations); + if (this.obligationExpressions.isEmpty() == false) { + items.addAll(this.obligationExpressions.keySet()); + } + } else if (this.root instanceof AdviceExpressionsType) { + items.addAll(this.rootAdvice); + if (this.adviceExpressions.isEmpty() == false) { + items.addAll(this.adviceExpressions.keySet()); + } + } + if (this.values.isEmpty() == false) { + items.add(this.values.keySet()); + } + if (this.designators.isEmpty() == false) { + items.add(this.designators.keySet()); + } + if (this.selectors.isEmpty() == false) { + items.add(this.selectors.keySet()); + } + if (this.applys.isEmpty() == false) { + items.add(this.applys.keySet()); + } + if (logger.isTraceEnabled()) { + logger.trace("getItemIds (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_ID_SHORT)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_ID_SHORT, null); + } + + if (propertyId.equals(PROPERTY_EFFECT)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_EFFECT, null); + } + + if (propertyId.equals(PROPERTY_DATATYPE)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_DATATYPE, null); + } + + if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_DATATYPE_SHORT, null); + } + + if (propertyId.equals(PROPERTY_CATEGORY)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_CATEGORY, null); + } + + if (propertyId.equals(PROPERTY_CATEGORY_SHORT)) { + return new MethodProperty<Object>(getType(propertyId), + new ObAdviceItem(itemId), OBADVICE_ITEM_CATEGORY_SHORT, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ID_SHORT)) { + return String.class; + } + if (propertyId.equals(PROPERTY_EFFECT)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DATATYPE)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) { + return String.class; + } + if (propertyId.equals(PROPERTY_CATEGORY)) { + return String.class; + } + if (propertyId.equals(PROPERTY_CATEGORY_SHORT)) { + return String.class; + } + return null; + } + + @Override + public int size() { + int size = 0; + if (this.root instanceof ObligationExpressionsType) { + size += this.rootObligations.size(); + size += this.obligationExpressions.size(); + } else if (this.root instanceof AdviceExpressionsType) { + size += this.rootAdvice.size(); + size += this.adviceExpressions.size(); + } + size += this.values.size(); + size += this.designators.size(); + size += this.selectors.size(); + size += this.applys.size(); + if (logger.isTraceEnabled()) { + logger.trace("size: " + size); + } + return size; + } + + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + itemId); + } + if (itemId instanceof AdviceExpressionType) { + return this.rootAdvice.contains(itemId); + } + if (itemId instanceof ObligationExpressionType) { + return this.rootObligations.contains(itemId); + } + if (itemId instanceof AttributeAssignmentExpressionType) { + if (this.root instanceof ObligationExpressionsType) { + return this.obligationExpressions.containsKey(itemId); + } else if (this.root instanceof AdviceExpressionsType) { + return this.adviceExpressions.containsKey(itemId); + } + } + if (itemId instanceof AttributeValueType) { + return this.values.containsKey(itemId); + } + if (itemId instanceof AttributeDesignatorType) { + return this.designators.containsKey(itemId); + } + if (itemId instanceof AttributeSelectorType) { + return this.selectors.containsKey(itemId); + } + if (itemId instanceof ApplyType) { + return this.applys.containsKey(itemId); + } + return false; + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + if (itemId instanceof ObligationExpressionType || + itemId instanceof AdviceExpressionType) { + return this.addItem(itemId, null); + } + throw new UnsupportedOperationException("Must be Obligation or Advice Expression Type."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + if (this.root instanceof ObligationExpressionsType) { + return this.addItem(new ObligationExpressionType(), null); + } else if (this.root instanceof AdviceExpressionsType) { + return this.addItem(new AdviceExpressionType(), null); + } + // + // Should never get here + // + return null; + } + + public Item addItem(Object itemId, Object parent) { + if (logger.isTraceEnabled()) { + logger.trace("addItem: " + itemId + " " + parent); + } + // + // Check itemId to see if its supported + // + if (this.isObjectSupported(itemId) == false) { + logger.error("Unsupported itemid: " + itemId.getClass().getCanonicalName()); + return null; + } + // + // Determine what they are trying to add + // + if (this.root instanceof ObligationExpressionsType) { + if (itemId instanceof ObligationExpressionType) { + // + // Adding a new root obligation expression, is it already in the parent. + // + if (((ObligationExpressionsType)this.root).getObligationExpression().contains(itemId) == false) { + // + // It doesn't exist in the object, add it in + // + ((ObligationExpressionsType)this.root).getObligationExpression().add((ObligationExpressionType) itemId); + } + // + // Track this + // + this.rootObligations.add((ObligationExpressionType) itemId); + // + // Notify + // + this.fireItemSetChange(); + // + // Return the item + // + return new ObAdviceItem(itemId); + } + if (itemId instanceof AttributeAssignmentExpressionType) { + // + // Sanity check the parent + // + if (parent instanceof ObligationExpressionType == false) { + logger.error("Incorrect parent type: " + parent.getClass().getCanonicalName()); + return null; + } + // + // Does the parent object exist? + // + if (((ObligationExpressionsType)this.root).getObligationExpression().contains(parent) == false) { + // + // This is a new obligation + // + logger.info("addItem - parent not found, adding." + ((ObligationExpressionType) parent).getObligationId()); + ((ObligationExpressionsType)this.root).getObligationExpression().add((ObligationExpressionType) parent); + // + // track it + // + this.rootObligations.add((ObligationExpressionType) parent); + } + // + // Check if the item needs to be added to the parent object + // + if (((ObligationExpressionType) parent).getAttributeAssignmentExpression().contains(itemId) == false) { + // + // Put the assignment into the parent + // + ((ObligationExpressionType) parent).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId); + // + // Add the contained expression + // + this.addExpression(((AttributeAssignmentExpressionType) itemId).getExpression(), (AttributeAssignmentExpressionType) itemId); + } + // + // track this in our map + // + this.obligationExpressions.put((AttributeAssignmentExpressionType) itemId, (ObligationExpressionType) parent); + // + // Notify + // + this.fireItemSetChange(); + // + // Return the item + // + return new ObAdviceItem(itemId); + } + if (parent instanceof AttributeAssignmentExpressionType) { + // + // Does the parent object exist? + // + if (this.obligationExpressions.containsKey(parent) == false) { + // + // No - we can't add it. Need more information. + // + logger.info("addItem - parent not found, adding." + ((AttributeAssignmentExpressionType) parent).getAttributeId()); + return null; + } + if (itemId instanceof AttributeValueType) { + this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof AttributeDesignatorType) { + this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof AttributeSelectorType) { + this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof ApplyType) { + this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) parent); + } else { + logger.error("Should not get here. The object was checked in the beginning of the function. Someone removed or altered that check."); + assert false; + return null; + } + // + // Notify + // + this.fireItemSetChange(); + // + // Return the item + // + return new ObAdviceItem(itemId); + } + } else if (this.root instanceof AdviceExpressionsType) { + // + // Are we adding new root advice expression? + // + if (itemId instanceof AdviceExpressionType) { + // + // Adding a new root obligation expression, is it already in the parent. + // + if (((AdviceExpressionsType)this.root).getAdviceExpression().contains(itemId) == false) { + // + // No - add it in + // + ((AdviceExpressionsType)this.root).getAdviceExpression().add((AdviceExpressionType) itemId); + } + // + // Track this object + // + this.rootAdvice.add((AdviceExpressionType) itemId); + // + // Notify + // + this.fireItemSetChange(); + // + // Return the new item + // + return new ObAdviceItem(itemId); + } + if (itemId instanceof AttributeAssignmentExpressionType) { + // + // Sanity check + // + if (parent instanceof AdviceExpressionType == false) { + logger.error("Incorrect parent type: " + parent.getClass().getCanonicalName()); + return null; + } + // + // Does the parent object exist? + // + if (((AdviceExpressionsType)this.root).getAdviceExpression().contains(parent) == false) { + // + // This is a new obligation + // + logger.info("addItem - parent not found, adding." + ((AdviceExpressionType) parent).getAdviceId()); + ((AdviceExpressionsType)this.root).getAdviceExpression().add((AdviceExpressionType) parent); + // + // Track it + // + this.rootAdvice.add((AdviceExpressionType) parent); + } + // + // Check if the item needs to be added to the parent object + // + if (((AdviceExpressionType) parent).getAttributeAssignmentExpression().contains(itemId) == false) { + // + // Put the assignment into the parent + // + ((AdviceExpressionType) parent).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId); + // + // Add the contained expression + // + this.addExpression(((AttributeAssignmentExpressionType) itemId).getExpression(), (AttributeAssignmentExpressionType) itemId); + } + // + // track this in our map + // + this.adviceExpressions.put((AttributeAssignmentExpressionType) itemId, (AdviceExpressionType) parent); + // + // Notify + // + this.fireItemSetChange(); + // + // Return the item + // + return new ObAdviceItem(itemId); + } + if (parent instanceof AttributeAssignmentExpressionType) { + // + // Does the parent object exist? + // + if (this.adviceExpressions.containsKey(parent) == false) { + // + // No - we can't add it. Need more information. + // + logger.info("addItem - parent not found, adding." + ((AttributeAssignmentExpressionType) parent).getAttributeId()); + return null; + } + if (itemId instanceof AttributeValueType) { + this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof AttributeDesignatorType) { + this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof AttributeSelectorType) { + this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) parent); + } else if (itemId instanceof ApplyType) { + this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) parent); + } else { + logger.error("Should not get here. Someone altered the object supported check or removed the code."); + assert false; + return null; + } + // + // Notify + // + this.fireItemSetChange(); + // + // Return new item + // + return new ObAdviceItem(itemId); + } + } else { + // + // We should not ever get here. + // + logger.error("The root object is incorrect."); + return null; + } + logger.error("Unsupported combination of itemId and parent classes."); + return null; + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + public boolean removeAllAssignments () { + if (logger.isTraceEnabled()) { + logger.trace("removeAllAssignments:"); + } + if (this.root instanceof ObligationExpressionsType) { + ((ObligationExpressionsType)this.root).getObligationExpression().clear(); + this.obligationExpressions.clear(); + } else if (this.root instanceof AdviceExpressionsType) { + ((AdviceExpressionsType)this.root).getAdviceExpression().clear(); + this.adviceExpressions.clear(); + } + this.values.clear(); + this.designators.clear(); + this.selectors.clear(); + this.applys.clear(); + // + // Notify + // + this.fireItemSetChange(); + return true; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeAllItems:"); + } + if (this.root instanceof ObligationExpressionsType) { + ((ObligationExpressionsType)this.root).getObligationExpression().clear(); + this.rootObligations.clear(); + this.obligationExpressions.clear(); + } else if (this.root instanceof AdviceExpressionsType) { + ((AdviceExpressionsType)this.root).getAdviceExpression().clear(); + this.rootAdvice.clear(); + this.adviceExpressions.clear(); + } + this.values.clear(); + this.designators.clear(); + this.selectors.clear(); + this.applys.clear(); + // + // Notify + // + this.fireItemSetChange(); + return true; + } + + @Override + public Collection<?> getChildren(Object itemId) { + final Collection<Object> items = new ArrayList<Object>(); + if (itemId instanceof AdviceExpressionType) { + if (this.rootAdvice.contains(itemId)) { + items.addAll(((AdviceExpressionType) itemId).getAttributeAssignmentExpression()); + } else { + logger.error("getChildren: itemId not in root advice expression " + ((AdviceExpressionType) itemId).getAdviceId()); + } + } + if (itemId instanceof ObligationExpressionType) { + if (this.rootObligations.contains(itemId)) { + items.addAll(((ObligationExpressionType) itemId).getAttributeAssignmentExpression()); + } else { + logger.error("getChildren: itemId not in root obligation expression " + ((ObligationExpressionType) itemId).getObligationId()); + } + } + if (itemId instanceof AttributeAssignmentExpressionType) { + if (this.root instanceof ObligationExpressionsType) { + if (this.obligationExpressions.containsKey(itemId)) { + JAXBElement<?> element = ((AttributeAssignmentExpressionType) itemId).getExpression(); + if (element != null && element.getValue() != null) { + items.add(element.getValue()); + } + } else { + logger.error("getChildren: itemId not in obligation expressions " + ((AttributeAssignmentExpressionType) itemId).getAttributeId()); + } + } else if (this.root instanceof AdviceExpressionsType) { + if (this.adviceExpressions.containsKey(itemId)) { + JAXBElement<?> element = ((AttributeAssignmentExpressionType) itemId).getExpression(); + if (element != null && element.getValue() != null) { + items.add(element.getValue()); + } + } else { + logger.error("getChildren: itemId not in advice expressions " + ((AttributeAssignmentExpressionType) itemId).getAttributeId()); + } + } + } + if (logger.isTraceEnabled()) { + logger.trace("getChildren " + itemId + "(" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Object getParent(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getParent: " + itemId); + } + assert itemId != null; + if (itemId instanceof AdviceExpressionType) { + if (this.root instanceof AdviceExpressionsType) { + return this.root; + } + return null; + } + if (itemId instanceof ObligationExpressionType) { + if (this.root instanceof ObligationExpressionsType) { + return this.root; + } + return null; + } + if (itemId instanceof AttributeAssignmentExpressionType) { + if (this.root instanceof ObligationExpressionsType) { + return this.obligationExpressions.get(itemId); + } else if (this.root instanceof AdviceExpressionsType) { + return this.adviceExpressions.get(itemId); + } + } + if (itemId instanceof AttributeValueType) { + return this.values.get(itemId); + } + if (itemId instanceof AttributeDesignatorType) { + return this.designators.get(itemId); + } + if (itemId instanceof AttributeSelectorType) { + return this.selectors.get(itemId); + } + if (itemId instanceof ApplyType) { + return this.applys.get(itemId); + } + return null; + } + + @Override + public Collection<?> rootItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + if (this.root instanceof ObligationExpressionsType) { + items.addAll(this.rootObligations); + } else if (this.root instanceof AdviceExpressionsType) { + items.addAll(this.rootAdvice); + } + if (logger.isTraceEnabled()) { + logger.trace("rootItemIds (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("setParent: " + itemId); + } + if (itemId instanceof AdviceExpressionType) { + return false; + } + if (itemId instanceof ObligationExpressionType) { + return false; + } + if (itemId instanceof AttributeAssignmentExpressionType) { + if (this.root instanceof ObligationExpressionsType && newParentId instanceof ObligationExpressionType) { + // + // Remove it from its parent object + // + ObligationExpressionType oldParent = this.obligationExpressions.get(itemId); + if (oldParent.getAttributeAssignmentExpression().remove(itemId)) { + // + // See if its in the new parent + // + if (((ObligationExpressionType) newParentId).getAttributeAssignmentExpression().contains(itemId) == false) { + // + // Nope, add it in + // + ((ObligationExpressionType) newParentId).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId); + } + // + // Update our tracking + // + this.obligationExpressions.put((AttributeAssignmentExpressionType) itemId, (ObligationExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + } else if (this.root instanceof AdviceExpressionsType) { + // + // Remove it from its parent object + // + AdviceExpressionType oldParent = this.adviceExpressions.get(itemId); + if (oldParent.getAttributeAssignmentExpression().remove(itemId)) { + // + // See if its in the new parent + // + if (((AdviceExpressionType) newParentId).getAttributeAssignmentExpression().contains(itemId) == false) { + // + // Nope, add it in + // + ((AdviceExpressionType) newParentId).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId); + } + // + // Update our tracking + // + this.adviceExpressions.put((AttributeAssignmentExpressionType) itemId, (AdviceExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + } + return false; + } + if (itemId instanceof AttributeValueType && newParentId instanceof AttributeAssignmentExpressionType) { + AttributeAssignmentExpressionType oldParent = this.values.get(itemId); + if (oldParent != null && + oldParent.getExpression() != null && + oldParent.getExpression().getValue() != null && + oldParent.getExpression().getValue() == itemId) { + // + // Remove from old parent + // + oldParent.setExpression(null); + // + // Put in new parent + // + ((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeValue((AttributeValueType) itemId)); + // + // track it + // + this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + return false; + } + if (itemId instanceof AttributeDesignatorType && newParentId instanceof AttributeAssignmentExpressionType) { + AttributeAssignmentExpressionType oldParent = this.designators.get(itemId); + if (oldParent != null && + oldParent.getExpression() != null && + oldParent.getExpression().getValue() != null && + oldParent.getExpression().getValue() == itemId) { + // + // Remove from old parent + // + oldParent.setExpression(null); + // + // Put in new parent + // + ((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) itemId)); + // + // track it + // + this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + return false; + } + if (itemId instanceof AttributeSelectorType && newParentId instanceof AttributeAssignmentExpressionType) { + AttributeAssignmentExpressionType oldParent = this.selectors.get(itemId); + if (oldParent != null && + oldParent.getExpression() != null && + oldParent.getExpression().getValue() != null && + oldParent.getExpression().getValue() == itemId) { + // + // Remove from old parent + // + oldParent.setExpression(null); + // + // Put in new parent + // + ((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeSelector((AttributeSelectorType) itemId)); + // + // track it + // + this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + return false; + } + if (itemId instanceof ApplyType && newParentId instanceof AttributeAssignmentExpressionType) { + AttributeAssignmentExpressionType oldParent = this.applys.get(itemId); + if (oldParent != null && + oldParent.getExpression() != null && + oldParent.getExpression().getValue() != null && + oldParent.getExpression().getValue() == itemId) { + // + // Remove from old parent + // + oldParent.setExpression(null); + // + // Put in new parent + // + ((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createApply((ApplyType) itemId)); + // + // track it + // + this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) newParentId); + // + // Fire + // + this.fireItemSetChange(); + return true; + } + return false; + } + return false; + } + + @Override + public boolean areChildrenAllowed(Object itemId) { + if (itemId instanceof AdviceExpressionType) { + return true; + } + if (itemId instanceof ObligationExpressionType) { + return true; + } + if (itemId instanceof AttributeAssignmentExpressionType) { + return true; + } + if (itemId instanceof AttributeValueType) { + return false; + } + if (itemId instanceof AttributeDesignatorType) { + return false; + } + if (itemId instanceof AttributeSelectorType) { + return false; + } + if (itemId instanceof ApplyType) { + return false; + } + return false; + } + + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException { + if (itemId instanceof AdviceExpressionType) { + return (areChildrenAllowed ? true : false); + } + if (itemId instanceof ObligationExpressionType) { + return (areChildrenAllowed ? true : false); + } + if (itemId instanceof AttributeAssignmentExpressionType) { + return (areChildrenAllowed ? true : false); + } + if (itemId instanceof AttributeValueType) { + return (areChildrenAllowed == false ? true : false); + } + if (itemId instanceof AttributeDesignatorType) { + return (areChildrenAllowed == false ? true : false); + } + if (itemId instanceof AttributeSelectorType) { + return (areChildrenAllowed == false ? true : false); + } + if (itemId instanceof ApplyType) { + return (areChildrenAllowed == false ? true : false); + } + return false; + } + + @Override + public boolean isRoot(Object itemId) { + if (this.root instanceof AdviceExpressionsType) { + return this.rootAdvice.contains(itemId); + } else if (this.root instanceof ObligationExpressionsType) { + return this.rootObligations.contains(itemId); + } + return false; + } + + @Override + public boolean hasChildren(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("hasChildren: " + itemId); + } + if (itemId instanceof AdviceExpressionType && this.root instanceof AdviceExpressionsType && + this.rootAdvice.contains(itemId)) { + return ((AdviceExpressionType) itemId).getAttributeAssignmentExpression().size() > 0; + } + if (itemId instanceof ObligationExpressionType && this.root instanceof ObligationExpressionsType && + this.rootObligations.contains(itemId)) { + return ((ObligationExpressionType) itemId).getAttributeAssignmentExpression().size() > 0; + } + if (itemId instanceof AttributeAssignmentExpressionType) { + if (this.root instanceof ObligationExpressionsType) { + return this.obligationExpressions.size() > 0; + } else if (this.root instanceof AdviceExpressionsType) { + return this.adviceExpressions.size() > 0; + } + } + return false; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + itemId); + } + if (this.root instanceof ObligationExpressionsType) { + if (itemId instanceof ObligationExpressionType) { + if (((ObligationExpressionsType) this.root).getObligationExpression().remove(itemId)) { + // + // Remove this + // + if (this.rootObligations.remove(itemId) == false) { + // + // + // + assert false; + logger.error("Removing item " + itemId + " failed to remove it from root obligation list"); + } + // + // Notify + // + this.fireItemSetChange(); + return true ; + } + } else if (itemId instanceof AttributeAssignmentExpressionType) { + ObligationExpressionType parent = this.obligationExpressions.get(itemId); + if (parent != null && parent.getAttributeAssignmentExpression().remove(itemId)) { + if (this.obligationExpressions.remove(itemId) == null) { + assert false; + logger.error("Removing item " + itemId + " failed to remove it from obligation expressions map"); + } + // + // Notify + // + this.fireItemSetChange(); + return true; + } + } + } else if (this.root instanceof AdviceExpressionsType) { + if (itemId instanceof AdviceExpressionType) { + if (((AdviceExpressionsType) this.root).getAdviceExpression().remove(itemId)) { + if (this.rootAdvice.remove(itemId) == false) { + assert false; + logger.error("Removing item " + itemId + " failed to remove it from root advice list"); + } + // + // Notify + // + this.fireItemSetChange(); + return true; + } + } else if (itemId instanceof AttributeAssignmentExpressionType) { + AdviceExpressionType parent = this.adviceExpressions.get(itemId); + if (parent != null && parent.getAttributeAssignmentExpression().remove(itemId)) { + if (this.adviceExpressions.remove(itemId) == null) { + assert false; + logger.error("Removing item " + itemId + " failed to remove it from advice expressions map"); + } + // + // Notify + // + this.fireItemSetChange(); + return true; + } + } + } + if (itemId instanceof AttributeValueType) { + AttributeAssignmentExpressionType parent = this.values.get(itemId); + if (parent != null && + parent.getExpression() != null && + parent.getExpression().getValue() != null && + parent.getExpression().getValue().equals(itemId)) { + parent.setExpression(null); + // + // Notify + // + this.fireItemSetChange(); + return this.values.remove(itemId) == null; + } + } + if (itemId instanceof AttributeDesignatorType) { + AttributeAssignmentExpressionType parent = this.designators.get(itemId); + if (parent != null && + parent.getExpression() != null && + parent.getExpression().getValue() != null && + parent.getExpression().getValue().equals(itemId)) { + parent.setExpression(null); + // + // Notify + // + this.fireItemSetChange(); + return this.designators.remove(itemId) == null; + } + } + if (itemId instanceof AttributeSelectorType) { + AttributeAssignmentExpressionType parent = this.selectors.get(itemId); + if (parent != null && + parent.getExpression() != null && + parent.getExpression().getValue() != null && + parent.getExpression().getValue().equals(itemId)) { + parent.setExpression(null); + // + // Notify + // + this.fireItemSetChange(); + return this.selectors.remove(itemId) == null; + } + } + if (itemId instanceof ApplyType) { + AttributeAssignmentExpressionType parent = this.applys.get(itemId); + if (parent != null && + parent.getExpression() != null && + parent.getExpression().getValue() != null && + parent.getExpression().getValue().equals(itemId)) { + parent.setExpression(null); + // + // Notify + // + this.fireItemSetChange(); + return this.applys.remove(itemId) == null; + } + } + return false; + } + + public class ObAdviceItem implements Item { + private static final long serialVersionUID = 1L; + private final Object data; + + public ObAdviceItem(Object data) { + this.data = data; + } + + public String getName() { + if (this.data instanceof AdviceExpressionType) { + return "Advice"; + } + if (this.data instanceof ObligationExpressionType) { + return "Obligation"; + } + if (this.data instanceof AttributeAssignmentExpressionType) { + return "Attribute Assignment Expression"; + } + if (this.data instanceof AttributeValueType) { + return "Attribute Value"; + } + if (this.data instanceof AttributeDesignatorType) { + return "Attribute Designator"; + } + if (this.data instanceof AttributeSelectorType) { + return "Attribute Selector"; + } + if (this.data instanceof ApplyType) { + return "Apply"; + } + return null; + } + + public String getId() { + if (this.data instanceof AdviceExpressionType) { + return ((AdviceExpressionType) this.data).getAdviceId(); + } + if (this.data instanceof ObligationExpressionType) { + return ((ObligationExpressionType) this.data).getObligationId(); + } + if (this.data instanceof AttributeAssignmentExpressionType) { + return ((AttributeAssignmentExpressionType) this.data).getAttributeId(); + } + if (this.data instanceof AttributeValueType) { + StringBuilder builder = new StringBuilder(); + for (Object content : ((AttributeValueType) this.data).getContent()) { + builder.append(content); + } + return builder.toString(); + } + if (this.data instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) this.data).getAttributeId(); + } + if (this.data instanceof AttributeSelectorType) { + return ((AttributeSelectorType) this.data).getContextSelectorId(); + } + if (this.data instanceof ApplyType) { + return ((ApplyType) this.data).getFunctionId(); + } + return null; + } + + public String getIdShort() { + String id = this.getId(); + if (id == null) { + return id; + } + if (this.data instanceof AttributeValueType) { + return id; + } + // + // Make it short + // + String[] parts = id.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + return id; + } + + public String getEffect() { + if (this.data instanceof AdviceExpressionType) { + return ((AdviceExpressionType) this.data).getAppliesTo().toString(); + } + if (this.data instanceof ObligationExpressionType) { + return ((ObligationExpressionType) this.data).getFulfillOn().toString(); + } + return null; + } + + public String getDatatype() { + /* + if (this.data instanceof AdviceExpressionType) { + } + if (this.data instanceof ObligationExpressionType) { + } + if (this.data instanceof AttributeAssignmentExpressionType) { + } + */ + if (this.data instanceof AttributeValueType) { + return ((AttributeValueType) this.data).getDataType(); + } + if (this.data instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) this.data).getDataType(); + } + if (this.data instanceof AttributeSelectorType) { + return ((AttributeSelectorType) this.data).getDataType(); + } + /* + if (this.data instanceof ApplyType) { + + } + */ + return null; + } + + public String getDatatypeShort() { + String dt = this.getDatatype(); + if (dt == null) { + return dt; + } + // + // Get short part + // + int index = dt.lastIndexOf('#'); + if (index == -1) { + String[] parts = dt.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + } else { + return dt.substring(index + 1); + } + return dt; + } + + public String getCategory() { + /* + if (this.data instanceof AdviceExpressionType) { + } + if (this.data instanceof ObligationExpressionType) { + } + */ + if (this.data instanceof AttributeAssignmentExpressionType) { + return ((AttributeAssignmentExpressionType) this.data).getCategory(); + } + /* + if (this.data instanceof AttributeValueType) { + } + */ + if (this.data instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) this.data).getCategory(); + } + if (this.data instanceof AttributeSelectorType) { + return ((AttributeSelectorType) this.data).getCategory(); + } + /* + if (this.data instanceof ApplyType) { + + } + */ + return null; + } + + public String getCategoryShort() { + String id = this.getCategory(); + if (id == null) { + return id; + } + String[] parts = id.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + return id; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.data, id); + } + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Expression container does not support adding new properties"); + } + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Expression container does not support removing properties"); + } + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java new file mode 100644 index 0000000..5b9f3f5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java
@@ -0,0 +1,488 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.server.Resource; + +public class PDPContainer extends ItemSetChangeNotifier implements Container.Indexed, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PDPGroupContainer.class); + + /** + * String identifier of a file's "Id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "Description" property. + */ + public static String PROPERTY_DESCRIPTION = "Description"; + + /** + * String identifier of a file's "Default" property. + */ + public static String PROPERTY_DEFAULT = "Default"; + + /** + * String identifier of a file's "icon" property. + */ + public static String PROPERTY_ICON = "Icon"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_STATUS = "Status"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_PDPS = "PDPs"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_POLICIES = "Policies"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_PIPCONFIG = "PIP Configurations"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> PDP_PROPERTIES; + + private final static Method PDPITEM_ID; + + private final static Method PDPITEM_NAME; + + private final static Method PDPITEM_DESCRIPTION; + + private final static Method PDPITEM_ICON; + + private final static Method PDPITEM_STATUS; + + private final static Method PDPITEM_POLICIES; + + private final static Method PDPITEM_PIPCONFIG; + + + static { + PDP_PROPERTIES = new ArrayList<String>(); + PDP_PROPERTIES.add(PROPERTY_ID); + PDP_PROPERTIES.add(PROPERTY_NAME); + PDP_PROPERTIES.add(PROPERTY_DESCRIPTION); + PDP_PROPERTIES.add(PROPERTY_DEFAULT); + PDP_PROPERTIES.add(PROPERTY_ICON); + PDP_PROPERTIES.add(PROPERTY_STATUS); + PDP_PROPERTIES.add(PROPERTY_PDPS); + PDP_PROPERTIES.add(PROPERTY_POLICIES); + PDP_PROPERTIES.add(PROPERTY_PIPCONFIG); + PDP_PROPERTIES = Collections.unmodifiableCollection(PDP_PROPERTIES); + try { + PDPITEM_ID = PDPItem.class.getMethod("getId", new Class[]{}); + PDPITEM_NAME = PDPItem.class.getMethod("getName", new Class[]{}); + PDPITEM_DESCRIPTION = PDPItem.class.getMethod("getDescription", new Class[] {}); + PDPITEM_ICON = PDPItem.class.getMethod("getIcon", new Class[] {}); + PDPITEM_STATUS = PDPItem.class.getMethod("getStatus", new Class[] {}); + PDPITEM_POLICIES = PDPItem.class.getMethod("getPolicies", new Class[] {}); + PDPITEM_PIPCONFIG = PDPItem.class.getMethod("getPipConfigs", new Class[] {}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PDPContainer"); + } + } + + private PAPEngine papEngine = null; //NOPMD + private PDPGroup group; + private List<PDP> pdps = Collections.synchronizedList(new ArrayList<PDP>()); + + public PDPContainer(PDPGroup group) { + super(); + this.setContainer(this); + // + // + // + this.group = group; + this.pdps.addAll(this.group.getPdps()); + } + + public synchronized void refresh(PDPGroup group) { + synchronized(this.group) { + this.group = group; + } + synchronized (this.pdps) { + this.pdps.clear(); + this.pdps.addAll(this.group.getPdps()); + } + } + + @Override + public Object nextItemId(Object itemId) { + synchronized (this.pdps) { + int index = this.pdps.indexOf(itemId); + if (index == -1) { + return null; + } + if (index == this.pdps.size() - 1) { + return null; + } + return this.pdps.get(index + 1); + } + } + + @Override + public Object prevItemId(Object itemId) { + synchronized (this.pdps) { + int index = this.pdps.indexOf(itemId); + if (index == -1) { + return null; + } + if (index == 0) { + return null; + } + return this.pdps.get(index - 1); + } + } + + @Override + public Object firstItemId() { + synchronized (this.pdps) { + if (this.pdps.size() > 0) { + return this.pdps.get(0); + } + } + return null; + } + + @Override + public Object lastItemId() { + synchronized (this.pdps) { + if (this.pdps.size() > 0) { + return this.pdps.get(this.pdps.size() - 1); + } + } + return null; + } + + @Override + public boolean isFirstId(Object itemId) { + synchronized (this.pdps) { + if (this.pdps.size() > 0) { + return this.pdps.get(0).equals(itemId); + } + } + return false; + } + + @Override + public boolean isLastId(Object itemId) { + synchronized (this.pdps) { + if (this.pdps.size() > 0) { + return this.pdps.get(this.pdps.size() - 1).equals(itemId); + } + } + return false; + } + + @Override + public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Use addPDP method"); + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Use addPDP method"); + } + + @Override + public Item getItem(Object itemId) { + /* + if (itemId instanceof PDP) { + } + */ + // TODO Auto-generated method stub + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return PDP_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + synchronized(this.pdps) { + return Collections.unmodifiableList(this.pdps); + } + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_DESCRIPTION, null); + } + + if (propertyId.equals(PROPERTY_ICON)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_ICON, null); + } + + if (propertyId.equals(PROPERTY_STATUS)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_STATUS, null); + } + + if (propertyId.equals(PROPERTY_POLICIES)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_POLICIES, null); + } + + if (propertyId.equals(PROPERTY_PIPCONFIG)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPItem((PDP) itemId), PDPITEM_PIPCONFIG, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ICON)) { + return Resource.class; + } + if (propertyId.equals(PROPERTY_STATUS)) { + return String.class; + } + if (propertyId.equals(PROPERTY_POLICIES)) { + return Set.class; + } + if (propertyId.equals(PROPERTY_PIPCONFIG)) { + return Set.class; + } + return null; + } + + @Override + public int size() { + return this.pdps.size(); + } + + @Override + public boolean containsId(Object itemId) { + return this.pdps.contains(itemId); + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object addItem() throws UnsupportedOperationException { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add a property"); + } + + @Override + public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot remove a property"); + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot remove all items."); + } + + @Override + public int indexOfId(Object itemId) { + return this.pdps.indexOf(itemId); + } + + @Override + public Object getIdByIndex(int index) { + return this.pdps.get(index); + } + + @Override + public List<?> getItemIds(int startIndex, int numberOfItems) { + synchronized (this.pdps) { + int endIndex = startIndex + numberOfItems; + if (endIndex > this.pdps.size()) { + endIndex = this.pdps.size() - 1; + } + return this.pdps.subList(startIndex, endIndex); + } + } + + @Override + public Object addItemAt(int index) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add item."); + } + + @Override + public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add item."); + } + + public class PDPItem implements Item { + private static final long serialVersionUID = 1L; + private final PDP pdp; + + public PDPItem(PDP pdp) { + this.pdp = pdp; + } + + public String getId() { + if (logger.isTraceEnabled()) { + logger.trace("getId: " + this.pdp); + } + return this.pdp.getId(); + } + + public String getName() { + if (logger.isTraceEnabled()) { + logger.trace("getName: " + this.pdp); + } + return this.pdp.getName(); + } + + public String getDescription() { + if (logger.isTraceEnabled()) { + logger.trace("getDescription: " + this.pdp); + } + return this.pdp.getDescription(); + } + + public Resource getIcon() { + if (logger.isTraceEnabled()) { + logger.trace("getIcon: " + this.pdp); + } + return null; + } + + public String getStatus() { + String status = this.pdp.getStatus().getStatus().toString(); + Set<String> errors = this.pdp.getStatus().getLoadErrors(); + if (errors.size() > 0) { + status = status + String.format(" %d errors", errors.size()); + } + Set<String> warnings = this.pdp.getStatus().getLoadWarnings(); + if (warnings.size() > 0) { + status = status + String.format(" %d warnings", warnings.size()); + } + return status; + } + + public Set<PDPPolicy> getPolicies() { + if (logger.isTraceEnabled()) { + logger.trace("getPolicies: " + this.pdp); + } + return this.pdp.getPolicies(); + } + + public Set<PDPPIPConfig> getPipConfigs() { + if (logger.isTraceEnabled()) { + logger.trace("getPIPConfigs: " + this.pdp); + } + return this.pdp.getPipConfigs(); + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.pdp, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP container does not support adding new properties"); + } + + @Override + public boolean removeItemProperty(Object id) + throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "PDP container does not support property removal"); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java new file mode 100644 index 0000000..12b9852 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java
@@ -0,0 +1,672 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PAPException; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.server.Resource; + +public class PDPGroupContainer extends ItemSetChangeNotifier implements Container.Indexed, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PDPGroupContainer.class); + + /** + * String identifier of a file's "Id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "Description" property. + */ + public static String PROPERTY_DESCRIPTION = "Description"; + + /** + * String identifier of a file's "Default" property. + */ + public static String PROPERTY_DEFAULT = "Default"; + + /** + * String identifier of a file's "icon" property. + */ + public static String PROPERTY_ICON = "Icon"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_STATUS = "Status"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_PDPS = "PDPs"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_POLICIES = "Policies"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_PIPCONFIG = "PIP Configurations"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> PDP_PROPERTIES; + + private final static Method PDPITEM_ID; + + private final static Method PDPITEM_NAME; + + private final static Method PDPITEM_DESCRIPTION; + + private final static Method PDPITEM_DEFAULT; + + private final static Method PDPITEM_ICON; + + private final static Method PDPITEM_STATUS; + + private final static Method PDPITEM_PDPS; + + private final static Method PDPITEM_POLICIES; + + private final static Method PDPITEM_PIPCONFIG; + + + static { + PDP_PROPERTIES = new ArrayList<String>(); + PDP_PROPERTIES.add(PROPERTY_ID); + PDP_PROPERTIES.add(PROPERTY_NAME); + PDP_PROPERTIES.add(PROPERTY_DESCRIPTION); + PDP_PROPERTIES.add(PROPERTY_DEFAULT); + PDP_PROPERTIES.add(PROPERTY_ICON); + PDP_PROPERTIES.add(PROPERTY_STATUS); + PDP_PROPERTIES.add(PROPERTY_PDPS); + PDP_PROPERTIES.add(PROPERTY_POLICIES); + PDP_PROPERTIES.add(PROPERTY_PIPCONFIG); + PDP_PROPERTIES = Collections.unmodifiableCollection(PDP_PROPERTIES); + try { + PDPITEM_ID = PDPGroupItem.class.getMethod("getId", new Class[]{}); + PDPITEM_NAME = PDPGroupItem.class.getMethod("getName", new Class[]{}); + PDPITEM_DESCRIPTION = PDPGroupItem.class.getMethod("getDescription", new Class[] {}); + PDPITEM_DEFAULT = PDPGroupItem.class.getMethod("getDefault", new Class[] {}); + PDPITEM_ICON = PDPGroupItem.class.getMethod("getIcon", new Class[] {}); + PDPITEM_STATUS = PDPGroupItem.class.getMethod("getStatus", new Class[] {}); + PDPITEM_PDPS = PDPGroupItem.class.getMethod("getPDPs", new Class[] {}); + PDPITEM_POLICIES = PDPGroupItem.class.getMethod("getPolicies", new Class[] {}); + PDPITEM_PIPCONFIG = PDPGroupItem.class.getMethod("getPipConfigs", new Class[] {}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PDPContainer"); + } + } + + private PAPEngine papEngine = null; + private List<PDPGroup> groups = Collections.synchronizedList(new ArrayList<PDPGroup>()); + + public PDPGroupContainer(PAPEngine engine) { + super(); + this.setContainer(this); + // + // + // + this.papEngine = engine; + // + // + // + this.refreshGroups(); + } + + public boolean isSupported(Object itemId) { + if (itemId instanceof PDPGroup) { + return true; + } + return false; + } + + public synchronized void refreshGroups() { + synchronized(this.groups) { + this.groups.clear(); + try { + this.groups.addAll(this.papEngine.getPDPGroups()); + } catch (PAPException e) { + String message = "Unable to retrieve Groups from server: " + e; + logger.error(message, e); + } + } + // + // Notify that we have changed + // + this.fireItemSetChange(); + } + + public List<PDPGroup> getGroups() { + return Collections.unmodifiableList(this.groups); + } + + public void makeDefault(PDPGroup group) { + try { + this.papEngine.SetDefaultGroup(group); + } catch (PAPException e) { + String message = "Unable to set Default Group on server: " + e; + logger.error(message, e); + } + } + + public void removeGroup(PDPGroup group, PDPGroup newGroup) throws PAPException { + if (logger.isTraceEnabled()) { + logger.trace("removeGroup: " + group + " new group for PDPs: " + newGroup); + } + if (group.isDefaultGroup()) { + throw new UnsupportedOperationException("You can't remove the Default Group."); + } + try { + this.papEngine.removeGroup(group, newGroup); + } catch (NullPointerException | PAPException e) { + logger.error("Failed to removeGroup " + group.getId(), e); + throw new PAPException("Failed to remove group '" + group.getId()+ "'", e); + } + } + + public void removePDP(PDP pdp, PDPGroup group) throws PAPException { + if (logger.isTraceEnabled()) { + logger.trace("removePDP: " + pdp + " from group: " + group); + } + try { + this.papEngine.removePDP(pdp); + } catch (PAPException e) { + logger.error("Failed to removePDP " + pdp.getId(), e); + throw new PAPException("Failed to remove pdp '" + pdp.getId()+ "'", e); + } + } + + public void updatePDP(PDP pdp) { + try { + papEngine.updatePDP(pdp); + } catch (PAPException e) { + logger.error(e); + } + } + + public void updateGroup(PDPGroup group) { + try { + papEngine.updateGroup(group); + } catch (PAPException e) { + logger.error(e); + } + } + + @Override + public Item getItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getItem: " + itemId); + } + if (this.isSupported(itemId)) { + return new PDPGroupItem((PDPGroup) itemId); + } + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return PDP_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + items.addAll(this.groups); + if (logger.isTraceEnabled()) { + logger.trace("getItemIds: " + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_DESCRIPTION, null); + } + + if (propertyId.equals(PROPERTY_DEFAULT)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_DEFAULT, null); + } + + if (propertyId.equals(PROPERTY_ICON)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_ICON, null); + } + + if (propertyId.equals(PROPERTY_STATUS)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_STATUS, null); + } + + if (propertyId.equals(PROPERTY_PDPS)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_PDPS, null); + } + + if (propertyId.equals(PROPERTY_POLICIES)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_POLICIES, null); + } + + if (propertyId.equals(PROPERTY_PIPCONFIG)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPGroupItem((PDPGroup) itemId), PDPITEM_PIPCONFIG, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DEFAULT)) { + return Boolean.class; + } + if (propertyId.equals(PROPERTY_ICON)) { + return Resource.class; + } + if (propertyId.equals(PROPERTY_STATUS)) { + return String.class; + } + if (propertyId.equals(PROPERTY_PDPS)) { + return Set.class; + } + if (propertyId.equals(PROPERTY_POLICIES)) { + return Set.class; + } + if (propertyId.equals(PROPERTY_PIPCONFIG)) { + return Set.class; + } + return null; + } + + @Override + public int size() { + return this.groups.size(); + } + + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + itemId); + } + if (this.isSupported(itemId) == false) { + return false; + } + return this.groups.contains(itemId); + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP Container cannot add a given item."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP Container cannot add a given item."); + } + + public void addNewGroup(String name, String description) throws NullPointerException, PAPException { + if (logger.isTraceEnabled()) { + logger.trace("addNewGroup " + name + " " + description); + } + this.papEngine.newGroup(name, description); + } + + public void addNewPDP(String id, PDPGroup group, String name, String description) throws NullPointerException, PAPException { + if (logger.isTraceEnabled()) { + logger.trace("addNewPDP " + id + " " + name + " " + description); + } + this.papEngine.newPDP(id, group, name, description); + } + + public void movePDP(PDP pdp, PDPGroup group) { + try { + this.papEngine.movePDP(pdp, group); + } catch (PAPException e) { + String message = "Unable to move PDP to new group on server: " + e; + logger.error(message, e); + } + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add a container property."); + } + + @Override + public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot remove a container property."); + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP Container cannot remove all items. You must have at least the Default group."); + } + + @Override + public void addItemSetChangeListener(ItemSetChangeListener listener) { + if (getItemSetChangeListeners() == null) { + setItemSetChangeListeners(new LinkedList<Container.ItemSetChangeListener>()); + } + getItemSetChangeListeners().add(listener); + } + + @Override + public Object nextItemId(Object itemId) { + if (this.isSupported(itemId) == false) { + return null; + } + int index = this.groups.indexOf(itemId); + if (index == -1) { + // + // We don't know this group + // + return null; + } + // + // Is it the last one? + // + if (index == this.groups.size() - 1) { + // + // Yes + // + return null; + } + // + // Return the next one + // + return this.groups.get(index + 1); + } + + @Override + public Object prevItemId(Object itemId) { + if (this.isSupported(itemId) == false) { + return null; + } + int index = this.groups.indexOf(itemId); + if (index == -1) { + // + // We don't know this group + // + return null; + } + // + // Is it the first one? + // + if (index == 0) { + // + // Yes + // + return null; + } + // + // Return the previous one + // + return this.groups.get(index - 1); + } + + @Override + public Object firstItemId() { + synchronized (this.groups) { + if (this.groups.size() > 0) { + return this.groups.get(0); + } + } + return null; + } + + @Override + public Object lastItemId() { + synchronized (this.groups) { + if (this.groups.size() > 0) { + return this.groups.get(this.groups.size() - 1); + } + } + return null; + } + + @Override + public boolean isFirstId(Object itemId) { + synchronized (this.groups) { + if (this.groups.size() > 0) { + return this.groups.get(0).equals(itemId); + } + } + return false; + } + + @Override + public boolean isLastId(Object itemId) { + synchronized (this.groups) { + if (this.groups.size() > 0) { + return this.groups.get(this.groups.size() - 1).equals(itemId); + } + } + return false; + } + + @Override + public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering."); + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering."); + } + + @Override + public int indexOfId(Object itemId) { + return this.groups.indexOf(itemId); + } + + @Override + public Object getIdByIndex(int index) { + return this.groups.get(index); + } + + @Override + public List<?> getItemIds(int startIndex, int numberOfItems) { + synchronized (this.groups) { + int endIndex = startIndex + numberOfItems; + if (endIndex > this.groups.size()) { + endIndex = this.groups.size() - 1; + } + return this.groups.subList(startIndex, endIndex); + } + } + + @Override + public Object addItemAt(int index) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot addItemAt"); + } + + @Override + public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot addItemAt"); + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + itemId); + } + if (this.isSupported(itemId) == false) { + return false; + } + // + // You cannot remove the default group + // + if (((PDPGroup) itemId).getId().equals("Default")) { + throw new UnsupportedOperationException("You can't remove the Default Group."); + } + // + // Remove PDPGroup and move any PDP's in it into the default group + // + try { + this.papEngine.removeGroup((PDPGroup) itemId, this.papEngine.getDefaultGroup()); + return true; + } catch (NullPointerException | PAPException e) { + logger.error("Failed to remove group", e); + } + return false; + } + + public class PDPGroupItem implements Item { + private static final long serialVersionUID = 1L; + + private final PDPGroup group; + + public PDPGroupItem(PDPGroup itemId) { + this.group = itemId; + } + + public String getId() { + if (logger.isTraceEnabled()) { + logger.trace("getId: " + this.group); + } + return this.group.getId(); + } + + public String getName() { + if (logger.isTraceEnabled()) { + logger.trace("getName: " + this.group); + } + return this.group.getName(); + } + + public String getDescription() { + if (logger.isTraceEnabled()) { + logger.trace("getDescription: " + this.group); + } + return this.group.getDescription(); + } + + public Boolean getDefault() { + if (logger.isTraceEnabled()) { + logger.trace("getDefault: " + this.group); + } + return this.group.isDefaultGroup(); + } + + public Resource getIcon() { + if (logger.isTraceEnabled()) { + logger.trace("getIcon: " + this.group); + } + return null; + } + + public String getStatus() { + return this.group.getStatus().getStatus().toString(); + } + + public Set<PDP> getPDPs() { + return Collections.unmodifiableSet(this.group.getPdps()); + } + + public Set<PDPPolicy> getPolicies() { + if (logger.isTraceEnabled()) { + logger.trace("getPolicies: " + this.group); + } + return this.group.getPolicies(); + } + + public Set<PDPPIPConfig> getPipConfigs() { + if (logger.isTraceEnabled()) { + logger.trace("getPIPConfigs: " + this.group); + } + return this.group.getPipConfigs(); + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(this.group, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP container does not support adding new properties"); + } + + @Override + public boolean removeItemProperty(Object id) + throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "PDP container does not support property removal"); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java new file mode 100644 index 0000000..aa2fb87 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java
@@ -0,0 +1,457 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.api.pip.PIPException; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class PDPPIPContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PDPPIPContainer.class); + + /** + * String identifier of a file's "Id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "Description" property. + */ + public static String PROPERTY_DESCRIPTION = "Description"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> PDPPIP_PROPERTIES; + + private final static Method PDPPIPITEM_ID; + + private final static Method PDPPIPITEM_NAME; + + private final static Method PDPPIPITEM_DESCRIPTION; + + static { + PDPPIP_PROPERTIES = new ArrayList<String>(); + PDPPIP_PROPERTIES.add(PROPERTY_ID); + PDPPIP_PROPERTIES.add(PROPERTY_NAME); + PDPPIP_PROPERTIES.add(PROPERTY_DESCRIPTION); + PDPPIP_PROPERTIES = Collections.unmodifiableCollection(PDPPIP_PROPERTIES); + try { + PDPPIPITEM_ID = PDPPIPItem.class.getMethod("getId", new Class[]{}); + PDPPIPITEM_NAME = PDPPIPItem.class.getMethod("getName", new Class[]{}); + PDPPIPITEM_DESCRIPTION = PDPPIPItem.class.getMethod("getDescription", new Class[] {}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PDPPIPContainer"); + } + } + + private final Object data; + + List<PIPConfiguration> configurations = new ArrayList<PIPConfiguration>(); + + public PDPPIPContainer(Object data) { + super(); + setContainer(this); + // + // Save our object + // + this.data = data; + // + // Is it supported? + // + if (this.isPDPGroup() == false && this.isPDP() == false) { + throw new IllegalArgumentException("This container only supported PDPGroup and PDP objects."); + } + // + // Initialize our internal structures + // + initialize(); + } + + private boolean isSupported(Object itemId) { + if (this.isConfiguration(itemId) || + this.isResolver(itemId) ) { + return true; + } + return false; + } + + private boolean isPDPGroup() { + return this.data instanceof PDPGroup; + } + + private boolean isPDP() { + return this.data instanceof PDP; + } + + private boolean isConfiguration(Object itemId) { + return itemId instanceof PIPConfiguration; + } + + private boolean isResolver(Object itemId) { + return itemId instanceof PIPResolver; + } + + private void initialize() { + assert this.data != null; + // + // Get the list of configurations + // + Set<PDPPIPConfig> configs = null; + if (this.isPDPGroup()) { + configs = ((PDPGroup) this.data).getPipConfigs(); + } else if (this.isPDP()) { + configs = ((PDP) this.data).getPipConfigs(); + } else { + throw new IllegalArgumentException("This container only supported PDPGroup and PDP objects."); + } + // + // Map these to a list of PIPConfiguration objects. That + // way we can match them up to the database. + // + for (PDPPIPConfig config : configs) { + Properties properties = new Properties(); + properties.putAll(config.getConfiguration()); + try { + PIPConfiguration pipConfig = new PIPConfiguration(config.getId(), properties); + if (logger.isDebugEnabled()) { + logger.debug("Found config: " + pipConfig); + } + this.configurations.add(pipConfig); + } catch (PIPException e) { + logger.error("Failed to create PIPConfiguration: " + e.getLocalizedMessage()); + } + } + } + + + public void refresh() { + this.configurations.clear(); + this.initialize(); + this.fireItemSetChange(); + } + + @Override + public Item getItem(Object itemId) { + if (this.isSupported(itemId)) { + return new PDPPIPItem(itemId); + } + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return PDPPIP_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + for (PIPConfiguration config : this.configurations) { + items.add(config); + /* + for (PIPResolver resolver : config.getPipresolvers()) { + items.add(resolver); + } + */ + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isSupported(itemId) == false) { + return null; + } + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPIPItem(itemId), PDPPIPITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPIPItem(itemId), PDPPIPITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPIPItem(itemId), PDPPIPITEM_DESCRIPTION, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return String.class; + } + return null; + } + + @Override + public int size() { + /* + int size = 0; + for (PIPConfiguration config : this.configurations) { + size++; + size += config.getPipresolvers().size(); + } + return size; + */ + return this.configurations.size(); + } + + @Override + public boolean containsId(Object itemId) { + // + // Let's try this by using the Id + // + for (PIPConfiguration config : this.configurations) { + if (this.isConfiguration(itemId)) { + if (((PIPConfiguration) itemId).getId() == config.getId()) { + return true; + } + } else if (this.isResolver(itemId)) { + for (PIPResolver resolver : config.getPipresolvers()) { + if (((PIPResolver) itemId).getId() == resolver.getId()) { + return true; + } + } + } else { + throw new IllegalArgumentException("This container only supports pip configuration and resolvers objects."); + } + } + return false; + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + if (this.isConfiguration(itemId)) { + this.configurations.add((PIPConfiguration) itemId); + // } else if (this.isResolver(itemId)) { + } + throw new UnsupportedOperationException("Cannot add unsupported object."); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add unknown object."); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Adding properties not supported."); + } + + @Override + public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Removing properties not supported."); + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + // + // Remove everything + // + this.configurations.clear(); + return true; + } + + @Override + public Collection<?> getChildren(Object itemId) { + if (this.isConfiguration(itemId)) { + Collection<Object> children = new ArrayList<Object>(); + for (PIPConfiguration config : this.configurations) { + if (config.getId() == ((PIPConfiguration) itemId).getId()) { + /* + * Not for this release + * + children.addAll(config.getPipresolvers()); + */ + break; + } + } + return Collections.unmodifiableCollection(children); + } + return Collections.emptyList(); + } + + @Override + public Object getParent(Object itemId) { + if (this.isResolver(itemId)) { + return ((PIPResolver) itemId).getPipconfiguration(); + } + return null; + } + + @Override + public Collection<?> rootItemIds() { + Collection<Object> roots = new ArrayList<Object>(); + roots.addAll(this.configurations); + return Collections.unmodifiableCollection(roots); + } + + @Override + public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Not allowed in this implementation."); + } + + @Override + public boolean areChildrenAllowed(Object itemId) { + if (this.isConfiguration(itemId)) { + return true; + } + return false; + } + + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot change which objects can or cannot have children."); + } + + @Override + public boolean isRoot(Object itemId) { + if (this.isConfiguration(itemId)) { + return this.containsId(itemId); + } + return false; + } + + @Override + public boolean hasChildren(Object itemId) { + if (this.isConfiguration(itemId)) { + //return ((PIPConfiguration) itemId).getPipresolvers().size() > 0; + // + // Not this implementation + return false; + } + return false; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Not allowed in this implementation."); + /* + if (this.isConfiguration(itemId)) { + return this.configurations.remove(itemId); + } + if (this.isResolver(itemId)) { + ((PIPResolver) itemId).getPipconfiguration().removePipresolver((PIPResolver) itemId); + } + throw new UnsupportedOperationException("Object not supported by this container."); + */ + } + + public class PDPPIPItem implements Item { + private static final long serialVersionUID = 1L; + + private final Object config; + + public PDPPIPItem(Object config) { + this.config = config; + } + + public String getId() { + if (this.config instanceof PIPConfiguration) { + return Integer.toString(((PIPConfiguration) this.config).getId()); + } + if (this.config instanceof PIPResolver) { + return Integer.toString(((PIPResolver) this.config).getId()); + } + return null; + } + + public String getName() { + if (this.config instanceof PIPConfiguration) { + return ((PIPConfiguration) this.config).getName(); + } + if (this.config instanceof PIPResolver) { + return ((PIPResolver) this.config).getName(); + } + return null; + } + + public String getDescription() { + if (this.config instanceof PIPConfiguration) { + return ((PIPConfiguration) this.config).getDescription(); + } + if (this.config instanceof PIPResolver) { + return ((PIPResolver) this.config).getDescription(); + } + return null; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(config, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add property."); + } + + @Override + public boolean removeItemProperty(Object id) + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot remove property."); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java new file mode 100644 index 0000000..bb015c1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java
@@ -0,0 +1,469 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import org.apache.openaz.xacml.std.pap.StdPDPPolicy; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; + +public class PDPPolicyContainer extends ItemSetChangeNotifier implements Container.Indexed { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PDPPolicyContainer.class); + + /** + * String identifier of a file's "Id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_VERSION = "Version"; + + /** + * String identifier of a file's "Description" property. + */ + public static String PROPERTY_DESCRIPTION = "Description"; + + /** + * String identifier of a file's "IsRoot" property. + */ + public static String PROPERTY_ISROOT = "Root"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> PDPPOLICY_PROPERTIES; + + private final static Method PDPPOLICYITEM_ID; + + private final static Method PDPPOLICYITEM_NAME; + + private final static Method PDPPOLICYITEM_VERSION; + + private final static Method PDPPOLICYITEM_DESCRIPTION; + + private final static Method PDPPOLICYITEM_ISROOT; + + private final static Method PDPPOLICYITEM_SETISROOT; + + static { + PDPPOLICY_PROPERTIES = new ArrayList<String>(); + PDPPOLICY_PROPERTIES.add(PROPERTY_ID); + PDPPOLICY_PROPERTIES.add(PROPERTY_NAME); + PDPPOLICY_PROPERTIES.add(PROPERTY_VERSION); + PDPPOLICY_PROPERTIES.add(PROPERTY_DESCRIPTION); + PDPPOLICY_PROPERTIES.add(PROPERTY_ISROOT); + PDPPOLICY_PROPERTIES = Collections.unmodifiableCollection(PDPPOLICY_PROPERTIES); + try { + PDPPOLICYITEM_ID = PDPPolicyItem.class.getMethod("getId", new Class[]{}); + PDPPOLICYITEM_NAME = PDPPolicyItem.class.getMethod("getName", new Class[]{}); + PDPPOLICYITEM_VERSION = PDPPolicyItem.class.getMethod("getVersion", new Class[]{}); + PDPPOLICYITEM_DESCRIPTION = PDPPolicyItem.class.getMethod("getDescription", new Class[] {}); + PDPPOLICYITEM_ISROOT = PDPPolicyItem.class.getMethod("getRoot", new Class[] {}); + PDPPOLICYITEM_SETISROOT = PDPPolicyItem.class.getMethod("setRoot", new Class[] {Boolean.class}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PDPContainer"); + } + } + + private final Object data; + private List<PDPPolicy> policies; + + public PDPPolicyContainer(Object data) { + super(); + this.data = data; + if (this.data instanceof PDPGroup) { + policies = new ArrayList<PDPPolicy> (((PDPGroup) this.data).getPolicies()); + } + if (this.data instanceof PDP) { + policies = new ArrayList<PDPPolicy> (((PDP) this.data).getPolicies()); + } + if (this.data instanceof Set) { + policies = new ArrayList<PDPPolicy> ((Set<PDPPolicy>)data); + } + if (this.policies == null) { + logger.info("NULL policies"); + throw new NullPointerException("PDPPolicyContainer created with unexpected Object type '" + data.getClass().getName() + "'"); + } + this.setContainer(this); + } + + @Override + public Object nextItemId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("nextItemId: " + itemId); + } + int index = this.policies.indexOf(itemId); + if (index == -1 || (index + 1) >= this.policies.size()) { + return null; + } + return new PDPPolicyItem(this.policies.get(index + 1)); + } + + @Override + public Object prevItemId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("prevItemId: " + itemId); + } + int index = this.policies.indexOf(itemId); + if (index <= 0) { + return null; + } + return new PDPPolicyItem(this.policies.get(index - 1)); + } + + @Override + public Object firstItemId() { + if (logger.isTraceEnabled()) { + logger.trace("firstItemId: "); + } + if (this.policies.isEmpty()) { + return null; + } + return new PDPPolicyItem(this.policies.get(0)); + } + + @Override + public Object lastItemId() { + if (logger.isTraceEnabled()) { + logger.trace("lastItemid: "); + } + if (this.policies.isEmpty()) { + return null; + } + return new PDPPolicyItem(this.policies.get(this.policies.size() - 1)); + } + + @Override + public boolean isFirstId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isFirstId: " + itemId); + } + if (this.policies.isEmpty()) { + return false; + } + return itemId.equals(this.policies.get(0)); + } + + @Override + public boolean isLastId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isLastId: " + itemId); + } + if (this.policies.isEmpty()) { + return false; + } + return itemId.equals(this.policies.get(this.policies.size() - 1)); + } + + @Override + public Object addItemAfter(Object previousItemId) + throws UnsupportedOperationException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) + throws UnsupportedOperationException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Item getItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getItem: " + itemId); + } + if (itemId instanceof PDPPolicy) { + return new PDPPolicyItem((PDPPolicy) itemId); + } + return null; + } + + @Override + public Collection<?> getContainerPropertyIds() { + return PDPPOLICY_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + items.addAll(this.policies); + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (itemId instanceof PDPPolicy == false) { + return null; + } + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_VERSION)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_VERSION, null); + } + + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_DESCRIPTION, null); + } + + if (propertyId.equals(PROPERTY_ISROOT)) { + return new MethodProperty<Object>(getType(propertyId), + new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ISROOT, PDPPOLICYITEM_SETISROOT); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_VERSION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ISROOT)) { + return Boolean.class; + } + return null; + } + + @Override + public int size() { + if (logger.isTraceEnabled()) { + logger.trace("size: " + this.policies.size()); + } + return this.policies.size(); + } + + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + itemId); + } + return this.policies.contains(itemId); + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItem: " + itemId); + } + if (itemId instanceof PDPPolicy) { + this.policies.add((PDPPolicy) itemId); + return new PDPPolicyItem((PDPPolicy)itemId); + } + return null; + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Cannot add an empty policy."); + } + + @Override + public boolean removeItem(Object itemId) + throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + itemId); + } + return this.policies.remove(itemId); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + //this.policies = new ArrayList<PDPPolicy>(); + //return true; + return false; + } + + @Override + public int indexOfId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("indexOfId: " + itemId); + } + return this.policies.indexOf(itemId); + } + + @Override + public Object getIdByIndex(int index) { + if (logger.isTraceEnabled()) { + logger.trace("getIdByIndex: " + index); + } + return this.policies.get(index); + } + + @Override + public List<?> getItemIds(int startIndex, int numberOfItems) { + if (logger.isTraceEnabled()) { + logger.trace("getItemIds: " + startIndex + " " + numberOfItems); + } + if (numberOfItems < 0) { + throw new IllegalArgumentException(); + } + return this.policies.subList(startIndex, startIndex + numberOfItems); + } + + @Override + public Object addItemAt(int index) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItemAt: " + index); + } + return null; + } + + @Override + public Item addItemAt(int index, Object newItemId) + throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItemAt: " + index + " " + newItemId); + } + return null; + } + + public class PDPPolicyItem implements Item { + private static final long serialVersionUID = 1L; + + private final PDPPolicy policy; + + public PDPPolicyItem(PDPPolicy itemId) { + this.policy = itemId; + } + + public String getId() { + if (logger.isTraceEnabled()) { + logger.trace("getId: " + this.policy); + } + return this.policy.getId(); + } + + public String getName() { + if (logger.isTraceEnabled()) { + logger.trace("getName: " + this.policy); + } + return this.policy.getName(); + } + + public String getVersion() { + if (logger.isTraceEnabled()) { + logger.trace("getVersion: " + this.policy); + } + return this.policy.getVersion(); + } + + public String getDescription() { + if (logger.isTraceEnabled()) { + logger.trace("getDescription: " + this.policy); + } + return this.policy.getDescription(); + } + + public boolean getRoot() { + if (logger.isTraceEnabled()) { + logger.trace("isRoot: " + this.policy); + } + return this.policy.isRoot(); + } + + public void setRoot(Boolean root) { + ((StdPDPPolicy)this.policy).setRoot(root); + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(policy, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @Override + public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) + throws UnsupportedOperationException { + throw new UnsupportedOperationException("PDP Policy container " + + "does not support adding new properties"); + } + + @Override + public boolean removeItemProperty(Object id) + throws UnsupportedOperationException { + throw new UnsupportedOperationException( + "PDP Policy container does not support property removal"); + } + + } +} +
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java new file mode 100644 index 0000000..247dcdd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java
@@ -0,0 +1,2096 @@ +/* + * 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 org.apache.openaz.xacml.admin.model; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.bind.JAXBElement; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.util.XACMLPolicyScanner; +import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult; +import com.google.gwt.thirdparty.guava.common.base.Splitter; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.util.MethodProperty; +import com.vaadin.server.Resource; +import com.vaadin.server.ThemeResource; +import com.vaadin.ui.Table; + +public class PolicyContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.Ordered, Container.ItemSetChangeNotifier { + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(PolicyContainer.class); + private final PolicyContainer self = this; + + /** + * String identifier of a file's "name" property. + */ + public static String PROPERTY_NAME = "Name"; + + /** + * String identifier of a file's "id" property. + */ + public static String PROPERTY_ID = "Id"; + + /** + * String identifier of a file's "short ID" property. + */ + public static String PROPERTY_SHORTID = "ShortId"; + + /** + * String identifier of a file's "Algorithm" property. + */ + public static String PROPERTY_ALGORITHM = "Algorithm"; + + /** + * String identifier of a file's "ShortAlgorithm" property. + */ + public static String PROPERTY_SHORTALGORITHM = "ShortAlgorithm"; + + /** + * String identifier of a file's "Description" property. + */ + public static String PROPERTY_DESCRIPTION = "Description"; + + /** + * String identifier of a file's "icon" property. + */ + public static String PROPERTY_ICON = "Icon"; + + /** + * String identifier of a file's "Status" property. + */ + public static String PROPERTY_STATUS = "Status"; + + /** + * String identifier of a file's "Attributes" property. + */ + public static String PROPERTY_ATTRIBUTES = "Attributes"; + + /** + * List of the string identifiers for the available properties. + */ + public static Collection<String> POLICY_PROPERTIES; + + private final static Method POLICYITEM_NAME; + + private final static Method POLICYITEM_ID; + + private final static Method POLICYITEM_SHORTID; + + private final static Method POLICYITEM_ALGORITHM; + + private final static Method POLICYITEM_SHORTALGORITHM; + + private final static Method POLICYITEM_DESCRIPTION; + + private final static Method POLICYITEM_ICON; + + private final static Method POLICYITEM_STATUS; + + private final static Method POLICYITEM_ATTRIBUTES; + + static { + + POLICY_PROPERTIES = new ArrayList<String>(); + POLICY_PROPERTIES.add(PROPERTY_NAME); + POLICY_PROPERTIES.add(PROPERTY_ID); + POLICY_PROPERTIES.add(PROPERTY_SHORTID); + POLICY_PROPERTIES.add(PROPERTY_ALGORITHM); + POLICY_PROPERTIES.add(PROPERTY_SHORTALGORITHM); + POLICY_PROPERTIES.add(PROPERTY_DESCRIPTION); + POLICY_PROPERTIES.add(PROPERTY_ICON); + POLICY_PROPERTIES.add(PROPERTY_STATUS); + POLICY_PROPERTIES.add(PROPERTY_ATTRIBUTES); + POLICY_PROPERTIES = Collections.unmodifiableCollection(POLICY_PROPERTIES); + try { + POLICYITEM_NAME = PolicyItem.class.getMethod("getName", new Class[]{}); + POLICYITEM_ID = PolicyItem.class.getMethod("getId", new Class[]{}); + POLICYITEM_SHORTID = PolicyItem.class.getMethod("getShortId", new Class[]{}); + POLICYITEM_ALGORITHM = PolicyItem.class.getMethod("getAlgorithm", new Class[] {}); + POLICYITEM_SHORTALGORITHM = PolicyItem.class.getMethod("getShortAlgorithm", new Class[] {}); + POLICYITEM_DESCRIPTION = PolicyItem.class.getMethod("getDescription", new Class[] {}); + POLICYITEM_ICON = PolicyItem.class.getMethod("getIcon", new Class[] {}); + POLICYITEM_STATUS = PolicyItem.class.getMethod("getStatus", new Class[] {}); + POLICYITEM_ATTRIBUTES = PolicyItem.class.getMethod("getAttributes", new Class[] {}); + } catch (final NoSuchMethodException e) { + throw new RuntimeException( + "Internal error finding methods in PolicyContainer"); + } + } + + private final File file; + private Object root; + + private Map<PolicySetType, PolicySetType> policySets = new HashMap<PolicySetType, PolicySetType>(); + private Map<PolicyType, PolicySetType> policies = new HashMap<PolicyType, PolicySetType>(); + private Map<RuleType, PolicyType> rules = new HashMap<RuleType, PolicyType>(); + private Map<TargetType, Object> targets = new HashMap<TargetType, Object>(); + private Map<AnyOfType, TargetType> anyofs = new HashMap<AnyOfType, TargetType>(); + private Map<AllOfType, AnyOfType> allofs = new HashMap<AllOfType, AnyOfType>(); + private Map<MatchType, AllOfType> matches = new HashMap<MatchType, AllOfType>(); + private Map<ObligationExpressionType, Object> obligations = new HashMap<ObligationExpressionType, Object>(); + private Map<AdviceExpressionType, Object> advice = new HashMap<AdviceExpressionType, Object>(); + private Map<ConditionType, RuleType> conditions = new HashMap<ConditionType, RuleType>(); + private Map<VariableDefinitionType, PolicyType> variables = new HashMap<VariableDefinitionType, PolicyType>(); + + public PolicyContainer(File file) throws IOException { + super(); + this.setContainer(this); + this.file = file; + this.readData(); + if (logger.isTraceEnabled()) { + logger.trace("New Policy Container: " + this.file.getName()); + } + } + + private void readData() throws IOException { + Object data = null; + try (InputStream is = Files.newInputStream(Paths.get(this.file.getAbsolutePath()))) { + data = XACMLPolicyScanner.readPolicy(is); + } catch (IOException e) { + logger.error("Failed to load policy."); + } + XACMLPolicyScanner scanner = null; + if (data instanceof PolicySetType) { + this.root = data; + scanner = new XACMLPolicyScanner((PolicySetType) this.root); + } else if (data instanceof PolicyType) { + this.root = data; + scanner = new XACMLPolicyScanner((PolicyType) this.root); + } else { + if (data != null) { + logger.error("invalid root object: " + data.getClass().getCanonicalName()); + } else { + logger.error("could not parse the file"); + } + throw new IOException("Invalid Xacml Policy File"); + } + scanner.scan(new XACMLPolicyScanner.SimpleCallback() { + + @Override + public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) { + self.addRule(parent, rule, false); + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicySet(PolicySetType parent, + PolicySetType policySet) { + self.addPolicySet(parent, policySet, false); + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicy(PolicySetType parent, + PolicyType policy) { + self.addPolicy(parent, policy, false); + return CallbackResult.CONTINUE; + } + + }); + } + + private boolean isObjectSupported(Object itemId) { + if (!(itemId instanceof PolicySetType) && + !(itemId instanceof PolicyType) && + !(itemId instanceof RuleType) && + !(itemId instanceof TargetType) && + !(itemId instanceof ObligationExpressionType) && + !(itemId instanceof AdviceExpressionType) && + !(itemId instanceof AnyOfType) && + !(itemId instanceof AllOfType) && + !(itemId instanceof MatchType) && + !(itemId instanceof ConditionType) && + !(itemId instanceof VariableDefinitionType)) { + return false; + } + return true; + } + + @Override + public Item getItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getItem: " + itemId); + } + if (this.isObjectSupported(itemId) == false) { + return null; + } + return new PolicyItem(itemId); + } + + public Item updateItem(Object itemId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + + this.fireItemSetChange(); + + return new PolicyItem(itemId); + } + + public Map<VariableDefinitionType, PolicyType> getVariables() { + return Collections.unmodifiableMap(this.variables); + } + + @Override + public Collection<?> getContainerPropertyIds() { + return POLICY_PROPERTIES; + } + + @Override + public Collection<?> getItemIds() { + XACMLPolicyScanner scanner = null; + final Collection<Object> items = new ArrayList<Object>(); + if (this.root instanceof PolicyType) { + scanner = new XACMLPolicyScanner((PolicyType) this.root); + } else if (this.root instanceof PolicySetType) { + scanner = new XACMLPolicyScanner((PolicySetType) this.root); + } else { + return Collections.unmodifiableCollection(items); + } + + scanner.scan(new XACMLPolicyScanner.SimpleCallback() { + + @Override + public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) { + items.add(rule); + if (rule.getTarget() != null) { + items.add(rule.getTarget()); + } + if (rule.getCondition() != null) { + items.add(rule.getCondition()); + } + if (rule.getObligationExpressions() != null) { + items.addAll(rule.getObligationExpressions().getObligationExpression()); + } + if (rule.getAdviceExpressions() != null) { + items.addAll(rule.getAdviceExpressions().getAdviceExpression()); + } + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicySet(PolicySetType parent, PolicySetType policySet) { + items.add(policySet); + if (policySet.getTarget() != null) { + items.add(policySet.getTarget()); + } + if (policySet.getObligationExpressions() != null) { + items.addAll(policySet.getObligationExpressions().getObligationExpression()); + } + if (policySet.getAdviceExpressions() != null) { + items.addAll(policySet.getAdviceExpressions().getAdviceExpression()); + } + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onPreVisitPolicy(PolicySetType parent, PolicyType policy) { + items.add(policy); + if (policy.getTarget() != null) { + items.add(policy.getTarget()); + } + if (policy.getObligationExpressions() != null) { + items.addAll(policy.getObligationExpressions().getObligationExpression()); + } + if (policy.getAdviceExpressions() != null) { + items.addAll(policy.getAdviceExpressions().getAdviceExpression()); + } + return CallbackResult.CONTINUE; + } + + }); + if (logger.isTraceEnabled()) { + logger.trace("getItemIds: (" + items.size() + "):" + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Property<?> getContainerProperty(Object itemId, Object propertyId) { + if (this.isObjectSupported(itemId) == false) { + return null; + } + + if (propertyId.equals(PROPERTY_NAME)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_NAME, null); + } + + if (propertyId.equals(PROPERTY_ID)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_ID, null); + } + + if (propertyId.equals(PROPERTY_SHORTID)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_SHORTID, null); + } + + if (propertyId.equals(PROPERTY_ICON)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_ICON, null); + } + + if (propertyId.equals(PROPERTY_ALGORITHM)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_ALGORITHM, null); + } + + if (propertyId.equals(PROPERTY_SHORTALGORITHM)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_SHORTALGORITHM, null); + } + + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_DESCRIPTION, null); + } + + if (propertyId.equals(PROPERTY_STATUS)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_STATUS, null); + } + + if (propertyId.equals(PROPERTY_ATTRIBUTES)) { + return new MethodProperty<Object>(getType(propertyId), + new PolicyItem(itemId), POLICYITEM_ATTRIBUTES, null); + } + + return null; + } + + @Override + public Class<?> getType(Object propertyId) { + + if (propertyId.equals(PROPERTY_NAME)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_SHORTID)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ICON)) { + return Resource.class; + } + if (propertyId.equals(PROPERTY_DESCRIPTION)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ALGORITHM)) { + return String.class; + } + if (propertyId.equals(PROPERTY_SHORTALGORITHM)) { + return String.class; + } + if (propertyId.equals(PROPERTY_STATUS)) { + return String.class; + } + if (propertyId.equals(PROPERTY_ATTRIBUTES)) { + return Table.class; + } + return null; + } + + @Override + public int size() { + int size = 0; + size += this.policySets.size(); + size += this.policies.size(); + size += this.rules.size(); + size += this.targets.size(); + size += this.obligations.size(); + size += this.advice.size(); + size += this.anyofs.size(); + size += this.allofs.size(); + size += this.matches.size(); + size += this.conditions.size(); + size += this.variables.size(); + + return size; + } + + @Override + public boolean containsId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("containsId: " + itemId); + } + if (itemId instanceof PolicySetType) { + if (this.root instanceof PolicySetType && ((PolicySetType) itemId).getPolicySetId().equals(((PolicySetType) this.root).getPolicySetId())) { + return true; + } + return this.policySets.containsKey(itemId); + } + if (itemId instanceof PolicyType) { + if (this.root instanceof PolicyType && ((PolicyType) itemId).getPolicyId().equals(((PolicyType) this.root).getPolicyId())) { + return true; + } + return this.policies.containsKey(itemId); + } + if (itemId instanceof RuleType) { + return this.rules.containsKey(itemId); + } + if (itemId instanceof TargetType) { + return this.targets.containsKey(itemId); + } + if (itemId instanceof ObligationExpressionType) { + return this.obligations.containsKey(itemId); + } + if (itemId instanceof AdviceExpressionType) { + return this.advice.containsKey(itemId); + } + if (itemId instanceof AnyOfType) { + return this.anyofs.containsKey(itemId); + } + if (itemId instanceof AllOfType) { + return this.allofs.containsKey(itemId); + } + if (itemId instanceof MatchType) { + return this.matches.containsKey(itemId); + } + if (itemId instanceof ConditionType) { + return this.conditions.containsKey(itemId); + } + if (itemId instanceof VariableDefinitionType) { + return this.variables.containsKey(itemId); + } + return false; + } + + @Override + public Item addItem(Object itemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Please use the addItem(Object, Object) method instead."); + } + + /** + * Add's the new Policy object under the parent. This method appends the item to the end + * of the parent's list if applicable. If you want to add an item within a list, use the + * addItemAfter() method instead. + * + * @param itemId + * @param parent + * @return + * @throws UnsupportedOperationException + */ + public Item addItem(Object itemId, Object parent) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItem: " + itemId); + } + if (itemId instanceof PolicySetType && parent instanceof PolicySetType) { + this.addPolicySet((PolicySetType) parent, (PolicySetType) itemId, true); + } else if (itemId instanceof PolicyType && parent instanceof PolicySetType) { + this.addPolicy((PolicySetType) parent, (PolicyType) itemId, true); + } else if (itemId instanceof RuleType && parent instanceof PolicyType) { + this.addRule((PolicyType) parent, (RuleType) itemId, true); + } else if (itemId instanceof TargetType && + (parent instanceof PolicyType || + parent instanceof PolicySetType || + parent instanceof RuleType)) { + this.addTarget(parent, (TargetType) itemId, true); + } else if (itemId instanceof ObligationExpressionType || + itemId instanceof ObligationExpressionsType) { + if (parent instanceof PolicyType || + parent instanceof PolicySetType || + parent instanceof RuleType || + parent instanceof ObligationExpressionsType) { + if (itemId instanceof ObligationExpressionType) { + this.addObligation(parent, (ObligationExpressionType) itemId, true); + } else { + this.addObligations(parent, (ObligationExpressionsType) itemId, true); + } + } + } else if (itemId instanceof AdviceExpressionType || + itemId instanceof AdviceExpressionsType) { + if (parent instanceof PolicyType || + parent instanceof PolicySetType || + parent instanceof RuleType || + parent instanceof AdviceExpressionsType) { + if (itemId instanceof AdviceExpressionType) { + this.addAdvice(parent, (AdviceExpressionType) itemId, true); + } else { + this.addAdvice(parent, (AdviceExpressionsType) itemId, true); + } + } + } else if (itemId instanceof AnyOfType && parent instanceof TargetType) { + this.addAnyOf((TargetType) parent, (AnyOfType) itemId, true); + } else if (itemId instanceof AllOfType && parent instanceof AnyOfType) { + this.addAllOf((AnyOfType) parent, (AllOfType) itemId, true); + } else if (itemId instanceof MatchType && parent instanceof AllOfType) { + this.addMatch((AllOfType) parent, (MatchType) itemId, true); + } else if (itemId instanceof ConditionType && parent instanceof RuleType) { + this.addCondition((RuleType) parent, (ConditionType) itemId, true); + } else if (itemId instanceof VariableDefinitionType && parent instanceof PolicyType) { + this.addVariable((PolicyType) parent, (VariableDefinitionType) itemId, true); + } else { + throw new UnsupportedOperationException("Unknown itemid or parent type: " + itemId.getClass().getCanonicalName() + " " + parent.getClass().getCanonicalName()); + } + // + // Fire update event + // + this.fireItemSetChange(); + // + // Create a new item + // + return new PolicyItem(itemId); + } + + private void addVariable(PolicyType policy, VariableDefinitionType variable, boolean add) { + if (add) { + if (policy == null) { + throw new NullPointerException(); + } + policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(variable); + } + this.variables.put(variable, policy); + } + + private void addCondition(RuleType rule, ConditionType condition, boolean add) { + if (add) { + if (rule == null) { + throw new NullPointerException(); + } + rule.setCondition(condition); + } + this.conditions.put(condition, rule); + } + + private void addPolicySet(PolicySetType parent, PolicySetType policySet, boolean add) { + if (policySet == null) { + throw new NullPointerException(); + } + if (parent == null && this.isRoot(policySet) == false) { + logger.warn("adding a non-root policy set with no parent"); + return; + } + if (add) { + if (parent == null) { + throw new NullPointerException(); + } + parent.getPolicySetOrPolicyOrPolicySetIdReference().add(new ObjectFactory().createPolicySet(policySet)); + } + this.policySets.put(policySet, parent); + this.addTarget(policySet, policySet.getTarget(), false); + this.addObligations(policySet, policySet.getObligationExpressions(), false); + this.addAdvice(policySet, policySet.getAdviceExpressions(), false); + } + + private void addPolicy(PolicySetType parent, PolicyType policy, boolean add) { + if (policy == null) { + throw new NullPointerException(); + } + if (parent == null && this.isRoot(policy) == false) { + logger.warn("adding a non-root policy with no parent"); + return; + } + if (add) { + if (parent == null) { + throw new NullPointerException(); + } + parent.getPolicySetOrPolicyOrPolicySetIdReference().add(new ObjectFactory().createPolicy(policy)); + } + this.policies.put(policy, parent); + this.addTarget(policy, policy.getTarget(), false); + this.addObligations(policy, policy.getObligationExpressions(), false); + this.addAdvice(policy, policy.getAdviceExpressions(), false); + for (Object obj : policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()) { + if (obj instanceof VariableDefinitionType) { + this.addVariable(policy, (VariableDefinitionType) obj, false); + } + } + } + + private void addRule(PolicyType parent, RuleType rule, boolean add) { + if (rule == null) { + throw new NullPointerException("Rule can't be null"); + } + if (parent == null) { + throw new NullPointerException("Parent policy can't be null"); + } + if (this.isRoot(parent) == false && this.policies.get(parent) == null) { + logger.warn("Could NOT find parent as root or in map: " + parent); + return; + } + if (add) { + parent.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule); + } + this.rules.put(rule, parent); + this.addTarget(rule, rule.getTarget(), false); + this.addObligations(rule, rule.getObligationExpressions(), false); + this.addAdvice(rule, rule.getAdviceExpressions(), false); + this.addCondition(rule, rule.getCondition(), add); + } + + private void addTarget(Object parent, TargetType target, boolean add) { + if (target == null) { + logger.error("TargetType is NULL"); + return; + } + if (add) { + if (parent == null) { + throw new NullPointerException(); + } + if (parent instanceof PolicySetType) { + ((PolicySetType) parent).setTarget(target); + } else if (parent instanceof PolicyType) { + ((PolicyType) parent).setTarget(target); + } else if (parent instanceof RuleType) { + ((RuleType) parent).setTarget(target); + } else { + logger.error("Adding target to unknown class: " + parent.getClass().getCanonicalName()); + } + } + this.targets.put(target, parent); + this.addAnyOfs(target); + } + + private void addAnyOfs(TargetType target) { + for (AnyOfType anyof : target.getAnyOf()) { + this.anyofs.put(anyof, target); + this.addAllOfs(anyof); + } + } + + private void addAnyOf(TargetType target, AnyOfType anyof, boolean add) { + if (add) { + target.getAnyOf().add(anyof); + } + this.anyofs.put(anyof, target); + } + + private void addAllOfs(AnyOfType anyof) { + for (AllOfType allof : anyof.getAllOf()) { + this.allofs.put(allof, anyof); + this.addMatches(allof); + } + } + + private void addAllOf(AnyOfType anyof, AllOfType allof, boolean add) { + if (add) { + anyof.getAllOf().add(allof); + } + this.allofs.put(allof, anyof); + } + + private void addMatches(AllOfType allofs) { + for (MatchType match : allofs.getMatch()) { + this.matches.put(match, allofs); + } + } + + private void addMatch(AllOfType allofs, MatchType match, boolean add) { + if (add) { + allofs.getMatch().add(match); + } + this.matches.put(match, allofs); + } + + private void addObligations(Object parent, ObligationExpressionsType expressions, boolean bAdd) { + if (expressions == null || expressions.getObligationExpression() == null) { + return; + } + if (bAdd) { + if (parent instanceof PolicySetType) { + ((PolicySetType) parent).setObligationExpressions(expressions); + } else if (parent instanceof PolicyType) { + ((PolicyType) parent).setObligationExpressions(expressions); + } else if (parent instanceof RuleType) { + ((RuleType) parent).setObligationExpressions(expressions); + } + } + for (ObligationExpressionType expression : expressions.getObligationExpression()) { + this.obligations.put(expression, parent); + } + } + + private void addObligation(Object parent, ObligationExpressionType expression, boolean bAdd) { + ObligationExpressionsType expressions = null; + if (parent instanceof PolicySetType) { + expressions = ((PolicySetType) parent).getObligationExpressions(); + if (expressions == null) { + expressions = new ObligationExpressionsType(); + ((PolicySetType) parent).setObligationExpressions(expressions); + } + } else if (parent instanceof PolicyType) { + expressions = ((PolicyType) parent).getObligationExpressions(); + if (expressions == null) { + expressions = new ObligationExpressionsType(); + ((PolicyType) parent).setObligationExpressions(expressions); + } + } else if (parent instanceof RuleType) { + expressions = ((RuleType) parent).getObligationExpressions(); + if (expressions == null) { + expressions = new ObligationExpressionsType(); + ((RuleType) parent).setObligationExpressions(expressions); + } + } else if (parent instanceof ObligationExpressionsType) { + expressions = (ObligationExpressionsType) parent; + if (bAdd) { + expressions.getObligationExpression().add(expression); + } + parent = this.getParent(expressions); + this.obligations.put(expression, parent); + return; + } + if (bAdd) { + expressions.getObligationExpression().add(expression); + } + this.obligations.put(expression, parent); + } + + private void addAdvice(Object parent, AdviceExpressionsType expressions, boolean bAdd) { + if (expressions == null || expressions.getAdviceExpression() == null) { + return; + } + if (bAdd) { + if (parent instanceof PolicySetType) { + ((PolicySetType) parent).setAdviceExpressions(expressions); + } else if (parent instanceof PolicyType) { + ((PolicyType) parent).setAdviceExpressions(expressions); + } else if (parent instanceof RuleType) { + ((RuleType) parent).setAdviceExpressions(expressions); + } + } + for (AdviceExpressionType expression : expressions.getAdviceExpression()) { + this.advice.put(expression, parent); + } + } + + private void addAdvice(Object parent, AdviceExpressionType expression, boolean bAdd) { + AdviceExpressionsType expressions = null; + if (parent instanceof PolicySetType) { + expressions = ((PolicySetType) parent).getAdviceExpressions(); + if (expressions == null) { + expressions = new AdviceExpressionsType(); + ((PolicySetType) parent).setAdviceExpressions(expressions); + } + } else if (parent instanceof PolicyType) { + expressions = ((PolicyType) parent).getAdviceExpressions(); + if (expressions == null) { + expressions = new AdviceExpressionsType(); + ((PolicyType) parent).setAdviceExpressions(expressions); + } + } else if (parent instanceof RuleType) { + expressions = ((RuleType) parent).getAdviceExpressions(); + if (expressions == null) { + expressions = new AdviceExpressionsType(); + ((RuleType) parent).setAdviceExpressions(expressions); + } + } else if (parent instanceof AdviceExpressionsType) { + expressions = (AdviceExpressionsType) parent; + if (bAdd) { + expressions.getAdviceExpression().add(expression); + } + parent = this.getParent(expressions); + this.advice.put(expression, parent); + return; + } + if (bAdd) { + expressions.getAdviceExpression().add(expression); + } + this.advice.put(expression, parent); + } + + @Override + public Object addItem() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Policy Container cannot add an unknown item."); + } + + @Override + public boolean addContainerProperty(Object propertyId, Class<?> type, + Object defaultValue) throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeContainerProperty(Object propertyId) + throws UnsupportedOperationException { + return false; + } + + @Override + public boolean removeAllItems() throws UnsupportedOperationException { + throw new UnsupportedOperationException("Policy Container cannot remove all items. You must have a base Policy or Policy Set."); + } + + @Override + public Collection<?> getChildren(Object itemId) { + final Collection<Object> items = new ArrayList<Object>(); + + if (itemId instanceof PolicySetType) { + PolicySetType policySet = (PolicySetType) itemId; + if (policySet.getTarget() != null) { + items.add(policySet.getTarget()); + } + if (policySet.getObligationExpressions() != null) { + items.addAll(policySet.getObligationExpressions().getObligationExpression()); + } + if (policySet.getAdviceExpressions() != null) { + items.addAll(policySet.getAdviceExpressions().getAdviceExpression()); + } + List<JAXBElement<?>> children = policySet.getPolicySetOrPolicyOrPolicySetIdReference(); + for (JAXBElement<?> element : children) { + if (element.getName().getLocalPart().equals("PolicySet")) { + items.add(element.getValue()); + } else if (element.getName().getLocalPart().equals("Policy")) { + items.add(element.getValue()); + } + } + } else if (itemId instanceof PolicyType) { + PolicyType policy = (PolicyType) itemId; + if (policy.getTarget() != null) { + items.add(policy.getTarget()); + } + List<Object> objs = policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition(); + for (Object obj : objs) { + if (obj instanceof VariableDefinitionType) { + items.add(obj); + } else if (obj instanceof RuleType) { + items.add(obj); + } + } + if (policy.getObligationExpressions() != null) { + items.addAll(policy.getObligationExpressions().getObligationExpression()); + } + if (policy.getAdviceExpressions() != null) { + items.addAll(policy.getAdviceExpressions().getAdviceExpression()); + } + } else if (itemId instanceof RuleType) { + RuleType rule = (RuleType) itemId; + if (rule.getTarget() != null) { + items.add(rule.getTarget()); + } + if (rule.getCondition() != null) { + items.add(rule.getCondition()); + } + if (rule.getObligationExpressions() != null) { + items.addAll(((RuleType) itemId).getObligationExpressions().getObligationExpression()); + } + if (rule.getAdviceExpressions() != null) { + items.addAll(rule.getAdviceExpressions().getAdviceExpression()); + } + } else if (itemId instanceof TargetType) { + for (AnyOfType anyof : ((TargetType) itemId).getAnyOf()) { + items.add(anyof); + } + } else if (itemId instanceof AnyOfType) { + for (AllOfType allof : ((AnyOfType) itemId).getAllOf()) { + items.add(allof); + } + } else if (itemId instanceof AllOfType) { + for (MatchType match : ((AllOfType) itemId).getMatch()) { + items.add(match); + } + } + if (logger.isTraceEnabled()) { + logger.trace("getChildren: " + itemId + "(" + items.size() + ") " + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public Object getParent(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("getParent: " + itemId); + } + assert itemId != null; + if (itemId == null) { + logger.fatal("getParent called with NULL object"); + return null; + } + if (itemId.equals(this.root)) { + if (logger.isTraceEnabled()) { + logger.trace("getParent is the root"); + } + return null; + } + if (itemId instanceof PolicySetType) { + return this.policySets.get(itemId); + } + if (itemId instanceof PolicyType) { + return this.policies.get(itemId); + } + if (itemId instanceof RuleType) { + return this.rules.get(itemId); + } + if (itemId instanceof TargetType) { + return this.targets.get(itemId); + } + if (itemId instanceof ObligationExpressionType) { + return this.obligations.get(itemId); + } + if (itemId instanceof AdviceExpressionType) { + return this.advice.get(itemId); + } + if (itemId instanceof AllOfType) { + return this.allofs.get(itemId); + } + if (itemId instanceof AnyOfType) { + return this.anyofs.get(itemId); + } + if (itemId instanceof MatchType) { + return this.matches.get(itemId); + } + if (itemId instanceof ConditionType) { + return this.conditions.get(itemId); + } + if (itemId instanceof VariableDefinitionType) { + return this.variables.get(itemId); + } + return null; + } + + @Override + public Collection<?> rootItemIds() { + final Collection<Object> items = new ArrayList<Object>(); + items.add(this.root); + if (logger.isTraceEnabled()) { + logger.trace("rootItemIds: " + items); + } + return Collections.unmodifiableCollection(items); + } + + @Override + public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + boolean result = this.setItemParent(itemId, newParentId); + if (result == true) { + if (logger.isTraceEnabled()) { + logger.trace("setParent: " + itemId + " " + newParentId + " succeeded."); + } + this.fireItemSetChange(); + } + return result; + } + + protected boolean setItemParent(Object itemId, Object newParentId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("setItemParent: " + itemId + " " + newParentId); + } + if (newParentId instanceof PolicySetType) { + return this.moveItemToPolicySet(itemId, (PolicySetType) newParentId); + } + if (newParentId instanceof PolicyType) { + return this.moveItemToPolicy(itemId, (PolicyType) newParentId); + } + if (newParentId instanceof RuleType) { + return this.moveItemToRule(itemId, (RuleType) newParentId); + } + if (newParentId instanceof TargetType) { + return this.moveItemToTarget(itemId, (TargetType) newParentId); + } + if (newParentId instanceof AnyOfType) { + return this.moveItemToAnyOf(itemId, (AnyOfType) newParentId); + } + if (newParentId instanceof AllOfType) { + return this.moveItemToAllOf(itemId, (AllOfType) newParentId); + } + return false; + } + + protected boolean moveItemToPolicySet(Object itemId, PolicySetType policySet) { + if (itemId instanceof PolicySetType) { + + if (this.doRemoveItem(itemId)) { + this.addPolicySet(policySet, (PolicySetType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof PolicyType) { + if (this.doRemoveItem(itemId)) { + this.addPolicy(policySet, (PolicyType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof TargetType) { + if (this.doRemoveItem(itemId)) { + this.addTarget(policySet, (TargetType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof ObligationExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addObligation(policySet, (ObligationExpressionType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof AdviceExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addAdvice(policySet, (AdviceExpressionType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to Policy Set: " + itemId.getClass().getCanonicalName()); + return false; + } + + protected boolean moveItemToPolicy(Object itemId, PolicyType policy) { + if (itemId instanceof RuleType) { + if (this.doRemoveItem(itemId)) { + this.addRule(policy, (RuleType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof TargetType) { + if (this.doRemoveItem(itemId)) { + this.addTarget(policy, (TargetType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof ObligationExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addObligation(policy, (ObligationExpressionType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof AdviceExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addAdvice(policy, (AdviceExpressionType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof VariableDefinitionType) { + if (this.doRemoveItem(itemId)) { + this.addVariable(policy, (VariableDefinitionType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to Policy: " + itemId.getClass().getCanonicalName()); + return false; + } + + protected boolean moveItemToRule(Object itemId, RuleType rule) { + if (itemId instanceof TargetType) { + if (this.doRemoveItem(itemId)) { + this.addTarget(rule, (TargetType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof ObligationExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addObligation(rule, (ObligationExpressionType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof AdviceExpressionType) { + if (this.doRemoveItem(itemId)) { + this.addAdvice(rule, (AdviceExpressionsType) itemId, true); + return true; + } + return false; + } else if (itemId instanceof ConditionType) { + if (this.doRemoveItem(itemId)) { + this.addCondition(rule, (ConditionType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to Rule: " + itemId.getClass().getCanonicalName()); + return false; + } + + protected boolean moveItemToTarget(Object itemId, TargetType target) { + if (itemId instanceof AnyOfType) { + if (this.doRemoveItem(itemId)) { + this.addAnyOf(target, (AnyOfType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to target: " + itemId.getClass().getCanonicalName()); + return false; + } + + protected boolean moveItemToAnyOf(Object itemId, AnyOfType anyOf) { + if (itemId instanceof AllOfType) { + if (this.doRemoveItem(itemId)) { + this.addAllOf(anyOf, (AllOfType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to anyOf: " + itemId.getClass().getCanonicalName()); + return false; + } + + protected boolean moveItemToAllOf(Object itemId, AllOfType allOf) { + if (itemId instanceof MatchType) { + if (this.doRemoveItem(itemId)) { + this.addMatch(allOf, (MatchType) itemId, true); + return true; + } + return false; + } + logger.warn("Can't move this item to allOf: " + itemId.getClass().getCanonicalName()); + return false; + } + + @Override + public boolean areChildrenAllowed(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("areChildrenAllowed: " + itemId); + } + if (itemId instanceof MatchType || + itemId instanceof ObligationExpressionType || + itemId instanceof AdviceExpressionType || + itemId instanceof ConditionType || + itemId instanceof VariableDefinitionType) { + return false; + } + return true; + } + + @Override + public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) + throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("setChildrenAllowed: " + itemId + " " + areChildrenAllowed); + } + if (itemId instanceof MatchType || + itemId instanceof ObligationExpressionType || + itemId instanceof AdviceExpressionType || + itemId instanceof ConditionType || + itemId instanceof VariableDefinitionType) { + if (areChildrenAllowed == true) { + return false; + } + return true; + } + if (areChildrenAllowed == false) { + return false; + } + return true; + } + + @Override + public boolean isRoot(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isRoot: " + itemId); + } + assert itemId != null; + if (itemId == null) { + // + // This usually means the container's map's are screwed up. + // + logger.error("NULL isRoot item"); + return false; + } + if (itemId instanceof PolicyType && this.root instanceof PolicyType && itemId.equals(this.root)) { + return true; + } else if (itemId instanceof PolicySetType && this.root instanceof PolicySetType && itemId.equals(this.root)) { + return true; + } + return false; + } + + @Override + public boolean hasChildren(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("hasChildren: " + itemId); + } + if (itemId instanceof MatchType || + itemId instanceof ObligationExpressionType || + itemId instanceof AdviceExpressionType || + itemId instanceof ConditionType || + itemId instanceof VariableDefinitionType) { + return false; + } + return true; + } + + @Override + public boolean removeItem(Object itemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("removeItem: " + itemId); + } + boolean result = this.doRemoveItem(itemId); + if (result) { + this.fireItemSetChange(); + } + return result; + } + + protected boolean doRemoveItem(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("doRemoveItem: " + itemId); + } + if (itemId instanceof PolicySetType) { + PolicySetType parent = this.policySets.get(itemId); + if (parent == null) { + logger.error("policy set not found in map"); + assert false; + return false; + } + return this.removePolicySetFromPolicySet(parent, (PolicySetType) itemId); + } else if (itemId instanceof PolicyType) { + PolicySetType parent = this.policies.get(itemId); + if (parent == null) { + logger.error("policy not found in map"); + assert false; + return false; + } + return this.removePolicyFromPolicySet(parent, (PolicyType) itemId); + } else if (itemId instanceof RuleType) { + PolicyType parent = this.rules.get(itemId); + if (parent == null) { + logger.error("rule not found in map"); + assert false; + return false; + } + if (parent.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().remove(itemId)) { + this.removeRule((RuleType) itemId); + return true; + } + logger.error("Failed to remove rule from parent policy"); + assert false; + return false; + } else if (itemId instanceof TargetType) { + throw new UnsupportedOperationException("Cannot remove TargetType directly - please remove it via PolicySet/Policy/Rule"); + } else if (itemId instanceof ObligationExpressionType) { + Object parent = this.obligations.get(itemId); + if (parent == null) { + logger.error("obligation not found in map"); + assert false; + return false; + } + if (parent instanceof PolicySetType) { + if (((PolicySetType) parent).getObligationExpressions() != null) { + if (((PolicySetType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) { + logger.error("Failed to remove obligation expression from policy set"); + assert false; + return false; + } + } else { + logger.error("policy set does not contain obligation expressions, cannot remove"); + assert false; + return false; + } + } else if (parent instanceof PolicyType) { + if (((PolicyType) parent).getObligationExpressions() != null) { + if (((PolicyType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) { + logger.error("Failed to remove obligation expression from policy"); + assert false; + return false; + } + } else { + logger.error("policy does not contain obligation expressions, cannot remove"); + assert false; + return false; + } + } else if (parent instanceof RuleType) { + if (((RuleType) parent).getObligationExpressions() != null) { + if (((RuleType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) { + logger.error("Failed to remove obligation expression from policy set"); + assert false; + return false; + } + } else { + logger.error("rule does not contain obligation expressions, cannot remove"); + assert false; + return false; + } + } else { + logger.error("Unknown parent for obligation: " + parent.getClass().getCanonicalName()); + assert false; + return false; + } + if (this.obligations.remove(itemId) == null) { + logger.error("obligation map does not contain itemId"); + assert false; + } + return true; + } else if (itemId instanceof AdviceExpressionType) { + Object parent = this.advice.get(itemId); + if (parent == null) { + logger.error("advice not found in map"); + assert false; + return false; + } + if (parent instanceof PolicySetType) { + if (((PolicySetType) parent).getAdviceExpressions() != null) { + if (((PolicySetType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) { + logger.error("Failed to remove advice expression from policy set"); + assert false; + return false; + } + } else { + logger.error("policy set does not contain advice expressions, cannot remove"); + assert false; + return false; + } + } else if (parent instanceof PolicyType) { + if (((PolicyType) parent).getAdviceExpressions() != null) { + if (((PolicyType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) { + logger.error("Failed to remove advice expression from policy"); + assert false; + return false; + } + } else { + logger.error("policy does not contain advice expressions, cannot remove"); + assert false; + return false; + } + } else if (parent instanceof RuleType) { + if (((RuleType) parent).getAdviceExpressions() != null) { + if (((RuleType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) { + logger.error("Failed to remove advice expression from rule"); + assert false; + return false; + } + } else { + logger.error("rule does not contain advice expressions, cannot remove"); + assert false; + return false; + } + } else { + logger.error("Unknown parent for advice: " + parent.getClass().getCanonicalName()); + assert false; + return false; + } + if (this.advice.remove((AdviceExpressionType) itemId) == null) { + logger.error("obligation map does not contain itemId"); + assert false; + } + return true; + } else if (itemId instanceof AnyOfType) { + TargetType parent = this.anyofs.get(itemId); + if (parent == null) { + logger.error("anyof not found in map"); + assert false; + return false; + } + if (parent.getAnyOf().remove(itemId)) { + this.removeAnyOf((AnyOfType) itemId); + return true; + } else { + logger.error("Failed to remove itemId from target"); + assert false; + return false; + } + } else if (itemId instanceof AllOfType) { + AnyOfType parent = this.allofs.get(itemId); + if (parent == null) { + logger.error("allof not found in map"); + assert false; + return false; + } + if (parent.getAllOf().remove(itemId)) { + this.removeAllOf((AllOfType) itemId); + return true; + } else { + logger.error("Failed to remove itemId from anyOf"); + assert false; + return false; + } + } else if (itemId instanceof MatchType) { + AllOfType parent = this.matches.get(itemId); + if (parent == null) { + logger.error("match not found in map"); + assert false; + return false; + } + if (parent.getMatch().remove(itemId)) { + this.removeMatch((MatchType) itemId); + return true; + } else { + logger.error("Failed to remove itemId from allOf"); + assert false; + return false; + } + } else if (itemId instanceof ConditionType) { + RuleType rule = this.conditions.get(itemId); + if (rule != null) { + rule.setCondition(null); + if (this.conditions.remove(itemId) == null) { + logger.error("Failed to remove condition from map"); + assert false; + return false; + } + return true; + } else { + logger.error("condition not found in map"); + assert false; + return false; + } + } else if (itemId instanceof VariableDefinitionType) { + PolicyType policy = this.variables.get(itemId); + if (policy != null) { + if (policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().remove(itemId)) { + if (this.variables.remove(itemId) == null) { + logger.error("failed to remove variable from map"); + assert false; + return false; + } + return true; + } else { + logger.error("failed to remove variable from policy"); + assert false; + return false; + } + } else { + logger.error("variable not found in map"); + assert false; + return false; + } + } + logger.error("Failed to remove policy set from policy set, not found."); + return false; + } + + protected boolean removePolicyFromPolicySet(PolicySetType parent, PolicyType policy) { + for (JAXBElement<?> element : parent.getPolicySetOrPolicyOrPolicySetIdReference()) { + if (PolicyType.class.isAssignableFrom(element.getDeclaredType()) && + ((PolicyType) element.getValue()).getPolicyId().equals(policy.getPolicyId())) { + if (parent.getPolicySetOrPolicyOrPolicySetIdReference().remove(element)) { + this.removePolicy(policy); + return true; + } + logger.error("Failed to remove policy from parent policy set"); + assert false; + return false; + } + } + logger.error("Failed to remove policy from policy set, not found."); + return false; + } + + protected boolean removePolicySetFromPolicySet(PolicySetType parent, PolicySetType policySet) { + for (JAXBElement<?> element : parent.getPolicySetOrPolicyOrPolicySetIdReference()) { + if (PolicySetType.class.isAssignableFrom(element.getDeclaredType())) { + logger.info(element); + if (((PolicySetType) element.getValue()).getPolicySetId().equals(policySet.getPolicySetId())) { + if (parent.getPolicySetOrPolicyOrPolicySetIdReference().remove(element)) { + this.removePolicySet(policySet); + return true; + } + logger.error("Failed to remove policy set from parent policy set"); + assert false; + return false; + } + } + } + return false; + } + + protected void removePolicySet(PolicySetType policySet) { + if (this.policySets.remove(policySet) == null) { + logger.warn("Failed to remove policy set from map: " + policySet); + return; + } + // + // Remove its objects from the other maps + // + this.removeTarget(policySet.getTarget()); + this.removeObligations(policySet.getObligationExpressions()); + this.removeAdvice(policySet.getAdviceExpressions()); + } + + protected void removePolicy(PolicyType policy) { + if (this.policies.remove(policy) == null) { + logger.warn("Failed to remove policy from map: " + policy); + return; + } + // + // Remove its objects from the other maps + // + this.removeTarget(policy.getTarget()); + this.removeObligations(policy.getObligationExpressions()); + this.removeAdvice(policy.getAdviceExpressions()); + this.removeVariables(policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()); + } + + protected void removeVariables(List<Object> combinerParametersOrRuleCombinerParametersOrVariableDefinition) { + for (Object object : combinerParametersOrRuleCombinerParametersOrVariableDefinition) { + if (object instanceof VariableDefinitionType) { + this.variables.remove(object); + } + } + } + + protected void removeRule(RuleType rule) { + if (this.rules.remove(rule) == null) { + logger.warn("Failed to remove rule from map: " + rule); + return; + } + // + // Remove its objects from the other maps + // + this.removeTarget(rule.getTarget()); + this.removeObligations(rule.getObligationExpressions()); + this.removeAdvice(rule.getAdviceExpressions()); + if (rule.getCondition() != null) { + this.conditions.remove(rule.getCondition()); + } + } + + protected void removeObligations(ObligationExpressionsType expressions) { + if (expressions == null) { + return; + } + for (ObligationExpressionType expression : expressions.getObligationExpression()) { + if (this.obligations.remove(expression) == null) { + logger.warn("Failed to remove obligation expression: " + expression); + } + } + } + + protected void removeAdvice(AdviceExpressionsType expressions) { + if (expressions == null) { + return; + } + for (AdviceExpressionType expression : expressions.getAdviceExpression()) { + if (this.advice.remove(expression) == null) { + logger.warn("Failed to remove advice expression: " + expression); + } + } + } + + protected void removeTarget(TargetType target) { + if (this.targets.remove(target) == null) { + logger.warn("Failed to remove target from map: " + target); + return; + } + for (AnyOfType anyof : target.getAnyOf()) { + this.removeAnyOf(anyof); + } + } + + protected void removeAnyOf(AnyOfType anyof) { + if (this.anyofs.remove(anyof) == null) { + logger.warn("failed to remove anyof from map: " + anyof); + return; + } + for (AllOfType allof : anyof.getAllOf()) { + this.removeAllOf(allof); + } + } + + protected void removeAllOf(AllOfType allof) { + if (this.allofs.remove(allof) == null) { + logger.warn("failed to remove allof from map: " + allof); + return; + } + for (MatchType match : allof.getMatch()) { + this.removeMatch(match); + } + } + + protected void removeMatch(MatchType match) { + if (this.matches.remove(match) == null) { + logger.warn("failed to remove match from map: " + match); + return; + } + } + + @Override + public Object nextItemId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("nextItemId: " + itemId); + } + return null; + } + + @Override + public Object prevItemId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("prevItemId: " + itemId); + } + return null; + } + + @Override + public Object firstItemId() { + if (logger.isTraceEnabled()) { + logger.trace("firstItemId: "); + } + return this.root; + } + + @Override + public Object lastItemId() { + if (logger.isTraceEnabled()) { + logger.trace("lastItemId: "); + } + return null; + } + + @Override + public boolean isFirstId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isFirstId: " + itemId); + } + // + // The Oasis classes do not have equals implemented. So I am + // not too sure that using equals works. + // + if (this.root != null && itemId != null) { + return this.root.equals(itemId); + } + if (logger.isTraceEnabled()) { + logger.trace("item is NOT the first ID" + itemId); + } + return false; + } + + @Override + public boolean isLastId(Object itemId) { + if (logger.isTraceEnabled()) { + logger.trace("isLastId: " + itemId); + } + return false; + } + + @Override + public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Need to know what you want added. Please use addItemAfter(Object, Object) instead."); + } + + @Override + public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("addItemAfter: " + previousItemId + " new " + newItemId); + } + /* + if (newItemId instanceof PolicySetType) { + + } + // + // Get our parents + // + Object parentPreviousItem = this.getParent(previousItemId); + */ + return null; + } + + public Item moveAfterSibling(Object itemId, Object siblingId) throws UnsupportedOperationException { + if (logger.isTraceEnabled()) { + logger.trace("moveAfterSibling: " + itemId + " sibling " + siblingId); + } + // + // Get the parents, which should be the same + // + /* + Object itemParent = this.getParent(itemId); + Object siblingParent = this.getParent(siblingId); + if (itemParent == null) { + logger.error("can't move the root element"); + return null; + } + if (itemParent != siblingParent) { + logger.error("parents are not the same"); + return null; + } + if (itemId instanceof PolicySetType) { + assert(itemParent instanceof PolicySetType); + if (itemParent instanceof PolicySetType) { + if (siblingId instanceof PolicySetType || siblingId instanceof PolicyType) { + int index = ((PolicySetType) itemParent).getPolicySetOrPolicyOrPolicySetIdReference().indexOf(siblingId); + + } + } + } + */ + return null; + } + + /** + * This class is returned to caller's to display the properties + * for each policy object. + * + * @author pameladragosh + * + */ + public class PolicyItem implements Item { + private static final long serialVersionUID = 1L; + private final Object data; + + public PolicyItem(Object data) { + this.data = data; + } + + public String getName() { + if (this.data instanceof RuleType) { + return "Rule"; + } + if (this.data instanceof PolicyType) { + return "Policy"; + } + if (this.data instanceof PolicySetType) { + return "Policy Set"; + } + if (this.data instanceof TargetType) { + return "Target"; + } + if (this.data instanceof AnyOfType) { + return "Any Of"; + } + if (this.data instanceof AllOfType) { + return "All Of"; + } + if (this.data instanceof MatchType) { + return "Match"; + } + if (this.data instanceof ObligationExpressionType) { + return "Obligation"; + } + if (this.data instanceof AdviceExpressionType) { + return "Advice"; + } + if (this.data instanceof ConditionType) { + return "Condition"; + } + if (this.data instanceof VariableDefinitionType) { + return "Variable"; + } + return null; + } + + public String getId() { + if (this.data instanceof RuleType) { + return ((RuleType) this.data).getRuleId(); + } + if (this.data instanceof PolicyType) { + return ((PolicyType) this.data).getPolicyId(); + } + if (this.data instanceof PolicySetType) { + return ((PolicySetType) this.data).getPolicySetId(); + } + if (this.data instanceof ObligationExpressionType) { + return ((ObligationExpressionType) this.data).getObligationId(); + } + if (this.data instanceof AdviceExpressionType) { + return ((AdviceExpressionType) this.data).getAdviceId(); + } + /* + if (this.data instanceof TargetType) { + return this.data.toString(); + } + if (this.data instanceof AnyOfType) { + return this.data.toString(); + } + if (this.data instanceof AllOfType) { + return this.data.toString(); + } + if (this.data instanceof MatchType) { + ((MatchType) this.data).getMatchId(); + } + */ + if (this.data instanceof VariableDefinitionType) { + ((VariableDefinitionType) this.data).getVariableId(); + } + return null; + } + + public String getShortId() { + String id = this.getId(); + if (id == null) { + return null; + } + String[] parts = id.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + + return null; + } + + public String getDescription() { + if (this.data instanceof RuleType) { + return ((RuleType) this.data).getDescription(); + } else if (this.data instanceof PolicyType) { + return ((PolicyType) this.data).getDescription(); + } else if (this.data instanceof PolicySetType) { + return ((PolicySetType) this.data).getDescription(); + } else if (this.data instanceof MatchType) { + StringBuilder builder = new StringBuilder(); + AttributeValueType value = ((MatchType) this.data).getAttributeValue(); + if (value != null) { + builder.append(value.getContent()); + builder.append(" "); + } + String alg = this.getShortAlgorithm(); + if (alg != null && alg.length() > 0) { + builder.append(alg); + builder.append(" "); + } + if (((MatchType) this.data).getAttributeDesignator() != null) { + builder.append(((MatchType) this.data).getAttributeDesignator().getAttributeId()); + } else if (((MatchType) this.data).getAttributeSelector() != null) { + builder.append(((MatchType) this.data).getAttributeSelector().getContextSelectorId()); + } + return builder.toString(); + } + return null; + } + + public String getAlgorithm() { + if (this.data instanceof PolicyType) { + return ((PolicyType) this.data).getRuleCombiningAlgId(); + } + if (this.data instanceof PolicySetType) { + return ((PolicySetType) this.data).getPolicyCombiningAlgId(); + } + if (this.data instanceof RuleType) { + return ((RuleType) this.data).getEffect().toString(); + } + if (this.data instanceof MatchType) { + return ((MatchType) this.data).getMatchId(); + } + if (this.data instanceof ObligationExpressionType) { + return ((ObligationExpressionType) this.data).getFulfillOn().toString(); + } + if (this.data instanceof AdviceExpressionType) { + return ((AdviceExpressionType) this.data).getAppliesTo().toString(); + } + if (this.data instanceof ConditionType) { + return this.getRootExpressionFunction(((ConditionType) this.data).getExpression()); + } + if (this.data instanceof VariableDefinitionType) { + //return this.getRootExpressionFunction(((VariableDefinitionType) this.data).getExpression()); + return ((VariableDefinitionType) this.data).getVariableId(); + } + return null; + } + + public String getShortAlgorithm() { + String algorithm = null; + if (this.data instanceof PolicyType) { + algorithm = ((PolicyType) this.data).getRuleCombiningAlgId(); + } + if (this.data instanceof PolicySetType) { + algorithm = ((PolicySetType) this.data).getPolicyCombiningAlgId(); + } + if (this.data instanceof RuleType) { + return ((RuleType) this.data).getEffect().toString(); + } + if (this.data instanceof ObligationExpressionType) { + return ((ObligationExpressionType) this.data).getFulfillOn().toString(); + } + if (this.data instanceof AdviceExpressionType) { + return ((AdviceExpressionType) this.data).getAppliesTo().toString(); + } + if (this.data instanceof MatchType) { + algorithm = ((MatchType) this.data).getMatchId(); + } + if (this.data instanceof ConditionType) { + algorithm = this.getRootExpressionFunction(((ConditionType) this.data).getExpression()); + if (algorithm.startsWith("http")) { + return algorithm; + } + } + if (this.data instanceof VariableDefinitionType) { + //algorithm = this.getRootExpressionFunction(((VariableDefinitionType) this.data).getExpression()); + return ((VariableDefinitionType) this.data).getVariableId(); + } + if (algorithm != null) { + Iterable<String> fields = Splitter.on(':').trimResults().omitEmptyStrings().split(algorithm); + if (fields != null) { + String lastId = null; + for (String id : fields) { + lastId = id; + } + return lastId; + } + } + return null; + } + + public Resource getIcon() { + if (this.data instanceof PolicySetType) { + return new ThemeResource("../runo/icons/16/folder.png"); + } + if (this.data instanceof RuleType) { + if (((RuleType) this.data).getEffect() == null) { + logger.warn("Rule has a null Effect"); + return new ThemeResource("icons/deny-16.png"); + } + if (((RuleType) this.data).getEffect() == EffectType.DENY) { + return new ThemeResource("icons/deny-16.png"); + } + return new ThemeResource("icons/permit-16.png"); + } + if (this.data instanceof PolicyType) { + return new ThemeResource("../runo/icons/16/document-txt.png"); + } + if (this.data instanceof TargetType) { + return new ThemeResource("icons/target-green-16.png"); + } + if (this.data instanceof ObligationExpressionType) { + return new ThemeResource("icons/obligation-16.png"); + } + if (this.data instanceof AdviceExpressionType) { + return new ThemeResource("icons/advice-16.png"); + } + if (this.data instanceof ConditionType) { + return new ThemeResource("icons/condition-16.png"); + } + if (this.data instanceof VariableDefinitionType) { + return new ThemeResource("icons/variable-16.png"); + } + return null; + } + + public String getStatus() { + StringBuffer buffer = new StringBuffer(); + String a = this.getAlgorithm(); + //String id = this.getId(); + if (this.data instanceof RuleType) { + RuleType rule = ((RuleType) this.data); + buffer.append("Rule"); + EffectType effect = rule.getEffect(); + if (effect == null) { + rule.setEffect(EffectType.PERMIT); + } + if (rule.getEffect() == EffectType.PERMIT) { + buffer.append(" (PERMIT)"); + } else if (rule.getEffect() == EffectType.DENY) { + buffer.append(" (DENY)"); + } + } else if (this.data instanceof PolicyType) { + buffer.append("Policy"); + } else if (this.data instanceof PolicySetType) { + buffer.append("Policy Set"); + } + /* + if (id != null) { + String[] ids = id.split("[:]"); + if (ids.length > 0) { + buffer.append(" " + ids[ids.length - 1]); + } + } + */ + if (a != null) { + String[] algs = a.split("[:]"); + if (algs.length > 0) { + buffer.append(" (" + algs[algs.length - 1] + ")"); + } + } + /* + String d = this.getDescription(); + if (d != null) { + buffer.append(" " + d); + } + */ + return buffer.toString(); + } + + public Table getAttributes() { + /* + if (this.data instanceof MatchType) { + + } + */ + return null; + } + + protected String getRootExpressionFunction(JAXBElement<?> element) { + if (element == null || element.getValue() == null) { + return null; + } + Object value = element.getValue(); + if (value instanceof ApplyType) { + return ((ApplyType) value).getFunctionId(); + } + if (value instanceof AttributeValueType) { + return ((AttributeValueType) value).getDataType(); + } + if (value instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) value).getAttributeId(); + } + if (value instanceof AttributeSelectorType) { + return ((AttributeSelectorType) value).getContextSelectorId(); + } + if (value instanceof VariableReferenceType) { + return "Variable=" + ((VariableReferenceType) value).getVariableId(); + } + if (value instanceof FunctionType) { + return ((FunctionType) value).getFunctionId(); + } + return null; + } + + @Override + public Property<?> getItemProperty(Object id) { + return getContainerProperty(data, id); + } + + @Override + public Collection<?> getItemPropertyIds() { + return getContainerPropertyIds(); + } + + @SuppressWarnings("rawtypes") + @Override + public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Policy container does not support adding new properties"); + } + + @Override + public boolean removeItemProperty(Object id) throws UnsupportedOperationException { + throw new UnsupportedOperationException("Policy container does not support property removal"); + } + + @Override + public String toString() { + return this.getName(); + } + + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java new file mode 100644 index 0000000..944c3c8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java
@@ -0,0 +1,56 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import com.vaadin.ui.Notification; + +/** + * A simple mechanism for displaying messages to the user. + * + * At the moment this is a very thin layer on top of the Vaadin Notification class. + * There are two reasons for this class existing: + * - simplifying (slightly) the code, in that the type is in the method call just like logging + * - this is a central point where all messages are done, which allows us to globally change how they are displayed if we wish. + * + * @author glenngriffin + * + */ +public class AdminNotification { + // + // PUBLIC STATIC METHODS + // + + public static void info(String caption) { + Notification.show(caption, Notification.Type.HUMANIZED_MESSAGE); + } + + public static void warn(String caption) { + Notification.show(caption, Notification.Type.WARNING_MESSAGE); + } + + public static void error(String caption) { + Notification.show(caption, Notification.Type.ERROR_MESSAGE); + } + + + + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java new file mode 100644 index 0000000..72c8a85 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java
@@ -0,0 +1,406 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.jpa.PIPType; +import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms; +import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.ui.UI; + +public class JPAUtils { + private static Log logger = LogFactory.getLog(JPAUtils.class); + + private static final Object mapAccess = new Object(); + private static Map<Datatype, List<FunctionDefinition>> mapDatatype2Function = null; + private static Map<String, FunctionDefinition> mapID2Function = null; + private static final Object booleanAccess = new Object(); + private static Datatype booleanDatatype = null; + + public static Datatype getBooleanDatatype() { + synchronized(booleanAccess) { + if (booleanDatatype == null) { + booleanDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_BOOLEAN); + } + return booleanDatatype; + } + } + + public static AttributeDesignatorType createDesignator(Attribute attribute) { + AttributeDesignatorType designator = new AttributeDesignatorType(); + designator.setAttributeId(attribute.getXacmlId()); + if (attribute.getCategoryBean() != null) { + designator.setCategory(attribute.getCategoryBean().getXacmlId()); + } else { + logger.warn("No category bean"); + } + if (attribute.getDatatypeBean() != null) { + designator.setDataType(attribute.getDatatypeBean().getXacmlId()); + } else { + logger.warn("No datatype bean"); + } + designator.setIssuer(attribute.getIssuer()); + designator.setMustBePresent(attribute.isMustBePresent()); + return designator; + } + + public static AttributeSelectorType createSelector(Attribute attribute) { + AttributeSelectorType selector = new AttributeSelectorType(); + selector.setContextSelectorId(attribute.getXacmlId()); + selector.setPath(attribute.getSelectorPath()); + if (attribute.getCategoryBean() != null) { + selector.setCategory(attribute.getCategoryBean().getXacmlId()); + } else { + logger.warn("No category bean"); + } + if (attribute.getDatatypeBean() != null) { + selector.setDataType(attribute.getDatatypeBean().getXacmlId()); + } else { + logger.warn("No datatype bean"); + } + selector.setMustBePresent(attribute.isMustBePresent()); + return selector; + } + + public static Attribute createAttribute(AttributeDesignatorType designator) { + Attribute attribute = new Attribute(); + attribute.setCategoryBean(JPAUtils.findCategory(designator.getCategory())); + attribute.setDatatypeBean(JPAUtils.findDatatype(designator.getDataType())); + attribute.setXacmlId(designator.getAttributeId()); + attribute.setIssuer(designator.getIssuer()); + attribute.setIsDesignator(true); + return attribute; + } + + public static Attribute createAttribute(AttributeSelectorType selector) { + Attribute attribute = new Attribute(); + attribute.setCategoryBean(JPAUtils.findCategory(selector.getCategory())); + attribute.setDatatypeBean(JPAUtils.findDatatype(selector.getDataType())); + attribute.setXacmlId(selector.getContextSelectorId()); + attribute.setSelectorPath(selector.getPath()); + attribute.setIsDesignator(false); + return attribute; + } + + public static Attribute findAttribute(Attribute attribute) { + return JPAUtils.findAttribute(attribute.getCategoryBean(), attribute.getDatatypeBean(), attribute.getXacmlId()); + } + + public static Attribute findAttribute(Category category, Datatype datatype, String attributeID) { + if (category == null || datatype == null | attributeID == null) { + return null; + } + return JPAUtils.findAttribute(category.getXacmlId(), datatype.getXacmlId(), attributeID); + } + + public static Attribute findAttribute(String category, String dataType, String attributeId) { + if (category == null || dataType == null | attributeId == null) { + return null; + } + JPAContainer<Attribute> attributes = ((XacmlAdminUI)UI.getCurrent()).getAttributes(); + for (Object id : attributes.getItemIds()) { + Attribute a = attributes.getItem(id).getEntity(); + if (a.getCategoryBean().getXacmlId().equals(category) && + a.getDatatypeBean().getXacmlId().equals(dataType) && + a.getXacmlId().equals(attributeId)) { + return a; + } + } + return null; + } + + public static Category findCategory(Identifier cat) { + JPAContainer<Category> categories = ((XacmlAdminUI)UI.getCurrent()).getCategories(); + for (Object id : categories.getItemIds()) { + Category c = categories.getItem(id).getEntity(); + if (c.getIdentifer().equals(cat)) { + return c; + } + } + return null; + } + + public static Category findCategory(String cat) { + JPAContainer<Category> categories = ((XacmlAdminUI)UI.getCurrent()).getCategories(); + for (Object id : categories.getItemIds()) { + Category c = categories.getItem(id).getEntity(); + if (c.getIdentifer().stringValue().equals(cat)) { + return c; + } + } + return null; + } + + public static Datatype findDatatype(Identifier dt) { + JPAContainer<Datatype> datatypes = ((XacmlAdminUI)UI.getCurrent()).getDatatypes(); + + for (Object id : datatypes.getItemIds()) { + Datatype d = datatypes.getItem(id).getEntity(); + if (d.getIdentifer().equals(dt)) { + return d; + } + } + return null; + } + + public static Datatype findDatatype(String dt) { + JPAContainer<Datatype> datatypes = ((XacmlAdminUI)UI.getCurrent()).getDatatypes(); + + for (Object id : datatypes.getItemIds()) { + Datatype d = datatypes.getItem(id).getEntity(); + if (d.getIdentifer().stringValue().equals(dt)) { + return d; + } + } + return null; + } + + public static Datatype findDatatype(int datatypeId) { + JPAContainer<Datatype> datatypes = ((XacmlAdminUI)UI.getCurrent()).getDatatypes(); + + for (Object id : datatypes.getItemIds()) { + Datatype d = datatypes.getItem(id).getEntity(); + if (d.getId() == datatypeId) { + return d; + } + } + return null; + } + + public static ConstraintType findConstraintType(String type) { + JPAContainer<ConstraintType> types = ((XacmlAdminUI)UI.getCurrent()).getConstraintTypes(); + for (Object id : types.getItemIds()) { + ConstraintType value = types.getItem(id).getEntity(); + if (value.getConstraintType().equals(type)) { + return value; + } + } + return null; + } + + public static FunctionDefinition findFunction(String functionId) { + if (functionId == null) { + throw new IllegalArgumentException("Cannot find a null function id"); + } + JPAContainer<FunctionDefinition> functions = ((XacmlAdminUI)UI.getCurrent()).getFunctionDefinitions(); + for (Object id : functions.getItemIds()) { + FunctionDefinition value = functions.getItem(id).getEntity(); + if (value.getXacmlid().equals(functionId)) { + return value; + } + } + return null; + } + + public static PolicyAlgorithms findPolicyAlgorithm(String algorithm) { + if (algorithm == null) { + throw new IllegalArgumentException("Cannot find a null algorithm"); + } + JPAContainer<PolicyAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getPolicyAlgorithms(); + for (Object id : algorithms.getItemIds()) { + PolicyAlgorithms alg = algorithms.getItem(id).getEntity(); + if (alg.getXacmlId().equals(algorithm)) { + return alg; + } + } + return null; + } + + public static RuleAlgorithms findRuleAlgorithm(String algorithm) { + if (algorithm == null) { + throw new IllegalArgumentException("Cannot find a null algorithm"); + } + JPAContainer<RuleAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getRuleAlgorithms(); + for (Object id : algorithms.getItemIds()) { + RuleAlgorithms alg = algorithms.getItem(id).getEntity(); + if (alg.getXacmlId().equals(algorithm)) { + return alg; + } + } + return null; + } + + public static Obadvice findObligation(Identifier id, EffectType effect) { + if (id == null) { + return null; + } + return JPAUtils.findObligation(id.stringValue(), effect); + } + + public static Obadvice findObligation(String id, EffectType effect) { + JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice(); + for (Object oaID : oa.getItemIds()) { + Obadvice obligation = oa.getItem(oaID).getEntity(); + if (obligation.getType().equals(Obadvice.OBLIGATION) && + obligation.getXacmlId().equals(id) && + obligation.getFulfillOn().equals((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY))) { + return obligation; + } + } + return null; + } + + public static Obadvice findAdvice(Identifier id, EffectType effect) { + if (id == null) { + return null; + } + return JPAUtils.findAdvice(id.stringValue(), effect); + } + + public static Obadvice findAdvice(String id, EffectType effect) { + JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice(); + for (Object oaID : oa.getItemIds()) { + Obadvice advice = oa.getItem(oaID).getEntity(); + if (advice.getType().equals(Obadvice.ADVICE) && + advice.getXacmlId().equals(id) && + advice.getFulfillOn().equals((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY))) { + return advice; + } + } + return null; + } + + public static Attribute isStandardAttribute(Attribute attribute) { + return JPAUtils.isStandardAttribute(attribute.getCategoryBean(), attribute.getDatatypeBean(), attribute.getXacmlId()); + } + + public static Attribute isStandardAttribute(Category categoryBean, Datatype datatypeBean, String xacmlId) { + if (categoryBean == null || datatypeBean == null || xacmlId == null) { + return null; + } + return JPAUtils.isStandardAttribute(categoryBean.getXacmlId(), datatypeBean.getXacmlId(), xacmlId); + } + + public static Attribute isStandardAttribute(String category, String datatype, String id) { + if (category == null || datatype == null || id == null) { + return null; + } + Category cat = JPAUtils.findCategory(category); + if (cat == null) { + return null; + } + Datatype dt = JPAUtils.findDatatype(datatype); + if (dt == null) { + return null; + } + Identifier identifier = null; + Iterator<Identifier> iter = XACMLConstants.STANDARD_ATTRIBUTES.iterator(); + while (iter.hasNext()) { + Identifier i = iter.next(); + if (i.stringValue().equals(id)) { + identifier = i; + break; + } + } + if (identifier == null) { + return null; + } + Attribute attribute = new Attribute(); + attribute.setCategoryBean(cat); + attribute.setDatatypeBean(dt); + attribute.setXacmlId(identifier.stringValue()); + return attribute; + } + + /** + * Builds a map in memory of a functions return datatype to function definition. Useful in limiting the number + * of SQL calls to DB especially when we don't expect these to change much. + * + * @return - A HashMap of Datatype JPA Container ID's to FunctionDefinition objects + */ + public static Map<Datatype, List<FunctionDefinition>> getFunctionDatatypeMap() { + + synchronized(mapAccess) { + if (mapDatatype2Function == null) { + buildFunctionMaps(); + } + } + return mapDatatype2Function; + } + + public static Map<String, FunctionDefinition> getFunctionIDMap() { + synchronized(mapAccess) { + if (mapID2Function == null) { + buildFunctionMaps(); + } + } + return mapID2Function; + } + + private static void buildFunctionMaps() { + mapDatatype2Function = new HashMap<Datatype, List<FunctionDefinition>>(); + mapID2Function = new HashMap<String, FunctionDefinition>(); + JPAContainer<FunctionDefinition> functions = ((XacmlAdminUI)UI.getCurrent()).getFunctionDefinitions(); + for (Object id : functions.getItemIds()) { + FunctionDefinition value = functions.getItem(id).getEntity(); + mapID2Function.put(value.getXacmlid(), value); + if (mapDatatype2Function.containsKey(value.getDatatypeBean()) == false) { + mapDatatype2Function.put(value.getDatatypeBean(), new ArrayList<FunctionDefinition>()); + } + mapDatatype2Function.get(value.getDatatypeBean()).add(value); + } + } + + public static void dumpDatatype2FunctionMap() { + if (logger.isDebugEnabled() == false) { + return; + } + Map<Datatype, List<FunctionDefinition>> map = getFunctionDatatypeMap(); + for (Datatype dt : map.keySet()) { + for (FunctionDefinition function: map.get(dt)) { + logger.debug("Datatype: " + (dt != null ? dt.getId() : "null") + " " + function.getXacmlid() + " (" + (function.getDatatypeBean() != null ? function.getDatatypeBean().getId() : "null") + ")"); + } + } + } + + public static PIPType getPIPType(String typeName) { + for (Object id : ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItemIds()) { + PIPType type = ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItem(id).getEntity(); + if (type.getType().equals(typeName)) { + return type; + } + } + return null; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java new file mode 100644 index 0000000..ba8cd82 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java
@@ -0,0 +1,65 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import java.io.IOException; + +import com.vaadin.server.FileDownloader; +import com.vaadin.server.StreamResource; +import com.vaadin.server.StreamResource.StreamSource; +import com.vaadin.server.VaadinRequest; +import com.vaadin.server.VaadinResponse; +import com.vaadin.ui.UI; + +public class OnDemandFileDownloader extends FileDownloader { + private static final long serialVersionUID = 1L; + private final OnDemandStreamResource resource; + + public interface OnDemandStreamResource extends StreamSource { + String getFilename (); + } + + public OnDemandFileDownloader(OnDemandStreamResource resource) { + super(new StreamResource(resource, "")); + this.resource = resource; + if (this.resource == null) { + throw new NullPointerException("Can't send null resource"); + } + } + + @Override + public boolean handleConnectorRequest(VaadinRequest request, + VaadinResponse response, String path) throws IOException { + this.getResource().setFilename(this.resource.getFilename()); + return super.handleConnectorRequest(request, response, path); + } + + private StreamResource getResource() { + StreamResource resource = null; + UI.getCurrent().getSession().lock(); + try { + resource = (StreamResource) this.getResource("dl"); + } finally { + UI.getCurrent().getSession().unlock(); + } + return resource; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java new file mode 100644 index 0000000..3958100 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java
@@ -0,0 +1,495 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.Set; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PAPException; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import org.apache.openaz.xacml.api.pap.PDPStatus; +import org.apache.openaz.xacml.rest.XACMLRestProperties; +import org.apache.openaz.xacml.std.pap.StdPDP; +import org.apache.openaz.xacml.std.pap.StdPDPGroup; +import org.apache.openaz.xacml.std.pap.StdPDPItemSetChangeNotifier; +import org.apache.openaz.xacml.std.pap.StdPDPPolicy; +import org.apache.openaz.xacml.std.pap.StdPDPStatus; +import org.apache.openaz.xacml.util.XACMLProperties; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.CollectionType; + +/** + * Implementation of the PAPEngine interface that communicates with a PAP engine in a remote servlet + * through a RESTful interface + * + * @author glenngriffin + * + */ +public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAPEngine { + private static final Log logger = LogFactory.getLog(RESTfulPAPEngine.class); + + // + // URL of the PAP Servlet that this Admin Console talks to + // + private String papServletURLString; + + /** + * Set up link with PAP Servlet and get our initial set of Groups + * @throws Exception + */ + public RESTfulPAPEngine (String myURLString) throws PAPException, IOException { + // + // Get our URL to the PAP servlet + // + this.papServletURLString = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL); + if (this.papServletURLString == null || this.papServletURLString.length() == 0) { + String message = "The property 'POLICYENGINE_ADMIN_ACTIVE' was not set during installation. Admin Console cannot call PAP."; + logger.error(message); + throw new PAPException(message); + } + + // + // register this Admin Console with the PAP Servlet to get updates + // + Object newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString); + if (newURL != null) { + // assume this was a re-direct and try again + logger.warn("Redirecting to '" + newURL + "'"); + this.papServletURLString = (String)newURL; + newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString); + if (newURL != null) { + logger.error("Failed to redirect to " + this.papServletURLString); + throw new PAPException("Failed to register with PAP"); + } + } + } + + + // + // High-level commands used by the Admin Console code through the PAPEngine Interface + // + + @Override + public PDPGroup getDefaultGroup() throws PAPException { + PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "default="); + return newGroup; + } + + @Override + public void SetDefaultGroup(PDPGroup group) throws PAPException { + sendToPAP("POST", null, null, null, "groupId=" + group.getId(), "default=true"); + } + + @Override + public Set<PDPGroup> getPDPGroups() throws PAPException { + Set<PDPGroup> newGroupSet; + newGroupSet = (Set<PDPGroup>) this.sendToPAP("GET", null, Set.class, StdPDPGroup.class, "groupId="); + return Collections.unmodifiableSet(newGroupSet); + } + + + @Override + public PDPGroup getGroup(String id) throws PAPException { + PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=" + id); + return newGroup; + } + + @Override + public void newGroup(String name, String description) + throws PAPException, NullPointerException { + String escapedName = null; + String escapedDescription = null; + try { + escapedName = URLEncoder.encode(name, "UTF-8"); + escapedDescription = URLEncoder.encode(description, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new PAPException("Unable to send name or description to PAP: " + e.getMessage()); + } + + this.sendToPAP("POST", null, null, null, "groupId=", "groupName="+escapedName, "groupDescription=" + escapedDescription); + } + + + /** + * Update the configuration on the PAP for a single Group. + * + * @param group + * @return + * @throws PAPException + */ + public void updateGroup(PDPGroup group) throws PAPException { + + try { + + // + // ASSUME that all of the policies mentioned in this group are already located in the correct directory on the PAP! + // + // Whenever a Policy is added to the group, that file must be automatically copied to the PAP from the Workspace. + // + + +// // Copy all policies from the local machine's workspace to the PAP's PDPGroup directory. +// // This is not efficient since most of the policies will already exist there. +// // However, the policy files are (probably!) not too huge, and this is a good way to ensure that any corrupted files on the PAP get refreshed. +// +//TODO WRONG!!!! The policy.getStream() is based on the location in the PAP directory, not the Workspace. +//TODO +// for (PDPPolicy policy : group.getPolicies()) { +// try (InputStream is = policy.getStream()) { +// copyFile(policy.getId(), group, is); +// } +// } + + // now update the group object on the PAP + + sendToPAP("PUT", group, null, null, "groupId=" + group.getId()); + } catch (Exception e) { + String message = "Unable to PUT policy '" + group.getId() + "', e:" + e; + logger.error(message, e); + throw new PAPException(message); + } + } + + + @Override + public void removeGroup(PDPGroup group, PDPGroup newGroup) + throws PAPException, NullPointerException { + String moveToGroupString = null; + if (newGroup != null) { + moveToGroupString = "movePDPsToGroupId=" + newGroup.getId(); + } + sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), moveToGroupString); + } + + @Override + public PDPGroup getPDPGroup(PDP pdp) throws PAPException { + return getPDPGroup(pdp.getId()); + } + + @Override + public PDPGroup getPDPGroup(String pdpId) throws PAPException { + PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "pdpId=" + pdpId, "getPDPGroup="); + return newGroup; + } + + @Override + public PDP getPDP(String pdpId) throws PAPException { + PDP newPDP = (PDP)sendToPAP("GET", null, null, StdPDP.class, "groupId=", "pdpId=" + pdpId); + return newPDP; + } + + @Override + public void newPDP(String id, PDPGroup group, String name, String description) throws PAPException, + NullPointerException { + StdPDP newPDP = new StdPDP(id, name, description); + sendToPAP("PUT", newPDP, null, null, "groupId=" + group.getId(), "pdpId=" + id); + } + + + @Override + public void movePDP(PDP pdp, PDPGroup newGroup) throws PAPException { + sendToPAP("POST", null, null, null, "groupId=" + newGroup.getId(), "pdpId=" + pdp.getId()); + } + + @Override + public void updatePDP(PDP pdp) throws PAPException { + PDPGroup group = getPDPGroup(pdp); + sendToPAP("PUT", pdp, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId()); + } + + @Override + public void removePDP(PDP pdp) throws PAPException { + PDPGroup group = getPDPGroup(pdp); + sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId()); + } + + + + @Override + public void publishPolicy(String id, String name, boolean isRoot, + InputStream policy, PDPGroup group) throws PAPException { + +//TODO - this method should take as input a Policy object, add it to the group, then call updateGroup +//TODO - ?? Where does the Policy object (with the version info) get created? + + // copy the (one) file into the target directory on the PAP servlet + copyFile(id, group, policy); + + // adjust the local copy of the group to include the new policy + PDPPolicy pdpPolicy = new StdPDPPolicy(id, isRoot, name); + group.getPolicies().add(pdpPolicy); + + // tell the PAP servlet to include the policy in the configuration + updateGroup(group); + } + + + + /** + * Copy a single Policy file from the input stream to the PAP Servlet. + * Either this works (silently) or it throws an exception. + * + * @param policyId + * @param group + * @param policy + * @return + * @throws PAPException + */ + public void copyFile(String policyId, PDPGroup group, InputStream policy) throws PAPException { + // send the policy file to the PAP Servlet + try { + sendToPAP("POST", policy, null, null, "groupId=" + group.getId(), "policyId="+policyId); + } catch (Exception e) { + String message = "Unable to PUT policy '" + policyId + "', e:" + e; + logger.error(message, e); + throw new PAPException(message); + } + } + + + @Override + public void copyPolicy(PDPPolicy policy, PDPGroup group) throws PAPException { + if (policy == null || group == null) { + throw new PAPException("Null input policy="+policy+" group="+group); + } + try (InputStream is = new FileInputStream(new File(policy.getLocation())) ) { + copyFile(policy.getId(), group, is ); + } catch (Exception e) { + String message = "Unable to PUT policy '" + policy.getId() + "', e:" + e; + logger.error(message, e); + throw new PAPException(message); + } + } + + + + + @Override + public void removePolicy(PDPPolicy policy, PDPGroup group) throws PAPException { + throw new PAPException("NOT IMPLEMENTED"); + + } + + + + /** + * Special operation - Similar to the normal PAP operations but this one contacts the PDP directly + * to get detailed status info. + * + * @param pdp + * @return + * @throws PAPException + */ + @Override + public PDPStatus getStatus(PDP pdp) throws PAPException { + StdPDPStatus status = (StdPDPStatus)sendToPAP("GET", pdp, null, StdPDPStatus.class); + return status; + } + + + + + // + // Internal Operations called by the PAPEngine Interface methods + // + + /** + * Send a request to the PAP Servlet and get the response. + * + * The content is either an InputStream to be copied to the Request OutputStream + * OR it is an object that is to be encoded into JSON and pushed into the Request OutputStream. + * + * The Request parameters may be encoded in multiple "name=value" sets, or parameters may be combined by the caller. + * + * @param method + * @param content - EITHER an InputStream OR an Object to be encoded in JSON + * @param collectionTypeClass + * @param responseContentClass + * @param parameters + * @return + * @throws Exception + */ + private Object sendToPAP(String method, Object content, Class collectionTypeClass, Class responseContentClass, String... parameters ) throws PAPException { + HttpURLConnection connection = null; + try { + String fullURL = papServletURLString; + if (parameters != null && parameters.length > 0) { + String queryString = ""; + for (String p : parameters) { + queryString += "&" + p; + } + fullURL += "?" + queryString.substring(1); + } + + // special case - Status (actually the detailed status) comes from the PDP directly, not the PAP + if (method.equals("GET") && + content instanceof PDP && + responseContentClass == StdPDPStatus.class) { + // Adjust the url and properties appropriately + fullURL = ((PDP)content).getId() + "?type=Status"; + content = null; + } + + + URL url = new URL(fullURL); + + // + // Open up the connection + // + connection = (HttpURLConnection)url.openConnection(); + // + // Setup our method and headers + // + connection.setRequestMethod(method); +// connection.setRequestProperty("Accept", "text/x-java-properties"); +// connection.setRequestProperty("Content-Type", "text/x-java-properties"); + connection.setUseCaches(false); + // + // Adding this in. It seems the HttpUrlConnection class does NOT + // properly forward our headers for POST re-direction. It does so + // for a GET re-direction. + // + // So we need to handle this ourselves. + // + connection.setInstanceFollowRedirects(false); + connection.setDoOutput(true); + connection.setDoInput(true); + if (content != null) { + if (content instanceof InputStream) { + try { + // + // Send our current policy configuration + // + try (OutputStream os = connection.getOutputStream()) { + int count = IOUtils.copy((InputStream)content, os); + if (logger.isDebugEnabled()) { + logger.debug("copied to output, bytes="+count); + } + } + } catch (Exception e) { + logger.error("Failed to write content in '" + method + "'", e); + throw e; + } + } else { + // The content is an object to be encoded in JSON + ObjectMapper mapper = new ObjectMapper(); + mapper.writeValue(connection.getOutputStream(), content); + } + } + // + // Do the connect + // + connection.connect(); + if (connection.getResponseCode() == 204) { + logger.info("Success - no content."); + return null; + } else if (connection.getResponseCode() == 200) { + logger.info("Success. We have a return object."); + + // get the response content into a String + String json = null; + // read the inputStream into a buffer (trick found online scans entire input looking for end-of-file) + java.util.Scanner scanner = new java.util.Scanner(connection.getInputStream()); + scanner.useDelimiter("\\A"); + json = scanner.hasNext() ? scanner.next() : ""; + scanner.close(); + logger.info("JSON response from PAP: " + json); + + // convert Object sent as JSON into local object + ObjectMapper mapper = new ObjectMapper(); + + if (collectionTypeClass != null) { + // collection of objects expected + final CollectionType javaType = + mapper.getTypeFactory().constructCollectionType(collectionTypeClass, responseContentClass); + + Object objectFromJSON = mapper.readValue(json, javaType); + return objectFromJSON; + } else { + // single value object expected + Object objectFromJSON = mapper.readValue(json, responseContentClass); + return objectFromJSON; + } + + } else if (connection.getResponseCode() >= 300 && connection.getResponseCode() <= 399) { + // redirection + String newURL = connection.getHeaderField("Location"); + if (newURL == null) { + logger.error("No Location header to redirect to when response code="+connection.getResponseCode()); + throw new IOException("No redirect Location header when response code="+connection.getResponseCode()); + } + int qIndex = newURL.indexOf("?"); + if (qIndex > 0) { + newURL = newURL.substring(0, qIndex); + } + logger.info("Redirect seen. Redirecting " + fullURL + " to " + newURL); + return newURL; + } else { + logger.warn("Unexpected response code: " + connection.getResponseCode() + " message: " + connection.getResponseMessage()); + throw new IOException("Server Response: " + connection.getResponseCode() + ": " + connection.getResponseMessage()); + } + + } catch (Exception e) { + logger.error("HTTP Request/Response to PAP: " + e,e); + throw new PAPException("Request/Response threw :" + e); + } finally { + // cleanup the connection + if (connection != null) { + try { + // For some reason trying to get the inputStream from the connection + // throws an exception rather than returning null when the InputStream does not exist. + InputStream is = null; + try { + is = connection.getInputStream(); + } catch (Exception e1) { //NOPMD + // ignore this + } + if (is != null) { + is.close(); + } + + } catch (IOException ex) { + logger.error("Failed to close connection: " + ex, ex); + } + connection.disconnect(); + } + } + } +} + +
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java new file mode 100644 index 0000000..28bf377 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java
@@ -0,0 +1,237 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; + +public class XACMLConstants { + + public static final Set<Identifier> SUBJECT_CATEGORIES = new HashSet<Identifier>(); + public static final Set<Identifier> ACTION_CATEGORIES = new HashSet<Identifier>(); + public static final Set<Identifier> RESOURCE_CATEGORIES = new HashSet<Identifier>(); + public static final Set<Identifier> ENVIRONMENT_CATEGORIES = new HashSet<Identifier>(); + + public static final Set<Identifier> CATEGORIES = new HashSet<Identifier>(); + static { + SUBJECT_CATEGORIES.addAll(Arrays.asList(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT, + XACML3.ID_SUBJECT_CATEGORY_CODEBASE, + XACML3.ID_SUBJECT_CATEGORY_INTERMEDIARY_SUBJECT, + XACML3.ID_SUBJECT_CATEGORY_RECIPIENT_SUBJECT, + XACML3.ID_SUBJECT_CATEGORY_REQUESTING_MACHINE) + ); + + ACTION_CATEGORIES.addAll(Arrays.asList( + XACML3.ID_ATTRIBUTE_CATEGORY_ACTION) + ); + + RESOURCE_CATEGORIES.addAll(Arrays.asList( + XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE) + ); + + ENVIRONMENT_CATEGORIES.addAll(Arrays.asList( + XACML3.ID_ATTRIBUTE_CATEGORY_ENVIRONMENT) + ); + + CATEGORIES.addAll(SUBJECT_CATEGORIES); + CATEGORIES.addAll(ACTION_CATEGORIES); + CATEGORIES.addAll(RESOURCE_CATEGORIES); + CATEGORIES.addAll(ENVIRONMENT_CATEGORIES); + + } + public static final Set<Identifier> DATATYPES = new HashSet<Identifier>(); + static { + DATATYPES.addAll(Arrays.asList(XACML3.ID_DATATYPE_STRING, + XACML3.ID_DATATYPE_BOOLEAN, + XACML3.ID_DATATYPE_INTEGER, + XACML3.ID_DATATYPE_DOUBLE, + XACML3.ID_DATATYPE_TIME, + XACML3.ID_DATATYPE_DATE, + XACML3.ID_DATATYPE_DATETIME, + XACML3.ID_DATATYPE_DAYTIMEDURATION, + XACML3.ID_DATATYPE_YEARMONTHDURATION, + XACML3.ID_DATATYPE_ANYURI, + XACML3.ID_DATATYPE_HEXBINARY, + XACML3.ID_DATATYPE_BASE64BINARY, + XACML3.ID_DATATYPE_RFC822NAME, + XACML3.ID_DATATYPE_X500NAME, + XACML3.ID_DATATYPE_IPADDRESS, + XACML3.ID_DATATYPE_DNSNAME)); + } + + public static final Set<Identifier> POLICY_ALGORITHMS = new HashSet<Identifier>(); + static { + POLICY_ALGORITHMS.addAll(Arrays.asList( + XACML3.ID_POLICY_DENY_OVERRIDES, + XACML3.ID_POLICY_DENY_UNLESS_PERMIT, + XACML3.ID_POLICY_FIRST_APPLICABLE, + XACML3.ID_POLICY_ON_PERMIT_APPLY_SECOND, + XACML3.ID_POLICY_ONLY_ONE_APPLICABLE, + XACML3.ID_POLICY_ORDERED_DENY_OVERRIDES, + XACML3.ID_POLICY_ORDERED_PERMIT_OVERRIDES, + XACML3.ID_POLICY_PERMIT_OVERRIDES, + XACML3.ID_POLICY_PERMIT_UNLESS_DENY + )); + } + + public static final Set<Identifier> RULE_ALGORITHMS = new HashSet<Identifier>(); + static { + RULE_ALGORITHMS.addAll(Arrays.asList( + XACML3.ID_RULE_DENY_OVERRIDES, + XACML3.ID_RULE_DENY_UNLESS_PERMIT, + XACML3.ID_RULE_FIRST_APPLICABLE, + XACML3.ID_RULE_ONLY_ONE_APPLICABLE, + XACML3.ID_RULE_ORDERED_DENY_OVERRIDES, + XACML3.ID_RULE_ORDERED_PERMIT_OVERRIDES, + XACML3.ID_RULE_PERMIT_OVERRIDES, + XACML3.ID_RULE_PERMIT_UNLESS_DENY + )); + } + + public static final Set<Identifier> STANDARD_ATTRIBUTES = new HashSet<Identifier>(); + static { + STANDARD_ATTRIBUTES.addAll(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE, + XACML3.ID_ACTION_ACTION_ID, + XACML3.ID_ACTION_IMPLIED_ACTION, + XACML3.ID_RESOURCE_RESOURCE_ID, + XACML3.ID_RESOURCE_RESOURCE_LOCATION, + XACML3.ID_RESOURCE_SIMPLE_FILE_NAME, + XACML3.ID_ENVIRONMENT_CURRENT_DATE, + XACML3.ID_ENVIRONMENT_CURRENT_TIME, + XACML3.ID_ENVIRONMENT_CURRENT_DATETIME + )); + } + + public static final Map<Identifier, Set<Identifier>> MAP_STANDARD_CATEGORIES = new HashMap<Identifier, Set<Identifier>>(); + static { + MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_CODEBASE, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_INTERMEDIARY_SUBJECT, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_RECIPIENT_SUBJECT, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_REQUESTING_MACHINE, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_SUBJECT_SUBJECT_ID, + XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER, + XACML3.ID_SUBJECT_KEY_INFO, + XACML3.ID_SUBJECT_AUTHENTICATION_TIME, + XACML3.ID_SUBJECT_AUTHENTICATION_METHOD, + XACML3.ID_SUBJECT_REQUEST_TIME, + XACML3.ID_SUBJECT_SESSION_START_TIME, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS, + XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME, + XACML3.ID_SUBJECT_ROLE + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_ACTION, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_ACTION_ACTION_ID, + XACML3.ID_ACTION_IMPLIED_ACTION + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_RESOURCE_RESOURCE_ID, + XACML3.ID_RESOURCE_RESOURCE_LOCATION, + XACML3.ID_RESOURCE_SIMPLE_FILE_NAME + ))); + MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_ENVIRONMENT, new HashSet<Identifier>(Arrays.asList( + XACML3.ID_ENVIRONMENT_CURRENT_DATE, + XACML3.ID_ENVIRONMENT_CURRENT_TIME, + XACML3.ID_ENVIRONMENT_CURRENT_DATETIME + ))); + } + + public static String extractShortName(String xacmlID) { + if (xacmlID == null) { + return null; + } + if (xacmlID.startsWith("http:")) { + String [] parts = xacmlID.split("[#]"); + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + return null; + } + if (xacmlID.startsWith("urn") || xacmlID.contains(":")) { + String[] parts = xacmlID.split("[:]"); + + if (parts != null && parts.length > 0) { + return parts[parts.length - 1]; + } + } + return null; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java new file mode 100644 index 0000000..7ef7e60 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java
@@ -0,0 +1,506 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import java.util.List; + +import javax.xml.bind.JAXBElement; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.std.IdentifierImpl; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType; + +public class XACMLFunctionValidator { + private static Log logger = LogFactory.getLog(XACMLFunctionValidator.class); + + public static boolean validNumberOfArguments(ApplyType apply) { + try { + // + // Sanity check + // + if (apply == null) { + throw new IllegalArgumentException("Must supply a non-null apply object."); + } + // + // Get the function + // + FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId()); + if (function == null) { + throw new Exception("Invalid function id: " + apply.getFunctionId()); + } + // + // Now check argument list, do we have the minimum? + // + List<JAXBElement<?>> applyArgs = apply.getExpression(); + if (applyArgs.isEmpty()) { + // + // May not need any args + // + if (function.getArgLb() > 0) { + throw new Exception ("Number of Args mismatch, expecting at least " + + function.getArgLb() + " arguments but have zero."); + } + } else { + if (applyArgs.size() < function.getArgLb()) { + throw new Exception ("Number of Args mismatch, expecting at least " + + function.getArgLb() + " arguments but have " + applyArgs.size()); + } + } + // + // Is there an upper bound? + // + if (function.getArgUb() != -1 && applyArgs.size() != function.getArgUb()) { + throw new Exception ("Number of Args mismatch, expecting at most " + + function.getArgUb() + " arguments but have " + applyArgs.size()); + } + } catch (Exception e) { + logger.error("Number of arguments incorrect: " + e); + return false; + } + return true; + } + + public static boolean canHaveMoreArguments(ConditionType condition) { + if (condition.getExpression() == null || condition.getExpression().getValue() == null) { + return true; + } + Object expression = condition.getExpression().getValue(); + if (expression instanceof ApplyType) { + return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression); + } + return false; + } + + public static boolean canHaveMoreArguments(VariableDefinitionType variable) { + if (variable.getExpression() == null || variable.getExpression().getValue() == null) { + return true; + } + Object expression = variable.getExpression().getValue(); + if (expression instanceof ApplyType) { + return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression); + } + return false; + } + + public static boolean canHaveMoreArguments(AttributeAssignmentExpressionType assignment) { + if (assignment.getExpression() == null || assignment.getExpression().getValue() == null) { + return true; + } + Object expression = assignment.getExpression().getValue(); + if (expression instanceof ApplyType) { + return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression); + } + return false; + } + + public static boolean canHaveMoreArguments(ApplyType apply) { + // + // Sanity check + // + if (apply == null) { + throw new IllegalArgumentException("Must supply a non-null apply object."); + } + // + // Get the function + // + FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId()); + if (function == null) { + throw new IllegalArgumentException("Invalid function id: " + apply.getFunctionId()); + } + // + // Is there no upper bound? + // + if (function.getArgUb() == -1) { + // + // No limit to the number of arguments + // + return true; + } + // + // There is an upper bound - have we met it? + // + List<JAXBElement<?>> applyArgs = apply.getExpression(); + if (applyArgs.size() < function.getArgUb()) { + // + // We have not met the upper bound, so yes we can + // add more arguments. + // + return true; + } + return false; + } + + public static boolean isFunctionAvailable(FunctionDefinition function, ApplyType apply, FunctionArgument argument) { + // + // Does it return correct datatype? + // + if (argument != null) { + // + // Does it match? + // + if (function.getDatatypeBean().getXacmlId().equals(argument.getDatatypeBean().getXacmlId())) { + return false; + } + if (function.getIsBagReturn() != argument.getIsBag()) { + return false; + } + } + // + // Check each argument + // + int i; + for (i = 0; i < apply.getExpression().size(); i++) { + // + // Get the argument + // + JAXBElement<?> arg = apply.getExpression().get(i); + // + // Get what the argument should be + // + FunctionArgument functionArg = XACMLFunctionValidator.getFunctionArgument(i + 1, function); + // + // Sanity check + // + if (arg == null || arg.getValue() == null || functionArg == null) { + // + // Something screwy with the list, just return not available. They will have + // delete items that are bad. + // + return false; + } + // + // Does it match? + // + if (XACMLFunctionValidator.isArgumentValid(arg.getValue(), functionArg) == false) { + return false; + } + } + // + // Done checking, we don't care if there are more args needed. Just want to know if this + // function can fit with the existing arguments. + // + return true; + } + + public static FunctionDefinition validateApply(ApplyType apply, FunctionArgument argument) { + // + // Sanity check + // + if (apply == null) { + throw new IllegalArgumentException("Must supply a non-null apply object."); + } + try { + // + // Get the function + // + FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId()); + if (function == null) { + throw new Exception("Invalid function id: " + apply.getFunctionId()); + } + // + // Does it return correct datatype? + // + if (argument != null) { + // + // Does it match? + // + if (argument.getDatatypeBean() != null) { + if (! function.getDatatypeBean().getXacmlId().equals(argument.getDatatypeBean().getXacmlId())) { + throw new Exception("Function return datatype(" + function.getDatatypeBean() + + ") does not match expected argument datatype (" + argument.getDatatypeBean()); + } + } else { + if (logger.isDebugEnabled()) { + logger.debug("Argument datatype bean is null - any datatype should work."); + } + } + if (function.getIsBagReturn() != argument.getIsBag()) { + throw new Exception("Function is bag (" + function.getIsBagReturn() + + ") does not match argument isBag(" + argument.getIsBag()); + } + } + // + // Now check argument list, do we have the minimum? + // + List<JAXBElement<?>> applyArgs = apply.getExpression(); + if (applyArgs == null) { + // + // May not need any args + // + if (function.getArgLb() > 0) { + throw new Exception ("Number of Args mismatch, expecting at least " + + function.getArgLb() + " arguments but have zero."); + } + } else { + if (applyArgs.size() < function.getArgLb()) { + throw new Exception ("Number of Args mismatch, expecting at least " + + function.getArgLb() + " arguments but have " + applyArgs.size()); + } + } + // + // Is there an upper bound? + // + if (function.getArgUb() != -1 && applyArgs.size() != function.getArgUb()) { + throw new Exception ("Number of Args mismatch, expecting at most " + + function.getArgUb() + " arguments but have " + applyArgs.size()); + } + // + // Check each argument + // + int i; + for (i = 0; i < applyArgs.size(); i++) { + // + // Get the argument + // + JAXBElement<?> arg = applyArgs.get(i); + // + // Get what the argument should be + // + FunctionArgument functionArg = XACMLFunctionValidator.getFunctionArgument(i + 1, function); + // + // Sanity check + // + if (arg == null || arg.getValue() == null || functionArg == null) { + throw new NullPointerException("An argument is null: Element" + arg + " Function Arg: " + functionArg); + } + // + // Does it match? + // + if (XACMLFunctionValidator.isArgumentValid(arg.getValue(), functionArg) == false) { + throw new Exception("Invalid Argument: " + arg.getValue()); + } + } + // + // Done checking, just return the function which has the datatype + // and if it is a bag. + // + return function; + } catch(Exception e) { + logger.error("Function is not valid: " + apply.getFunctionId() + " argument: " + argument + " " + e); + return null; + } + } + + private static boolean isArgumentValid(Object value, FunctionArgument functionArg) { + if (value instanceof ApplyType) { + // + // Recursively validate the Apply. + // + FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) value, functionArg); + if (functionArg.getDatatypeBean() == null || function.getDatatypeBean().getId() == functionArg.getDatatypeBean().getId()) { + if (function.getIsBagReturn() == functionArg.getIsBag()) { + return true; + } + logger.error("isBag does not match: " + function.getIsBagReturn() + " " + functionArg.getIsBag()); + } + logger.error("Datatypes do not match: " + function.getDatatypeBean().getShortName() + " " + functionArg.getDatatypeBean().getShortName()); + } else if (value instanceof AttributeValueType) { + AttributeValueType val = (AttributeValueType) value; + Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(val.getDataType())); + if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) { + // + // TODO Is bag? + // + return true; + } + logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName()); + } else if (value instanceof AttributeDesignatorType) { + AttributeDesignatorType designator = (AttributeDesignatorType) value; + Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(designator.getDataType())); + if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) { + // + // TODO Is bag? + // + return true; + } + logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName()); + } else if (value instanceof AttributeSelectorType) { + AttributeSelectorType selector = (AttributeSelectorType) value; + Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(selector.getDataType())); + if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) { + // + // TODO Is bag? + // + return true; + } + logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName()); + } else if (value instanceof VariableReferenceType) { + // + // We can't verify this at this time. + // The user can define variables in other parts of the policy file + // or another policy file. This should be flagged if the user performs + // simulation and other testing on the policy before deployment. + // + return true; + } else if (value instanceof FunctionType) { + // + // Does this function exist? + // + FunctionDefinition function = JPAUtils.findFunction(((FunctionType) value).getFunctionId()); + if (function == null) { + // + // Could not find function + // + logger.warn("Could not find function in our database: " + ((FunctionType) value).getFunctionId()); + return false; + } + // + // Does this function return the correct data type? + // + if (functionArg.getDatatypeBean() == null || function.getDatatypeBean().getId() == functionArg.getDatatypeBean().getId()) { + return true; + } + logger.error("Datatypes do not match: " + function.getDatatypeBean().getShortName() + " " + functionArg.getDatatypeBean().getShortName()); + } + return false; + } + + public static FunctionArgument getFunctionArgument(int index, FunctionDefinition function) { + if (index < 1) { + throw new IllegalArgumentException("The index must be 1-based"); + } + // + // Setup what the actual lower bound and upper bounds are + // within the list. + // +// int lowerBound = function.getArgLb(); +// if (lowerBound == 0) { +// lowerBound = 1; +// } + int upperBound = function.getArgUb(); + if (upperBound == -1) { + upperBound = function.getFunctionArguments().size(); + } + // + // The list may not be sorted, so make sure we find + // the actual argument index + // + int argumentIndex = index; + if (index >= upperBound) { + argumentIndex = upperBound; + } + for (FunctionArgument arg : function.getFunctionArguments()) { + if (arg.getArgIndex() == argumentIndex) { + return arg; + } + } + return null; + } + + public static boolean validateCondition(ConditionType condition) { + if (condition.getExpression() == null) { + return false; + } + Object expression = condition.getExpression().getValue(); + if (expression instanceof ApplyType) { + FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null); + if (function == null) { + return false; + } + if (function.isBagReturn()) { + return false; + } + if (function.getDatatypeBean() == null) { + return false; + } + return function.getDatatypeBean().getXacmlId().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue()); + } + if (expression instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue()); + } + if (expression instanceof AttributeSelectorType) { + return ((AttributeSelectorType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue()); + } + if (expression instanceof AttributeValueType) { + return ((AttributeValueType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue()); + } + if (expression instanceof VariableReferenceType) { + // + // Really unknown - the variable may or may not have been defined + // + return true; + } + return false; + } + + public static boolean validateVariable(VariableDefinitionType variable) { + if (variable.getExpression() == null) { + return false; + } + Object expression = variable.getExpression().getValue(); + if (expression instanceof ApplyType) { + FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null); + if (function == null) { + return false; + } + return true; + } + if (expression instanceof AttributeDesignatorType) { + return true; + } + if (expression instanceof AttributeSelectorType) { + return true; + } + if (expression instanceof AttributeValueType) { + return true; + } + if (expression instanceof VariableReferenceType) { + return true; + } + return false; + } + + public static boolean validateAssignment(AttributeAssignmentExpressionType assignmentExpression) { + if (assignmentExpression.getExpression() == null) { + return false; + } + Object expression = assignmentExpression.getExpression().getValue(); + if (expression instanceof ApplyType) { + FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null); + if (function == null) { + return false; + } + // + // TODO + // + } + // + // TODO + // + return true; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java new file mode 100644 index 0000000..8a7c714 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java
@@ -0,0 +1,495 @@ +/* + * 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 org.apache.openaz.xacml.admin.util; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.api.Advice; +import org.apache.openaz.xacml.api.AttributeValue; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.Obligation; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.util.XACMLObjectCopy; +import org.apache.openaz.xacml.util.XACMLPolicyAggregator; +import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.ui.UI; + +public class XACMLPolicyImporter extends XACMLPolicyAggregator { + private static Log logger = LogFactory.getLog(XACMLPolicyImporter.class); + + public enum OPTION { + /* + * Overwrite any existing ID + */ + OVERWRITE_EXISTING, + /* + * Update an existing ID - only ADDs information + */ + UPDATE_EXISTING, + /* + * Does not change an existing ID + */ + DONOTCHANGE_EXISTING + } + + public boolean importAttributes = true; + public boolean ignoreStandardAttributes = true; + public boolean addConstraints = true; + public OPTION attributeOption = OPTION.OVERWRITE_EXISTING; + public boolean importObligations = true; + public OPTION obligationOption = OPTION.OVERWRITE_EXISTING; + public boolean importAdvice = true; + public OPTION adviceOption = OPTION.OVERWRITE_EXISTING; + + public XACMLPolicyImporter() { + } + + public boolean isImportAttributes() { + return importAttributes; + } + + public void setImportAttributes(boolean importAttributes) { + this.importAttributes = importAttributes; + } + + public boolean isIgnoreStandardAttributes() { + return ignoreStandardAttributes; + } + + public void setIgnoreStandardAttributes(boolean ignoreStandardAttributes) { + this.ignoreStandardAttributes = ignoreStandardAttributes; + } + + public boolean isAddConstraints() { + return addConstraints; + } + + public void setAddConstraints(boolean addConstraints) { + this.addConstraints = addConstraints; + } + + public OPTION getAttributeOption() { + return attributeOption; + } + + public void setAttributeOption(OPTION attributeOption) { + this.attributeOption = attributeOption; + } + + public boolean isImportObligations() { + return importObligations; + } + + public void setImportObligations(boolean importObligations) { + this.importObligations = importObligations; + } + + public OPTION getObligationOption() { + return obligationOption; + } + + public void setObligationOption(OPTION obligationOption) { + this.obligationOption = obligationOption; + } + + public boolean isImportAdvice() { + return importAdvice; + } + + public void setImportAdvice(boolean importAdvice) { + this.importAdvice = importAdvice; + } + + public OPTION getAdviceOption() { + return adviceOption; + } + + public void setAdviceOption(OPTION adviceOption) { + this.adviceOption = adviceOption; + } + @Override + public CallbackResult onObligation(Object parent, ObligationExpressionType expression, Obligation obligation) { + if (importObligations) { + super.onObligation(parent, expression, obligation); + } + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onAttribute(Object parent, Object container, org.apache.openaz.xacml.api.Attribute attribute) { + if (importAttributes) { + super.onAttribute(parent, container, attribute); + } + return CallbackResult.CONTINUE; + } + + @Override + public CallbackResult onAdvice(Object parent, AdviceExpressionType expression, Advice advice) { + if (importAdvice) { + super.onAdvice(parent, expression, advice); + } + return CallbackResult.CONTINUE; + } + + @Override + public void onFinishScan(Object root) { + if (this.importAttributes && this.doImportAttributes() > 0) { + ((XacmlAdminUI)UI.getCurrent()).refreshAttributes(); + } + int changes = 0; + if (this.importObligations) { + changes += this.doImportObligations(); + } + if (this.importAdvice) { + changes += this.doImportAdvice(); + } + // + // If changes were made, we need to tell the UI so the + // dictionary can refresh. + // + if (changes > 0) { + ((XacmlAdminUI)UI.getCurrent()).refreshObadvice(); + } + } + + @SuppressWarnings("unchecked") + protected int doImportAttributes() { + int changes = 0; + // + // Get our attributes. This container is modifiable. + // + JPAContainer<Attribute> attributes = ((XacmlAdminUI)UI.getCurrent()).getAttributes(); + // + // Get mutable entity providers for these. + // + JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); + categories.setEntityProvider(new CachingMutableLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + + JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class); + datatypes.setEntityProvider(new CachingMutableLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + // + // Work the map + // + for (Identifier cat : this.attributeMap.keySet()) { + // + // Does category exist? + // + Category category = JPAUtils.findCategory(cat); + if (category == null) { + // + // This should rarely happen, but is possible since XACML 3.0 + // you can define your own categories. + // + logger.warn("New category: " + cat); + category = new Category(cat, Category.CUSTOM); + String shortName = XACMLConstants.extractShortName(cat.stringValue()); + if (shortName != null) { + category.setShortName(shortName); + } else { + category.setShortName(category.getXacmlId()); + } + // + // Make sure the grouping is ok + // + if (category.getGrouping() == null) { + category.setGrouping(category.getShortName()); + } + // + // Add it in + // + categories.addEntity(category); + // + // Tell the RO to update itself. + // + ((XacmlAdminUI)UI.getCurrent()).getCategories().refresh(); + } + Map<Identifier, Map<Identifier, Set<AttributeValue<?>>>> map = this.attributeMap.get(cat); + for (Identifier dt : map.keySet()) { + // + // Does datatype exist? + // + Datatype datatype = JPAUtils.findDatatype(dt); + if (datatype == null) { + // + // This should rarely happen, but is possible since XACML 3.0 + // you can define new datatypes. + // + logger.warn("New datatype: " + dt); + datatype = new Datatype(dt, Datatype.CUSTOM); + String shortName = XACMLConstants.extractShortName(dt.stringValue()); + if (shortName != null) { + datatype.setShortName(shortName); + } else { + datatype.setShortName(datatype.getXacmlId()); + } + // + // Add it in + // + datatypes.addEntity(datatype); + // + // Tell the Read-Only property to update itself. + // + ((XacmlAdminUI)UI.getCurrent()).getDatatypes().refresh(); + } + // + // Iterate the attributes + // + for (Identifier id : map.get(dt).keySet()) { + // + // Do we ignore it if its standard? + // + if (! this.ignoreStandardAttributes || + XACMLConstants.STANDARD_ATTRIBUTES.contains(id) == false) { + // + // Does it already exist? + // + Attribute newAttribute = null; + Attribute currentAttribute = JPAUtils.findAttribute(category, datatype, id.stringValue()); + // + // Support for an existing attribute + // + if (currentAttribute != null) { + if (this.attributeOption == OPTION.OVERWRITE_EXISTING) { + newAttribute = currentAttribute; + newAttribute.setConstraintType(null); + newAttribute.removeAllConstraintValues(); + } else if (this.attributeOption == OPTION.DONOTCHANGE_EXISTING) { + logger.info("Do not change existing: " + currentAttribute); + continue; + } else if (this.attributeOption == OPTION.UPDATE_EXISTING) { + newAttribute = currentAttribute; + } + } else { + // + // Create our new attribute + // + newAttribute = new Attribute(id.stringValue(), ((XacmlAdminUI)UI.getCurrent()).getUserid()); + newAttribute.setCategoryBean(category); + newAttribute.setDatatypeBean(datatype); + } + // + // Get all the values + // + Set<AttributeValue<?>> values = map.get(dt).get(id); + // + // Do we have more than 1? Also, omit boolean datatype which + // doesn't make any sense to enumerate. + // + if (values.size() > 1 && dt.equals(XACML3.ID_DATATYPE_BOOLEAN) == false) { + // + // We have a lot of possible values, add as an enumeration + // + newAttribute.setConstraintType(JPAUtils.findConstraintType(ConstraintType.ENUMERATION_TYPE)); + for (AttributeValue<?> value : values) { + Object val = value.getValue(); + String content; + if (val instanceof Collection) { + content = XACMLObjectCopy.getContent((List<Object>) value.getValue()); + } else { + content = val.toString(); + } + // + // Check if we should add it in + // + boolean add = true; + // + // If we are updating an existing, we can really only do this for enumerations, + // its impossible to resolve a regular expression or range. + // + if (currentAttribute != null && this.attributeOption == OPTION.UPDATE_EXISTING && + newAttribute.getConstraintType().getConstraintType().equals(ConstraintType.ENUMERATION_TYPE)) { + // + // Make sure it isn't there already, no duplicates. + // + for (ConstraintValue currentConstraintValue : newAttribute.getConstraintValues()) { + if (currentConstraintValue.getValue().equals(content)) { + add = false; + break; + } + } + } + if (add && content.isEmpty() == false) { + ConstraintValue newValue = new ConstraintValue("Enumeration", content); + newValue.setAttribute(newAttribute); + newAttribute.addConstraintValue(newValue); + } + } + } + // + // Add it + // + if (newAttribute != null) { + if (newAttribute.getId() == 0) { + logger.info("Adding new attribute"); + if (attributes.addEntity(newAttribute) == null) { + logger.error("Failed to add new attribute: " + newAttribute); + } else { + changes++; + } + } else { + logger.info("Updating attribute " + newAttribute); + try { + attributes.commit(); + changes++; + } catch (SourceException | InvalidValueException e) { + logger.error("Update failed: " + e.getLocalizedMessage()); + } + } + } + } + } + } + } + return changes; + } + + protected int doImportObligations() { + int changes = 0; + JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice(); + for (Identifier id : this.obligationMap.keySet()) { + for (EffectType effect : this.obligationMap.get(id).keySet()) { + for (Obligation obligation : this.obligationMap.get(id).get(effect)) { + Obadvice newObligation = null; + Obadvice currentObligation = JPAUtils.findObligation(obligation.getId(), effect); + // + // Does it exist? + // + if (currentObligation != null) { + if (this.obligationOption == OPTION.OVERWRITE_EXISTING) { + newObligation = currentObligation; + newObligation.removeAllExpressions(); + } else if (this.obligationOption == OPTION.DONOTCHANGE_EXISTING) { + continue; + } else if (this.obligationOption == OPTION.UPDATE_EXISTING) { + newObligation = currentObligation; + } + } else { + // + // Create new one + // + newObligation = new Obadvice(obligation.getId(), ((XacmlAdminUI)UI.getCurrent()).getUserid()); + newObligation.setFulfillOn((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY)); + } + // + // TODO add the expressions + // + + // + // Add it in + // + if (newObligation != null) { + if (newObligation.getId() == 0) { + logger.info("Adding obligation " + newObligation); + oa.addEntity(newObligation); + changes++; + } else { + logger.info("Updating obligation " + newObligation); + try { + oa.commit(); + changes++; + } catch (SourceException | InvalidValueException e) { + logger.error("Update obligation failed " + e.getLocalizedMessage()); + } + } + } + } + } + } + return changes; + } + + protected int doImportAdvice() { + int changes = 0; + JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice(); + for (Identifier id : this.adviceMap.keySet()) { + for (EffectType effect : this.adviceMap.get(id).keySet()) { + for (Advice advice : this.adviceMap.get(id).get(effect)) { + Obadvice newAdvice = null; + Obadvice currentAdvice = JPAUtils.findAdvice(advice.getId(), effect); + // + // Does it exist? + // + if (currentAdvice != null) { + if (this.adviceOption == OPTION.OVERWRITE_EXISTING) { + newAdvice = currentAdvice; + newAdvice.removeAllExpressions(); + } else if (this.adviceOption == OPTION.DONOTCHANGE_EXISTING) { + continue; + } else if (this.adviceOption == OPTION.UPDATE_EXISTING) { + newAdvice = currentAdvice; + } + } else { + // + // Create new one + // + newAdvice = new Obadvice(advice.getId(), ((XacmlAdminUI)UI.getCurrent()).getUserid()); + newAdvice.setType(Obadvice.ADVICE); + newAdvice.setFulfillOn((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY)); + } + // + // TODO add the expressions + // + + // + // Add it in + // + if (newAdvice != null) { + if (newAdvice.getId() == 0) { + logger.info("Adding advice " + newAdvice); + oa.addEntity(newAdvice); + changes++; + } else { + logger.info("Updating advice " + newAdvice); + try { + oa.commit(); + changes++; + } catch (SourceException | InvalidValueException e) { + logger.error("Update advice failed " + e.getLocalizedMessage()); + } + } + } + } + } + } + return changes; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java new file mode 100644 index 0000000..0dd7f32 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java
@@ -0,0 +1,290 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.components.AttributeDictionary; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public class AttributeDictionarySelectorComponent extends CustomComponent implements AttributeChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private ListSelect listSelectAttribute; + @AutoGenerated + private HorizontalLayout horizontalLayout_2; + @AutoGenerated + private Button buttonNewAttribute; + @AutoGenerated + private ComboBox comboBoxCategoryFilter; + /** + * + */ + private static final long serialVersionUID = 1L; + private final AttributeDictionarySelectorComponent self = this; + private final Datatype datatype; + private final Attribute initialAttribute; + private final BasicNotifier notifier = new BasicNotifier(); + private static final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); + private static final JPAContainer<Attribute> attributes = new JPAContainer<Attribute>(Attribute.class); + static { + attributes.setEntityProvider(new CachingLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + attributes.sort(new String[]{"xacmlId"}, new boolean[]{true}); + categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); + } + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeDictionarySelectorComponent(Datatype datatype, Attribute initialAttribute) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save pointer and finish container initialization + // + this.datatype = datatype; + this.initialAttribute = initialAttribute; + // + // Initialize + // + this.initializeCategoryFilter(); + this.initializeAttributes(); + this.initializeButtons(); + // + // Set our focus + // + this.listSelectAttribute.focus(); + } + + protected void initializeCategoryFilter() { + // + // Remove any filters + // + AttributeDictionarySelectorComponent.categories.removeAllContainerFilters(); + // + // Initialize data source and GUI properties + // + this.comboBoxCategoryFilter.setContainerDataSource(AttributeDictionarySelectorComponent.categories); + this.comboBoxCategoryFilter.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxCategoryFilter.setItemCaptionPropertyId("xacmlId"); + this.comboBoxCategoryFilter.setImmediate(true); + // + // Respond to events + // + this.comboBoxCategoryFilter.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Clear any existing filters + // + AttributeDictionarySelectorComponent.attributes.removeAllContainerFilters(); + // + // Get the current selection + // + Object id = self.comboBoxCategoryFilter.getValue(); + // + // Is anything currently selected? + // + if (id != null) { + // + // Yes - add the new filter into the container + // + AttributeDictionarySelectorComponent.attributes.addContainerFilter(new Compare.Equal("categoryBean", AttributeDictionarySelectorComponent.categories.getItem(id).getEntity())); + } + } + }); + } + + protected void initializeAttributes() { + // + // Remove any filters + // + AttributeDictionarySelectorComponent.attributes.removeAllContainerFilters(); + // + // Initialize data source and GUI properties + // + this.listSelectAttribute.setContainerDataSource(AttributeDictionarySelectorComponent.attributes); + this.listSelectAttribute.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.listSelectAttribute.setItemCaptionPropertyId("xacmlId"); + this.listSelectAttribute.setImmediate(true); + this.listSelectAttribute.setHeight(7, Unit.EM); + // + // Filter by datatype + // + if (this.datatype != null) { + AttributeDictionarySelectorComponent.attributes.addContainerFilter(new Compare.Equal("datatypeBean", this.datatype)); + } + // + // Is there a default selection? Is there an id? + // + if (this.initialAttribute != null && this.initialAttribute.getId() != 0) { + this.listSelectAttribute.select(this.initialAttribute.getId()); + } + // + // Respond to events + // + this.listSelectAttribute.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + protected void initializeButtons() { + this.buttonNewAttribute.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + AttributeDictionary.createNewAttributeWindow(); + } + }); + } + + @Override + public void commit() { + this.listSelectAttribute.commit(); + } + + @Override + public Attribute getAttribute() { + Object id = this.listSelectAttribute.getValue(); + if (id == null) { + return null; + } + return AttributeDictionarySelectorComponent.attributes.getItem(id).getEntity(); + } + + @Override + public boolean addListener(AttributeChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(AttributeChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireAttributeChanged(Attribute attribute) { + this.notifier.fireAttributeChanged(attribute); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_2 + horizontalLayout_2 = buildHorizontalLayout_2(); + mainLayout.addComponent(horizontalLayout_2); + + // listSelectAttribute + listSelectAttribute = new ListSelect(); + listSelectAttribute.setCaption("Dictionary Attributes"); + listSelectAttribute.setImmediate(false); + listSelectAttribute.setWidth("100.0%"); + listSelectAttribute.setHeight("-1px"); + listSelectAttribute.setInvalidAllowed(false); + listSelectAttribute.setRequired(true); + mainLayout.addComponent(listSelectAttribute); + mainLayout.setExpandRatio(listSelectAttribute, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_2() { + // common part: create layout + horizontalLayout_2 = new HorizontalLayout(); + horizontalLayout_2.setImmediate(false); + horizontalLayout_2.setWidth("-1px"); + horizontalLayout_2.setHeight("-1px"); + horizontalLayout_2.setMargin(false); + horizontalLayout_2.setSpacing(true); + + // comboBoxCategoryFilter + comboBoxCategoryFilter = new ComboBox(); + comboBoxCategoryFilter.setCaption("Filter Category"); + comboBoxCategoryFilter.setImmediate(false); + comboBoxCategoryFilter.setWidth("-1px"); + comboBoxCategoryFilter.setHeight("-1px"); + horizontalLayout_2.addComponent(comboBoxCategoryFilter); + horizontalLayout_2.setExpandRatio(comboBoxCategoryFilter, 1.0f); + + // buttonNewAttribute + buttonNewAttribute = new Button(); + buttonNewAttribute.setCaption("New Attribute"); + buttonNewAttribute.setImmediate(true); + buttonNewAttribute + .setDescription("Click to create a new attribute in the dictionary."); + buttonNewAttribute.setWidth("-1px"); + buttonNewAttribute.setHeight("-1px"); + horizontalLayout_2.addComponent(buttonNewAttribute); + horizontalLayout_2.setComponentAlignment(buttonNewAttribute, + new Alignment(10)); + + return horizontalLayout_2; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java new file mode 100644 index 0000000..c1568b9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java
@@ -0,0 +1,372 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public class AttributeSimpleCreatorComponent extends CustomComponent implements AttributeChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private Table tableDatatype; + @AutoGenerated + private Table tableCategory; + @AutoGenerated + private TextField textFieldContextPath; + @AutoGenerated + private TextField textFieldAttributeId; + /** + * + */ + private static final long serialVersionUID = 1L; + private final AttributeSimpleCreatorComponent self = this; + private final Datatype datatype; + private final Attribute attribute; + private final BasicNotifier notifier = new BasicNotifier(); + private static final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); + private static final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class); + static { + categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); + datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true}); + } + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeSimpleCreatorComponent(Datatype datatype, Attribute initialAttribute) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.datatype = datatype; + this.attribute = initialAttribute; + // + // Initialize GUI + // + this.initializeCategories(); + this.initializeDatatypes(); + this.initializeAttributeId(); + // + // Focus + // + this.textFieldAttributeId.focus(); + } + + private void initializeCategories() { + // + // Remove any filters + // + AttributeSimpleCreatorComponent.categories.removeAllContainerFilters(); + // + // Initialize data source & GUI properties + // + this.tableCategory.setContainerDataSource(AttributeSimpleCreatorComponent.categories); + this.tableCategory.setVisibleColumns(new Object[] {"xacmlId"}); + this.tableCategory.setColumnHeaders(new String[] {"XACML ID"}); + this.tableCategory.setImmediate(true); + this.tableCategory.setNullSelectionAllowed(false); + this.tableCategory.setPageLength(10); + this.tableCategory.setSelectable(true); + // + // Default selection + // + Category defaultCategory; + if (this.attribute == null || this.attribute.getCategoryBean() == null || this.attribute.getCategoryBean().getIdentifer() == null) { + defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT); + assert defaultCategory != null; + } else { + defaultCategory = JPAUtils.findCategory(this.attribute.getCategoryBean().getIdentifer()); + } + if (defaultCategory != null) { + this.tableCategory.select(defaultCategory.getId()); + } + // + // Respond to changes + // + this.tableCategory.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + private void initializeDatatypes() { + // + // Remove any filters + // + AttributeSimpleCreatorComponent.datatypes.removeAllContainerFilters(); + // + // Initialize data source & GUI properties + // + this.tableDatatype.setContainerDataSource(AttributeSimpleCreatorComponent.datatypes); + this.tableDatatype.setVisibleColumns(new Object[] {"xacmlId", "shortName"}); + this.tableDatatype.setColumnHeaders(new String[] {"Data Type ID", "Data Type"}); + this.tableDatatype.setNullSelectionAllowed(false); + this.tableDatatype.setImmediate(true); + this.tableDatatype.setPageLength(10); + // + // Are we restricted to a certain datatype? + // + if (this.datatype != null) { + // + // Datatype restricted + // + this.tableDatatype.select(this.datatype.getId()); + this.tableDatatype.setEnabled(false); + return; + } + this.tableDatatype.setSelectable(true); + // + // Do we have a default value? + // + Datatype defaultDatatype; + if (this.attribute != null && this.attribute.getDatatypeBean() != null) { + defaultDatatype = this.attribute.getDatatypeBean(); + } else { + defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING); + } + if (defaultDatatype != null) { + this.tableDatatype.select(defaultDatatype.getId()); + } + // + // Respond to changes + // + this.tableDatatype.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + private void initializeAttributeId() { + this.textFieldAttributeId.setImmediate(true); + this.textFieldAttributeId.setNullRepresentation(""); + if (this.attribute == null) { + this.textFieldAttributeId.setValue(XacmlAdminUI.getDomain()); + } else { + // + // Set the ID + // + this.textFieldAttributeId.setValue(this.attribute.getXacmlId()); + // + // Is it an attribute selector? + // + if (this.attribute.isDesignator()) { + this.textFieldContextPath.setVisible(false); + this.textFieldContextPath.setRequired(false); + } else { + this.textFieldAttributeId.setCaption("Context Selector Id"); + this.textFieldAttributeId.setRequired(false); + this.textFieldContextPath.setVisible(true); + this.textFieldContextPath.setValue(this.attribute.getSelectorPath()); + this.textFieldContextPath.setRequired(true); + this.textFieldContextPath.setRequiredError("You must have a context path for a selector."); + this.textFieldContextPath.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + } + // + // Respond to changes + // + this.textFieldAttributeId.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + @Override + public Attribute getAttribute() { + try { + this.textFieldAttributeId.commit(); + } catch (Exception e) { //NOPMD + // TODO - Handle, Log or NOPMD + // TODO - Will vaadin display error? + } + Attribute attribute = new Attribute(this.textFieldAttributeId.getValue()); + attribute.setSelectorPath(this.textFieldContextPath.getValue()); + Object categoryId = this.tableCategory.getValue(); + if (categoryId != null) { + attribute.setCategoryBean(AttributeSimpleCreatorComponent.categories.getItem(categoryId).getEntity()); + } + if (this.datatype != null) { + attribute.setDatatypeBean(this.datatype); + } else { + Object datatypeId = this.tableDatatype.getValue(); + if (datatypeId == null) { + return null; + } + attribute.setDatatypeBean(AttributeSimpleCreatorComponent.datatypes.getItem(datatypeId).getEntity()); + } + return attribute; + } + + @Override + public boolean addListener(AttributeChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(AttributeChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void commit() { + try { + this.textFieldAttributeId.commit(); + this.textFieldContextPath.commit(); + this.tableCategory.commit(); + this.tableDatatype.commit(); + } catch (Exception e) { //NOPMD + // TODO - Handle, Log or NOPMD + // TODO - Will vaadin display error? + } + } + + @Override + public void fireAttributeChanged(Attribute attribute) { + this.notifier.fireAttributeChanged(attribute); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldAttributeId + textFieldAttributeId = new TextField(); + textFieldAttributeId.setCaption("Attribute Id"); + textFieldAttributeId.setImmediate(false); + textFieldAttributeId.setWidth("100.0%"); + textFieldAttributeId.setHeight("-1px"); + textFieldAttributeId.setInvalidAllowed(false); + textFieldAttributeId.setRequired(true); + mainLayout.addComponent(textFieldAttributeId); + mainLayout.setExpandRatio(textFieldAttributeId, 1.0f); + + // textFieldContextPath + textFieldContextPath = new TextField(); + textFieldContextPath.setCaption("Context Path"); + textFieldContextPath.setImmediate(false); + textFieldContextPath.setDescription("The Selector's Context Path."); + textFieldContextPath.setWidth("100.0%"); + textFieldContextPath.setHeight("-1px"); + textFieldContextPath + .setInputPrompt("eg. md:record/md:patient/md:patient-number/text()"); + mainLayout.addComponent(textFieldContextPath); + mainLayout.setExpandRatio(textFieldContextPath, 1.0f); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + mainLayout.setExpandRatio(horizontalLayout_1, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // tableCategory + tableCategory = new Table(); + tableCategory.setCaption("Choose Category"); + tableCategory.setImmediate(false); + tableCategory.setWidth("-1px"); + tableCategory.setHeight("-1px"); + tableCategory.setInvalidAllowed(false); + tableCategory.setRequired(true); + horizontalLayout_1.addComponent(tableCategory); + + // tableDatatype + tableDatatype = new Table(); + tableDatatype.setCaption("Choose Data Type"); + tableDatatype.setImmediate(false); + tableDatatype.setWidth("-1px"); + tableDatatype.setHeight("-1px"); + tableDatatype.setInvalidAllowed(false); + tableDatatype.setRequired(true); + horizontalLayout_1.addComponent(tableDatatype); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java new file mode 100644 index 0000000..a3fded5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java
@@ -0,0 +1,414 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.io.Serializable; +import java.util.Set; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Category; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.util.XACMLConstants; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.util.BeanItem; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public class AttributeStandardSelectorComponent extends CustomComponent implements AttributeChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private HorizontalLayout horizontalLayout_2; + @AutoGenerated + private Table tableDatatypes; + @AutoGenerated + private Table tableAttributes; + @AutoGenerated + private ComboBox comboBoxCategories; + /** + * + */ + private static final long serialVersionUID = 1L; + + public class AttributeBean implements Serializable { + private static final long serialVersionUID = 1L; + private Identifier attributeId; + private Identifier categoryId; + + public AttributeBean(Identifier category, Identifier id) { + this.categoryId = category; + this.attributeId = id; + } + public Identifier getAttributeId() { + return attributeId; + } + public void setAttributeId(Identifier attributeId) { + this.attributeId = attributeId; + } + public Identifier getCategoryId() { + return categoryId; + } + public void setCategoryId(Identifier categoryId) { + this.categoryId = categoryId; + } + @Override + public String toString() { + return this.attributeId.stringValue(); + } + + } + private final AttributeStandardSelectorComponent self = this; + private final Datatype datatype; + private final Attribute attribute; + private final BasicNotifier notifier = new BasicNotifier(); + private static final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class); + private static final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class); + static { + categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + categories.sort(new String[]{"xacmlId"}, new boolean[]{true}); + datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true}); + } + private BeanItemContainer<AttributeBean> container = new BeanItemContainer<AttributeBean>(AttributeBean.class); + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeStandardSelectorComponent(Datatype datatype, Attribute initialAttribute) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.datatype = datatype; + this.attribute = initialAttribute; + // + // Initialize GUI + // + this.initializeCategories(); + this.initializeAttributes(); + this.initializeDatatypes(); + // + // Initialize focus + // + this.tableAttributes.focus(); + } + + private void initializeCategories() { + // + // Remove any filters + // + AttributeStandardSelectorComponent.categories.removeAllContainerFilters(); + // + // Initialize data source & GUI properties + // + this.comboBoxCategories.setContainerDataSource(AttributeStandardSelectorComponent.categories); + this.comboBoxCategories.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxCategories.setItemCaptionPropertyId("xacmlId"); + this.comboBoxCategories.setImmediate(true); + this.comboBoxCategories.setNullSelectionAllowed(false); + // + // Set default selection + // + Category defaultCategory; + if (this.attribute == null || this.attribute.getCategoryBean() == null) { + defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT); + } else { + defaultCategory = this.attribute.getCategoryBean(); + } + if (defaultCategory != null) { + this.comboBoxCategories.select(defaultCategory.getId()); + } + // + // Respond to events + // + this.comboBoxCategories.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupAttributeIDs(); + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + private void initializeAttributes() { + // + // Initialize GUI properties + // + this.tableAttributes.setImmediate(true); + this.tableAttributes.setNullSelectionAllowed(false); + this.tableAttributes.setPageLength(10); + // + // Setup + // + this.tableAttributes.setContainerDataSource(this.container); + this.tableAttributes.setVisibleColumns(new Object[] {"attributeId"}); + this.tableAttributes.setColumnHeaders(new String[] {"Attribute Id"}); + this.tableAttributes.setSelectable(true); + this.setupAttributeIDs(); + // + // Respond + // + this.tableAttributes.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + private void initializeDatatypes() { + // + // Remove any filters + // + AttributeStandardSelectorComponent.datatypes.removeAllContainerFilters(); + // + // Initialize data source & GUI properties + // + this.tableDatatypes.setContainerDataSource(AttributeStandardSelectorComponent.datatypes); + this.tableDatatypes.setVisibleColumns(new Object[] {"shortName", "xacmlId"}); + this.tableDatatypes.setColumnHeaders(new String[] {"Short Name", "XACML Data Type ID"}); + this.tableDatatypes.setImmediate(true); + this.tableDatatypes.setNullSelectionAllowed(false); + this.tableDatatypes.setPageLength(10); + // + // Are we restricted to a certain datatype? + // + if (this.datatype != null) { + // + // Datatype restricted + // + this.tableDatatypes.select(this.datatype.getId()); + this.tableDatatypes.setEnabled(false); + return; + } + this.tableDatatypes.setSelectable(true); + // + // Select a default + // + Datatype defaultDatatype; + if (this.attribute == null || this.attribute.getDatatypeBean() == null) { + defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING); + } else { + defaultDatatype = this.attribute.getDatatypeBean(); + } + if (defaultDatatype != null) { + this.tableDatatypes.select(defaultDatatype.getId()); + } + // + // Respond to events + // + this.tableDatatypes.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.fireAttributeChanged(self.getAttribute()); + } + }); + } + + private void setupAttributeIDs() { + // + // Get the current selection (should NOT be null) + // + Object id = this.comboBoxCategories.getValue(); + Category category = AttributeStandardSelectorComponent.categories.getItem(id).getEntity(); + Set<Identifier> attributeIDs = null; + if (category.isStandard()) { + // + // Get the subset of attribute ID's specific to this standard + // category. + // + attributeIDs = XACMLConstants.MAP_STANDARD_CATEGORIES.get(category.getIdentifer()); + } + if (attributeIDs == null) { + // + // A custom category, there are no default attribute IDs + // that we can determine. + // + attributeIDs = XACMLConstants.STANDARD_ATTRIBUTES; + } + // + // Reset attribute IDs. Based on the category, add only acceptable + // attribute ID's for the category. + // + Object defaultBean = null; + this.tableAttributes.removeAllItems(); + for (Identifier attributeId : attributeIDs) { + BeanItem<AttributeBean> newItem = this.container.addItem(new AttributeBean(category.getIdentifer(), attributeId)); + if (this.attribute == null) { + if (attributeId.equals(XACML3.ID_SUBJECT_SUBJECT_ID) || + attributeId.equals(XACML3.ID_ACTION_ACTION_ID) || + attributeId.equals(XACML3.ID_RESOURCE_RESOURCE_ID) || + attributeId.equals(XACML3.ID_ENVIRONMENT_CURRENT_DATE)) { + defaultBean = newItem.getBean(); + } + } else { + if (newItem.getBean().getAttributeId().stringValue().equals(this.attribute.getXacmlId())) { + defaultBean = newItem.getBean(); + } + } + } + // + // Set the default selection + // + if (defaultBean != null) { + this.tableAttributes.select(defaultBean); + } + } + + @Override + public void commit() { + this.comboBoxCategories.commit(); + this.tableAttributes.commit(); + this.tableDatatypes.commit(); + } + + @Override + public Attribute getAttribute() { + Object categoryId = this.comboBoxCategories.getValue(); + Object attributeId = this.tableAttributes.getValue(); + Object datatypeId = this.tableDatatypes.getValue(); + if (attributeId == null || datatypeId == null || categoryId == null) { + return null; + } + AttributeBean attributeBean = this.container.getItem(attributeId).getBean(); + Datatype datatype = AttributeStandardSelectorComponent.datatypes.getItem(datatypeId).getEntity(); + Category category = AttributeStandardSelectorComponent.categories.getItem(categoryId).getEntity(); + if (datatype == null || category == null) { + return null; + } + Attribute attribute = new Attribute(attributeBean.getAttributeId().stringValue()); + attribute.setCategoryBean(category); + attribute.setDatatypeBean(datatype); + + return attribute; + } + + @Override + public boolean addListener(AttributeChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(AttributeChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireAttributeChanged(Attribute attribute) { + this.notifier.fireAttributeChanged(attribute); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // comboBoxCategories + comboBoxCategories = new ComboBox(); + comboBoxCategories.setCaption("Select A Category"); + comboBoxCategories.setImmediate(false); + comboBoxCategories.setWidth("-1px"); + comboBoxCategories.setHeight("-1px"); + comboBoxCategories.setInvalidAllowed(false); + comboBoxCategories.setRequired(true); + mainLayout.addComponent(comboBoxCategories); + mainLayout.setExpandRatio(comboBoxCategories, 1.0f); + + // horizontalLayout_2 + horizontalLayout_2 = buildHorizontalLayout_2(); + mainLayout.addComponent(horizontalLayout_2); + mainLayout.setExpandRatio(horizontalLayout_2, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_2() { + // common part: create layout + horizontalLayout_2 = new HorizontalLayout(); + horizontalLayout_2.setImmediate(false); + horizontalLayout_2.setWidth("-1px"); + horizontalLayout_2.setHeight("-1px"); + horizontalLayout_2.setMargin(false); + horizontalLayout_2.setSpacing(true); + + // tableAttributes + tableAttributes = new Table(); + tableAttributes.setCaption("Standard Attributes"); + tableAttributes.setImmediate(false); + tableAttributes.setWidth("-1px"); + tableAttributes.setHeight("-1px"); + tableAttributes.setInvalidAllowed(false); + tableAttributes.setRequired(true); + horizontalLayout_2.addComponent(tableAttributes); + + // tableDatatypes + tableDatatypes = new Table(); + tableDatatypes.setCaption("Standard Data Types"); + tableDatatypes.setImmediate(false); + tableDatatypes.setWidth("-1px"); + tableDatatypes.setHeight("-1px"); + tableDatatypes.setInvalidAllowed(false); + tableDatatypes.setRequired(true); + horizontalLayout_2.addComponent(tableDatatypes); + + return horizontalLayout_2; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java new file mode 100644 index 0000000..ab466b0 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java
@@ -0,0 +1,385 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.converter.StringToIntegerConverter; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class CSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier { + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private TextField textFieldSkip; + + @AutoGenerated + private TextField textFieldQuote; + + @AutoGenerated + private TextField textFieldDelimiter; + + @AutoGenerated + private TextField textFieldFile; + + public static String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine"; + + + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(CSVPIPConfigurationComponent.class); + private final CSVPIPConfigurationComponent self = this; + private final BasicNotifier notifier = new BasicNotifier(); + private final EntityItem<PIPConfiguration> entity; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param entityConfig + * @param configParamField + */ + public CSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.entity = entityConfig; + // + // initialize + // + this.initialize(); + // + // Focus + // + this.textFieldFile.focus(); + } + + protected void initialize() { + if (logger.isDebugEnabled()) { + logger.debug("initializing " + this.entity.getEntity().toString()); + } + // + // What are our current values? + // + Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>(); + for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) { + if (param.getParamName().equals(CSVEngine.PROP_SOURCE)) { + this.textFieldFile.setData(param); + } else if (param.getParamName().equals(CSVEngine.PROP_DELIMITER)) { + this.textFieldDelimiter.setData(param); + } else if (param.getParamName().equals(CSVEngine.PROP_QUOTE)) { + this.textFieldQuote.setData(param); + } else if (param.getParamName().equals(CSVEngine.PROP_SKIP)) { + this.textFieldSkip.setData(param); + } else { + unneeded.add(param); + } + } + if (unneeded.isEmpty() == false) { + this.entity.getEntity().getPipconfigParams().removeAll(unneeded); + } + // + // + // + this.initializeEntity(); + this.initializeText(); + } + + protected void initializeEntity() { + // + // Initialize the entity + // + this.entity.getEntity().setClassname(CLASSNAME); + this.entity.getEntity().setRequiresResolvers(true); + } + + protected void initializeText() { + // + // + // + this.textFieldFile.setRequired(true); + this.textFieldFile.setRequiredError("You need to specify a path to the CSV file on the server."); + this.textFieldFile.setImmediate(true); + this.textFieldFile.setNullRepresentation(""); + // + // + // + PIPConfigParam param = (PIPConfigParam) this.textFieldFile.getData(); + if (param != null) { + this.textFieldFile.setValue(param.getParamValue()); + } + this.textFieldFile.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData(); + if (param == null) { + param = new PIPConfigParam(CSVEngine.PROP_SOURCE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldFile.setData(param); + } + param.setParamValue(self.textFieldFile.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldFile.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData(); + if (param == null) { + param = new PIPConfigParam(CSVEngine.PROP_SOURCE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldFile.setData(param); + } + param.setParamValue(self.textFieldFile.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldDelimiter.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldDelimiter.getData(); + if (param != null) { + this.textFieldDelimiter.setValue(param.getParamValue()); + } + this.textFieldDelimiter.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldDelimiter.getData(); + if (param == null) { + param = new PIPConfigParam(CSVEngine.PROP_DELIMITER); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldDelimiter.setData(param); + } + param.setParamValue(self.textFieldDelimiter.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldQuote.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldQuote.getData(); + if (param != null) { + this.textFieldQuote.setValue(param.getParamValue()); + } + this.textFieldQuote.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldQuote.getData(); + if (param == null) { + param = new PIPConfigParam(CSVEngine.PROP_QUOTE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldQuote.setData(param); + } + param.setParamValue(self.textFieldQuote.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldSkip.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldSkip.getData(); + if (param != null) { + this.textFieldSkip.setValue(param.getParamValue()); + } + this.textFieldSkip.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldSkip.getData(); + if (param == null) { + param = new PIPConfigParam(CSVEngine.PROP_SKIP); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldSkip.setData(param); + } + param.setParamValue(self.textFieldSkip.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldSkip.setConverter(new StringToIntegerConverter()); + } + + public void validate() throws InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("validate"); + } + this.textFieldFile.validate(); + this.textFieldDelimiter.validate(); + this.textFieldQuote.validate(); + this.textFieldSkip.validate(); + } + + public void commit() throws SourceException, InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("commit"); + } + this.textFieldFile.commit(); + this.textFieldDelimiter.commit(); + this.textFieldQuote.commit(); + + if (this.textFieldSkip.getValue() == null || this.textFieldSkip.getValue().isEmpty()) { + this.entity.getEntity().removePipconfigParam((PIPConfigParam) this.textFieldSkip.getData()); + this.textFieldSkip.setData(null); + } + this.textFieldSkip.commit(); + } + + public void discard() throws SourceException { + if (logger.isDebugEnabled()) { + logger.debug("discard"); + } + this.textFieldFile.discard(); + this.textFieldDelimiter.discard(); + this.textFieldQuote.discard(); + this.textFieldSkip.discard(); + + this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SOURCE); + this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_DELIMITER); + this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_QUOTE); + this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SKIP); + this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_MAXSIZE); + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldFile + textFieldFile = new TextField(); + textFieldFile.setCaption("Path to CSV File"); + textFieldFile.setImmediate(false); + textFieldFile + .setDescription("This is the path to CSV file on the PDP node."); + textFieldFile.setWidth("-1px"); + textFieldFile.setHeight("-1px"); + textFieldFile.setInvalidAllowed(false); + textFieldFile.setRequired(true); + textFieldFile + .setInputPrompt("Eg. \"c:\\data.csv\" \"http://foo.com/data.csv\""); + mainLayout.addComponent(textFieldFile); + mainLayout.setExpandRatio(textFieldFile, 1.0f); + + // textFieldDelimiter + textFieldDelimiter = new TextField(); + textFieldDelimiter.setCaption("Delimiter"); + textFieldDelimiter.setImmediate(false); + textFieldDelimiter + .setDescription("Enter a separator character or string that delineates columns in each row."); + textFieldDelimiter.setWidth("-1px"); + textFieldDelimiter.setHeight("-1px"); + textFieldDelimiter.setInputPrompt("Eg. \",\" or \"|\""); + textFieldDelimiter.setNullSettingAllowed(true); + mainLayout.addComponent(textFieldDelimiter); + mainLayout.setExpandRatio(textFieldDelimiter, 1.0f); + + // textFieldQuote + textFieldQuote = new TextField(); + textFieldQuote.setCaption("Quote"); + textFieldQuote.setImmediate(false); + textFieldQuote + .setDescription("Enter character used for quoted elements."); + textFieldQuote.setWidth("-1px"); + textFieldQuote.setHeight("-1px"); + textFieldQuote.setInputPrompt("Eg. \" or '"); + textFieldQuote.setNullSettingAllowed(true); + mainLayout.addComponent(textFieldQuote); + + // textFieldSkip + textFieldSkip = new TextField(); + textFieldSkip.setCaption("Skip Lines"); + textFieldSkip.setImmediate(false); + textFieldSkip + .setDescription("Skips the number of lines at the beginning of the file."); + textFieldSkip.setWidth("-1px"); + textFieldSkip.setHeight("-1px"); + textFieldSkip.setInputPrompt("Eg. 1 or 2"); + mainLayout.addComponent(textFieldSkip); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java new file mode 100644 index 0000000..043cba7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java
@@ -0,0 +1,200 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class CustomPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private PIPParameterComponent pipParameterComponent; + @AutoGenerated + private TextField textFieldClassname; + /** + * + */ + private static final long serialVersionUID = 1L; + private final EntityItem<?> entity; + private static final Log logger = LogFactory.getLog(CustomPIPConfigurationComponent.class); + private final CustomPIPConfigurationComponent self = this; + private final BasicNotifier notifier = new BasicNotifier(); + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param configParamField + */ + public CustomPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) { + // + // Save + // + this.entity = entityConfig; + + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // InitializeGUI + // + this.initialize(); + } + + protected void initialize() { + if (logger.isDebugEnabled()) { + logger.debug("initializing " + this.entity.getEntity().toString()); + } + this.initializeEntity(); + this.initializeText(); + } + + protected void initializeEntity() { + // + // If the entity is persisted, then we are editing + // it. So don't remove anything. + // + if (this.entity.isPersistent()) { + return; + } + // + // Not sure if we really should remove stuff. To be + // determined later. + // + } + + protected void initializeText() { + this.textFieldClassname.setRequired(true); + this.textFieldClassname.setRequiredError("You must declare the Java classname for the PIP Factory Loader"); + this.textFieldClassname.setImmediate(true); + final Object entity = this.entity.getEntity(); + if (entity instanceof PIPConfiguration) { + this.textFieldClassname.setValue(((PIPConfiguration)entity).getClassname()); + } else if (entity instanceof PIPResolver) { + this.textFieldClassname.setValue(((PIPResolver)entity).getClassname()); + } + // + // Respond to events + // + this.textFieldClassname.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (entity instanceof PIPConfiguration) { + ((PIPConfiguration) entity).setClassname(self.textFieldClassname.getValue()); + } else if (entity instanceof PIPResolver) { + ((PIPResolver) entity).setClassname(self.textFieldClassname.getValue()); + } + self.fireFormChangedEvent(); + } + }); + } + + public void validate() throws InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("validate"); + } + this.textFieldClassname.validate(); + } + + public void commit() throws SourceException, InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("commit"); + } + this.textFieldClassname.commit(); + } + + public void discard() throws SourceException { + if (logger.isDebugEnabled()) { + logger.debug("discard"); + } + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldClassname + textFieldClassname = new TextField(); + textFieldClassname.setCaption("Java Classname"); + textFieldClassname.setImmediate(false); + textFieldClassname + .setDescription("Java classname of the code implementing the custom PIP."); + textFieldClassname.setWidth("-1px"); + textFieldClassname.setHeight("-1px"); + textFieldClassname.setInputPrompt("Eg. com.foo.MyPIP"); + mainLayout.addComponent(textFieldClassname); + mainLayout.setExpandRatio(textFieldClassname, 1.0f); + + // pipParameterComponent + pipParameterComponent = new PIPParameterComponent(this.entity.getEntity()); + pipParameterComponent.setImmediate(false); + pipParameterComponent.setWidth("-1px"); + pipParameterComponent.setHeight("-1px"); + mainLayout.addComponent(pipParameterComponent); + + return mainLayout; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java new file mode 100644 index 0000000..eafbcad --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java
@@ -0,0 +1,386 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Container; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Field; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.TableFieldFactory; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class EnumerationEditorComponent extends CustomComponent implements Validator { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + + @AutoGenerated + private Button buttonClearAll; + + @AutoGenerated + private Button buttonRemove; + + @AutoGenerated + private Button buttonAdd; + + @AutoGenerated + private Table tableEnumerations; + + private static final long serialVersionUID = -1L; + private static final Log logger = LogFactory.getLog(EnumerationEditorComponent.class); + private final EnumerationEditorComponent self = this; + private final Attribute attribute; + private Identifier datatype; + private final BeanItemContainer<ConstraintValue> beanContainer; + + public EnumerationEditorComponent(Attribute attribute, Identifier datatype) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save our attribute + // + this.attribute = attribute; + this.datatype = datatype; + // + // Construct a bean container that the + // table uses to manage the values. + // + this.beanContainer = new BeanItemContainer<ConstraintValue>(ConstraintValue.class); + // + // Initialize our components + // + this.initializeTable(); + this.initializeButtons(); + } + + private void initializeTable() { + // + // Add the current enumeration values into the + // bean container. + // + for (ConstraintValue value : this.attribute.getConstraintValues()) { + if (value.getProperty().equals("Enumeration")) { + this.beanContainer.addBean(value); + } + } + // + // Now hook the bean container to the table + // + this.tableEnumerations.setContainerDataSource(beanContainer); + // + // We have to manually create the text field because we need + // to set a validator. + // + this.tableEnumerations.setTableFieldFactory(new TableFieldFactory() { + private static final long serialVersionUID = 1L; + + @Override + public Field<?> createField(Container container, Object itemId, + Object propertyId, Component uiContext) { + if (propertyId.toString().equals("value")) { + final TextField text = new TextField(); + text.setImmediate(true); + text.setNullRepresentation(""); + text.setNullSettingAllowed(false); + text.setRequired(true); + text.setRequiredError("Cannot have empty enumeration values."); + text.addValidator(self); + return text; + } + return null; + } + }); + // + // Finish setting up the table. + // + this.tableEnumerations.setVisibleColumns(new Object[] {"value"}); + this.tableEnumerations.setColumnHeaders(new String[] {"Enumeration Value"}); + this.tableEnumerations.setSelectable(true); + this.tableEnumerations.setEditable(true); + this.tableEnumerations.setImmediate(true); + if (this.tableEnumerations.size() == 0) { + this.tableEnumerations.setPageLength(3); + } else { + this.tableEnumerations.setPageLength(this.tableEnumerations.size() + 1); + } + // + // As the user select items, enable/disable buttons + // + this.tableEnumerations.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.buttonRemove.setEnabled(self.tableEnumerations.getValue() != null); + } + + }); + } + + private void initializeButtons() { + // + // Adding new values + // + this.buttonAdd.setImmediate(true); + this.buttonAdd.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Create a new value object + // + ConstraintValue newValue = new ConstraintValue("Enumeration", ""); + // + // Associate it with the attribute + // + newValue.setAttribute(self.attribute); + // + // Add it into the attribute's internal list + // + self.attribute.addConstraintValue(newValue); + // + // Now we can add it to the GUI + // + Item item = self.tableEnumerations.addItem(newValue); + if (item != null) { + self.tableEnumerations.select(newValue); + self.tableEnumerations.focus(); + } + // + // Make sure this button is now enabled + // + self.buttonClearAll.setEnabled(true); + } + }); + // + // Removing values - nothing is selected to begin with so + // disable the button. + // + this.buttonRemove.setEnabled(false); + this.buttonRemove.setImmediate(true); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Get the selected value + // + Object value = self.tableEnumerations.getValue(); + // + // Was it selected or unselected (i.e. null)? If so, remove it + // from the table + // + if (value != null && self.tableEnumerations.removeItem(value)) { + // + // Dis-associate it with the attribute + // + ((ConstraintValue) value).setAttribute(null); + // + // Now remove it from the attribute's internal list + // + self.attribute.removeConstraintValue((ConstraintValue) value); + // + // If there are no items, then disable this button + // + if (self.tableEnumerations.size() == 0) { + self.buttonClearAll.setEnabled(false); + } + } + } + + }); + // + // Clearing all the values, set it enabled if we have anything + // + this.buttonClearAll.setImmediate(true); + this.buttonClearAll.setEnabled(this.tableEnumerations.size() > 0); + this.buttonClearAll.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Iterate all the values + // + for (Object id : self.tableEnumerations.getItemIds()) { + // + // Get the value object (it is the id) + // + ConstraintValue value = (ConstraintValue) id; + // + // Dis-associate it with the attribute + // + value.setAttribute(null); + // + // Now remove it from the attribute's internal list + // + self.attribute.removeConstraintValue(value); + } + // + // Remove everything from the table + // + self.tableEnumerations.removeAllItems(); + // + // Now disable this button + // + self.buttonClearAll.setEnabled(false); + } + }); + } + + public void setupDatatype(Identifier id) { + if (logger.isTraceEnabled()) { + logger.trace("setupDatatype: " + datatype); + } + this.datatype = id; + // + // Initiate a validate + // + this.tableEnumerations.validate(); + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value == null || value.toString().length() == 0) { + return; + } + if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) { + try { + Integer.parseInt(value.toString()); + } catch(NumberFormatException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + return; + } + if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) { + try { + Double.parseDouble(value.toString()); + } catch(NumberFormatException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + return; + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // tableEnumerations + tableEnumerations = new Table(); + tableEnumerations.setCaption("Enumeration Values"); + tableEnumerations.setImmediate(true); + tableEnumerations + .setDescription("Enter possible values for the attribute."); + tableEnumerations.setWidth("100.0%"); + tableEnumerations.setHeight("-1px"); + tableEnumerations.setInvalidAllowed(false); + mainLayout.addComponent(tableEnumerations); + mainLayout.setExpandRatio(tableEnumerations, 1.0f); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + mainLayout.setExpandRatio(horizontalLayout_1, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // buttonAdd + buttonAdd = new Button(); + buttonAdd.setCaption("Add"); + buttonAdd.setImmediate(true); + buttonAdd.setDescription("Add a new enumeration value."); + buttonAdd.setWidth("-1px"); + buttonAdd.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonAdd); + horizontalLayout_1.setComponentAlignment(buttonAdd, new Alignment(9)); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove"); + buttonRemove.setImmediate(true); + buttonRemove.setDescription("Remove the selected enumeration value."); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonRemove); + horizontalLayout_1.setComponentAlignment(buttonRemove, + new Alignment(10)); + + // buttonClearAll + buttonClearAll = new Button(); + buttonClearAll.setCaption("Clear All"); + buttonClearAll.setImmediate(false); + buttonClearAll.setDescription("Clears all the values out."); + buttonClearAll.setWidth("-1px"); + buttonClearAll.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonClearAll); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java new file mode 100644 index 0000000..67f7faf --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java
@@ -0,0 +1,339 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class HyperCSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private TextField textFieldDefinition; + @AutoGenerated + private TextField textFieldTarget; + @AutoGenerated + private TextField textFieldSource; + /** + * + */ + private static final long serialVersionUID = 1L; + public static final String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine"; + + private final EntityItem<PIPConfiguration> entity; + private static final Log logger = LogFactory.getLog(CustomPIPConfigurationComponent.class); + private final HyperCSVPIPConfigurationComponent self = this; + private final BasicNotifier notifier = new BasicNotifier(); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public HyperCSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.entity = entityConfig; + // + // Initialize + // + this.initialize(); + } + + protected void initialize() { + if (logger.isDebugEnabled()) { + logger.debug("initializing " + this.entity.getEntity().toString()); + } + // + // What are our current values? + // + Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>(); + for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) { + if (param.getParamName().equals(HyperCSVEngine.PROP_SOURCE)) { + this.textFieldSource.setData(param); + } else if (param.getParamName().equals(HyperCSVEngine.PROP_TARGET)) { + this.textFieldTarget.setData(param); + } else if (param.getParamName().equals(HyperCSVEngine.PROP_DEFINITION)) { + this.textFieldDefinition.setData(param); + } else { + unneeded.add(param); + } + } + if (unneeded.isEmpty() == false) { + this.entity.getEntity().getPipconfigParams().removeAll(unneeded); + } + // + // + // + this.initializeEntity(); + this.initializeText(); + } + + protected void initializeEntity() { + // + // Initialize the entity + // + this.entity.getEntity().setClassname(CLASSNAME); + this.entity.getEntity().setRequiresResolvers(true); + } + + protected void initializeText() { + // + // + // + this.textFieldSource.setNullRepresentation(""); + PIPConfigParam param = (PIPConfigParam) this.textFieldSource.getData(); + if (param != null) { + this.textFieldSource.setValue(param.getParamValue()); + } + this.textFieldSource.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldSource.setData(param); + } + param.setParamValue(self.textFieldSource.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldSource.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldSource.setData(param); + } + param.setParamValue(self.textFieldSource.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldTarget.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldTarget.getData(); + if (param != null) { + this.textFieldTarget.setValue(param.getParamValue()); + } + this.textFieldTarget.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldTarget.setData(param); + } + param.setParamValue(self.textFieldTarget.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldTarget.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldTarget.setData(param); + } + param.setParamValue(self.textFieldTarget.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldDefinition.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldDefinition.getData(); + if (param != null) { + this.textFieldDefinition.setValue(param.getParamValue()); + } + this.textFieldDefinition.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldDefinition.setData(param); + } + param.setParamValue(self.textFieldDefinition.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldDefinition.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData(); + if (param == null) { + param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldDefinition.setData(param); + } + param.setParamValue(self.textFieldDefinition.getValue()); + self.fireFormChangedEvent(); + } + }); + } + + public void validate() throws InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("validate"); + } + this.textFieldSource.validate(); + this.textFieldTarget.validate(); + this.textFieldDefinition.validate(); + } + + public void commit() throws SourceException, InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("commit"); + } + this.textFieldSource.commit(); + this.textFieldTarget.commit(); + this.textFieldDefinition.commit(); + } + + public void discard() throws SourceException { + if (logger.isDebugEnabled()) { + logger.debug("discard"); + } + this.textFieldSource.discard(); + this.textFieldTarget.discard(); + this.textFieldDefinition.discard(); + //?? + this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_SOURCE); + this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_TARGET); + this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_DEFINITION); + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldSource + textFieldSource = new TextField(); + textFieldSource.setCaption("CSV Source File"); + textFieldSource.setImmediate(false); + textFieldSource.setDescription("Path to CSV file"); + textFieldSource.setWidth("-1px"); + textFieldSource.setHeight("-1px"); + textFieldSource.setInvalidAllowed(false); + textFieldSource.setRequired(true); + textFieldSource.setInputPrompt("Eg. /opt/app/data.csv"); + mainLayout.addComponent(textFieldSource); + + // textFieldTarget + textFieldTarget = new TextField(); + textFieldTarget.setCaption("Table"); + textFieldTarget.setImmediate(false); + textFieldTarget.setDescription("Name of database table to be created."); + textFieldTarget.setWidth("-1px"); + textFieldTarget.setHeight("-1px"); + textFieldTarget.setInvalidAllowed(false); + textFieldTarget.setRequired(true); + mainLayout.addComponent(textFieldTarget); + + // textFieldDefinition + textFieldDefinition = new TextField(); + textFieldDefinition.setCaption("Table Definition"); + textFieldDefinition.setImmediate(false); + textFieldDefinition.setDescription("SQL Table Definition"); + textFieldDefinition.setWidth("-1px"); + textFieldDefinition.setHeight("-1px"); + textFieldDefinition.setInvalidAllowed(false); + textFieldDefinition.setRequired(true); + mainLayout.addComponent(textFieldDefinition); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java new file mode 100644 index 0000000..608b0ac --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java
@@ -0,0 +1,644 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Set; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.server.Page; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Notification.Type; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class LDAPPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier { + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Button buttonTest; + + @AutoGenerated + private TextField textFieldScope; + + @AutoGenerated + private TextField textFieldCredentials; + + @AutoGenerated + private TextField textFieldPrincipal; + + @AutoGenerated + private ComboBox comboBoxAuthentication; + + @AutoGenerated + private TextField textFieldProviderURL; + + @AutoGenerated + private TextField textFieldFactory; + + public static String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.ldap.LDAPEngine"; + + public static String LDAP_CONTEXT = Context.INITIAL_CONTEXT_FACTORY; + public static String LDAP_URL = Context.PROVIDER_URL; + public static String LDAP_AUTH = "authentication"; + public static String LDAP_PRINCIPAL = "principal"; + public static String LDAP_CREDENTIALS = "credentials"; + public static String LDAP_SCOPE = "scope"; + + public static String LDAP_DEFAULT_CONTEXT = "com.sun.jndi.ldap.LdapCtxFactory"; + + public static String LDAP_AUTH_ANONYMOUS = "anonymous"; + public static String LDAP_AUTH_SIMPLE = "simple"; + public static String LDAP_AUTH_SASL = "SASL"; //???? + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(LDAPPIPConfigurationComponent.class); + private final LDAPPIPConfigurationComponent self = this; + private final BasicNotifier notifier = new BasicNotifier(); + private final EntityItem<PIPConfiguration> entity; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param configParamField + */ + public LDAPPIPConfigurationComponent(EntityItem<PIPConfiguration> entity) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.entity = entity; + // + // Initialize + // + this.initialize(); + } + + protected void initialize() { + if (logger.isDebugEnabled()) { + logger.debug("initializing " + this.entity.getEntity().toString()); + } + // + // Iterate any existing values + // + Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>(); + for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) { + if (param.getParamName().equals(LDAP_CONTEXT)) { + this.textFieldFactory.setData(param); + } else if (param.getParamName().equals(LDAP_URL)) { + this.textFieldProviderURL.setData(param); + } else if (param.getParamName().equals(LDAP_AUTH)) { + this.comboBoxAuthentication.setData(param); + } else if (param.getParamName().equals(LDAP_PRINCIPAL)) { + this.textFieldPrincipal.setData(param); + } else if (param.getParamName().equals(LDAP_CREDENTIALS)) { + this.textFieldCredentials.setData(param); + } else if (param.getParamName().equals(LDAP_SCOPE)) { + this.textFieldScope.setData(param); + } else { + unneeded.add(param); + } + } + // + // Get rid of unneeded parameters + // + if (unneeded.isEmpty() == false) { + this.entity.getEntity().getPipconfigParams().removeAll(unneeded); + } + // + // Initialize GUI + // + this.initializeEntity(); + this.initializeCombo(); + this.initializeText(); + this.initializeButtons(); + } + + protected void initializeEntity() { + // + // Initialize the entity + // + this.entity.getEntity().setClassname(CLASSNAME); + this.entity.getEntity().setRequiresResolvers(true); + } + + protected void initializeCombo() { + // + // GUI properties + // + this.comboBoxAuthentication.setImmediate(true); + this.comboBoxAuthentication.setNullSelectionAllowed(false); + this.comboBoxAuthentication.setRequired(true); + this.comboBoxAuthentication.setRequiredError("You must select an authentication mechanism"); + // + // Initial set of items + // + this.comboBoxAuthentication.addItem(LDAP_AUTH_ANONYMOUS); + this.comboBoxAuthentication.addItem(LDAP_AUTH_SIMPLE); + this.comboBoxAuthentication.addItem(LDAP_AUTH_SASL); + // + // Ensure the authentication combo is selected to something. + // + PIPConfigParam param = (PIPConfigParam) this.comboBoxAuthentication.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_AUTH, LDAP_AUTH_ANONYMOUS); + this.entity.getEntity().addPipconfigParam(param); + this.comboBoxAuthentication.setData(param); + this.comboBoxAuthentication.select(param.getParamValue()); + } else { + // + // Is this custom? + // + this.comboBoxAuthentication.select(param.getParamValue()); + if (this.comboBoxAuthentication.getValue().equals(param.getParamValue()) == false) { + this.comboBoxAuthentication.addItem(param.getParamValue()); + this.comboBoxAuthentication.select(param.getParamValue()); + } + } + // + // Respond to events + // + this.comboBoxAuthentication.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.comboBoxAuthentication.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_AUTH, self.comboBoxAuthentication.getValue().toString()); + self.entity.getEntity().addPipconfigParam(param); + self.comboBoxAuthentication.setData(param); + } + param.setParamValue(self.comboBoxAuthentication.getValue().toString()); + self.fireFormChangedEvent(); + } + }); + } + + protected void initializeText() { + // + // + // + this.textFieldFactory.setImmediate(true); + this.textFieldFactory.setNullRepresentation(""); + // + // We can initialize this if there is no value + // + PIPConfigParam param = (PIPConfigParam) this.textFieldFactory.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_CONTEXT, LDAP_DEFAULT_CONTEXT); + this.entity.getEntity().addPipconfigParam(param); + this.textFieldFactory.setData(param); + } + this.textFieldFactory.setValue(param.getParamValue()); + this.textFieldFactory.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldFactory.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_CONTEXT); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldFactory.setData(param); + } + param.setParamValue(self.textFieldFactory.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldFactory.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldFactory.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_CONTEXT); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldFactory.setData(param); + } + param.setParamValue(self.textFieldFactory.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldProviderURL.setImmediate(true); + this.textFieldProviderURL.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldProviderURL.getData(); + if (param != null) { + this.textFieldProviderURL.setValue(param.getParamValue()); + } + this.textFieldProviderURL.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldProviderURL.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_URL); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldProviderURL.setData(param); + } + param.setParamValue(self.textFieldProviderURL.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldProviderURL.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldProviderURL.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_URL); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldProviderURL.setData(param); + } + param.setParamValue(self.textFieldProviderURL.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldPrincipal.setImmediate(true); + this.textFieldPrincipal.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldPrincipal.getData(); + if (param != null) { + this.textFieldPrincipal.setValue(param.getParamValue()); + } + this.textFieldPrincipal.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldPrincipal.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_PRINCIPAL); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldPrincipal.setData(param); + } + param.setParamValue(self.textFieldPrincipal.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldPrincipal.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldPrincipal.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_PRINCIPAL); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldPrincipal.setData(param); + } + param.setParamValue(self.textFieldPrincipal.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldCredentials.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldCredentials.getData(); + if (param != null) { + this.textFieldCredentials.setValue(param.getParamValue()); + } + this.textFieldCredentials.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldCredentials.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_CREDENTIALS); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldCredentials.setData(param); + } + param.setParamValue(self.textFieldCredentials.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldCredentials.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldCredentials.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_CREDENTIALS); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldCredentials.setData(param); + } + param.setParamValue(self.textFieldCredentials.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldScope.setNullRepresentation(""); + param = (PIPConfigParam) this.textFieldScope.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_SCOPE, "subtree"); + this.entity.getEntity().addPipconfigParam(param); + this.textFieldScope.setData(param); + } + this.textFieldScope.setValue(param.getParamValue()); + this.textFieldScope.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldScope.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_SCOPE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldScope.setData(param); + } + param.setParamValue(self.textFieldScope.getValue()); + self.fireFormChangedEvent(); + } + }); + this.textFieldScope.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldScope.getData(); + if (param == null) { + param = new PIPConfigParam(LDAP_SCOPE); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldScope.setData(param); + } + param.setParamValue(self.textFieldScope.getValue()); + self.fireFormChangedEvent(); + } + }); + } + + protected void initializeButtons() { + this.buttonTest.setImmediate(true); + this.buttonTest.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.testLDAPConnection(); + } + }); + } + + protected void testLDAPConnection() { + Hashtable<String, String> env = new Hashtable<String, String>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, this.textFieldFactory.getValue()); + env.put(Context.PROVIDER_URL, this.textFieldProviderURL.getValue()); + env.put(Context.SECURITY_PRINCIPAL, this.textFieldPrincipal.getValue()); + env.put(Context.SECURITY_CREDENTIALS, this.textFieldCredentials.getValue()); + + String auth = this.comboBoxAuthentication.getValue().toString(); + env.put(Context.SECURITY_AUTHENTICATION, auth); + // + // Do we need to do anything? + // + /* + if (auth.equals(LDAP_AUTH_ANONYMOUS)) { + + } else if (auth.equals(LDAP_AUTH_SIMPLE)) { + + } else if (auth.equals(LDAP_AUTH_SASL)) { + + } + */ + + DirContext ctx = null; + try { + ctx = new InitialDirContext(env); + new Notification("Success!", + "Connection Established!", + Type.HUMANIZED_MESSAGE, true) + .show(Page.getCurrent()); + } catch (NamingException e) { + logger.error(e); + new Notification("Connection Failed", + "<br/>" + e.getLocalizedMessage(), + Type.ERROR_MESSAGE, true) + .show(Page.getCurrent()); + } finally { + try { + if (ctx != null) { + ctx.close(); + } + } catch (NamingException idontcare) { //NOPMD + } + } + } + + public void validate() throws InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("validate"); + } + this.comboBoxAuthentication.validate(); + this.textFieldFactory.validate(); + this.textFieldProviderURL.validate(); + this.textFieldPrincipal.validate(); + this.textFieldCredentials.validate(); + this.textFieldScope.validate(); + } + + public void commit() throws SourceException, InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("commit"); + } + this.comboBoxAuthentication.commit(); + this.textFieldFactory.commit(); + this.textFieldProviderURL.commit(); + this.textFieldPrincipal.commit(); + this.textFieldCredentials.commit(); + this.textFieldScope.commit(); + } + + public void discard() throws SourceException { + if (logger.isDebugEnabled()) { + logger.debug("discard"); + } + + this.textFieldFactory.discard(); + this.textFieldProviderURL.discard(); + this.textFieldPrincipal.discard(); + this.textFieldCredentials.discard(); + this.textFieldScope.discard(); + /* + this.entity.getEntity().getPipconfigParams().remove(LDAP_CONTEXT); + this.entity.getEntity().getPipconfigParams().remove(LDAP_URL); + this.entity.getEntity().getPipconfigParams().remove(LDAP_AUTH); + this.entity.getEntity().getPipconfigParams().remove(LDAP_PRINCIPAL); + this.entity.getEntity().getPipconfigParams().remove(LDAP_CREDENTIALS); + this.entity.getEntity().getPipconfigParams().remove(LDAP_SCOPE); + */ + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldFactory + textFieldFactory = new TextField(); + textFieldFactory.setCaption("Initial Context Factory"); + textFieldFactory.setImmediate(false); + textFieldFactory.setWidth("-1px"); + textFieldFactory.setHeight("-1px"); + textFieldFactory.setInvalidAllowed(false); + textFieldFactory.setRequired(true); + textFieldFactory.setInputPrompt("com.sun.jndi.ldap.LdapCtxFactory"); + mainLayout.addComponent(textFieldFactory); + mainLayout.setExpandRatio(textFieldFactory, 1.0f); + + // textFieldProviderURL + textFieldProviderURL = new TextField(); + textFieldProviderURL.setCaption("Provider URL"); + textFieldProviderURL.setImmediate(false); + textFieldProviderURL.setWidth("-1px"); + textFieldProviderURL.setHeight("-1px"); + textFieldProviderURL.setInvalidAllowed(false); + textFieldProviderURL.setRequired(true); + textFieldProviderURL + .setInputPrompt("Eg. ldap://localhost:389/o=JNDITutorial"); + mainLayout.addComponent(textFieldProviderURL); + mainLayout.setExpandRatio(textFieldProviderURL, 1.0f); + + // comboBoxAuthentication + comboBoxAuthentication = new ComboBox(); + comboBoxAuthentication.setCaption("Authentication"); + comboBoxAuthentication.setImmediate(false); + comboBoxAuthentication.setWidth("-1px"); + comboBoxAuthentication.setHeight("-1px"); + comboBoxAuthentication.setRequired(true); + mainLayout.addComponent(comboBoxAuthentication); + mainLayout.setExpandRatio(comboBoxAuthentication, 1.0f); + + // textFieldPrincipal + textFieldPrincipal = new TextField(); + textFieldPrincipal.setCaption("Principal"); + textFieldPrincipal.setImmediate(false); + textFieldPrincipal.setWidth("-1px"); + textFieldPrincipal.setHeight("-1px"); + textFieldPrincipal.setNullSettingAllowed(true); + mainLayout.addComponent(textFieldPrincipal); + mainLayout.setExpandRatio(textFieldPrincipal, 1.0f); + + // textFieldCredentials + textFieldCredentials = new TextField(); + textFieldCredentials.setCaption("Credentials"); + textFieldCredentials.setImmediate(false); + textFieldCredentials.setWidth("-1px"); + textFieldCredentials.setHeight("-1px"); + textFieldCredentials.setNullSettingAllowed(true); + mainLayout.addComponent(textFieldCredentials); + mainLayout.setExpandRatio(textFieldCredentials, 1.0f); + + // textFieldScope + textFieldScope = new TextField(); + textFieldScope.setCaption("Scope"); + textFieldScope.setImmediate(false); + textFieldScope.setWidth("-1px"); + textFieldScope.setHeight("-1px"); + textFieldScope.setInvalidAllowed(false); + textFieldScope.setRequired(true); + textFieldScope.setInputPrompt("Eg. subtree"); + mainLayout.addComponent(textFieldScope); + + // buttonTest + buttonTest = new Button(); + buttonTest.setCaption("Test Connection"); + buttonTest.setImmediate(true); + buttonTest.setWidth("-1px"); + buttonTest.setHeight("-1px"); + mainLayout.addComponent(buttonTest); + mainLayout.setComponentAlignment(buttonTest, new Alignment(48)); + + return mainLayout; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java new file mode 100644 index 0000000..bcbeca8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java
@@ -0,0 +1,186 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.jpa.ObadviceExpression; +import org.apache.openaz.xacml.admin.view.windows.ExpressionEditorWindow; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; + +public class OaExpressionsEditorComponent extends CustomComponent { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonadd; + @AutoGenerated + private Table tableExpressions; + private static final long serialVersionUID = 1L; + private final OaExpressionsEditorComponent self = this; + private final JPAContainer<ObadviceExpression> container; + private final EntityItem<Obadvice> oa; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public OaExpressionsEditorComponent(EntityItem<Obadvice> oa, JPAContainer<ObadviceExpression> container) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.container = container; + this.oa = oa; + // + // Filter the container + // + this.container.removeAllContainerFilters(); + this.container.addContainerFilter(new Compare.Equal("obadvice", this.oa.getEntity())); + // + // Initialize components + // + this.initializeTable(); + this.initializeButtons(); + } + + private void initializeTable() { + this.tableExpressions.setContainerDataSource(this.container); + this.tableExpressions.setVisibleColumns(new Object[] {"type"}); + this.tableExpressions.setColumnHeaders(new String[] {"Expression Type"}); + this.tableExpressions.setPageLength(this.container.size() + 1); + } + + private void initializeButtons() { + this.buttonadd.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + ObadviceExpression expression = new ObadviceExpression(); + // TODO - EntityItem is not used - does container.createEntityItem even need to be called? + // final EntityItem<ObadviceExpression> entity = self.container.createEntityItem(expression); + self.container.createEntityItem(expression); // See TODO + + final ExpressionEditorWindow editor = new ExpressionEditorWindow(); + editor.setCaption("Edit Attribute"); + editor.setCloseShortcut(KeyCode.ESCAPE); + editor.setModal(true); + editor.center(); + UI.getCurrent().addWindow(editor); + } + + }); + this.buttonRemove.setEnabled(false); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.tableExpressions.removeItem(self.tableExpressions.getValue()); + } + + }); + + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // tableExpressions + tableExpressions = new Table(); + tableExpressions.setCaption("Expressions"); + tableExpressions.setImmediate(false); + tableExpressions + .setDescription("The list of expressions for the obligation/advice object."); + tableExpressions.setWidth("-1px"); + tableExpressions.setHeight("-1px"); + mainLayout.addComponent(tableExpressions); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // buttonadd + buttonadd = new Button(); + buttonadd.setCaption("Add"); + buttonadd.setImmediate(true); + buttonadd.setWidth("-1px"); + buttonadd.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonadd); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove"); + buttonRemove.setImmediate(true); + buttonRemove.setDescription("Remove selected expression(s)."); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonRemove); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java new file mode 100644 index 0000000..5a91ff2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java
@@ -0,0 +1,453 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.jpa.PIPResolverParam; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import org.apache.openaz.xacml.admin.view.windows.PIPParamEditorWindow; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.util.BeanItem; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class PIPParameterComponent extends CustomComponent implements FormChangedEventNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table tableParameters; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private Button buttonClear; + @AutoGenerated + private Button buttonClone; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonAdd; + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPParameterComponent.class); + private final PIPParameterComponent self = this; + private final Object config; + private final BasicNotifier notifier = new BasicNotifier(); + + private static final Action ADD_PARAM = new Action ("Add Parameter"); + private static final Action EDIT_PARAM = new Action ("Edit Parameter"); + private static final Action REMOVE_PARAM = new Action ("Remove Parameter"); + private static final Action CLONE_PARAM = new Action ("Clone Parameter"); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPParameterComponent(Object config) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.config = config; + // + // Initialize + // + this.initializeTable(); + this.initializeButtons(); + // + // Initial button setup + // + this.setupButtons(); + } + + protected void initializeTable() { + // + // Initialize GUI properties + // + this.tableParameters.setImmediate(true); + this.tableParameters.setSelectable(true); + // + // Add in the data + // + if (this.config instanceof PIPConfiguration) { + BeanItemContainer<PIPConfigParam> container = new BeanItemContainer<PIPConfigParam>(PIPConfigParam.class); + PIPConfiguration config = (PIPConfiguration) this.config; + for (PIPConfigParam param : config.getPipconfigParams()) { + container.addBean(param); + } + this.tableParameters.setContainerDataSource(container); + } else if (this.config instanceof PIPResolver) { + BeanItemContainer<PIPResolverParam> container = new BeanItemContainer<PIPResolverParam>(PIPResolverParam.class); + PIPResolver resolver = (PIPResolver) this.config; + for (PIPResolverParam param : resolver.getPipresolverParams()) { + container.addBean(param); + } + this.tableParameters.setContainerDataSource(container); + } else { + throw new IllegalArgumentException("Unsupported object"); + } + // + // Finish more gui initialization + // + this.tableParameters.setPageLength(5);//this.tableParameters.getContainerDataSource().size() + 1); + this.tableParameters.setVisibleColumns(new Object[] {"paramName", "paramValue"}); + this.tableParameters.setColumnHeaders(new String[] {"Name", "Value"}); + this.tableParameters.setSizeFull(); + // + // Action Handler + // + this.tableParameters.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {ADD_PARAM}; + } + return new Action[] {EDIT_PARAM, REMOVE_PARAM, CLONE_PARAM}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_PARAM) { + self.editParameter(null); + return; + } + if (action == EDIT_PARAM) { + self.editParameter(target); + return; + } + if (action == REMOVE_PARAM) { + self.removeParameter(target); + return; + } + if (action == CLONE_PARAM) { + self.cloneParameter(target); + return; + } + } + }); + // + // Respond to events + // + this.tableParameters.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupButtons(); + } + }); + // + // Double click + // + this.tableParameters.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + self.editParameter(event.getItemId()); + } + } + }); + } + + protected void initializeButtons() { + this.buttonAdd.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.editParameter(null); + } + }); + this.buttonClone.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.cloneParameter(self.tableParameters.getValue()); + } + }); + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.removeParameter(self.tableParameters.getValue()); + } + }); + this.buttonClear.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.clearParameters(); + } + }); + } + + protected void setupButtons() { + if (this.tableParameters.getValue() != null) { + this.buttonClone.setEnabled(true); + this.buttonRemove.setEnabled(true); + } else { + this.buttonClone.setEnabled(false); + this.buttonRemove.setEnabled(false); + } + } + + protected void editParameter(final Object source) { + // + // Make a copy + // + final Object target = source != null ? source : this.config instanceof PIPConfiguration ? new PIPConfigParam() : new PIPResolverParam(); + final PIPParamEditorWindow window = new PIPParamEditorWindow(target); + window.setModal(true); + window.setCaption((source == null ? "Create New Parameter" : "Edit Parameter")); + window.center(); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did user save? + // + if (window.isSaved() == false) { + return; + } + // + // Yes - was it a brand new object? + // + if (source == null) { + // + // yes add it to the parent object + // + if (self.config instanceof PIPConfiguration) { + ((PIPConfiguration) self.config).addPipconfigParam((PIPConfigParam) target); + } else { + ((PIPResolver) self.config).addPipresolverParam((PIPResolverParam) target); + } + // + // add it to the table + // + Item item = self.tableParameters.addItem(target); + if (item == null) { + logger.error("Failed to add parameter: " + target); + } else { + self.tableParameters.select(target); + } + } else { + // + // Copy the parameters over + // + if (source instanceof PIPConfigParam) { + ((PIPConfigParam) source).setParamName(((PIPConfigParam) target).getParamName()); + ((PIPConfigParam) source).setParamValue(((PIPConfigParam) target).getParamValue()); + } else { + ((PIPResolverParam) source).setParamName(((PIPResolverParam) target).getParamName()); + ((PIPResolverParam) source).setParamValue(((PIPResolverParam) target).getParamValue()); + } + // + // Update the table + // + self.tableParameters.refreshRowCache(); + } + } + }); + UI.getCurrent().addWindow(window); + } + + protected void cloneParameter(Object target) { + if (target == null) { + logger.error("null target sent to clone method"); + return; + } + Item item; + if (target instanceof PIPConfigParam && this.config instanceof PIPConfiguration) { + PIPConfigParam param = new PIPConfigParam((PIPConfigParam) target); + ((PIPConfiguration) this.config).addPipconfigParam(param); + item = this.tableParameters.addItem(new BeanItem<PIPConfigParam>(param)); + } else if (target instanceof PIPResolverParam && this.config instanceof PIPResolver) { + PIPResolverParam param = new PIPResolverParam((PIPResolverParam) target); + ((PIPResolver) this.config).addPipresolverParam(param); + item = this.tableParameters.addItem(new BeanItem<PIPResolverParam>(param)); + } else { + throw new IllegalArgumentException("Unsupported param and config combination."); + } + if (item == null) { + logger.error("Failed to add parameter to table: " + target); + } else { + this.tableParameters.select(target); + } + } + + protected void removeParameter(Object target) { + if (target == null) { + logger.error("null target sent to remove method"); + return; + } + if (this.config instanceof PIPConfiguration) { + if (((PIPConfiguration)this.config).removePipconfigParam((PIPConfigParam) target) == null) { + logger.error("Failed to remove parameter from pip configuration"); + return; + } + } else { + if (((PIPResolver) this.config).removePipresolverParam((PIPResolverParam) target) == null) { + logger.error("Failed to remove parameter from pip resolver"); + return; + } + } + if (this.tableParameters.removeItem(target) == false) { + logger.error("Failed to remove parameter from table"); + } + } + + protected void clearParameters() { + this.tableParameters.removeAllItems(); + if (this.config instanceof PIPConfiguration) { + ((PIPConfiguration) this.config).clearConfigParams(); + } else { + ((PIPResolver) this.config).clearParams(); + } + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + // tableParameters + tableParameters = new Table(); + tableParameters.setCaption("Configuration Parameters"); + tableParameters.setImmediate(false); + tableParameters.setWidth("-1px"); + tableParameters.setHeight("-1px"); + mainLayout.addComponent(tableParameters); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // buttonAdd + buttonAdd = new Button(); + buttonAdd.setCaption("Add"); + buttonAdd.setImmediate(false); + buttonAdd.setWidth("-1px"); + buttonAdd.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonAdd); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove"); + buttonRemove.setImmediate(false); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonRemove); + + // buttonClone + buttonClone = new Button(); + buttonClone.setCaption("Clone"); + buttonClone.setImmediate(false); + buttonClone.setWidth("-1px"); + buttonClone.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonClone); + + // buttonClear + buttonClear = new Button(); + buttonClear.setCaption("Clear All"); + buttonClear.setImmediate(false); + buttonClear.setWidth("-1px"); + buttonClear.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonClear); + + return horizontalLayout_1; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java new file mode 100644 index 0000000..7529e70 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java
@@ -0,0 +1,275 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Properties; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.view.windows.PIPResolverEditorWindow; +import org.apache.openaz.xacml.std.pip.engines.csv.ConfigurableCSVResolver; +import org.apache.openaz.xacml.std.pip.engines.jdbc.ConfigurableJDBCResolver; +import org.apache.openaz.xacml.std.pip.engines.ldap.ConfigurableLDAPResolver; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class PIPResolverComponent extends CustomComponent { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Table tableResolvers; + + private final Action ADD_RESOLVER = new Action("Add Resolver"); + private final Action EDIT_RESOLVER = new Action("Edit Resolver"); + private final Action CLONE_RESOLVER = new Action("Clone Resolver"); + private final Action REMOVE_RESOLVER = new Action("Remove Resolver"); + + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPResolverComponent.class); + + private final PIPResolverComponent self = this; + private final PIPConfiguration config; + + private final JPAContainer<PIPResolver> resolverContainer = new JPAContainer<PIPResolver>(PIPResolver.class); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPResolverComponent(PIPConfiguration configuration) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.config = configuration; + this.resolverContainer.setEntityProvider(new CachingMutableLocalEntityProvider<PIPResolver>(PIPResolver.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + this.resolverContainer.addContainerFilter(new Compare.Equal("pipconfiguration", this.config)); + // + // Initialize GUI + // + this.initializeTable(); + } + + protected void initializeTable() { + // + // Setup the container datasource + // + this.tableResolvers.setContainerDataSource(this.resolverContainer); + // + // Set GUI properties + // + this.tableResolvers.setImmediate(true); + this.tableResolvers.setVisibleColumns(new Object[] {"name", "description", "issuer"}); + this.tableResolvers.setColumnHeaders(new String[] {"Name", "Description", "Issuer"}); + this.tableResolvers.setPageLength(this.config.getPipresolvers().size() + 1); + this.tableResolvers.setSizeFull(); + this.tableResolvers.setSelectable(true); + // + // Add the actions + // + this.tableResolvers.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {ADD_RESOLVER}; + } + return new Action[] {EDIT_RESOLVER, CLONE_RESOLVER, REMOVE_RESOLVER}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_RESOLVER) { + PIPResolverComponent.addResolver(self.config, null); + return; + } + if (action == EDIT_RESOLVER) { + PIPResolverComponent.editResolver(self.resolverContainer.getItem(target)); + return; + } + if (action == CLONE_RESOLVER) { + PIPResolverComponent.addResolver(self.config, self.resolverContainer.getItem(target).getEntity()); + return; + } + if (action == REMOVE_RESOLVER) { + self.removeResolver(self.config, self.resolverContainer.getItem(target).getEntity()); + return; + } + } + }); + // + // Respond to events + // + this.tableResolvers.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + Object id = event.getItemId(); + if (id == null) { + return; + } + PIPResolverComponent.editResolver(self.resolverContainer.getItem(id)); + } + } + }); + } + + protected void removeResolver(PIPConfiguration config, PIPResolver resolver) { + config.removePipresolver(resolver); + this.tableResolvers.removeItem(resolver.getId()); + } + + public static void addResolver(PIPConfiguration config, PIPResolver pipResolver) { + // + // Create the entity + // + PIPResolver resolver = null; + if (pipResolver != null) { + resolver = new PIPResolver(pipResolver); + } else { + resolver = new PIPResolver(); + } + resolver.setCreatedBy(((XacmlAdminUI)UI.getCurrent()).getUserid()); + resolver.setModifiedBy(((XacmlAdminUI)UI.getCurrent()).getUserid()); + resolver.setPipconfiguration(config); + // + // Set its default class + // + if (config.getPiptype().isSQL()) { + resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName()); + } else if (config.getPiptype().isLDAP()) { + resolver.setClassname(ConfigurableLDAPResolver.class.getCanonicalName()); + } else if (config.getPiptype().isCSV()) { + resolver.setClassname(ConfigurableCSVResolver.class.getCanonicalName()); + } else if (config.getPiptype().isHyperCSV()) { + resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName()); + } + // + // Bring up the editor window + // + PIPResolverComponent.editResolver(((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().createEntityItem(resolver)); + + } + + public static void editResolver(final EntityItem<PIPResolver> entity) { + + final PIPResolverEditorWindow window = new PIPResolverEditorWindow(entity); + window.setModal(true); + window.center(); + if (entity.isPersistent()) { + window.setCaption("Edit Resolver"); + } else { + window.setCaption("Create Resolver"); + } + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click "save"? + // + if (window.isSaved() == false) { + return; + } + // + // Adding a new entity? + // + if (entity.isPersistent() == false) { + // + // Yes - let's official add it + // + ((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().addEntity(entity.getEntity()); + ((XacmlAdminUI)UI.getCurrent()).refreshPIPConfiguration(); + } + } + }); + UI.getCurrent().addWindow(window); + } + + public static void publishConfiguration(EntityItem<PIPConfiguration> config) { + Properties properties = config.getEntity().generateProperties(Integer.toString(config.getEntity().getId())); + + try { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + properties.store(os, ""); + if (logger.isDebugEnabled()) { + logger.debug(os.toString()); + } + } catch (IOException e) { //NOPMD + // TODO - Handle, Log or NOPMD + // TODO - Will vaadin display error? + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // tableResolvers + tableResolvers = new Table(); + tableResolvers.setCaption("Resolvers"); + tableResolvers.setImmediate(false); + tableResolvers.setWidth("-1px"); + tableResolvers.setHeight("-1px"); + mainLayout.addComponent(tableResolvers); + + return mainLayout; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java new file mode 100644 index 0000000..d07aa34 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java
@@ -0,0 +1,599 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.DoubleRangeValidator; +import com.vaadin.data.validator.IntegerRangeValidator; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class RangeEditorComponent extends CustomComponent { + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Panel panelTester; + @AutoGenerated + private VerticalLayout verticalLayout_2; + @AutoGenerated + private Button buttonValidate; + @AutoGenerated + private TextField textFieldTestInput; + @AutoGenerated + private HorizontalLayout horizontalLayout_2; + @AutoGenerated + private TextField textFieldMax; + @AutoGenerated + private ComboBox comboBoxMax; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private TextField textFieldMin; + @AutoGenerated + private ComboBox comboBoxMin; + private static final long serialVersionUID = -1L; + private static final Log logger = LogFactory.getLog(RangeEditorComponent.class); + private final RangeEditorComponent self = this; + private final Attribute attribute; + private Identifier datatype; + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + public RangeEditorComponent(Attribute attribute, Identifier datatype) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save our attribute + // + this.attribute = attribute; + this.datatype = datatype; + // + // Finish initialization + // + this.initializeCombos(); + this.initializeTextFields(); + this.initializeTest(); + this.setupDatatype(this.datatype); + } + + private void initializeCombos() { + // + // Add the 2 possible values into each combo box + // + this.comboBoxMin.setNullSelectionAllowed(true); + this.comboBoxMin.addItem("minInclusive"); + this.comboBoxMin.addItem("minExclusive"); + this.comboBoxMax.addItem("maxInclusive"); + this.comboBoxMax.addItem("maxExclusive"); + // + // Find any current values + // + for (ConstraintValue value : this.attribute.getConstraintValues()) { + if (value.getProperty().equals("minInclusive") || + value.getProperty().equals("minExclusive")) { + // + // If it hasn't been set yet + // + if (this.comboBoxMin.getData() == null) { + // + // Select the appropriate combo value + // + this.comboBoxMin.select(value.getProperty()); + // + // Save the object + // + this.comboBoxMin.setData(value); + // + // Setup the text field + // + this.textFieldMin.setValue(value.getValue()); + } else { + // + // Extra value in there, this shouldn't happen. But this + // is here just in case + // + logger.warn("Extra min value found: " + value.getProperty() + " " + value.getValue()); + } + } else if (value.getProperty().equals("maxInclusive") || + value.getProperty().equals("maxExclusive")) { + // + // Check if it hasn't been set yet + // + if (this.comboBoxMax.getData() == null) { + // + // Select the appropriate combo value + // + this.comboBoxMax.select(value.getProperty()); + // + // Save the object + // + this.comboBoxMax.setData(value); + // + // Setup the text field + // + this.textFieldMax.setValue(value.getValue()); + } else { + // + // Extra value in there, this shouldn't happen. But this + // is here just in case + // + logger.warn("Extra max value found: " + value.getProperty() + " " + value.getValue()); + } + } else { + logger.warn("Non-range value found: " + value.getProperty() + " " + value.getValue()); + } + } + // + // Were there values? + // + if (this.comboBoxMin.getData() == null) { + // + // Put a new empty value in there + // + ConstraintValue value = new ConstraintValue("minInclusive", null); + // + // Associate it with the attribute + // + value.setAttribute(this.attribute); + // + // Make sure the attribute has it in its list + // + this.attribute.addConstraintValue(value); + // + // Save it in the combo + // + this.comboBoxMin.setData(value); + // + // Disable text field + // + this.textFieldMin.setEnabled(false); + } + if (this.comboBoxMax.getData() == null) { + // + // Put a new empty value in there + // + ConstraintValue value = new ConstraintValue("maxInclusive", null); + // + // Associate it with the attribute + // + value.setAttribute(this.attribute); + // + // Make sure the attribute has it in its list + // + this.attribute.addConstraintValue(value); + // + // Save it in the combo + // + this.comboBoxMax.setData(value); + // + // Disable text field + // + this.textFieldMax.setEnabled(false); + } + // + // Respond to combo changes + // + this.setupComboText(this.comboBoxMin, this.textFieldMin); + this.setupComboText(this.comboBoxMax, this.textFieldMax); + } + + private void setupComboText(final ComboBox box, final TextField text) { + // + // Respond to combo changes + // + box.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Get the new value + // + String property = (String) box.getValue(); + // + // Get our constraint object + // + ConstraintValue value = (ConstraintValue) box.getData(); + // + // Update our object + // + if (property == null) { + // + // Clear the text field and disable it + // + text.setEnabled(false); + text.setValue(null); + } else { + // + // Change the property name + // + value.setProperty(property); + // + // Focus to the text field and enable it + // + text.setEnabled(true); + text.focus(); + } + } + }); + + } + + private void initializeTextFields() { + this.textFieldMin.setNullRepresentation(""); + this.textFieldMin.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Get our min object + // + ConstraintValue value = (ConstraintValue) self.comboBoxMin.getData(); + // + // Save its new value + // + value.setValue(self.textFieldMin.getValue()); + } + }); + this.textFieldMax.setNullRepresentation(""); + this.textFieldMax.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Get our max object + // + ConstraintValue value = (ConstraintValue) self.comboBoxMax.getData(); + // + // Save its new value + // + value.setValue(self.textFieldMax.getValue()); + } + + }); + } + + private void initializeTest() { + this.textFieldTestInput.setNullRepresentation(""); + this.textFieldTestInput.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.textFieldTestInput.getValue() != null && self.textFieldTestInput.getValue().length() > 0) { + self.buttonValidate.setEnabled(true); + } else { + self.buttonValidate.setEnabled(false); + } + } + }); + + this.buttonValidate.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Create our validator and add it into the text + // + Validator validator = self.setupValidator(self.datatype); + if (validator == null) { + logger.warn("Could not create a validator"); + return; + } + self.textFieldTestInput.addValidator(validator); + // + // Initiate the validation + // + try { + self.textFieldTestInput.validate(); + // + // If we get here, then it validated! + // + AdminNotification.info("Success! Value is in range"); + } catch (InvalidValueException e) { + AdminNotification.warn("Failed, Value is NOT in range"); + } + // + // Remove the validator + // + self.textFieldTestInput.removeValidator(validator); + } + }); + } + + private Validator setupValidator(Identifier id) { + if (logger.isTraceEnabled()) { + logger.trace("setupValidator: " + id); + } + // + // Get our min/max objects + // + ConstraintValue min = (ConstraintValue) self.comboBoxMin.getData(); + ConstraintValue max = (ConstraintValue) self.comboBoxMax.getData(); + Object minObject = self.comboBoxMin.getConvertedValue(); + Object maxObject = self.comboBoxMax.getConvertedValue(); + logger.debug("Converted values: " + minObject + " " + maxObject); + // + // Get our min/max values + // + String minValue = self.textFieldMin.getValue(); + String maxValue = self.textFieldMax.getValue(); + // + // What is our datatype? + // + if (id.equals(XACML3.ID_DATATYPE_INTEGER)) { + Integer minimum = null; + Integer maximum = null; + boolean minInclusive = true; + boolean maxInclusive = true; + if (min.getProperty() != null) { + if (minValue != null && minValue.length() > 0) { + minimum = Integer.parseInt(minValue); + } + if (min.getProperty().equals("minInclusive")) { + minInclusive = true; + } else if (min.getProperty().equals("minExclusive")) { + minInclusive = false; + } + } + if (max.getProperty() != null) { + if (maxValue != null && maxValue.length() > 0) { + maximum = Integer.parseInt(maxValue); + } + if (max.getProperty().equals("maxInclusive")) { + maxInclusive = true; + } else if (max.getProperty().equals("maxExclusive")) { + maxInclusive = false; + } + } + IntegerRangeValidator validator = new IntegerRangeValidator("The value is NOT within the range", minimum, maximum); + validator.setMinValueIncluded(minInclusive); + validator.setMaxValueIncluded(maxInclusive); + return validator; + } + if (id.equals(XACML3.ID_DATATYPE_DOUBLE)) { + Double minimum = null; + Double maximum = null; + boolean minInclusive = true; + boolean maxInclusive = true; + if (min.getProperty() != null) { + if (minValue != null && minValue.length() > 0) { + minimum = Double.parseDouble(minValue); + } + if (min.getProperty().equals("minInclusive")) { + minInclusive = true; + } else if (min.getProperty().equals("minExclusive")) { + minInclusive = false; + } + } + if (max.getProperty() != null) { + if (maxValue != null && maxValue.length() > 0) { + maximum = Double.parseDouble(maxValue); + } + if (max.getProperty().equals("maxInclusive")) { + maxInclusive = true; + } else if (max.getProperty().equals("maxExclusive")) { + maxInclusive = false; + } + } + DoubleRangeValidator validator = new DoubleRangeValidator("The value is NOT within the range", minimum, maximum); + validator.setMinValueIncluded(minInclusive); + validator.setMaxValueIncluded(maxInclusive); + return validator; + } + + return null; + } + + public void setupDatatype(Identifier datatype) { + if (logger.isTraceEnabled()) { + logger.trace("setupDatatype: " + datatype); + } + this.datatype = datatype; + if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) { + this.textFieldMin.setConverter(Integer.class); + this.textFieldMax.setConverter(Integer.class); + this.textFieldTestInput.setConverter(Integer.class); + return; + } + if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) { + this.textFieldMin.setConverter(Double.class); + this.textFieldMax.setConverter(Double.class); + this.textFieldTestInput.setConverter(Double.class); + return; + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + mainLayout.setExpandRatio(horizontalLayout_1, 1.0f); + + // horizontalLayout_2 + horizontalLayout_2 = buildHorizontalLayout_2(); + mainLayout.addComponent(horizontalLayout_2); + mainLayout.setExpandRatio(horizontalLayout_2, 1.0f); + + // panelTester + panelTester = buildPanelTester(); + mainLayout.addComponent(panelTester); + mainLayout.setExpandRatio(panelTester, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // comboBoxMin + comboBoxMin = new ComboBox(); + comboBoxMin.setCaption("Minimum Type"); + comboBoxMin.setImmediate(true); + comboBoxMin.setDescription("Select the type for the minimum."); + comboBoxMin.setWidth("-1px"); + comboBoxMin.setHeight("-1px"); + horizontalLayout_1.addComponent(comboBoxMin); + + // textFieldMin + textFieldMin = new TextField(); + textFieldMin.setCaption("Minimum Value"); + textFieldMin.setImmediate(true); + textFieldMin.setDescription("Enter a value for the minimum."); + textFieldMin.setWidth("-1px"); + textFieldMin.setHeight("-1px"); + textFieldMin.setInvalidAllowed(false); + textFieldMin.setInputPrompt("eg. 1"); + horizontalLayout_1.addComponent(textFieldMin); + horizontalLayout_1 + .setComponentAlignment(textFieldMin, new Alignment(9)); + + return horizontalLayout_1; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_2() { + // common part: create layout + horizontalLayout_2 = new HorizontalLayout(); + horizontalLayout_2.setImmediate(false); + horizontalLayout_2.setWidth("-1px"); + horizontalLayout_2.setHeight("-1px"); + horizontalLayout_2.setMargin(false); + horizontalLayout_2.setSpacing(true); + + // comboBoxMax + comboBoxMax = new ComboBox(); + comboBoxMax.setCaption("Maximum Type"); + comboBoxMax.setImmediate(true); + comboBoxMax.setDescription("Select the type for the maximum."); + comboBoxMax.setWidth("-1px"); + comboBoxMax.setHeight("-1px"); + horizontalLayout_2.addComponent(comboBoxMax); + + // textFieldMax + textFieldMax = new TextField(); + textFieldMax.setCaption("Maximum Value"); + textFieldMax.setImmediate(true); + textFieldMax.setDescription("Enter a value for the maxmum."); + textFieldMax.setWidth("-1px"); + textFieldMax.setHeight("-1px"); + textFieldMax.setInvalidAllowed(false); + textFieldMax.setInputPrompt("eg. 100"); + horizontalLayout_2.addComponent(textFieldMax); + + return horizontalLayout_2; + } + + @AutoGenerated + private Panel buildPanelTester() { + // common part: create layout + panelTester = new Panel(); + panelTester.setCaption("Test Range Values"); + panelTester.setImmediate(true); + panelTester.setWidth("-1px"); + panelTester.setHeight("-1px"); + + // verticalLayout_2 + verticalLayout_2 = buildVerticalLayout_2(); + panelTester.setContent(verticalLayout_2); + + return panelTester; + } + + @AutoGenerated + private VerticalLayout buildVerticalLayout_2() { + // common part: create layout + verticalLayout_2 = new VerticalLayout(); + verticalLayout_2.setImmediate(false); + verticalLayout_2.setWidth("100.0%"); + verticalLayout_2.setHeight("100.0%"); + verticalLayout_2.setMargin(false); + verticalLayout_2.setSpacing(true); + + // textFieldTestInput + textFieldTestInput = new TextField(); + textFieldTestInput.setCaption("Value"); + textFieldTestInput.setImmediate(true); + textFieldTestInput.setDescription("Enter a value to test against."); + textFieldTestInput.setWidth("-1px"); + textFieldTestInput.setHeight("-1px"); + textFieldTestInput.setInputPrompt("eg. 50"); + verticalLayout_2.addComponent(textFieldTestInput); + + // buttonValidate + buttonValidate = new Button(); + buttonValidate.setCaption("Test"); + buttonValidate.setImmediate(true); + buttonValidate + .setDescription("Click to test if value is within the range."); + buttonValidate.setWidth("-1px"); + buttonValidate.setHeight("-1px"); + verticalLayout_2.addComponent(buttonValidate); + verticalLayout_2.setComponentAlignment(buttonValidate, + new Alignment(48)); + + return verticalLayout_2; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java new file mode 100644 index 0000000..968719a --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java
@@ -0,0 +1,246 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.ConstraintValue; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Panel; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class RegexpEditorComponent extends CustomComponent { + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Panel panelTester; + + @AutoGenerated + private VerticalLayout verticalLayout_2; + + @AutoGenerated + private Button buttonTest; + + @AutoGenerated + private TextField textFieldTestValue; + + @AutoGenerated + private TextField textFieldExpression; + + private static final long serialVersionUID = -1L; + private static final Log logger = LogFactory.getLog(RegexpEditorComponent.class); + private RegexpEditorComponent self = this; + private final Attribute attribute; + private ConstraintValue value = null; + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + public RegexpEditorComponent(Attribute attribute) { + buildMainLayout(); + setCompositionRoot(mainLayout); + + this.attribute = attribute; + + initializeTextField(); + initializeTestPanel(); + } + + private void initializeTextField() { + // + // Find our reg expression value if it exists + // + for (ConstraintValue value : this.attribute.getConstraintValues()) { + if (value.getProperty().equals(ConstraintType.REGEXP_TYPE)) { + if (this.value == null) { + this.textFieldExpression.setValue(value.getValue()); + this.value = value; + } else { + logger.warn("Multiple regexp constraint values: " + value); + value.setAttribute(null); + this.attribute.removeConstraintValue(value); + } + } else { + value.setAttribute(null); + this.attribute.removeConstraintValue(value); + } + } + // + // Was something found? + // + if (this.value == null) { + ConstraintValue newValue = new ConstraintValue(ConstraintType.REGEXP_TYPE, ""); + newValue.setAttribute(this.attribute); + this.attribute.addConstraintValue(newValue); + this.value = newValue; + } + // + // Save the values when they changes + // + this.textFieldExpression.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.value.setValue(self.textFieldExpression.getValue()); + } + }); + } + + private void initializeTestPanel() { + this.textFieldTestValue.setNullRepresentation(""); + + this.buttonTest.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + String testValue = self.textFieldTestValue.getValue(); + if (testValue == null || testValue.length() == 0) { + return; + } + String regExp = self.textFieldExpression.getValue(); + if (regExp == null || regExp.length() == 0) { + return; + } + // + // Create a validator + // + Validator validator = new RegexpValidator(regExp, true, "Regular Expression does NOT match."); + // + // Add it + // + self.textFieldTestValue.addValidator(validator); + // + // Validate + // + try { + self.textFieldTestValue.validate(); + AdminNotification.info("Success! Regular Expression Matches"); + } catch (InvalidValueException e) { + AdminNotification.warn("Failed, Regular Expression does NOT match"); + } + // + // Remove the validator + // + self.textFieldTestValue.removeValidator(validator); + } + }); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldExpression + textFieldExpression = new TextField(); + textFieldExpression.setCaption("Regular Expression"); + textFieldExpression.setImmediate(true); + textFieldExpression + .setDescription("Create a regular expression used to constrain attribute values."); + textFieldExpression.setWidth("-1px"); + textFieldExpression.setHeight("-1px"); + textFieldExpression.setInvalidAllowed(false); + textFieldExpression.setInputPrompt("eg. [a-zA-Z0-9]"); + mainLayout.addComponent(textFieldExpression); + mainLayout.setExpandRatio(textFieldExpression, 1.0f); + + // panelTester + panelTester = buildPanelTester(); + mainLayout.addComponent(panelTester); + mainLayout.setExpandRatio(panelTester, 1.0f); + + return mainLayout; + } + + @AutoGenerated + private Panel buildPanelTester() { + // common part: create layout + panelTester = new Panel(); + panelTester.setCaption("Test The Expression"); + panelTester.setImmediate(false); + panelTester.setWidth("-1px"); + panelTester.setHeight("-1px"); + + // verticalLayout_2 + verticalLayout_2 = buildVerticalLayout_2(); + panelTester.setContent(verticalLayout_2); + + return panelTester; + } + + @AutoGenerated + private VerticalLayout buildVerticalLayout_2() { + // common part: create layout + verticalLayout_2 = new VerticalLayout(); + verticalLayout_2.setImmediate(false); + verticalLayout_2.setWidth("100.0%"); + verticalLayout_2.setHeight("100.0%"); + verticalLayout_2.setMargin(false); + + // textFieldTestValue + textFieldTestValue = new TextField(); + textFieldTestValue.setCaption("Test Value"); + textFieldTestValue.setImmediate(true); + textFieldTestValue + .setDescription("Enter a value to match against the regular expression."); + textFieldTestValue.setWidth("-1px"); + textFieldTestValue.setHeight("-1px"); + textFieldTestValue.setInputPrompt("eg. example"); + verticalLayout_2.addComponent(textFieldTestValue); + + // buttonTest + buttonTest = new Button(); + buttonTest.setCaption("Test"); + buttonTest.setImmediate(true); + buttonTest.setWidth("-1px"); + buttonTest.setHeight("-1px"); + verticalLayout_2.addComponent(buttonTest); + verticalLayout_2.setComponentAlignment(buttonTest, new Alignment(48)); + + return verticalLayout_2; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java new file mode 100644 index 0000000..7b2b501 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java
@@ -0,0 +1,763 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.components; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.server.Page; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Notification.Type; +import com.vaadin.ui.PasswordField; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; + +public class SQLPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier { + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Button buttonTest; + + @AutoGenerated + private PasswordField textFieldPassword; + + @AutoGenerated + private TextField textFieldUser; + + @AutoGenerated + private TextField textFieldConnectionURL; + + @AutoGenerated + private ComboBox comboBoxSQLDriver; + + @AutoGenerated + private TextField textFieldDataSource; + + @AutoGenerated + private ComboBox comboBoxConnectionType; + + public static final String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.jdbc.JDBCEngine"; + + public static final String SQL_TYPE = "type"; + public static final String SQL_TYPE_JDBC = "jdbc"; + public static final String SQL_TYPE_JNDI = "jndi"; + public static final String SQL_DATASOURCE = "datasource"; + public static final String SQL_DRIVER = "jdbc.driver"; + public static final String SQL_URL = "jdbc.url"; + public static final String SQL_USER = "jdbc.conn.user"; + public static final String SQL_PASSWORD = "jdbc.conn.password"; + + // + // These are the drivers that we are initially supporting and testing. + // Other JDBC drivers may work fine, but we will wait until we test + // with those drivers before adding them to this list. + // + public static final String SQL_DRIVER_MYSQL = "com.mysql.jdbc.Driver"; + public static final String SQL_DRIVER_POSTGRESQL = "org.postgresql.Driver"; + public static final String SQL_DRIVER_H2 = "org.h2.Driver"; + public static final String SQL_DRIVER_HYPER = "org.hsqldb.jdbc.JDBCDriver"; + public static final String SQL_DRIVER_SQL_SERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + public static String[] SQL_DRIVERS = new String[] {SQL_DRIVER_MYSQL, SQL_DRIVER_POSTGRESQL, SQL_DRIVER_H2, SQL_DRIVER_HYPER, SQL_DRIVER_SQL_SERVER}; + + public static final String SQL_DRIVER_MYSQL_URL = "jdbc:mysql://localhost:3306/"; + public static final String SQL_DRIVER_POSTGRESQL_URL = "jdbc:postgresql://localhost:5432/"; + public static final String SQL_DRIVER_H2_URL = "jdbc:h2:file:/"; + public static final String SQL_DRIVER_HYPER_URL = "jdbc:hsqldb:file:/"; + public static final String SQL_DRIVER_SQL_SERVER_URL = "jdbc:sqlserver://localhost:1433/"; + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(SQLPIPConfigurationComponent.class); + + private final SQLPIPConfigurationComponent self = this; + private final BasicNotifier notifier = new BasicNotifier(); + private final EntityItem<PIPConfiguration> entity; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param configParamField + */ + public SQLPIPConfigurationComponent(EntityItem<PIPConfiguration> entity) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.entity = entity; + // + // Initialize + // + this.initialize(); + // + // Finish + // + this.reset(); + } + + protected void initialize() { + if (logger.isDebugEnabled()) { + logger.debug("initializing " + this.entity.getEntity().toString()); + } + // + // Iterate any existing values, save them in the data field for each + // GUI object. + // + Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>(); + for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) { + // + // Sanity check + // + if (param.getParamName() == null) { + logger.warn("Null parameter name found."); + unneeded.add(param); + continue; + } + if (param.getParamName().equals(SQL_TYPE)) { + this.comboBoxConnectionType.setData(param); + } else if (param.getParamName().equals(SQL_DATASOURCE)) { + this.textFieldDataSource.setData(param); + } else if (param.getParamName().equals(SQL_DRIVER)) { + this.comboBoxSQLDriver.setData(param); + } else if (param.getParamName().equals(SQL_URL)) { + this.textFieldConnectionURL.setData(param); + } else if (param.getParamName().equals(SQL_USER)) { + this.textFieldUser.setData(param); + } else if (param.getParamName().equals(SQL_PASSWORD)) { + this.textFieldPassword.setData(param); + } else { + unneeded.add(param); + } + } + // + // Get rid of parameters that are not needed + // + if (unneeded.isEmpty() == false) { + this.entity.getEntity().getPipconfigParams().removeAll(unneeded); + } + // + // Now finish initializing the GUI objects + // + this.initializeEntity(); + this.initializeTypeCombo(); + this.initializeSQLDriverCombo(); + this.initializeText(); + this.initializeButtons(); + } + + protected void initializeEntity() { + // + // Initialize the entity + // + this.entity.getEntity().setClassname(CLASSNAME); + this.entity.getEntity().setRequiresResolvers(true); + } + + protected void initializeTypeCombo() { + // + // Setup GUI properties + // + this.comboBoxConnectionType.setImmediate(true); + this.comboBoxConnectionType.setNullSelectionAllowed(false); + this.comboBoxConnectionType.setRequired(true); + this.comboBoxConnectionType.setRequiredError("You must select a connection type."); + // + // Add the possible items + // + this.comboBoxConnectionType.addItem(SQL_TYPE_JDBC); + this.comboBoxConnectionType.addItem(SQL_TYPE_JNDI); + // + // Respond to events + // + this.comboBoxConnectionType.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.comboBoxConnectionType.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_TYPE); + self.entity.getEntity().addPipconfigParam(param); + self.comboBoxConnectionType.setData(param); + } + param.setParamValue(self.comboBoxConnectionType.getValue().toString()); + self.reset(); + self.fireFormChangedEvent(); + } + }); + // + // Set its default selection. If there isn't one, then we default to JDBC. + // + PIPConfigParam param = (PIPConfigParam) this.comboBoxConnectionType.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_TYPE, SQL_TYPE_JDBC); + this.entity.getEntity().addPipconfigParam(param); + this.comboBoxConnectionType.setData(param); + } + this.comboBoxConnectionType.select(param.getParamValue()); + } + + protected void initializeSQLDriverCombo() { + // + // GUI properties + // + this.comboBoxSQLDriver.setImmediate(true); + this.comboBoxSQLDriver.setRequired(true); + this.comboBoxConnectionType.setRequiredError("You must select a JDBC Driver"); + this.comboBoxSQLDriver.setInputPrompt("Eg. com.mysql.jdbc.Driver"); + // + // Add some common driver values. These are the drivers we have tested with so far. + // + for (String driver : SQL_DRIVERS) { + this.comboBoxSQLDriver.addItem(driver); + } + // + // Setup the default selection + // + PIPConfigParam param = (PIPConfigParam) this.comboBoxSQLDriver.getData(); + if (param != null) { + this.comboBoxSQLDriver.setValue(param.getParamValue()); + // + // Check if its there (the value could be something other than what we + // have setup in our list of defaults.) + // + boolean bFound = false; + for (Object id : this.comboBoxSQLDriver.getItemIds()) { + Item item = this.comboBoxSQLDriver.getItem(id); + if (item.toString().equals(param.getParamValue())) { + bFound = true; + break; + } + } + if (! bFound) { + // + // It's not one of our defaults, no problem. Add it in. + // + this.comboBoxSQLDriver.addItem(param.getParamValue()); + this.comboBoxSQLDriver.setValue(param.getParamValue()); + } + } + // + // Allow new items + // + this.comboBoxSQLDriver.setNewItemsAllowed(true); + // + // Respond to selection changes + // + this.comboBoxSQLDriver.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.comboBoxSQLDriver.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_DRIVER, self.comboBoxSQLDriver.getValue().toString()); + self.entity.getEntity().addPipconfigParam(param); + self.comboBoxSQLDriver.setData(param); + } + // + // Was something unselected? + // + if (self.comboBoxSQLDriver.getValue() == null) { + param.setParamValue(null); + } else { + param.setParamValue(self.comboBoxSQLDriver.getValue().toString()); + // + // See if we should pre-populate the driver URL + // + self.setupDriverURL(self.comboBoxSQLDriver.getValue().toString()); + } + // + // Fire + // + self.fireFormChangedEvent(); + } + }); + } + + protected void initializeText() { + // + // GUI properties + // + this.textFieldDataSource.setImmediate(true); + this.textFieldDataSource.setNullRepresentation(""); + this.textFieldDataSource.setRequired(true); + this.textFieldDataSource.setRequiredError("The name of the JNDI Resource is needed."); + // + // Get its initial value + // + PIPConfigParam param = (PIPConfigParam) this.textFieldDataSource.getData(); + if (param != null) { + this.textFieldDataSource.setValue(param.getParamValue()); + } + // + // Respond to value changes + // + this.textFieldDataSource.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldDataSource.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_DATASOURCE, self.textFieldDataSource.getValue()); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldDataSource.setData(param); + } + param.setParamValue(self.textFieldDataSource.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // Setup GUI properties + // + this.textFieldConnectionURL.setImmediate(true); + this.textFieldConnectionURL.setNullRepresentation(""); + this.textFieldConnectionURL.setRequired(true); + this.textFieldConnectionURL.setRequiredError("A URL is needed to connect to the database."); + // + // Set its default value + // + param = (PIPConfigParam) this.textFieldConnectionURL.getData(); + if (param != null) { + this.textFieldConnectionURL.setValue(param.getParamValue()); + } + // + // Respond to value changes + // + this.textFieldConnectionURL.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldConnectionURL.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_URL); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldConnectionURL.setData(param); + } + param.setParamValue(self.textFieldConnectionURL.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // Set GUI properties + // + this.textFieldUser.setImmediate(true); + this.textFieldUser.setNullRepresentation(""); + this.textFieldUser.setRequired(true); + this.textFieldUser.setRequiredError("User name is required."); + // + // Setup its default value + // + param = (PIPConfigParam) self.textFieldUser.getData(); + if (param != null) { + this.textFieldUser.setValue(param.getParamValue()); + } + // + // Respond to value changes + // + this.textFieldUser.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldUser.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_USER); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldUser.setData(param); + } + param.setParamValue(self.textFieldUser.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // Initialize GUI properties + // + this.textFieldPassword.setImmediate(true); + this.textFieldPassword.setNullRepresentation(""); + // + // Set its default value + // + param = (PIPConfigParam) self.textFieldPassword.getData(); + if (param != null) { + this.textFieldPassword.setValue(param.getParamValue()); + } + // + // Respond to value change events + // + this.textFieldPassword.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPConfigParam param = (PIPConfigParam) self.textFieldPassword.getData(); + if (param == null) { + param = new PIPConfigParam(SQL_PASSWORD); + self.entity.getEntity().addPipconfigParam(param); + self.textFieldPassword.setData(param); + } + param.setParamValue(self.textFieldPassword.getValue()); + self.fireFormChangedEvent(); + } + }); + } + + protected void initializeButtons() { + this.buttonTest.setImmediate(true); + this.buttonTest.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object id = self.comboBoxConnectionType.getValue(); + if (id == null) { + logger.warn("No combo box selection"); + return; + } + if (id.toString().equals(SQL_TYPE_JDBC)) { + self.testJDBCConnection(); + } else if (id.toString().equals(SQL_TYPE_JNDI)) { + self.testJNDIConnection(); + } + } + }); + } + + protected void setupDriverURL(String value) { + if (value.equals(SQL_DRIVER_MYSQL)) { + this.textFieldConnectionURL.setValue(SQL_DRIVER_MYSQL_URL); + } else if (value.equals(SQL_DRIVER_POSTGRESQL)) { + this.textFieldConnectionURL.setValue(SQL_DRIVER_POSTGRESQL_URL); + } else if (value.equals(SQL_DRIVER_H2)) { + this.textFieldConnectionURL.setValue(SQL_DRIVER_H2_URL); + } else if (value.equals(SQL_DRIVER_HYPER)) { + this.textFieldConnectionURL.setValue(SQL_DRIVER_HYPER_URL); + } else if (value.equals(SQL_DRIVER_SQL_SERVER)) { + this.textFieldConnectionURL.setValue(SQL_DRIVER_SQL_SERVER_URL); + } + } + + protected void testJNDIConnection() { + try { + Context initialContext = new InitialContext(); + DataSource dataSource = (DataSource) initialContext.lookup(this.textFieldDataSource.getValue()); + try (Connection connection = dataSource.getConnection()) { + new Notification("Success!", + "Connection Established!", + Type.HUMANIZED_MESSAGE, true) + .show(Page.getCurrent()); + } + } catch (NamingException e) { + logger.error(e); + new Notification("JNDI Naming Exception", + "<br/>" + e.getLocalizedMessage() + "<br/>Is the context defined in this J2EE Container instance?", + Type.ERROR_MESSAGE, true) + .show(Page.getCurrent()); + } catch (SQLException e) { + logger.error(e); + new Notification("SQL Exception", + "<br/>" + e.getLocalizedMessage() + "<br/>Are the configuration parameters correct?", + Type.ERROR_MESSAGE, true) + .show(Page.getCurrent()); + } + } + + protected void testJDBCConnection() { + try { + if (this.comboBoxSQLDriver.getValue() != null) { + Class.forName(this.comboBoxSQLDriver.getValue().toString()); + } else { + throw new ClassNotFoundException("Please select a JDBC driver to load."); + } + } catch (ClassNotFoundException e) { + logger.error(e); + new Notification("Driver Exception", + "<br/>" + e.getLocalizedMessage() + "<br/>Is the JDBC driver's jar in the J2EE container path?", + Type.ERROR_MESSAGE, true) + .show(Page.getCurrent()); + return; + } + Connection connection = null; + try { + connection = DriverManager.getConnection(this.textFieldConnectionURL.getValue(), this.textFieldUser.getValue(), this.textFieldPassword.getValue()); + new Notification("Success!", + "Connection Established!", + Type.HUMANIZED_MESSAGE, true) + .show(Page.getCurrent()); + } catch (SQLException e) { + logger.error(e); + new Notification("SQL Exception", + "<br/>" + e.getLocalizedMessage() + "<br/>Are the configuration parameters correct?", + Type.ERROR_MESSAGE, true) + .show(Page.getCurrent()); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException idontcare) { //NOPMD + } + } + } + } + + protected void reset() { + Object id = this.comboBoxConnectionType.getValue(); + if (id == null) { + logger.warn("Can't reset combo hasn't selected anything."); + return; + } + if (id.toString().equals(SQL_TYPE_JDBC)) { + // + // + // + this.textFieldDataSource.setVisible(false); + this.textFieldDataSource.setRequired(false); + // + // + // + this.textFieldConnectionURL.setVisible(true); + this.textFieldConnectionURL.setRequired(true); + this.comboBoxSQLDriver.setVisible(true); + this.comboBoxSQLDriver.setRequired(true); + this.textFieldUser.setVisible(true); + this.textFieldUser.setRequired(true); + this.textFieldPassword.setVisible(true); + } else if (id.toString().equals(SQL_TYPE_JNDI)) { + // + // + // + this.textFieldDataSource.setVisible(true); + this.textFieldDataSource.setRequired(true); + // + // + // + this.textFieldConnectionURL.setVisible(false); + this.textFieldConnectionURL.setRequired(false); + this.comboBoxSQLDriver.setVisible(false); + this.comboBoxSQLDriver.setRequired(false); + this.textFieldUser.setVisible(false); + this.textFieldUser.setRequired(false); + this.textFieldPassword.setVisible(false); + } else { + logger.warn("Unknown SQL type selection: " + id); + } + } + + public void validate() throws InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("validate"); + } + this.comboBoxConnectionType.validate(); + this.textFieldDataSource.validate(); + this.textFieldConnectionURL.validate(); + this.comboBoxSQLDriver.validate(); + this.textFieldPassword.validate(); + this.textFieldUser.validate(); + } + + public void commit() throws SourceException, InvalidValueException { + if (logger.isDebugEnabled()) { + logger.debug("commit"); + } + this.comboBoxConnectionType.commit(); + + Object id = this.comboBoxConnectionType.getValue(); + if (id == null) { + logger.warn("Can't reset combo hasn't selected anything."); + return; + } + if (id.toString().equals(SQL_TYPE_JDBC)) { + this.textFieldConnectionURL.commit(); + this.comboBoxSQLDriver.commit(); + this.textFieldPassword.commit(); + this.textFieldUser.commit(); + + this.textFieldDataSource.setData(null); + this.entity.getEntity().getPipconfigParams().remove(SQL_DATASOURCE); + + } else if (id.toString().equals(SQL_TYPE_JNDI)) { + + this.textFieldDataSource.commit(); + + this.textFieldConnectionURL.setData(null); + this.comboBoxSQLDriver.setData(null); + this.textFieldPassword.setData(null); + this.textFieldUser.setData(null); + /* ??? + this.entity.getEntity().getPipconfigParams().remove(SQL_TYPE); + this.entity.getEntity().getPipconfigParams().remove(SQL_DRIVER); + this.entity.getEntity().getPipconfigParams().remove(SQL_URL); + this.entity.getEntity().getPipconfigParams().remove(SQL_USER); + this.entity.getEntity().getPipconfigParams().remove(SQL_PASSWORD); + */ + } + } + + public void discard() throws SourceException { + if (logger.isDebugEnabled()) { + logger.debug("discard"); + } + this.textFieldDataSource.setData(null); + this.textFieldConnectionURL.setData(null); + this.comboBoxSQLDriver.setData(null); + this.textFieldPassword.setData(null); + this.textFieldUser.setData(null); + + this.entity.getEntity().getPipconfigParams().remove(SQL_TYPE); + this.entity.getEntity().getPipconfigParams().remove(SQL_DATASOURCE); + this.entity.getEntity().getPipconfigParams().remove(SQL_DRIVER); + this.entity.getEntity().getPipconfigParams().remove(SQL_URL); + this.entity.getEntity().getPipconfigParams().remove(SQL_USER); + this.entity.getEntity().getPipconfigParams().remove(SQL_PASSWORD); + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // comboBoxConnectionType + comboBoxConnectionType = new ComboBox(); + comboBoxConnectionType.setCaption("Type of SQL Connection"); + comboBoxConnectionType.setImmediate(false); + comboBoxConnectionType.setWidth("-1px"); + comboBoxConnectionType.setHeight("-1px"); + mainLayout.addComponent(comboBoxConnectionType); + + // textFieldDataSource + textFieldDataSource = new TextField(); + textFieldDataSource.setCaption("Data Source"); + textFieldDataSource.setImmediate(false); + textFieldDataSource.setWidth("-1px"); + textFieldDataSource.setHeight("-1px"); + mainLayout.addComponent(textFieldDataSource); + mainLayout.setExpandRatio(textFieldDataSource, 1.0f); + + // comboBoxSQLDriver + comboBoxSQLDriver = new ComboBox(); + comboBoxSQLDriver.setCaption("JDBC Driver"); + comboBoxSQLDriver.setImmediate(false); + comboBoxSQLDriver.setWidth("-1px"); + comboBoxSQLDriver.setHeight("-1px"); + mainLayout.addComponent(comboBoxSQLDriver); + mainLayout.setExpandRatio(comboBoxSQLDriver, 1.0f); + + // textFieldConnectionURL + textFieldConnectionURL = new TextField(); + textFieldConnectionURL.setCaption("Connection URL"); + textFieldConnectionURL.setImmediate(false); + textFieldConnectionURL.setWidth("-1px"); + textFieldConnectionURL.setHeight("-1px"); + mainLayout.addComponent(textFieldConnectionURL); + mainLayout.setExpandRatio(textFieldConnectionURL, 1.0f); + + // textFieldUser + textFieldUser = new TextField(); + textFieldUser.setCaption("User"); + textFieldUser.setImmediate(false); + textFieldUser.setWidth("-1px"); + textFieldUser.setHeight("-1px"); + mainLayout.addComponent(textFieldUser); + mainLayout.setExpandRatio(textFieldUser, 1.0f); + + // textFieldPassword + textFieldPassword = new PasswordField(); + textFieldPassword.setCaption("Password"); + textFieldPassword.setImmediate(false); + textFieldPassword.setWidth("-1px"); + textFieldPassword.setHeight("-1px"); + mainLayout.addComponent(textFieldPassword); + mainLayout.setExpandRatio(textFieldPassword, 1.0f); + + // buttonTest + buttonTest = new Button(); + buttonTest.setCaption("Test Connection"); + buttonTest.setImmediate(true); + buttonTest.setWidth("-1px"); + buttonTest.setHeight("-1px"); + mainLayout.addComponent(buttonTest); + mainLayout.setComponentAlignment(buttonTest, new Alignment(48)); + + return mainLayout; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java new file mode 100644 index 0000000..da86e03 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java
@@ -0,0 +1,31 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; + +public interface ApplyParametersChangedListener { + + void applyParameterChanged(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container); + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java new file mode 100644 index 0000000..2491e18 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java
@@ -0,0 +1,69 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; + +public interface ApplyParametersChangedNotifier { + + boolean addListener(ApplyParametersChangedListener listener); + + boolean removeListener(ApplyParametersChangedListener listener); + + void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container); + + class BasicNotifier implements ApplyParametersChangedNotifier { + Collection<ApplyParametersChangedListener> listeners = null; + + @Override + public boolean addListener(ApplyParametersChangedListener listener) { + if (this.listeners == null) { + this.listeners = new ArrayList<ApplyParametersChangedListener>(); + } + return this.listeners.add(listener); + } + + @Override + public boolean removeListener(ApplyParametersChangedListener listener) { + if (this.listeners == null) { + return false; + } + return this.listeners.remove(listener); + } + + @Override + public void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) { + if (this.listeners == null) { + return; + } + for (ApplyParametersChangedListener listener : this.listeners) { + listener.applyParameterChanged(apply, parent, argument, container); + } + } + + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java new file mode 100644 index 0000000..10fb9a2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java
@@ -0,0 +1,27 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +import org.apache.openaz.xacml.admin.jpa.Attribute; + +public interface AttributeChangedEventListener { + void attributeChanged(Attribute attribute); +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java new file mode 100644 index 0000000..da7606f --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java
@@ -0,0 +1,78 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.openaz.xacml.admin.jpa.Attribute; + +public interface AttributeChangedEventNotifier { + + boolean addListener(AttributeChangedEventListener listener); + + boolean removeListener(AttributeChangedEventListener listener); + + void fireAttributeChanged(Attribute attribute); + + void commit(); + + Attribute getAttribute(); + + class BasicNotifier implements AttributeChangedEventNotifier { + Collection<AttributeChangedEventListener> listeners = null; + + @Override + public boolean addListener(AttributeChangedEventListener listener) { + if (this.listeners == null) { + this.listeners = new ArrayList<AttributeChangedEventListener>(); + } + return this.listeners.add(listener); + } + + @Override + public boolean removeListener(AttributeChangedEventListener listener) { + if (this.listeners == null) { + return false; + } + return this.listeners.remove(listener); + } + + @Override + public void fireAttributeChanged(Attribute attribute) { + if (this.listeners == null) { + return; + } + for (AttributeChangedEventListener listener : this.listeners) { + listener.attributeChanged(attribute); + } + } + + public void commit() { + + } + + public Attribute getAttribute() { + return null; + } + + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java new file mode 100644 index 0000000..4637ee7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java
@@ -0,0 +1,25 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +public interface FormChangedEventListener { + void onFormChanged(); +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java new file mode 100644 index 0000000..1b8ba9d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java
@@ -0,0 +1,61 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.events; + +import java.util.ArrayList; +import java.util.Collection; + +public interface FormChangedEventNotifier { + boolean addListener(FormChangedEventListener listener); + boolean removeListener(FormChangedEventListener listener); + void fireFormChangedEvent(); + + class BasicNotifier implements FormChangedEventNotifier { + Collection<FormChangedEventListener> listeners = null; + + @Override + public boolean addListener(FormChangedEventListener listener) { + if (this.listeners == null) { + this.listeners = new ArrayList<FormChangedEventListener>(); + } + return this.listeners.add(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + if (this.listeners == null) { + this.listeners = new ArrayList<FormChangedEventListener>(); + } + return this.listeners.remove(listener); + } + + @Override + public void fireFormChangedEvent() { + if (this.listeners == null) { + return; + } + for (FormChangedEventListener listener : this.listeners) { + listener.onFormChanged(); + } + } + + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java new file mode 100644 index 0000000..c91a192 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java
@@ -0,0 +1,158 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import java.util.Collection; + +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPType; +import org.apache.openaz.xacml.admin.view.components.CSVPIPConfigurationComponent; +import org.apache.openaz.xacml.admin.view.components.CustomPIPConfigurationComponent; +import org.apache.openaz.xacml.admin.view.components.HyperCSVPIPConfigurationComponent; +import org.apache.openaz.xacml.admin.view.components.LDAPPIPConfigurationComponent; +import org.apache.openaz.xacml.admin.view.components.SQLPIPConfigurationComponent; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; +import com.vaadin.ui.VerticalLayout; + +public class ConfigParamField extends CustomField<Object> implements FormChangedEventListener { + private static final long serialVersionUID = 1L; + private final EntityItem<PIPConfiguration> entityConfig; + private VerticalLayout mainLayout = new VerticalLayout(); + + public ConfigParamField(EntityItem<PIPConfiguration> config) { + // + // Save + // + this.entityConfig = config; + // + // Make sure we can auto-fit + // + this.setWidth("-1px"); + this.mainLayout.setWidth("-1px"); + } + + public Component resetContent(PIPType pipType) { + // + // Remove all the layout + // + this.mainLayout.removeAllComponents(); + this.mainLayout.setDescription("Custom Field Layout"); + // + // Is there a type? + // + if (pipType == null) { + return this.mainLayout; + } + // + // Setup the layout based on the type + // + Component c = null; + String type = pipType.getType(); + if (type.equals(PIPType.TYPE_SQL)) { + SQLPIPConfigurationComponent comp = new SQLPIPConfigurationComponent(this.entityConfig); + comp.addListener(this); + c = comp; + } else if (type.equals(PIPType.TYPE_LDAP)) { + LDAPPIPConfigurationComponent comp = new LDAPPIPConfigurationComponent(this.entityConfig); + comp.addListener(this); + c = comp; + } else if (type.equals(PIPType.TYPE_CSV)) { + CSVPIPConfigurationComponent comp = new CSVPIPConfigurationComponent(this.entityConfig); + comp.addListener(this); + c = comp; + } else if (type.equals(PIPType.TYPE_HYPERCSV)) { + HyperCSVPIPConfigurationComponent comp = new HyperCSVPIPConfigurationComponent(this.entityConfig); + comp.addListener(this); + c = comp; + } else if (type.equals(PIPType.TYPE_CUSTOM)) { + CustomPIPConfigurationComponent comp = new CustomPIPConfigurationComponent(this.entityConfig); + comp.addListener(this); + c = comp; + } + if (c != null) { + this.mainLayout.addComponent(c); + } + // + // Done + // + return this.mainLayout; + } + + @Override + protected Component initContent() { + return this.resetContent(this.entityConfig.getEntity().getPiptype()); + } + + @Override + public void validate() throws InvalidValueException { + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component c = this.mainLayout.getComponent(0); + if (c instanceof SQLPIPConfigurationComponent) { + ((SQLPIPConfigurationComponent)c).validate(); + } else if (c instanceof LDAPPIPConfigurationComponent) { + ((LDAPPIPConfigurationComponent)c).validate(); + } else if (c instanceof CSVPIPConfigurationComponent) { + ((CSVPIPConfigurationComponent)c).validate(); + } else if (c instanceof HyperCSVPIPConfigurationComponent) { + ((HyperCSVPIPConfigurationComponent)c).validate(); + } else if (c instanceof CustomPIPConfigurationComponent) { + ((CustomPIPConfigurationComponent)c).validate(); + } + super.validate(); + } + + @Override + public void commit() throws SourceException, InvalidValueException { + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component c = this.mainLayout.getComponent(0); + if (c instanceof SQLPIPConfigurationComponent) { + ((SQLPIPConfigurationComponent)c).commit(); + } else if (c instanceof LDAPPIPConfigurationComponent) { + ((LDAPPIPConfigurationComponent)c).commit(); + } else if (c instanceof CSVPIPConfigurationComponent) { + ((CSVPIPConfigurationComponent)c).commit(); + } else if (c instanceof HyperCSVPIPConfigurationComponent) { + ((HyperCSVPIPConfigurationComponent)c).commit(); + } else if (c instanceof CustomPIPConfigurationComponent) { + ((CustomPIPConfigurationComponent)c).commit(); + } + super.commit(); + } + + @Override + public Class<?> getType() { + return Collection.class; + } + + @Override + public void onFormChanged() { + this.fireEvent(new com.vaadin.ui.Field.ValueChangeEvent(this)); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java new file mode 100644 index 0000000..2004510 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java
@@ -0,0 +1,111 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import java.util.Collection; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.view.components.EnumerationEditorComponent; +import org.apache.openaz.xacml.admin.view.components.RangeEditorComponent; +import org.apache.openaz.xacml.admin.view.components.RegexpEditorComponent; +import org.apache.openaz.xacml.api.Identifier; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; +import com.vaadin.ui.VerticalLayout; + +public class ConstraintField extends CustomField<Object> { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(ConstraintField.class); + + private VerticalLayout mainLayout = new VerticalLayout(); + private EntityItem<Attribute> attributeEntity; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ConstraintField(EntityItem<Attribute> entityItem) { + // + // Save our Attribute that we are editing + // + this.attributeEntity = entityItem; + } + + public void resetDatatype(Identifier id) { + if (logger.isDebugEnabled()) { + logger.debug("resetDatatype " + id); + } + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component component = this.mainLayout.getComponent(0); + if (component != null && component instanceof RangeEditorComponent) { + ((RangeEditorComponent) component).setupDatatype(id); + } + if (component != null && component instanceof EnumerationEditorComponent) { + ((EnumerationEditorComponent) component).setupDatatype(id); + } + } + + public Component resetContent(ConstraintType type, Identifier datatype) { + // + // Remove all existing components + // + this.mainLayout.removeAllComponents(); + // + // What are we constrained to? + // + if (type == null || type.getConstraintType() == null) { + // + // No constraint defined + // + this.attributeEntity.getEntity().removeAllConstraintValues(); + return mainLayout; + } + if (type.getConstraintType().equals("Enumeration")) { + mainLayout.addComponent(new EnumerationEditorComponent(this.attributeEntity.getEntity(), datatype)); + } else if (type.getConstraintType().equals("Range")) { + mainLayout.addComponent(new RangeEditorComponent(this.attributeEntity.getEntity(), datatype)); + } else if (type.getConstraintType().equals("Regular Expression")) { + mainLayout.addComponent(new RegexpEditorComponent(this.attributeEntity.getEntity())); + } + return mainLayout; + } + + @Override + protected Component initContent() { + return this.resetContent(this.attributeEntity.getEntity().getConstraintType(), this.attributeEntity.getEntity().getDatatypeBean().getIdentifer()); + } + + @Override + public Class<?> getType() { + return Collection.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java new file mode 100644 index 0000000..62c7ffa --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java
@@ -0,0 +1,74 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; +import com.vaadin.ui.OptionGroup; + +public class DesignatorSelectorField extends CustomField<Object> { + private static final long serialVersionUID = 1L; + private final DesignatorSelectorField self = this; + private final OptionGroup selectDesignator = new OptionGroup("Type of attribute"); + + public DesignatorSelectorField(EntityItem<Attribute> attributeEntity) { + this.selectDesignator.setImmediate(true); + this.selectDesignator.addItem(Attribute.ATTRIBUTE_DESIGNATOR); + this.selectDesignator.addItem(Attribute.ATTRIBUTE_SELECTOR); + if (attributeEntity.getEntity().isDesignator()) { + this.selectDesignator.select(Attribute.ATTRIBUTE_DESIGNATOR); + } else { + this.selectDesignator.select(Attribute.ATTRIBUTE_SELECTOR); + } + // + // Listen when designator vs selector changes + // + this.selectDesignator.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange( + com.vaadin.data.Property.ValueChangeEvent event) { + Object value = self.selectDesignator.getValue(); + if (value != null) { + if (value.toString().equals(Attribute.ATTRIBUTE_DESIGNATOR)) { + self.setValue('1'); + } else if (value.toString().equals(Attribute.ATTRIBUTE_SELECTOR)) { + self.setValue('0'); + } + } + } + }); + } + + @Override + protected Component initContent() { + return this.selectDesignator; + } + + @Override + public Class<? extends Object> getType() { + return Character.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java new file mode 100644 index 0000000..d1f250b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java
@@ -0,0 +1,47 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import java.util.Collection; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; + + +public class ExpressionField extends CustomField<Object> { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(ExpressionField.class); //NOPMD + + @Override + protected Component initContent() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Class<? extends Object> getType() { + return Collection.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java new file mode 100644 index 0000000..f5ca9fd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java
@@ -0,0 +1,51 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import java.util.Collection; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.view.components.OaExpressionsEditorComponent; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; +import com.vaadin.ui.UI; + +public class OaExpressionsField extends CustomField<Object> { + private static final long serialVersionUID = 1L; + private final EntityItem<Obadvice> obad; + + public OaExpressionsField(EntityItem<Obadvice> obad) { + this.obad = obad; + } + + @Override + protected Component initContent() { + return new OaExpressionsEditorComponent(this.obad, ((XacmlAdminUI)UI.getCurrent()).getObadviceExpressions()); + } + + @Override + public Class<? extends Object> getType() { + return Collection.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java new file mode 100644 index 0000000..9986dc7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java
@@ -0,0 +1,123 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.fields; + +import java.util.Collection; + +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.view.components.PIPParameterComponent; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.windows.PIPSQLResolverEditorWindow; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomField; +import com.vaadin.ui.VerticalLayout; + +public class ResolverParamField extends CustomField<Object> implements FormChangedEventListener { + private static final long serialVersionUID = 1L; + private final EntityItem<PIPResolver> entity; + private VerticalLayout mainLayout = new VerticalLayout(); + + public ResolverParamField(EntityItem<PIPResolver> entity) { + this.entity = entity; + // + // Make sure we can auto-fit + // + this.setWidth("-1px"); + this.mainLayout.setWidth("-1px"); + } + + @Override + public void onFormChanged() { + this.fireEvent(new com.vaadin.ui.Field.ValueChangeEvent(this)); + } + + @Override + protected Component initContent() { + Component c = null; + if (this.entity.getEntity().getPipconfiguration().getPiptype().isSQL() || + this.entity.getEntity().getPipconfiguration().getPiptype().isHyperCSV() || + this.entity.getEntity().getPipconfiguration().getPiptype().isLDAP() || + this.entity.getEntity().getPipconfiguration().getPiptype().isCSV() ) { + // + // + // + PIPSQLResolverEditorWindow comp = new PIPSQLResolverEditorWindow(this.entity); + comp.addListener(this); + c = comp; + } else { + // + // + // + PIPParameterComponent comp = new PIPParameterComponent(this.entity.getEntity()); + comp.addListener(this); + c = comp; + } + if (c != null) { + this.mainLayout.addComponent(c); + } + return this.mainLayout; + } + + + @Override + public void discard() throws SourceException { + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component c = this.mainLayout.getComponent(0); + if (c instanceof PIPSQLResolverEditorWindow) { + ((PIPSQLResolverEditorWindow)c).discard(); + } + super.discard(); + } + + @Override + public void validate() throws InvalidValueException { + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component c = this.mainLayout.getComponent(0); + if (c instanceof PIPSQLResolverEditorWindow) { + ((PIPSQLResolverEditorWindow)c).validate(); + } + super.validate(); + } + + @Override + public void commit() throws SourceException, InvalidValueException { + if (this.mainLayout.getComponentCount() == 0) { + return; + } + Component c = this.mainLayout.getComponent(0); + if (c instanceof PIPSQLResolverEditorWindow) { + ((PIPSQLResolverEditorWindow)c).commit(); + } + super.commit(); + } + + @Override + public Class<? extends Object> getType() { + return Collection.class; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java new file mode 100644 index 0000000..1101f23 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.net.URI; +import java.net.URISyntaxException; + +import com.vaadin.data.Validator; + +public class AnyURIValidator implements Validator { + private static final long serialVersionUID = 1L; + + public AnyURIValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + new URI((String) value); + } catch (URISyntaxException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized URI"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java new file mode 100644 index 0000000..362a5d9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java
@@ -0,0 +1,56 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +// import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base64; + +import com.vaadin.data.Validator; + +public class Base64BinaryValidator implements Validator { + private static final long serialVersionUID = 1L; + + public Base64BinaryValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + // try { + new Base64().decode((String) value); + // Base64().decode(String) inherited from + // org.apache.commons.codec.binary.BaseNCodec + // does not throw DecoderException in version 1.10 + // of org.apache.commons.codec (the version we are + // using). This may need to be uncommented in later + // versions. + // + // TODO - Since this does not throw an exception under + // any circumstance, I question whether it is + // a valid method of validating the input value. + // + // } catch (DecoderException e) { + // throw new InvalidValueException(e.getLocalizedMessage()); + // } + } else + throw new InvalidValueException("Unrecognized Base64 Binary"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java new file mode 100644 index 0000000..0e2c8c1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import com.vaadin.data.Validator; + +public class BooleanValidator implements Validator { + private static final long serialVersionUID = 1L; + + public BooleanValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof Boolean) { + return; + } + if (value.toString().equalsIgnoreCase("true") || + value.toString().equalsIgnoreCase("false") || + value.toString().equalsIgnoreCase("0") || + value.toString().equalsIgnoreCase("1")) { + return; + } + throw new InvalidValueException("Unrecognized boolean"); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java new file mode 100644 index 0000000..3d2c8d0 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.RFC2396DomainName; +import com.vaadin.data.Validator; + +public class DNSNameValidator implements Validator { + private static final long serialVersionUID = 1L; + + public DNSNameValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + RFC2396DomainName.newInstance((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized DNS Name"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java new file mode 100644 index 0000000..4bdea6e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.ISO8601DateTime; +import com.vaadin.data.Validator; + +public class DateTimeValidator implements Validator { + private static final long serialVersionUID = 1L; + + public DateTimeValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + ISO8601DateTime.fromISO8601DateTimeString((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized DateTime"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java new file mode 100644 index 0000000..0d217e4 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.ISO8601Date; +import com.vaadin.data.Validator; + +public class DateValidator implements Validator { + private static final long serialVersionUID = 1L; + + public DateValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + ISO8601Date.fromISO8601DateString((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized Date"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java new file mode 100644 index 0000000..f8aaa6b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.XPathDayTimeDuration; +import com.vaadin.data.Validator; + +public class DayTimeDurationValidator implements Validator { + private static final long serialVersionUID = 1L; + + public DayTimeDurationValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + XPathDayTimeDuration.newInstance((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized DayTimeDuration"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java new file mode 100644 index 0000000..a0fc0dd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java
@@ -0,0 +1,43 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import com.vaadin.data.Validator; + +public class DoubleValidator implements Validator { + private static final long serialVersionUID = 1L; + + public DoubleValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof Double) { + return; + } + try { + Double.parseDouble(value.toString()); + } catch (NumberFormatException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java new file mode 100644 index 0000000..e8065b1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import org.apache.commons.codec.DecoderException; + +import org.apache.openaz.xacml.std.datatypes.HexBinary; +import com.vaadin.data.Validator; + +public class HexBinaryValidator implements Validator { + private static final long serialVersionUID = 1L; + + public HexBinaryValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + HexBinary.newInstance((String) value); + } catch (DecoderException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized HexBinary"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java new file mode 100644 index 0000000..3996819 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java
@@ -0,0 +1,42 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import com.vaadin.data.Validator; + +public class IntegerValidator implements Validator { + private static final long serialVersionUID = 1L; + + public IntegerValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof Integer) { + return; + } + try { + Integer.parseInt(value.toString()); + } catch (NumberFormatException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java new file mode 100644 index 0000000..72aa772 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.IPAddress; +import com.vaadin.data.Validator; + +public class IpAddressValidator implements Validator { + private static final long serialVersionUID = 1L; + + public IpAddressValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + IPAddress.newInstance((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized IP Address"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java new file mode 100644 index 0000000..4211cd7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.RFC822Name; +import com.vaadin.data.Validator; + +public class RFC822NameValidator implements Validator { + private static final long serialVersionUID = 1L; + + public RFC822NameValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + RFC822Name.newInstance((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized RFC822 Name"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java new file mode 100644 index 0000000..7d03d38 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java
@@ -0,0 +1,38 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import com.vaadin.data.Validator; + +public class StringValidator implements Validator { + private static final long serialVersionUID = 1L; + + public StringValidator() { + // TODO Auto-generated constructor stub + } + + @Override + public void validate(Object value) throws InvalidValueException { + // TODO Auto-generated method stub + + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java new file mode 100644 index 0000000..b93dafe --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.ISO8601Time; +import com.vaadin.data.Validator; + +public class TimeValidator implements Validator { + private static final long serialVersionUID = 1L; + + public TimeValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + ISO8601Time.fromISO8601TimeString((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized Time"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java new file mode 100644 index 0000000..354d662 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java
@@ -0,0 +1,71 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.data.Validator; + +public class ValidatorFactory { + + public static Validator newInstance(Datatype datatype) { + + if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_ANYURI)) { + return new AnyURIValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_BASE64BINARY)) { + return new Base64BinaryValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_BOOLEAN)) { + return new BooleanValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DATE)) { + return new DateValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DATETIME)) { + return new DateTimeValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DAYTIMEDURATION)) { + return new DayTimeDurationValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DNSNAME)) { + return new DNSNameValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DOUBLE)) { + return new DoubleValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_HEXBINARY)) { + return new HexBinaryValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_INTEGER)) { + return new IntegerValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_IPADDRESS)) { + return new IpAddressValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_RFC822NAME)) { + return new RFC822NameValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_STRING)) { + return new StringValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_TIME)) { + return new TimeValidator(); + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_X500NAME)) { + return new X500NameValidator(); + /* + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_XPATHEXPRESSION)) { + + */ + } else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_YEARMONTHDURATION)) { + return new YearMonthDurationValidator(); + } + + return null; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java new file mode 100644 index 0000000..977a13d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java
@@ -0,0 +1,44 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import javax.security.auth.x500.X500Principal; + +import com.vaadin.data.Validator; + +public class X500NameValidator implements Validator { + private static final long serialVersionUID = 1L; + + public X500NameValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + new X500Principal((String) value); + } catch (IllegalArgumentException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized X500 Name"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java new file mode 100644 index 0000000..8d53629 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java
@@ -0,0 +1,45 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.validators; + +import java.text.ParseException; + +import org.apache.openaz.xacml.std.datatypes.XPathYearMonthDuration; +import com.vaadin.data.Validator; + +public class YearMonthDurationValidator implements Validator { + private static final long serialVersionUID = 1L; + + public YearMonthDurationValidator() { + } + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + try { + XPathYearMonthDuration.newInstance((String) value); + } catch (ParseException e) { + throw new InvalidValueException(e.getLocalizedMessage()); + } + } else + throw new InvalidValueException("Unrecognized YearMonthDuration"); + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java new file mode 100644 index 0000000..802eb43 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java
@@ -0,0 +1,208 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class AdviceEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private OptionGroup optionGroupEffect; + @AutoGenerated + private TextField textFieldAdviceID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final AdviceEditorWindow self = this; + private final AdviceExpressionType advice; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AdviceEditorWindow(AdviceExpressionType advice) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.advice = advice; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initialize(); + this.initializeButton(); + // + // Focus + // + this.textFieldAdviceID.focus(); + } + + protected void initialize() { + // + // The text field for the advice ID + // + this.textFieldAdviceID.setNullRepresentation(""); + if (this.advice.getAdviceId() == null) { + this.textFieldAdviceID.setValue(XacmlAdminUI.getDomain()); + } else { + this.textFieldAdviceID.setValue(advice.getAdviceId()); + } + this.textFieldAdviceID.setRequiredError("You must have an ID for the advice"); + // + // The option + // + this.optionGroupEffect.setRequiredError("You must select Permit or Deny for the advice"); + this.optionGroupEffect.addItem(EffectType.PERMIT); + this.optionGroupEffect.addItem(EffectType.DENY); + if (this.advice.getAppliesTo() == null) { + this.optionGroupEffect.select(EffectType.PERMIT); + } else { + if (this.advice.getAppliesTo().equals(EffectType.PERMIT)) { + this.optionGroupEffect.select(EffectType.PERMIT); + } else { + this.optionGroupEffect.select(EffectType.DENY); + } + } + } + + protected void initializeButton() { + this.buttonSave.setImmediate(true); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textFieldAdviceID.commit(); + self.optionGroupEffect.commit(); + // + // all good, save everything + // + self.advice.setAdviceId(self.textFieldAdviceID.getValue()); + self.advice.setAppliesTo((EffectType) self.optionGroupEffect.getValue()); + // + // Set ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Vaadin displays the error + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public AdviceExpressionType getAdvice() { + return this.advice; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldAdviceID + textFieldAdviceID = new TextField(); + textFieldAdviceID.setCaption("Advice ID"); + textFieldAdviceID.setImmediate(false); + textFieldAdviceID.setWidth("-1px"); + textFieldAdviceID.setHeight("-1px"); + textFieldAdviceID.setInvalidAllowed(false); + textFieldAdviceID.setRequired(true); + textFieldAdviceID.setInputPrompt("Eg. urn:com:foo:advice:sample"); + mainLayout.addComponent(textFieldAdviceID); + + // optionGroupEffect + optionGroupEffect = new OptionGroup(); + optionGroupEffect.setCaption("Applies To"); + optionGroupEffect.setImmediate(false); + optionGroupEffect.setWidth("-1px"); + optionGroupEffect.setHeight("-1px"); + optionGroupEffect.setInvalidAllowed(false); + optionGroupEffect.setRequired(true); + mainLayout.addComponent(optionGroupEffect); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java new file mode 100644 index 0000000..e8496e5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java
@@ -0,0 +1,600 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.List; +import java.util.Map; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener; +import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedNotifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Container; +import com.vaadin.data.Container.Filter; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.data.util.filter.SimpleStringFilter; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ApplyEditorWindow extends Window implements ApplyParametersChangedNotifier { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSelect; + @AutoGenerated + private Table tableFunction; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private CheckBox checkBoxFilterIsBag; + @AutoGenerated + private ComboBox comboBoxDatatypeFilter; + @AutoGenerated + private TextField textFieldFilter; + @AutoGenerated + private TextArea textAreaDescription; + /** + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(ApplyEditorWindow.class); + private final ApplyEditorWindow self = this; + private final ApplyParametersChangedNotifier notifier = new ApplyParametersChangedNotifier.BasicNotifier(); + private final BeanItemContainer<FunctionDefinition> container = new BeanItemContainer<FunctionDefinition>(FunctionDefinition.class); + private final ApplyType apply; + private final ApplyType applyParent; + private final FunctionArgument argument; + private final Object parent; + private boolean isSaved = false; + private FunctionDefinition function = null; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param parent + * @param parentApply + */ + public ApplyEditorWindow(ApplyType apply, ApplyType parentApply, FunctionArgument argument, Object parent) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.apply = apply; + this.applyParent = parentApply; + this.argument = argument; + this.parent = parent; + logger.info(this.apply + " " + this.applyParent + " " + this.argument + " " + this.parent); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.textAreaDescription.setValue(apply.getDescription()); + this.textAreaDescription.setNullRepresentation(""); + this.initializeButton(); + this.initializeTable(); + this.initializeFilters(); + // + // focus + // + this.textFieldFilter.focus(); + } + + protected void initializeTable() { + // + // Setup GUI properties + // + this.tableFunction.setImmediate(true); + this.tableFunction.setSelectable(true); + this.tableFunction.setNullSelectionAllowed(false); + this.tableFunction.setRequired(true); + this.tableFunction.setRequiredError("You MUST select a function for the Apply"); + // + // Set its data source + // + this.tableFunction.setContainerDataSource(this.container); + this.tableFunction.setVisibleColumns(new Object[] {"xacmlid", "shortname", "datatypeBean", "isBagReturn"}); + this.tableFunction.setColumnHeaders(new String[] {"Function Xacml ID", "ID", "Return Data Type", "Return Bag?"}); + // + // Determine appropriate filters + // + Datatype datatypeId = null; + if (this.applyParent == null) { + if (this.parent instanceof ConditionType) { + // + // Only boolean functions allowed + // + datatypeId = JPAUtils.findDatatype(XACML3.ID_DATATYPE_BOOLEAN); + } + } else { + String parentFunction = this.applyParent.getFunctionId(); + this.function = JPAUtils.findFunction(parentFunction); + if (this.function == null) { + throw new IllegalArgumentException("applyParent's function is not found:" + parentFunction); + } + if (this.argument == null) { + throw new IllegalArgumentException("Need to know what argument apply is "); + } + datatypeId = this.argument.getDatatypeBean(); + } + Map<Datatype, List<FunctionDefinition>> functionMap = JPAUtils.getFunctionDatatypeMap(); + if (datatypeId == null) { + // + // All functions are available + // + for (Datatype id : functionMap.keySet()) { + this.addTableEntries(functionMap.get(id)); + } + } else { + for (Datatype id : functionMap.keySet()) { + if (id == null) { + if (datatypeId == null) { + this.addTableEntries(functionMap.get(id)); + break; + } + continue; + } + if (id.getId() == datatypeId.getId()) { + this.addTableEntries(functionMap.get(id)); + break; + } + } + } + // + // Setup double-click + // + this.tableFunction.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + self.selected(); + } + } + }); + // + // Value change listener + // + this.tableFunction.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + logger.info("valueChange " + self.tableFunction.getValue()); + if (self.tableFunction.getValue() != null) { + self.buttonSelect.setEnabled(true); + } else { + self.buttonSelect.setEnabled(false); + } + } + }); + // + // Select current value if possible + // + if (this.apply != null && this.apply.getFunctionId() != null && this.apply.getFunctionId().isEmpty() == false) { + FunctionDefinition current = JPAUtils.findFunction(this.apply.getFunctionId()); + if (current != null) { + this.tableFunction.select(current); + this.tableFunction.setCurrentPageFirstItemId(current); + } else { + logger.warn("Could not find function in table for " + this.apply.getFunctionId()); + } + } else { + this.buttonSelect.setEnabled(false); + } + } + + protected void addTableEntries(List<FunctionDefinition> functions) { + if (functions == null) { + logger.warn("NULL list of functions, cannot add to table."); + return; + } + for (FunctionDefinition function : functions) { + // + // Just check if this function is available for this + // apply. + // +// if (XACMLFunctionValidator.isFunctionAvailable(function, this.apply, this.argument)) { + this.container.addBean(function); +// } else { +// if (logger.isDebugEnabled()) { +// logger.debug("Function not available: " + function); +// } +// } + } + } + + protected void initializeButton() { + this.buttonSelect.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.selected(); + } + }); + } + + protected void initializeFilters() { + this.textFieldFilter.setImmediate(true); + this.textFieldFilter.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + SimpleStringFilter currentFilter = null; + + @Override + public void textChange(TextChangeEvent event) { + // + // Remove current filter + // + if (this.currentFilter != null) { + self.container.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Get the text + // + String value = event.getText(); + if (value != null && value.length() > 0) { + // + // Add the new filter + // + this.currentFilter = new SimpleStringFilter("shortname", value, true, false); + self.container.addContainerFilter(this.currentFilter); + } + } + }); + + this.comboBoxDatatypeFilter.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes()); + this.comboBoxDatatypeFilter.setImmediate(true); + this.comboBoxDatatypeFilter.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxDatatypeFilter.setItemCaptionPropertyId("xacmlId"); + this.comboBoxDatatypeFilter.setNullSelectionAllowed(true); + this.comboBoxDatatypeFilter.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + Container.Filter currentFilter = null; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Remove current filter + // + if (this.currentFilter != null) { + self.container.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Get the current selection + // + Object id = self.comboBoxDatatypeFilter.getValue(); + if (id == null) { + return; + } + // + // Setup the filter + // + final Datatype datatype = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id).getEntity(); + this.currentFilter = new Container.Filter() { + private static final long serialVersionUID = 1L; + + @Override + public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { + if (itemId instanceof FunctionDefinition) { + Datatype dt = ((FunctionDefinition) itemId).getDatatypeBean(); + if (dt == null) { + return false; + } + return dt.getXacmlId().equals(datatype.getXacmlId()); + } + return false; + } + + @Override + public boolean appliesToProperty(Object propertyId) { + if (propertyId != null && propertyId.toString().equals("datatypeBean")) { + return true; + } + return false; + } + }; + self.container.addContainerFilter(this.currentFilter); + } + }); + + this.checkBoxFilterIsBag.setImmediate(true); + this.checkBoxFilterIsBag.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + Filter currentFilter = null; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Remove current filter + // + if (this.currentFilter != null) { + self.container.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Is it checked? + // + if (self.checkBoxFilterIsBag.getValue() == false) { + // + // Nope, get out of here + // + return; + } + // + // Add the filter + // + this.currentFilter = new Compare.Equal("isBagReturn", true); + self.container.addContainerFilter(this.currentFilter); + } + }); + } + + protected void selected() { + // + // Is there a selected function? + // + try { + // + // Run the commit + // + this.textAreaDescription.commit(); + this.tableFunction.commit(); + // + // Commit worked, get the selected function + // + Object id = this.tableFunction.getValue(); + // + // Sanity check, it *should* never be null + // unless someone changed the initialization code. + // + if (id == null || ! (id instanceof FunctionDefinition)) { + throw new InvalidValueException(this.tableFunction.getRequiredError()); + } + // + // Get the actual function and save it into the apply + // + this.function = (FunctionDefinition) id; + this.apply.setDescription(this.textAreaDescription.getValue()); + this.apply.setFunctionId(function.getXacmlid()); + } catch (SourceException | InvalidValueException e) { + // + // Vaadin GUI will display message + // + return; + } + /** + // + // Make sure the arguments are good + // + final ApplyType copyApply = XACMLObjectCopy.copy(this.apply); + final ApplyArgumentsEditorWindow window = new ApplyArgumentsEditorWindow(copyApply, this.function); + window.setCaption("Define Arguments for " + this.function.getShortname()); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Save our arguments + // + self.apply.getExpression().clear(); + self.apply.getExpression().addAll(copyApply.getExpression()); + // + // We are saved + // + self.isSaved = true; + // + // Fire + // + self.fireEvent(self.apply, self.applyParent, self.argument, self.parent); + // + // Close the apply editor window + // + self.close(); + } + }); + window.center(); + UI.getCurrent().addWindow(window); + **/ + // + // We are saved + // + self.isSaved = true; + // + // Fire + // + self.fireEvent(self.apply, self.applyParent, self.argument, self.parent); + // + // Close the apply editor window + // + self.close(); + } + + @Override + public boolean addListener(ApplyParametersChangedListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(ApplyParametersChangedListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) { + this.notifier.fireEvent(apply, parent, argument, container); + } + + public boolean isSaved() { + return this.isSaved; + } + + public FunctionDefinition getSelectedFunction() { + return this.function; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + // tableFunction + tableFunction = new Table(); + tableFunction.setCaption("Select A Function"); + tableFunction.setImmediate(false); + tableFunction.setWidth("100.0%"); + tableFunction.setHeight("-1px"); + tableFunction.setInvalidAllowed(false); + tableFunction.setRequired(true); + mainLayout.addComponent(tableFunction); + mainLayout.setExpandRatio(tableFunction, 1.0f); + + // buttonSelect + buttonSelect = new Button(); + buttonSelect.setCaption("Select and Continue"); + buttonSelect.setImmediate(true); + buttonSelect.setWidth("-1px"); + buttonSelect.setHeight("-1px"); + mainLayout.addComponent(buttonSelect); + mainLayout.setComponentAlignment(buttonSelect, new Alignment(48)); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // textAreaDescription + textAreaDescription = new TextArea(); + textAreaDescription.setCaption("Enter A Description"); + textAreaDescription.setImmediate(false); + textAreaDescription.setWidth("50.0%"); + textAreaDescription.setHeight("-1px"); + horizontalLayout_1.addComponent(textAreaDescription); + + // textFieldFilter + textFieldFilter = new TextField(); + textFieldFilter.setCaption("Filter Function By ID"); + textFieldFilter.setImmediate(false); + textFieldFilter.setWidth("-1px"); + textFieldFilter.setHeight("-1px"); + horizontalLayout_1.addComponent(textFieldFilter); + horizontalLayout_1.setComponentAlignment(textFieldFilter, + new Alignment(9)); + + // comboBoxDatatypeFilter + comboBoxDatatypeFilter = new ComboBox(); + comboBoxDatatypeFilter.setCaption("Filter By Data Type"); + comboBoxDatatypeFilter.setImmediate(false); + comboBoxDatatypeFilter.setWidth("-1px"); + comboBoxDatatypeFilter.setHeight("-1px"); + horizontalLayout_1.addComponent(comboBoxDatatypeFilter); + horizontalLayout_1.setComponentAlignment(comboBoxDatatypeFilter, + new Alignment(9)); + + // checkBoxFilterIsBag + checkBoxFilterIsBag = new CheckBox(); + checkBoxFilterIsBag.setCaption("Is Bag Filter"); + checkBoxFilterIsBag.setImmediate(false); + checkBoxFilterIsBag.setWidth("-1px"); + checkBoxFilterIsBag.setHeight("-1px"); + horizontalLayout_1.addComponent(checkBoxFilterIsBag); + horizontalLayout_1.setComponentAlignment(checkBoxFilterIsBag, + new Alignment(9)); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java new file mode 100644 index 0000000..a9306fa --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java
@@ -0,0 +1,228 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Category; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class AttributeAssignmentExpressionEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private Table tableCategories; + @AutoGenerated + private TextField textFieldIssuer; + @AutoGenerated + private TextField textFieldAttributeID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final AttributeAssignmentExpressionEditorWindow self = this; + private final AttributeAssignmentExpressionType assignment; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeAssignmentExpressionEditorWindow(AttributeAssignmentExpressionType assignment) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.assignment = assignment; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeText(); + this.initializeTable(); + this.initializeButton(); + // + // Focus + // + this.textFieldAttributeID.focus(); + } + + protected void initializeText() { + // + // + // + this.textFieldAttributeID.setNullRepresentation(""); + if (this.assignment.getAttributeId() == null) { + this.textFieldAttributeID.setValue(XacmlAdminUI.getDomain()); + } else { + this.textFieldAttributeID.setValue(this.assignment.getAttributeId()); + } + this.textFieldAttributeID.setRequiredError("You must have an attribute id for the assignment expression."); + // + // + // + this.textFieldIssuer.setNullRepresentation(""); + this.textFieldIssuer.setValue(this.assignment.getIssuer()); + } + + protected void initializeTable() { + this.tableCategories.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getCategories()); + this.tableCategories.setVisibleColumns(new Object[] {"xacmlId"}); + this.tableCategories.setColumnHeaders(new String[] {"XACML ID"}); + this.tableCategories.setSelectable(true); + this.tableCategories.setNullSelectionAllowed(true); + this.tableCategories.setPageLength(((XacmlAdminUI) UI.getCurrent()).getCategories().size()); + } + + protected void initializeButton() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textFieldAttributeID.commit(); + self.textFieldIssuer.commit(); + self.tableCategories.commit(); + // + // Save + // + self.assignment.setAttributeId(self.textFieldAttributeID.getValue()); + self.assignment.setIssuer(self.textFieldIssuer.getValue()); + Object cat = self.tableCategories.getValue(); + if (cat != null) { + EntityItem<Category> entity = ((XacmlAdminUI) UI.getCurrent()).getCategories().getItem(cat); + if (entity != null && entity.getEntity() != null) { + self.assignment.setCategory(entity.getEntity().getXacmlId()); + } else { + self.assignment.setCategory(null); + } + } else { + self.assignment.setCategory(null); + } + // + // Set ourselves as saved + // + self.isSaved = true; + // + // close window + // + self.close(); + } catch (SourceException e) { //NOPMD + // + // Vaadin displays error GUI + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public AttributeAssignmentExpressionType getAssignment () { + return this.assignment; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldAttributeID + textFieldAttributeID = new TextField(); + textFieldAttributeID.setCaption("Attribute Assignment ID"); + textFieldAttributeID.setImmediate(false); + textFieldAttributeID.setWidth("-1px"); + textFieldAttributeID.setHeight("-1px"); + textFieldAttributeID.setInvalidAllowed(false); + textFieldAttributeID.setRequired(true); + mainLayout.addComponent(textFieldAttributeID); + + // textFieldIssuer + textFieldIssuer = new TextField(); + textFieldIssuer.setCaption("Issuer (Optional)"); + textFieldIssuer.setImmediate(false); + textFieldIssuer.setWidth("-1px"); + textFieldIssuer.setHeight("-1px"); + textFieldIssuer.setNullSettingAllowed(true); + mainLayout.addComponent(textFieldIssuer); + + // tableCategories + tableCategories = new Table(); + tableCategories.setCaption("Category (Optional)"); + tableCategories.setImmediate(false); + tableCategories.setWidth("100.0%"); + tableCategories.setHeight("-1px"); + mainLayout.addComponent(tableCategories); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java new file mode 100644 index 0000000..62e9c1a --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java
@@ -0,0 +1,336 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.ConstraintType; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.view.fields.ConstraintField; +import org.apache.openaz.xacml.admin.view.fields.DesignatorSelectorField; +import org.apache.openaz.xacml.api.Identifier; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.fieldgroup.FieldGroup; +import com.vaadin.data.fieldgroup.FieldGroup.CommitException; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.data.util.filter.Not; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.shared.ui.combobox.FilteringMode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.Window; + +public class AttributeEditorWindow extends Window { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(AttributeEditorWindow.class); + private AttributeEditorWindow self = this; + + private boolean isSaved = false; + private Attribute attribute; + + private FormLayout mainLayout = new FormLayout(); + + @PropertyId("isDesignator") + DesignatorSelectorField selectDesignator; + + @PropertyId("selectorPath") + TextField selectorPath = new TextField("Attribute Selector Path"); + + @PropertyId("xacmlId") + TextField xacmlID = new TextField("XACML ID"); + + @PropertyId("categoryBean") + ComboBox category = new ComboBox("Category"); + + @PropertyId("description") + TextArea descriptionField = new TextArea("Description"); + + @PropertyId("datatypeBean") + ComboBox datatype = new ComboBox("DataType"); + + @PropertyId("constraintType") + ComboBox constraintTypes = new ComboBox("Constraint Type"); + + @PropertyId("constraintValues") + ConstraintField constraintValues; + + Button saveButton = new Button("Save"); + + FieldGroup fieldGroup = null; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeEditorWindow(EntityItem<Attribute> entityItem) { + // + // Save our attribute + // + this.attribute = entityItem.getEntity(); + if (logger.isDebugEnabled()) { + logger.debug("Editing attribute: " + entityItem.getEntity().toString()); + } + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Create our main layout + // + this.setContent(mainLayout); + // + // Finish setting up the main layout + // + this.mainLayout.setSpacing(true); + this.mainLayout.setMargin(true); + // + // Setup option group, binding the + // field group doesn't seem to work. + // + this.selectDesignator = new DesignatorSelectorField(entityItem); + this.selectDesignator.setCaption("Select the Attribute Type"); + this.selectDesignator.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = self.selectDesignator.getValue(); + if (value == null || ! (value instanceof Character)) { + self.selectorPath.setVisible(false); + } + if (((Character) value) == '1') { + self.selectorPath.setVisible(false); + } else { + self.selectorPath.setVisible(true); + } + } + }); + // + // Setup selector path + // + this.selectorPath.setImmediate(true); + this.selectorPath.setNullRepresentation(""); + this.selectorPath.setWidth("100%"); + // + // Setup the Category combo + // + this.category.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getCategories()); + this.category.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.category.setItemCaptionPropertyId("xacmlId"); + this.category.setFilteringMode(FilteringMode.CONTAINS); + this.category.setImmediate(true); + this.category.setNullSelectionAllowed(false); + this.category.setConverter(new SingleSelectConverter<Object>(this.category)); + // + // Setup the Datatype combo + // + this.datatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes()); + this.datatype.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.datatype.setItemCaptionPropertyId("xacmlId"); + this.datatype.setFilteringMode(FilteringMode.CONTAINS); + this.datatype.setImmediate(true); + this.datatype.setNullSelectionAllowed(false); + this.datatype.setConverter(new SingleSelectConverter<Object>(this.datatype)); + // + // Setup the constraint type combo + // + this.constraintTypes.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getConstraintTypes()); + this.constraintTypes.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.constraintTypes.setItemCaptionPropertyId("constraintType"); + this.constraintTypes.setFilteringMode(FilteringMode.CONTAINS); + this.constraintTypes.setImmediate(true); + this.constraintTypes.setNullSelectionAllowed(true); + this.constraintTypes.setConverter(new SingleSelectConverter<Object>(this.constraintTypes)); + // + // Setup the constraint value custom field + // + this.constraintValues = new ConstraintField(entityItem); + // + // Finish laying out the main layout + // + this.mainLayout.addComponent(this.selectDesignator); + this.mainLayout.addComponent(this.selectorPath); + this.mainLayout.addComponent(this.xacmlID); + this.mainLayout.addComponent(this.category); + this.mainLayout.addComponent(this.descriptionField); + this.mainLayout.addComponent(this.datatype); + this.mainLayout.addComponent(this.constraintTypes); + this.mainLayout.addComponent(this.constraintValues); + // + // Now create our field group and bind our bean items + // This will populate the components with the attribute's + // current value. + // + this.fieldGroup = new FieldGroup(entityItem); + this.fieldGroup.bindMemberFields(this); + // + // Finishing setting up after the bind. There are some components + // where initializing the bind causes some properties to be reset. + // + this.xacmlID.setWidth("100%"); + this.descriptionField.setNullRepresentation(""); + this.descriptionField.setWidth("100%"); + this.setupDatatype(this.attribute.getDatatypeBean().getIdentifer()); + this.datatype.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Identifier id = self.getCurrentDatatype(); + if (id != null) { + self.setupDatatype(id); + } + } + }); + // + // Listen to when constraint type changes + // + this.constraintTypes.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = self.constraintTypes.getValue(); + if (value == null) { + self.constraintValues.resetContent(null, self.getCurrentDatatype()); + } else { + ConstraintType newValue = ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().getItem(value).getEntity(); + self.constraintValues.resetContent(newValue, self.getCurrentDatatype()); + } + } + }); + // + // Setup our "SAVE" button to commit the fields + // + this.mainLayout.addComponent(this.saveButton); + this.mainLayout.setComponentAlignment(this.saveButton, Alignment.MIDDLE_CENTER); + this.saveButton.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // SAVE the latest values + // + fieldGroup.commit(); + // + // Set that we did save the attribute + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (CommitException e) { + logger.error("Failed to commit fields", e); + } + } + + }); + // + // Add our close listener so we can discard anything that was changed. + // + this.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + if (self.isSaved == false) { + logger.info("discarding"); + // + // Discard any changes to the existing JPA container entity + // + self.fieldGroup.discard(); + // + // Make sure there are no filters on the container + // + ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters(); + } + } + + }); + // + // Set focus + // + this.xacmlID.focus(); + } + + private void setupDatatype(Identifier datatype) { + if (datatype.equals(XACML3.ID_DATATYPE_INTEGER) || + datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) { + ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters(); + this.constraintTypes.setEnabled(true); + this.constraintValues.resetDatatype(datatype); + return; + } + if (datatype.equals(XACML3.ID_DATATYPE_STRING)) { + ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().addContainerFilter(new Not(new Compare.Equal("constraintType", ConstraintType.RANGE_TYPE))); + if (this.attribute.getConstraintType() != null && + this.attribute.getConstraintType().getConstraintType() != null && + this.attribute.getConstraintType().getConstraintType().equals(ConstraintType.RANGE_TYPE)) { + this.attribute.setConstraintType(null); + } + this.constraintValues.resetDatatype(datatype); + return; + } + // + // No constraint for all other datatypes + // + this.attribute.setConstraintType(null); + this.constraintTypes.select(null); + this.constraintTypes.setEnabled(false); + } + + private Identifier getCurrentDatatype() { + Object id = self.datatype.getValue(); + if (id != null) { + EntityItem<Datatype> dt = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id); + if (dt != null) { + return dt.getEntity().getIdentifer(); + } + } + return null; + } + + public boolean isSaved() { + return this.isSaved; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java new file mode 100644 index 0000000..b1448bf --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java
@@ -0,0 +1,396 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.components.AttributeDictionarySelectorComponent; +import org.apache.openaz.xacml.admin.view.components.AttributeSimpleCreatorComponent; +import org.apache.openaz.xacml.admin.view.components.AttributeStandardSelectorComponent; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class AttributeSelectionWindow extends Window implements AttributeChangedEventListener { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private HorizontalLayout horizontalLayoutAttribute; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private VerticalLayout verticalLayout_2; + @AutoGenerated + private CheckBox checkBoxMustBePresent; + @AutoGenerated + private TextField textFieldIssuer; + @AutoGenerated + private OptionGroup optionGroupAttribute; + /** + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(AttributeSelectionWindow.class); + private final AttributeSelectionWindow self = this; + private final Datatype datatype; + private final Attribute defaultAttribute; + private AttributeChangedEventNotifier currentComponent = null; + private Attribute attribute = null; + private boolean isSaved = false; + + public static final String ATTRIBUTE_OPTION_DICTIONARY = "Use Attribute From Dictionary"; + public static final String ATTRIBUTE_OPTION_STANDARD = "Use A Standard Attribute"; + public static final String ATTRIBUTE_OPTION_INPUT = "Input A New Attribute"; + public static final String[] ATTRIBUTE_OPTIONS = new String[] {ATTRIBUTE_OPTION_DICTIONARY, ATTRIBUTE_OPTION_STANDARD, ATTRIBUTE_OPTION_INPUT}; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeSelectionWindow(Datatype datatype, Object defaultAttribute) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save data + // + this.datatype = datatype; + if (defaultAttribute == null) { + this.defaultAttribute = null; + } else { + // + // Given a default attribute + // + Attribute tempAttribute; + if (defaultAttribute instanceof AttributeDesignatorType) { + tempAttribute = JPAUtils.createAttribute((AttributeDesignatorType) defaultAttribute); + } else if (defaultAttribute instanceof AttributeSelectorType) { + tempAttribute = JPAUtils.createAttribute((AttributeSelectorType) defaultAttribute); + } else { + this.defaultAttribute = null; + throw new IllegalArgumentException("Selection window only works with designator or selector objects."); + } + // + // See if the attribute exists in our dictionary + // + Attribute dictionaryAttribute = JPAUtils.findAttribute(tempAttribute); + if (dictionaryAttribute != null) { + this.defaultAttribute = dictionaryAttribute; + } else { + this.defaultAttribute = tempAttribute; + } + } + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeOption(); + this.initializeButtons(); + this.initializeAttribute(); + // + // Setup attribute + // + this.resetAttributeOption(); + // + // Focus + // + } + + protected void initializeOption() { + // + // Setup datasource and GUI properties + // + this.optionGroupAttribute.setImmediate(true); + this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_DICTIONARY); + this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_STANDARD); + this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_INPUT); + // + // Respond to events + // + this.optionGroupAttribute.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.resetAttributeOption(); + } + }); + } + + protected void initializeButtons() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit everything?? + // + self.textFieldIssuer.commit(); + self.checkBoxMustBePresent.commit(); + self.currentComponent.commit(); + // + // Save to the attribute + // + String issuer = self.textFieldIssuer.getValue(); + if (issuer == null || issuer.length() == 0) { + self.attribute.setIssuer(null); + } else { + self.attribute.setIssuer(issuer); + } + self.attribute.setMustBePresent(self.checkBoxMustBePresent.getValue()); + // + // Mark as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Vaadin displays the error + // + } + } + }); + } + + protected void initializeAttribute() { + // + // Are we editing something? + // + if (this.defaultAttribute == null) { + // + // No, this is a new attribute being created + // + this.optionGroupAttribute.select(ATTRIBUTE_OPTION_STANDARD); + return; + } + // + // Yes, is it in our dictionary? + // + Attribute attribute = JPAUtils.findAttribute(this.defaultAttribute); + if (attribute != null) { + // + // Yes its in our dictionary + // + this.attribute = attribute; + this.optionGroupAttribute.select(ATTRIBUTE_OPTION_DICTIONARY); + return; + } + // + // Is it a standard attribute? + // + attribute = JPAUtils.isStandardAttribute(this.defaultAttribute); + if (attribute == null) { + // + // No, start editing via custom input attribute + // + this.attribute = this.defaultAttribute; + this.optionGroupAttribute.select(ATTRIBUTE_OPTION_INPUT); + return; + } + // + // Yes - its a standard attribute + // + this.attribute = attribute; + this.optionGroupAttribute.select(ATTRIBUTE_OPTION_STANDARD); + } + + protected void resetAttributeOption() { + // + // Remove GUI components from layout + // + this.horizontalLayoutAttribute.removeAllComponents(); + this.currentComponent = null; + // + // Grab our currently selected option value + // + Object value = self.optionGroupAttribute.getValue(); + // + // What is it set to? + // + if (value.toString().equals(ATTRIBUTE_OPTION_DICTIONARY)) { + this.currentComponent = new AttributeDictionarySelectorComponent(this.datatype, this.defaultAttribute); + } else if (value.toString().equals(ATTRIBUTE_OPTION_STANDARD)) { + this.currentComponent = new AttributeStandardSelectorComponent(this.datatype, this.defaultAttribute); + } else if (value.toString().equals(ATTRIBUTE_OPTION_INPUT)) { + this.currentComponent = new AttributeSimpleCreatorComponent(this.datatype, this.defaultAttribute); + } else { + logger.error("Unknown option" + value); + return; + } + this.currentComponent.addListener(this); + this.horizontalLayoutAttribute.addComponent((CustomComponent) this.currentComponent); + this.currentComponent.fireAttributeChanged(this.currentComponent.getAttribute()); + } + + @Override + public void attributeChanged(Attribute attribute) { + if (logger.isDebugEnabled()) { + logger.debug("attributeChanged: " + attribute); + } + this.attribute = attribute; + if (attribute == null) { + this.buttonSave.setEnabled(false); + } else { + this.buttonSave.setEnabled(true); + } + } + + public boolean isSaved() { + return this.isSaved; + } + + public Attribute getAttribute() { + return this.attribute; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + // horizontalLayoutAttribute + horizontalLayoutAttribute = new HorizontalLayout(); + horizontalLayoutAttribute.setImmediate(false); + horizontalLayoutAttribute.setWidth("-1px"); + horizontalLayoutAttribute.setHeight("-1px"); + horizontalLayoutAttribute.setMargin(false); + mainLayout.addComponent(horizontalLayoutAttribute); + mainLayout.setExpandRatio(horizontalLayoutAttribute, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Select"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + + // optionGroupAttribute + optionGroupAttribute = new OptionGroup(); + optionGroupAttribute.setCaption("Attribute Source"); + optionGroupAttribute.setImmediate(false); + optionGroupAttribute.setWidth("-1px"); + optionGroupAttribute.setHeight("-1px"); + optionGroupAttribute.setInvalidAllowed(false); + horizontalLayout_1.addComponent(optionGroupAttribute); + + // verticalLayout_2 + verticalLayout_2 = buildVerticalLayout_2(); + horizontalLayout_1.addComponent(verticalLayout_2); + + return horizontalLayout_1; + } + + @AutoGenerated + private VerticalLayout buildVerticalLayout_2() { + // common part: create layout + verticalLayout_2 = new VerticalLayout(); + verticalLayout_2.setImmediate(false); + verticalLayout_2.setWidth("-1px"); + verticalLayout_2.setHeight("-1px"); + verticalLayout_2.setMargin(true); + verticalLayout_2.setSpacing(true); + + // textFieldIssuer + textFieldIssuer = new TextField(); + textFieldIssuer.setCaption("Issuer"); + textFieldIssuer.setImmediate(false); + textFieldIssuer.setWidth("-1px"); + textFieldIssuer.setHeight("-1px"); + verticalLayout_2.addComponent(textFieldIssuer); + + // checkBoxMustBePresent + checkBoxMustBePresent = new CheckBox(); + checkBoxMustBePresent.setCaption("Attribute Must Be Present"); + checkBoxMustBePresent.setImmediate(false); + checkBoxMustBePresent.setWidth("-1px"); + checkBoxMustBePresent.setHeight("-1px"); + verticalLayout_2.addComponent(checkBoxMustBePresent); + + return verticalLayout_2; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java new file mode 100644 index 0000000..13ae0b1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java
@@ -0,0 +1,320 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.validators.ValidatorFactory; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.shared.ui.combobox.FilteringMode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class AttributeValueEditorWindow extends Window { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldValue; + @AutoGenerated + private ComboBox comboBoxDatatype; + private static final long serialVersionUID = 1L; + private final AttributeValueEditorWindow self = this; + private final Datatype datatypeRestriction; + private final AttributeValueType value; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public AttributeValueEditorWindow(AttributeValueType value, Datatype datatypeRestriction) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.value = value; + this.datatypeRestriction = datatypeRestriction; + // + // Make sure the value has the same datatype as the restriction + // + if (this.datatypeRestriction != null) { + this.value.setDataType(this.datatypeRestriction.getXacmlId()); + } + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeCombo(); + this.initializeTextField(); + this.initializeButtons(); + // + // Focus? + // + if (this.datatypeRestriction == null) { + this.comboBoxDatatype.focus(); + } else { + this.textFieldValue.focus(); + } + } + + protected void initializeCombo() { + this.comboBoxDatatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes()); + this.comboBoxDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboBoxDatatype.setItemCaptionPropertyId("xacmlId"); + this.comboBoxDatatype.setFilteringMode(FilteringMode.CONTAINS); + this.comboBoxDatatype.setImmediate(true); + this.comboBoxDatatype.setNullSelectionAllowed(false); + this.comboBoxDatatype.setConverter(new SingleSelectConverter<Object>(this.comboBoxDatatype)); + // + // Select a value if its defined + // + if (this.datatypeRestriction != null) { + this.comboBoxDatatype.select(this.datatypeRestriction.getId()); + } else if (this.value.getDataType() != null) { + this.comboBoxDatatype.select(JPAUtils.findDatatype(this.value.getDataType()).getId()); + } + // + // Can the user change the datatype? + // + if (this.datatypeRestriction != null) { + this.comboBoxDatatype.setEnabled(false); + return; + } + // + // Listen to events + // + this.comboBoxDatatype.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object id = self.comboBoxDatatype.getValue(); + assert id != null; + // + // Get the entity and save it + // + EntityItem<Datatype> entity = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id); + self.value.setDataType(entity.getEntity().getXacmlId()); + // + // Reset the validator + // + self.textFieldValue.removeAllValidators(); + Validator validator = ValidatorFactory.newInstance(entity.getEntity()); + if (validator != null) { + self.textFieldValue.addValidator(validator); + } + } + }); + } + + protected void initializeTextField() { + // + // GUI properties + // + this.textFieldValue.setImmediate(true); + this.textFieldValue.setNullRepresentation(""); + // + // Setup validator + // + if (this.datatypeRestriction != null) { + Validator validator = ValidatorFactory.newInstance(this.datatypeRestriction); + if (validator != null) { + this.textFieldValue.addValidator(validator); + } + } + // + // Text change or Value Change? + // + this.textFieldValue.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Save the new value. TODO - assuming position 0 of content list. + // + self.saveValue(0, self.textFieldValue.getValue()); + // + // Setup the save button + // + if (self.textFieldValue.getValue() == null || self.textFieldValue.getValue().isEmpty()) { + self.buttonSave.setEnabled(false); + } else { + self.buttonSave.setEnabled(true); + } + } + }); + // + // Initialize the value + // + if (this.value != null && this.value.getContent().isEmpty() == false) { + // + // TODO - If there are multiple Content objects...Right now we work with the first one only. + // + this.textFieldValue.setValue(this.value.getContent().get(0).toString()); + } + } + + protected void saveValue(int i, String value) { + // + // Get the content - TODO + // + if (this.value.getContent().isEmpty()) { + this.value.getContent().add(value); + return; + } + Object o = this.value.getContent().get(i); + if (o == null) { + // + // Add it into the list - ensure its a + // + assert this.value.getContent().size() == i; + this.value.getContent().add(value); + } else { + // + // Overwrite the previous object + // + this.value.getContent().set(i, value); + } + } + + protected void initializeButtons() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Make sure it validates (i.e. call the Validators) + // + self.comboBoxDatatype.validate(); + self.textFieldValue.validate(); + // + // Yes + // + self.isSaved = true; + // + // Close + // + self.close(); + } catch (InvalidValueException e) { //NOPMD + // + // Vaadin with update GUI displaying the error + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public String getValue() { + return this.textFieldValue.getValue(); + } + + public AttributeValueType getAttribute() { + return this.value; + } + + public Datatype getDatatype() { + return JPAUtils.findDatatype(this.value.getDataType()); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // comboBoxDatatype + comboBoxDatatype = new ComboBox(); + comboBoxDatatype.setCaption("Select Datatype"); + comboBoxDatatype.setImmediate(false); + comboBoxDatatype.setWidth("-1px"); + comboBoxDatatype.setHeight("-1px"); + comboBoxDatatype.setInvalidAllowed(false); + comboBoxDatatype.setRequired(true); + mainLayout.addComponent(comboBoxDatatype); + + // textFieldValue + textFieldValue = new TextField(); + textFieldValue.setCaption("Attribute Value"); + textFieldValue.setImmediate(false); + textFieldValue.setWidth("100.0%"); + textFieldValue.setHeight("-1px"); + textFieldValue.setInvalidAllowed(false); + textFieldValue.setRequired(true); + mainLayout.addComponent(textFieldValue); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java new file mode 100644 index 0000000..b961a78 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java
@@ -0,0 +1,192 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.IntegerRangeValidator; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +// import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ColumnSelectionWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldColumn; + /** + * + */ + private static final long serialVersionUID = 1L; + private boolean isSaved = false; + private ColumnSelectionWindow self = this; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ColumnSelectionWindow(Integer value) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Initialize + // + this.initialize(); + // + // Set the value + // + if (value != null) { + this.textFieldColumn.setValue(value.toString()); + } else { + this.textFieldColumn.setValue(Integer.toString(0)); + } + // + // Shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + // + // Focus + // + this.textFieldColumn.focus(); + } + + protected void initialize() { + this.initializeText(); + this.initializeButton(); + } + + protected void initializeText() { + // + // Add a validator + // + this.textFieldColumn.addValidator(new IntegerRangeValidator("Please enter an integer greater than or equal to 0.", 0, null)); + // + // Respond to text changing to setup the button + // + this.textFieldColumn.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() != null && event.getText().isEmpty() == false) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + }); + } + + protected void initializeButton() { + self.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textFieldColumn.commit(); + // + // If we get here, the value is valid. + // Mark ourselves as saved and close the window + // + self.isSaved = true; + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Vaadin will display error + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public Integer getColumn() { + try { + return Integer.parseInt(this.textFieldColumn.getValue()); + } catch (NumberFormatException e) { + return null; + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldColumn + textFieldColumn = new TextField(); + textFieldColumn.setCaption("Column"); + textFieldColumn.setImmediate(false); + textFieldColumn.setDescription("0-based index into CSV line"); + textFieldColumn.setWidth("-1px"); + textFieldColumn.setHeight("-1px"); + textFieldColumn.setRequired(true); + textFieldColumn.setInputPrompt("Eg. ‘0'"); + mainLayout.addComponent(textFieldColumn); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java new file mode 100644 index 0000000..468634c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java
@@ -0,0 +1,521 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.openaz.xacml.admin.model.PDPPIPContainer; +import org.apache.openaz.xacml.admin.model.PDPPolicyContainer; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.api.pap.PAPEngine; +import org.apache.openaz.xacml.api.pap.PAPException; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import org.apache.openaz.xacml.std.pap.StdPDPGroup; +import org.apache.openaz.xacml.std.pap.StdPDPPolicy; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Validator; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class EditPDPGroupWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private Table tablePIP; + @AutoGenerated + private Table tablePolicies; + @AutoGenerated + private TextArea textDescription; + @AutoGenerated + private TextField textName; + + + private static final Action ADD_POLICY = new Action ("Add New Policy"); + private static final Action REMOVE_POLICY = new Action ("Remove Policy"); + private static final Action MAKE_ROOT = new Action ("Make Root"); + private static final Action MAKE_REFERENCED = new Action ("Make Referenced"); + + private static final Action EDIT_CONFIG = new Action("Edit Configurations"); + + // + // ?? Why is this static? + // + private static PDPPolicyContainer policyContainer; + private PDPPIPContainer pipContainer; + + /** + * + */ + private static final long serialVersionUID = 1L; + private final EditPDPGroupWindow self = this; + private final StdPDPGroup group; + private boolean isSaved = false; + + // this is the version that contains all of the edits made by the user. + // it may be a copy of the original object (edited) or a new one. + private StdPDPGroup updatedObject; + + private PAPEngine papEngine; + private List<PDPGroup> groups; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public EditPDPGroupWindow(StdPDPGroup group, List<PDPGroup> list, PAPEngine engine) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save pointers + // + this.group = group; + this.groups = list; + this.papEngine = engine; + // + // Initialize + // + this.initialize(); + // + // Shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + // + // Focus + // + this.textName.focus(); + } + + protected void initialize() { + this.initializeText(); + this.initializeButton(); + this.initializeTables(); + } + + protected void initializeText() { + this.textName.setNullRepresentation(""); + this.textDescription.setNullRepresentation(""); + if (this.group != null) { + this.textName.setValue(this.group.getName()); + this.textDescription.setValue(this.group.getDescription()); + } + // + // Validation + // + this.textName.addValidator(new Validator() { + private static final long serialVersionUID = 1L; + + @Override + public void validate(Object value) throws InvalidValueException { + assert value instanceof String; + if (value == null) { + throw new InvalidValueException("The name cannot be blank."); + } + // Group names must be unique so that user can distinguish between them (and we can create unique IDs from them) + for (PDPGroup g : self.groups) { + if (group != null && g.getId().equals(group.getId())) { + // ignore this group - we may or may not be changing the name + continue; + } + if (g.getName().equals(value.toString())) { + throw new InvalidValueException("Name must be unique"); + } + } + } + }); + this.textName.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() == null || event.getText().isEmpty()) { + self.buttonSave.setEnabled(false); + } else { + self.buttonSave.setEnabled(true); + } + } + }); + } + + protected void initializeTables() { + this.initializePolicyTable(); + this.initializePIPTable(); + } + + protected void initializePolicyTable() { + if (this.group == null) { + this.tablePolicies.setVisible(false); + return; + } + // + // GUI properties + // + EditPDPGroupWindow.policyContainer = new PDPPolicyContainer(group); + this.tablePolicies.setContainerDataSource(EditPDPGroupWindow.policyContainer); + this.tablePolicies.setVisibleColumns("Root", "Name", "Version", "Id");//, "Description"); + this.tablePolicies.setPageLength(EditPDPGroupWindow.policyContainer.size() + 1); + this.tablePolicies.setSelectable(true); + this.tablePolicies.setSizeFull(); + /* + * Not in this release. + * + this.tablePolicies.setColumnCollapsingAllowed(true); + this.tablePolicies.setColumnCollapsed("Description", true); + // + // Generated columns + // + this.tablePolicies.addGeneratedColumn("Description", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + TextArea area = new TextArea(); + if (itemId != null && itemId instanceof PDPPolicy) { + area.setValue(((PDPPolicy)itemId).getDescription()); + } + area.setNullRepresentation(""); + area.setWidth("100.0%"); + return area; + } + }); + */ + // + // Actions + // + this.tablePolicies.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {ADD_POLICY}; + } + return new Action[] {ADD_POLICY, REMOVE_POLICY, MAKE_ROOT, MAKE_REFERENCED}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_POLICY) { + + final SelectWorkspacePoliciesWindow policiesWindow = new SelectWorkspacePoliciesWindow(); + policiesWindow.setCaption("Select Policy to Add"); + policiesWindow.setModal(true); + policiesWindow.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // Did the user hit save? + // + if (policiesWindow.isSaved() == false) { + return; + } + // + // Get the selected policy + // + StdPDPPolicy selectedPolicy = policiesWindow.getSelectedPolicy(); + if (selectedPolicy != null) { + + // do not allow multiple copies of same policy + for (Object existingPolicy : EditPDPGroupWindow.policyContainer.getItemIds()) { + if (selectedPolicy.getId().equals(((PDPPolicy)existingPolicy).getId())) { + AdminNotification.warn("Cannot re-add Policy with the same ID (i.e. same Name, source Sub-Domain and Version)"); + return; + } + } + // copy policy to PAP + try { + papEngine.copyPolicy(selectedPolicy, self.group); + } catch (PAPException e) { + AdminNotification.warn("Unable to copy Policy '" + selectedPolicy.getPolicyId() + "' to PAP: " + e.getMessage()); + return; + } + + // add Policy to group + EditPDPGroupWindow.policyContainer.addItem(selectedPolicy); + self.markAsDirtyRecursive(); + } + } + }); + policiesWindow.center(); + UI.getCurrent().addWindow(policiesWindow); + return; + } + if (action == REMOVE_POLICY) { + assert target != null; + PDPPolicy policy = (PDPPolicy)target; + EditPDPGroupWindow.policyContainer.removeItem(policy); + self.markAsDirtyRecursive(); + return; + } + if (action == MAKE_ROOT) { + assert target != null; + assert target instanceof StdPDPPolicy; + StdPDPPolicy policy = (StdPDPPolicy)target; + EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(true); + self.markAsDirtyRecursive(); + return; + } + if (action == MAKE_REFERENCED) { + assert target != null; + assert target instanceof StdPDPPolicy; + StdPDPPolicy policy = (StdPDPPolicy)target; + EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(false); + self.markAsDirtyRecursive(); + return; + } + + AdminNotification.error("Unrecognized action '" + action + "' on target '" + target + "'"); + } + }); + } + + protected void initializePIPTable() { + if (this.group == null) { + this.tablePIP.setVisible(false); + return; + } + // + // Setup data source and GUI properties + // + this.pipContainer = new PDPPIPContainer(group); + this.tablePIP.setContainerDataSource(this.pipContainer); + this.tablePIP.setPageLength(this.pipContainer.size() + 2); + this.tablePIP.setSelectable(true); + this.tablePIP.setSizeFull(); + // + // Add the action handler + // + this.tablePIP.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + return new Action[] {EDIT_CONFIG}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == EDIT_CONFIG) { + self.editPIPConfiguration(); + return; + } + } + }); + } + + protected void editPIPConfiguration() { + final SelectPIPConfigurationWindow window = new SelectPIPConfigurationWindow(this.group); + window.setCaption("Select PIP Configurations"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save button? + // + if (window.isSaved() == false) { + return; + } + // + // Yes - save the PIP configuration + // + Set<PDPPIPConfig> configs = window.getSelectedConfigs(); + assert configs != null; + self.group.setPipConfigs(configs); + // + // Update the container + // + self.pipContainer.refresh(); + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Validate + // + self.textName.commit(); + // + // All good save everything + // + self.doSave(); + // + // mark ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (InvalidValueException e) { //NOPMD + // + // Ignore, Vaadin will display our message + // + } + } + }); + } + + protected void doSave() { + if (this.group == null) { + return; + } + StdPDPGroup updatedGroupObject = new StdPDPGroup( + this.group.getId(), + this.group.isDefaultGroup(), + this.textName.getValue(), + this.textDescription.getValue(), + null); + // replace the original set of Policies with the set from the container (possibly modified by the user) + Set<PDPPolicy> changedPolicies = new HashSet<PDPPolicy>(); + changedPolicies.addAll((Collection<PDPPolicy>) EditPDPGroupWindow.policyContainer.getItemIds()); + updatedGroupObject.setPolicies(changedPolicies); + updatedGroupObject.setPdps(this.group.getPdps()); + // replace the original set of PIP Configs with the set from the container +//TODO - get PIP Configs from a container used to support editing +// selfPDPObject.getPipConfigs().clear(); +// selfPDPObject.getPipConfigs().addAll(containerGroup.getPipConfigs()); + updatedGroupObject.setPipConfigs(this.group.getPipConfigs()); + // copy those things that the user cannot change from the original to the new object + updatedGroupObject.setStatus(this.group.getStatus()); + this.updatedObject = updatedGroupObject; + } + + public boolean isSaved() { + return this.isSaved; + } + + public String getGroupName() { + return this.textName.getValue(); + } + + public String getGroupDescription() { + return this.textDescription.getValue(); + } + + public PDPGroup getUpdatedObject() { + return this.updatedObject; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100.0%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textName + textName = new TextField(); + textName.setCaption("Group Name"); + textName.setImmediate(false); + textName.setWidth("-1px"); + textName.setHeight("-1px"); + textName.setRequired(true); + mainLayout.addComponent(textName); + + // textDescription + textDescription = new TextArea(); + textDescription.setCaption("Group Description"); + textDescription.setImmediate(false); + textDescription.setWidth("100.0%"); + textDescription.setHeight("-1px"); + textDescription.setNullSettingAllowed(true); + mainLayout.addComponent(textDescription); + mainLayout.setExpandRatio(textDescription, 1.0f); + + // tablePolicies + tablePolicies = new Table(); + tablePolicies.setCaption("Policies"); + tablePolicies.setImmediate(false); + tablePolicies.setWidth("-1px"); + tablePolicies.setHeight("-1px"); + mainLayout.addComponent(tablePolicies); + mainLayout.setExpandRatio(tablePolicies, 1.0f); + + // tablePIP + tablePIP = new Table(); + tablePIP.setCaption("PIP Configurations"); + tablePIP.setImmediate(false); + tablePIP.setWidth("-1px"); + tablePIP.setHeight("-1px"); + mainLayout.addComponent(tablePIP); + mainLayout.setExpandRatio(tablePIP, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java new file mode 100644 index 0000000..d2c40e9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java
@@ -0,0 +1,309 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.api.pap.PDP; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +import elemental.events.KeyboardEvent.KeyCode; + +public class EditPDPWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextArea textDescription; + @AutoGenerated + private TextField textName; + @AutoGenerated + private TextField textId; + /** + * + */ + private static final long serialVersionUID = 1L; + private final EditPDPWindow self = this; + private final PDP pdp; + private final List<PDPGroup> groups; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param pdp + */ + public EditPDPWindow(PDP pdp, List<PDPGroup> list) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save data + // + this.pdp = pdp; + this.groups = list; + // + // Initialize + // + this.initializeText(); + this.initializeButton(); + // + // Keyboard short + // + this.setCloseShortcut(KeyCode.ESC); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + // + // Focus + // + this.textId.focus(); + } + + protected void initializeText() { + // + // Initialize values + // + if (this.pdp != null) { + this.textId.setValue(this.pdp.getId()); + this.textName.setValue(this.pdp.getName()); + this.textDescription.setValue(this.pdp.getDescription()); + } + // + // + // + this.textId.setRequiredError("You must enter a valid id for the PDP."); + this.textId.setNullRepresentation(""); + this.textId.addValidator(new RegexpValidator("[\\w=,]", false, "Please enter a valid URL with no whitespace or \"=\" or \",\" characters.")); + this.textId.addValidator(new Validator() { + private static final long serialVersionUID = 1L; + + @Override + public void validate(Object value) throws InvalidValueException { + // + // Cannot be null + // + if (value == null || value.toString().length() == 0) { + throw new InvalidValueException("ID cannot be null."); + } + // + // Make sure its a valid URL + // + try { + new URL(value.toString()); + } catch (MalformedURLException e) { + throw new InvalidValueException("The PDP URL '" + value.toString() + "' is not a valid URL: '" + e.getMessage() +"'"); + } + } + }); + // + // + // + this.textName.setNullRepresentation(""); + this.textName.addValidator(new Validator() { + private static final long serialVersionUID = 1L; + + @Override + public void validate(Object value) throws InvalidValueException { + // + // If the value is null, set it to the id + // + if (value == null || value.toString().length() == 0) { + return; + } + } + }); + // + // + // + this.textDescription.setNullRepresentation(""); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Do a commit + // + self.textName.commit(); + self.textId.commit(); + self.textDescription.commit(); + // + // Should be a string, but to be safe + // + String id = self.textId.getValue(); + String name = self.textName.getValue(); + if (name == null || name.isEmpty()) { + self.textName.setValue(id); + name = id; + } + // + // ID must be unique. + // Also the Name must be unique AND not match any existing IDs + // because user uses the NAME to identify this PDP on the browser window, not the ID. + // + for (PDPGroup g : self.groups) { + for (PDP p : g.getPdps()) { + if (p.getId().equals(id)) { + if (self.pdp != null) { + // + // we are editing this pdp + // + continue; + } + throw new InvalidValueException("URL must be unique - the PDP '" + id + "' already exists in group '" + g.getName() + "'"); + } + if (id.equals(p.getName())) { + throw new InvalidValueException("A previous PDP with URL '" + p.getId() + "' has been given the name '" + id + + "'. Please edit that PDP to change the name before creating a nwe PDP with this URL."); + } + if (name != null && name.length() > 0 && self.pdp == null && (p.getId().equals(name) || name.equals(p.getName()))) { + throw new InvalidValueException("Name must not be the same as another PDP's name OR another PDP's URL."); + } + } + } + // + // make sure name is NOT a URL, unless it is identical to the ID. + // (If it is a URL, then a later PDP might be created with that URL as it's ID, which would be confusing.) + // + if ( ! id.equals(name)) { + try { + new URL(name); + // if we get here the name is a URL but not identical to the id, which is not good + AdminNotification.warn("The Name must not be a URL unless it is the same as the PDP URL"); + return; + } catch (Exception e) { //NOPMD + // ignore - we want to get here + } + } + // + // If we get here the inputs are ok + // + self.isSaved = true; + // + // + // + self.close(); + } catch (SourceException | InvalidValueException e1) { //NOPMD + // + // Vaadin will display error + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public String getPDPId() { + return this.textId.getValue(); + } + + public String getPDPName() { + return this.textName.getValue(); + } + + public String getPDPDescription() { + return this.textDescription.getValue(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textId + textId = new TextField(); + textId.setCaption("PDP URL"); + textId.setImmediate(false); + textId.setDescription("The URL is the ID of the PDP"); + textId.setWidth("-1px"); + textId.setHeight("-1px"); + textId.setRequired(true); + textId.setInputPrompt("Eg. http://localhost:8080/pdp"); + mainLayout.addComponent(textId); + + // textName + textName = new TextField(); + textName.setCaption("PDP Name"); + textName.setImmediate(false); + textName.setWidth("-1px"); + textName.setHeight("-1px"); + mainLayout.addComponent(textName); + + // textDescription + textDescription = new TextArea(); + textDescription.setCaption("PDP Description"); + textDescription.setImmediate(false); + textDescription.setWidth("100.0%"); + textDescription.setHeight("-1px"); + textDescription.setNullSettingAllowed(true); + mainLayout.addComponent(textDescription); + mainLayout.setExpandRatio(textDescription, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java new file mode 100644 index 0000000..b231d70 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java
@@ -0,0 +1,1078 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Map; + +import javax.xml.bind.JAXBElement; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.jpa.FunctionArgument; +import org.apache.openaz.xacml.admin.jpa.FunctionDefinition; +import org.apache.openaz.xacml.admin.model.ExpressionContainer; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.util.XACMLFunctionValidator; +import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener; +import org.apache.openaz.xacml.util.XACMLObjectCopy; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Container.ItemSetChangeEvent; +import com.vaadin.data.Container.ItemSetChangeListener; +import com.vaadin.data.Item; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.Component; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ExpressionBuilderComponent extends Window implements ApplyParametersChangedListener { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TreeTable treeExpressions; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private CheckBox checkBoxShortName; + @AutoGenerated + private Button buttonClearAll; + @AutoGenerated + private Button buttonDeleteExpression; + @AutoGenerated + private Button buttonAddExpression; + /* + * + * + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(ExpressionBuilderComponent.class); + + private static final Action ADD_EXPRESSION = new Action ("Add Expression"); + private static final Action EDIT_EXPRESSION = new Action ("Edit Expression"); + private static final Action DELETE_EXPRESSION = new Action ("Delete Expression"); + private static final Action ADD_ARGUMENT = new Action ("Add Argument"); + private static final Action EDIT_ARGUMENT = new Action ("Edit Argument"); + private static final Action DELETE_ARGUMENT = new Action ("Delete Argument"); + + private final Object[] visibleColumns = new Object[] {ExpressionContainer.PROPERTY_NAME, ExpressionContainer.PROPERTY_ID, ExpressionContainer.PROPERTY_ID_SHORT, ExpressionContainer.PROPERTY_DATATYPE, ExpressionContainer.PROPERTY_DATATYPE_SHORT}; + private final String[] columnHeaders = new String[] {"Name", "XCAML ID or Value", "XCAML ID or Value", "Data Type ID", "Data Type ID"}; + + private final ExpressionBuilderComponent self = this; + private final Object parent; + private final Map<VariableDefinitionType, PolicyType> variables; + private final ExpressionContainer container; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ExpressionBuilderComponent(Object parent, Object root, FunctionArgument argument, Map<VariableDefinitionType, PolicyType> variables) { + buildMainLayout(); +// setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save our data + // + this.parent = parent; + this.variables = variables; + this.container = new ExpressionContainer(parent, root, argument); + // + // Make sure we support the parent object + // + if (this.isSupported() == false) { + throw new IllegalArgumentException("Unsupported object type"); + } + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Finish our GUI initialization + // + this.initializeTree(); + this.initializeButtons(); + this.initializeCheckbox(); + // + // Setup the buttons + // + this.setupButtons(); + } + + private boolean isSupported() { + return this.isParentACondition() || + this.isParentAVariable() || + this.isParentAAssignment(); + } + + private boolean isParentACondition() { + return this.parent instanceof ConditionType; + } + + private boolean isParentAVariable() { + return this.parent instanceof VariableDefinitionType; + } + + private boolean isParentAAssignment() { + return this.parent instanceof AttributeAssignmentExpressionType; + } + + private void initializeTree() { + // + // Initialize GUI properties + // + this.treeExpressions.setImmediate(true); + this.treeExpressions.setSelectable(true); + // + // Initialize the data source + // + this.treeExpressions.setContainerDataSource(this.container); + this.treeExpressions.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.treeExpressions.setVisibleColumns(this.visibleColumns); + this.treeExpressions.setColumnHeaders(this.columnHeaders); + this.treeExpressions.setColumnCollapsingAllowed(true); + this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, true); + this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, true); + // + // Add our action handler + // + this.treeExpressions.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + if (self.container.size() == 0) { + return new Action[] {ADD_EXPRESSION}; + } + return null; + } + if (target instanceof ApplyType && XACMLFunctionValidator.canHaveMoreArguments((ApplyType) target)) { + return new Action[] {ADD_ARGUMENT, EDIT_EXPRESSION, DELETE_EXPRESSION}; + } + return new Action[] {EDIT_ARGUMENT, DELETE_ARGUMENT}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_EXPRESSION && target == null) { + self.addExpression(null, null); + } + if (action == EDIT_EXPRESSION && target != null) { + self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target)); + } + if (action == DELETE_EXPRESSION && target != null) { + self.deleteExpression(target); + } + if (action == ADD_ARGUMENT && target != null && target instanceof ApplyType) { + self.addArgument((ApplyType) target); + } + if (action == EDIT_ARGUMENT && target != null) { + self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target)); + } + if (action == DELETE_ARGUMENT && target != null) { + self.deleteExpression(target); + } + } + }); + // + // Listen to double-click item selections + // + this.treeExpressions.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + Object target = event.getItemId();//self.treeExpressions.getValue(); + if (target == null) { + return; + } + self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target)); + } + } + }); + // + // Listen when the user selects a row + // + this.treeExpressions.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupButtons(); + } + }); + // + // Listen to when the table contents change + // + this.treeExpressions.addItemSetChangeListener(new ItemSetChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void containerItemSetChange(ItemSetChangeEvent event) { + self.validateExpression(); + } + }); + // + // Expand columns automatically + // + this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_NAME, 1.0f); + this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_ID, 1.0f); + this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_DATATYPE, 1.0f); + // + // Expand all the children + // + for (Object id : this.treeExpressions.getItemIds()) { + this.treeExpressions.setCollapsed(id, false); + } + // + // Have a description generator + // + this.treeExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public String generateDescription(Component source, Object itemId, Object propertyId) { + if (propertyId != null && propertyId.equals(ExpressionContainer.PROPERTY_NAME) && itemId instanceof ApplyType) { + return ((ApplyType) itemId).getDescription(); + } + return null; + } + }); + } + + private void initializeButtons() { + this.buttonClearAll.setImmediate(true); + this.buttonClearAll.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.clearAllExpressions(); + } + + }); + + this.buttonAddExpression.setImmediate(true); + this.buttonAddExpression.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object selected = self.treeExpressions.getValue(); + if (selected == null) { + // + // Adding a root expression + // + self.addExpression(null, null); + } else { + // + // Adding an argument + // + if (selected instanceof ApplyType) { + // + // Get the function + // + self.addArgument((ApplyType) selected); + } + } + } + }); + + this.buttonDeleteExpression.setImmediate(true); + this.buttonDeleteExpression.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object id = self.treeExpressions.getValue(); + if (id == null) { + logger.error("Delete button clicked on null selection"); + return; + } + self.deleteExpression(id); + } + + }); + + this.buttonSave.setImmediate(true); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.setEnabled(false); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // TODO validate + // + // + // Mark that we are saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } + }); + } + + protected void initializeCheckbox() { + this.checkBoxShortName.setValue(true); + this.checkBoxShortName.setImmediate(true); + this.checkBoxShortName.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, self.checkBoxShortName.getValue()); + self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, self.checkBoxShortName.getValue()); + self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID_SHORT, ! self.checkBoxShortName.getValue()); + self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE_SHORT, ! self.checkBoxShortName.getValue()); + } + }); + } + + protected void setupButtons() { + if (this.treeExpressions.size() == 0) { + this.buttonAddExpression.setEnabled(true); + this.buttonClearAll.setEnabled(false); + this.buttonSave.setEnabled(false); + } else { + this.validateExpression(); + this.buttonAddExpression.setEnabled(false); + this.buttonClearAll.setEnabled(true); + } + Object value = this.treeExpressions.getValue(); + if (value == null) { + this.buttonDeleteExpression.setEnabled(false); + } else { + this.buttonDeleteExpression.setEnabled(true); + } + } + + protected void validateExpression() { + boolean valid = false; + boolean canHaveMore = false; + if (this.isParentACondition()) { + valid = XACMLFunctionValidator.validateCondition((ConditionType) this.parent); + canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((ConditionType) this.parent); + } else if (this.isParentAVariable()) { + valid = XACMLFunctionValidator.validateVariable((VariableDefinitionType) this.parent); + canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((VariableDefinitionType) this.parent); + } else if (this.isParentAAssignment()) { + valid = XACMLFunctionValidator.validateAssignment((AttributeAssignmentExpressionType)this.parent); + canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((AttributeAssignmentExpressionType) this.parent); + } + if (logger.isDebugEnabled()) { + logger.debug("valid: " + valid + " canHaveMore: " + canHaveMore); + } +// this.buttonAddExpression.setEnabled(canHaveMore); + this.buttonSave.setEnabled(valid); + } + + protected void addArgument(final ApplyType parentApply) { + // + // Get the function + // + FunctionDefinition function = JPAUtils.findFunction(parentApply.getFunctionId()); + if (function != null) { + FunctionArgument argument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size() + 1, function); + if (logger.isDebugEnabled()) { + logger.debug("Add Argument: " + argument); + } + assert argument != null; + // + // Is this a high order bag function? And it's data type not defined? (most likely) + // + if (function.isHigherOrder() && argument.getDatatypeBean() == null) { + if (logger.isDebugEnabled()) { + logger.debug("isHighOrder and a null datatype bean"); + } + // + // Get what the data type restriction should be + // + try { + assert parentApply.getExpression().size() > 0; + JAXBElement<?> element = parentApply.getExpression().get(0); + assert element != null && element.getValue() != null; + Object declaredFunction = element.getValue(); + assert declaredFunction instanceof FunctionType; + FunctionDefinition declaredFunctionDefinition = JPAUtils.findFunction(((FunctionType) declaredFunction).getFunctionId()); + assert declaredFunctionDefinition != null; + if (logger.isDebugEnabled()) { + logger.debug("declaredFunction is: " + declaredFunctionDefinition); + } + FunctionArgument declaredFunctionArgument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size(), declaredFunctionDefinition); + assert declaredFunctionArgument != null; + if (logger.isDebugEnabled()) { + logger.debug("declaredFunctionArgument is: " + declaredFunctionArgument); + } + // + // Copy the argument + // + argument = new FunctionArgument(argument); + argument.setDatatypeBean(declaredFunctionArgument.getDatatypeBean()); + } catch (Exception e) { + logger.error("Exception while determining parent apply's FunctionType argument datatype."); + } + + } + self.addExpression(parentApply, argument); + } else { + AdminNotification.error("ApplyType does not have a function defined. Please define that first."); + } + + } + + protected void addExpression(final ApplyType parentApply, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("Adding Expression: " + parentApply + " arg: " + argument); + } + // + // First we need to select what Expression They want + // + final ExpressionSelectionWindow selector = new ExpressionSelectionWindow(parentApply, + this.isParentAAssignment(), + (argument != null ? argument.isBag() : false), + (argument != null ? ! argument.isBag() : false)); + selector.setCaption("Select the Expression Type"); + selector.setModal(true); + selector.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Was something selected? + // + String selection = selector.getSelection(); + if (selection == null) { + return; + } + // + // What did the user select? + // + if (selection.equals(ExpressionSelectionWindow.OPTION_APPLY)) { + // + self.editApply(new ApplyType(), parentApply, argument); + // + } else if (selection.equals(ExpressionSelectionWindow.OPTION_DESIGNATOR)) { + // + self.editAttribute(new AttributeDesignatorType(), parentApply, argument); + // + } else if (selection.equals(ExpressionSelectionWindow.OPTION_SELECTOR) ) { + // + self.editAttribute(new AttributeSelectorType(), parentApply, argument); + // + } else if (selection.equals(ExpressionSelectionWindow.OPTION_VALUE)) { + // + self.editValue(new AttributeValueType(), parentApply, argument); + // + } else if (selection.equals(ExpressionSelectionWindow.OPTION_VARIABLE)) { + // + self.editVariable(new VariableReferenceType(), parentApply, argument); + // + } + } + }); + selector.center(); + UI.getCurrent().addWindow(selector); + } + + protected void editApply(final ApplyType apply, final ApplyType parent, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("editApply: " + apply + " parent: " + parent + " :" + argument); + } + // + // Copy the apply and create its window + // + final ApplyType copyApply = XACMLObjectCopy.copy(apply); + final ApplyEditorWindow window = new ApplyEditorWindow(copyApply, parent, argument, self.parent); + window.setCaption("Edit The Apply Expression"); + window.setModal(true); + // + // Set ourselves as an ApplyParametersChanged listener + // + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (window.isSaved() == false) { + return; + } + // + // Copy back the apply + // + apply.setDescription(copyApply.getDescription()); + apply.setFunctionId(copyApply.getFunctionId()); + // + // Get the function information + // + FunctionDefinition function = JPAUtils.findFunction(apply.getFunctionId()); + assert function != null; + // + // Is this a new Apply? + // + if (self.container.containsId(apply)) { + // + // No - we are updating + // + self.container.updateItem(apply); + } else { + // + // Is this a higher-order bag function? + // + if (function.isHigherOrder()) { + // + // Have the user select a function for it + // + final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow(null); + functionSelection.setCaption("Select Function"); + functionSelection.setModal(true); + functionSelection.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (functionSelection.isSaved() == false) { + return; + } + // + // Get the function + // + String function = functionSelection.getSelectedFunction(); + if (function == null || function.isEmpty()) { + logger.error("Function window said it was saved, but there was no function."); + return; + } + // + // Create the function object + // + FunctionType hoFunction = new FunctionType(); + hoFunction.setFunctionId(function); + // + // Add it into the apply + // + apply.getExpression().add(new ObjectFactory().createFunction(hoFunction)); + // + // New Item + // + Item item = self.container.addItem(apply, parent, argument); + assert item != null; + self.treeExpressions.setCollapsed(apply, false); + self.treeExpressions.select(apply); + } + }); + functionSelection.center(); + UI.getCurrent().addWindow(functionSelection); + } else { + // + // New Item + // + Item item = self.container.addItem(apply, parent, argument); + assert item != null; + self.treeExpressions.setCollapsed(apply, false); + self.treeExpressions.select(apply); + } + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editAttribute(final Object target, final ApplyType parent, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("editAttribute: " + target + " parent: " + parent + " :" + argument); + } + // + // Determine what the data type needs to be + // + Datatype datatype = null; + if (parent == null && this.isParentACondition()) { + datatype = JPAUtils.getBooleanDatatype(); + } else { + if (argument != null) { + datatype = argument.getDatatypeBean(); + } + } + // + // Copy the attribute + // + final Object copyAttribute = XACMLObjectCopy.deepCopy(target); + // + // Create the window + // + final AttributeSelectionWindow window = new AttributeSelectionWindow(datatype, copyAttribute); + if (target instanceof AttributeDesignatorType) { + window.setCaption("Edit Designator " + (((AttributeDesignatorType) target).getAttributeId() != null ? ((AttributeDesignatorType) target).getAttributeId() : "")); + } else { + window.setCaption("Edit Selector " + (((AttributeSelectorType) target).getContextSelectorId() != null ? ((AttributeSelectorType) target).getContextSelectorId() : "")); + } + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user hit save? + // + if (window.isSaved() == false) { + return; + } + // + // Grab the attribute + // + Attribute attribute = window.getAttribute(); + if (attribute == null) { + return; + } + // + // Save it back into the original + // + if (target instanceof AttributeDesignatorType) { + ((AttributeDesignatorType)target).setAttributeId(attribute.getXacmlId()); + ((AttributeDesignatorType)target).setCategory(attribute.getCategoryBean().getXacmlId()); + ((AttributeDesignatorType)target).setDataType(attribute.getDatatypeBean().getXacmlId()); + ((AttributeDesignatorType)target).setIssuer(attribute.getIssuer()); + ((AttributeDesignatorType)target).setMustBePresent(attribute.isMustBePresent()); + } else { + ((AttributeSelectorType)target).setContextSelectorId(attribute.getXacmlId()); + ((AttributeSelectorType)target).setCategory(attribute.getCategoryBean().getXacmlId()); + ((AttributeSelectorType)target).setDataType(attribute.getDatatypeBean().getXacmlId()); + ((AttributeSelectorType)target).setPath(attribute.getSelectorPath()); + ((AttributeSelectorType)target).setMustBePresent(attribute.isMustBePresent()); + } + // + // Is this a new item? + // + if (self.container.containsId(target)) { + // + // No, just update the container + // + self.container.updateItem(target); + } else { + // + // Yes a new item, add it in + // + //assert(self.container.addItem(JPAUtils.createDesignator(attribute), parent, argument) != null); + Item item = self.container.addItem(target, parent, argument); + assert item != null; + self.treeExpressions.select(target); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editValue(final AttributeValueType value, final ApplyType parent, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("editvalue: " + value + " parent: " + parent + " :" + argument); + } + // + // Copy the attribute value + // + final AttributeValueType copyValue = XACMLObjectCopy.copy(value); + // + // Get what the datatype should be + // + Datatype datatypeRestriction = null; + // + // Is this a root? + // + if (parent == null) { + // + // Check if our parent container is a condition + // + if (self.isParentACondition()) { + // + // We are only allowed to return boolean's + // + datatypeRestriction = JPAUtils.getBooleanDatatype(); + } + } else { + // + // Are we an argument? + // + if (argument != null) { + // + // Yes - we are restricted to that argument's datatype + // + datatypeRestriction = argument.getDatatypeBean(); + } + } + // + // Create the window + // + final AttributeValueEditorWindow window = new AttributeValueEditorWindow(copyValue, datatypeRestriction); + window.setCaption("Edit Attribute Value"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Yes - get the value + // + value.getContent().clear(); + for (Object o : copyValue.getContent()) { + value.getContent().add(o); + } + value.setDataType(copyValue.getDataType()); + // + // Was this a new value? + // + if (self.container.containsId(value)) { + // + // No - update it + // + self.container.updateItem(value); + } else { + // + // Yes - add it in + // + Item item = self.container.addItem(value, parent, argument); + assert item != null; + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editVariable(final VariableReferenceType variable, final ApplyType parent, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("editVariable: " + variable + " parent: " + parent + " :" + argument); + } + // + // Copy the variable + // + final VariableReferenceType copyVariable = XACMLObjectCopy.copy(variable); + // + // Create the window + // + final VariableReferenceEditorWindow window = new VariableReferenceEditorWindow(copyVariable, this.variables); + window.setCaption("Edit Variable Reference"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Copy the variable changes back + // + variable.setVariableId(copyVariable.getVariableId()); + // + // Is this a new one? + // + if (self.container.containsId(variable)) { + // + // No - update it + // + self.container.updateItem(variable); + } else { + // + // Yes - add it + // + Item item = self.container.addItem(variable, parent, argument); + assert item != null; + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editFunction(final FunctionType func, final ApplyType parent, final FunctionArgument argument) { + if (logger.isDebugEnabled()) { + logger.debug("editFunction: " + func + " parent: " + parent + " :" + argument); + } + + final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow((func != null ? func.getFunctionId() : null)); + functionSelection.setCaption("Edit Function"); + functionSelection.setModal(true); + functionSelection.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (functionSelection.isSaved() == false) { + return; + } + // + // Get the function + // + String function = functionSelection.getSelectedFunction(); + if (function == null || function.isEmpty()) { + logger.error("Function window said it was saved, but there was no function."); + return; + } + // + // New one? + // + if (func == null) { + // + // Create the function object + // + FunctionType hoFunction = new FunctionType(); + hoFunction.setFunctionId(function); + // + // Add it into the apply + // + assert parent.getExpression().size() == 0; + parent.getExpression().add(new ObjectFactory().createFunction(hoFunction)); + // + // New Item + // + Item item = self.container.addItem(func, parent, argument); + assert item != null; + self.treeExpressions.setCollapsed(parent, false); + self.treeExpressions.select(func); + } else { + // + // Editing an existing + // + func.setFunctionId(function); + self.container.updateItem(func); + // + // Warn user + // + if (parent.getExpression().size() > 1) { + AdminNotification.warn("You have updated the function ID. The rest of the arguments may be invalid for the function. Please verify the other arguments."); + } + } + } + }); + functionSelection.center(); + UI.getCurrent().addWindow(functionSelection); + } + + protected void editExpression(final Object target, final ApplyType parent, final FunctionArgument argument) { + if (target instanceof ApplyType) { + // + this.editApply((ApplyType) target, parent, argument); + // + } else if (target instanceof AttributeValueType) { + // + this.editValue((AttributeValueType) target,parent, argument); + // + } else if (target instanceof AttributeDesignatorType || target instanceof AttributeSelectorType) { + // + this.editAttribute(target, parent, argument); + // + } else if (target instanceof VariableReferenceType) { + // + this.editVariable((VariableReferenceType) target, parent, argument); + // + } else if (target instanceof FunctionType) { + // + this.editFunction((FunctionType) target, parent, argument); + // + } + } + + protected void deleteExpression(Object target) { + if (this.container.isRoot(target)) { + if (this.treeExpressions.removeAllItems() == false) { + logger.error("Failed to remove everything."); + } + } else { + if (this.treeExpressions.removeItem(target) == false) { + logger.error("Failed to remove " + target); + } + } + this.setupButtons(); + } + + protected void clearAllExpressions() { + if (this.treeExpressions.removeAllItems() == false) { + logger.error("Failed to remove everything."); + } + this.setupButtons(); + } + + @Override + public void applyParameterChanged(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) { + logger.info("applyParameterChanged: " + apply + " " + parent + " " + argument + " " + container); + // + // TODO - figure out if this something being edited, or a new one + // + } + + public boolean isSaved() { + return this.isSaved; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + mainLayout.setExpandRatio(horizontalLayout_1, 1.0f); + + // treeExpressions + treeExpressions = new TreeTable(); + treeExpressions.setImmediate(false); + treeExpressions.setWidth("100.0%"); + treeExpressions.setHeight("-1px"); + mainLayout.addComponent(treeExpressions); + mainLayout.setExpandRatio(treeExpressions, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // buttonAddExpression + buttonAddExpression = new Button(); + buttonAddExpression.setCaption("Add Expression"); + buttonAddExpression.setImmediate(true); + buttonAddExpression.setWidth("-1px"); + buttonAddExpression.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonAddExpression); + + // buttonDeleteExpression + buttonDeleteExpression = new Button(); + buttonDeleteExpression.setCaption("Delete Expression"); + buttonDeleteExpression.setImmediate(true); + buttonDeleteExpression.setWidth("-1px"); + buttonDeleteExpression.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonDeleteExpression); + + // buttonClearAll + buttonClearAll = new Button(); + buttonClearAll.setCaption("Clear All"); + buttonClearAll.setImmediate(true); + buttonClearAll.setDescription("Clears all the expressions."); + buttonClearAll.setWidth("-1px"); + buttonClearAll.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonClearAll); + + // checkBoxShortName + checkBoxShortName = new CheckBox(); + checkBoxShortName.setCaption("Display Short XACML ID's"); + checkBoxShortName.setImmediate(false); + checkBoxShortName + .setDescription("If checked, the right-most string of the function and datatype URI's will only be displayed."); + checkBoxShortName.setWidth("-1px"); + checkBoxShortName.setHeight("-1px"); + horizontalLayout_1.addComponent(checkBoxShortName); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java new file mode 100644 index 0000000..0ee6eea --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java
@@ -0,0 +1,90 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.Tree; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ExpressionEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Tree treeExpression; + @AutoGenerated + private ComboBox comboBox; + /** + * + */ + private static final long serialVersionUID = 1L; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ExpressionEditorWindow() { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + + // TODO add user code here + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // comboBox + comboBox = new ComboBox(); + comboBox.setImmediate(false); + comboBox.setWidth("-1px"); + comboBox.setHeight("-1px"); + mainLayout.addComponent(comboBox); + + // treeExpression + treeExpression = new Tree(); + treeExpression.setImmediate(false); + treeExpression.setWidth("100.0%"); + treeExpression.setHeight("-1px"); + mainLayout.addComponent(treeExpression); + mainLayout.setExpandRatio(treeExpression, 1.0f); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java new file mode 100644 index 0000000..d7bfeb0 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java
@@ -0,0 +1,170 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ExpressionSelectionWindow extends Window { + + public static String OPTION_APPLY = "Apply"; + public static String OPTION_VALUE = "Attribute Value"; + public static String OPTION_DESIGNATOR = "Attribute Designator"; + public static String OPTION_SELECTOR = "Attribute Selector"; + public static String OPTION_VARIABLE = "Variable Reference"; + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private OptionGroup optionGroupExpression; + /** + * + */ + private static final long serialVersionUID = 1L; + private final ExpressionSelectionWindow self = this; + boolean isSaved = false; + String selection = null; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param parentApply + */ + // TODO - Refactor. Unused formal parameter parentApply. Either determine + // whether this is unnecessary and remove it (including removing it from all + // constructor consumers), or use it. + // NOTE: parentApply was originally used by passing to private initializeOption method. + // However, the parameter was unused by that method also. + // Setting to NOPMD for now. + public ExpressionSelectionWindow(ApplyType parentApply, boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) { //NOPMD + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Finish GUI initialization + // + // this.initializeOption(parentApply, isAttributeAssignment, mustBeBag, mustBeValue); + this.initializeOption(isAttributeAssignment, mustBeBag, mustBeValue); + this.initializeButtons(); + } + + // private void initializeOption(ApplyType parentApply, boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) { + private void initializeOption(boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) { +// if (!isAttributeAssignment) { + this.optionGroupExpression.addItem(OPTION_APPLY); +// } + if (!mustBeBag || mustBeValue) { + this.optionGroupExpression.addItem(OPTION_VALUE); + } + if (mustBeBag || !mustBeValue) { + this.optionGroupExpression.addItem(OPTION_DESIGNATOR); + this.optionGroupExpression.addItem(OPTION_SELECTOR); + } + this.optionGroupExpression.addItem(OPTION_VARIABLE); + // + // Default Selection + // + if (!isAttributeAssignment) { + this.optionGroupExpression.select(OPTION_APPLY); + } else { + if (!mustBeBag || mustBeValue) { + this.optionGroupExpression.select(OPTION_VALUE); + } else { + this.optionGroupExpression.select(OPTION_DESIGNATOR); + } + } + } + + private void initializeButtons() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.isSaved = true; + self.selection = self.optionGroupExpression.getValue().toString(); + self.close(); + } + }); + } + + public String getSelection() { + if (this.isSaved == false) { + return null; + } + return this.selection; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // optionGroupExpression + optionGroupExpression = new OptionGroup(); + optionGroupExpression + .setCaption("Select One Of The Following Types of Expressions"); + optionGroupExpression.setImmediate(false); + optionGroupExpression.setWidth("-1px"); + optionGroupExpression.setHeight("-1px"); + mainLayout.addComponent(optionGroupExpression); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Select"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(24)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java new file mode 100644 index 0000000..80d33b8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
@@ -0,0 +1,314 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.filter.SimpleStringFilter; +import com.vaadin.data.util.sqlcontainer.SQLContainer; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class FunctionSelectionWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private Table tableFunctions; + @AutoGenerated + private TextField textFieldFilter; + /** + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(FunctionSelectionWindow.class); + private final FunctionSelectionWindow self = this; + private final String defaultFunctionID; + private String selectedFunction = null; + private boolean isSaved = false; + private static SQLContainer highOrderFunctions = ((XacmlAdminUI) UI.getCurrent()).getHigherOrderBagContainer(); + /* + * Seems that when this view is created it may or may not be upper case. + */ + private static String PROPERTY_SHORTNAME = "shortname"; + private static String PROPERTY_XACMLID = "xacmlid"; + + static { + for (Object prop : FunctionSelectionWindow.highOrderFunctions.getContainerPropertyIds()) { + logger.info("SQL Container Property Id: " + prop.toString()); + if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) { + PROPERTY_SHORTNAME = prop.toString(); + } else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) { + PROPERTY_XACMLID = prop.toString(); + } + } + + } + + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public FunctionSelectionWindow(String defaultFunction) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.defaultFunctionID = defaultFunction; + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeTextField(); + this.initializeFunctions(); + this.initializeButtons(); + // + // Set our focus + // + this.tableFunctions.focus(); + } + + protected void initializeTextField() { + // + // Initialize GUI settings + // + this.textFieldFilter.setImmediate(true); + // + // Respond to the text change events + // + this.textFieldFilter.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + SimpleStringFilter currentFilter = null; + + @Override + public void textChange(TextChangeEvent event) { + // + // Remove current filter + // + if (this.currentFilter != null) { + FunctionSelectionWindow.highOrderFunctions.removeContainerFilter(this.currentFilter); + this.currentFilter = null; + } + // + // Get the text + // + String value = event.getText(); + if (value != null && value.length() > 0) { + // + // Add the new filter + // + this.currentFilter = new SimpleStringFilter(PROPERTY_SHORTNAME, value, true, false); + FunctionSelectionWindow.highOrderFunctions.addContainerFilter(this.currentFilter); + } + } + }); + } + protected void initializeFunctions() { + // + // Setup data source. Make sure there are no current filters + // + FunctionSelectionWindow.highOrderFunctions.removeAllContainerFilters(); + this.tableFunctions.setContainerDataSource(FunctionSelectionWindow.highOrderFunctions); + // + // Initialize GUI properties + // + this.tableFunctions.setImmediate(true); + this.tableFunctions.setNullSelectionAllowed(false); + this.tableFunctions.setRequired(true); + this.tableFunctions.setRequiredError("Please select a function."); + this.tableFunctions.setSelectable(true); + this.tableFunctions.setPageLength(15); + this.tableFunctions.setVisibleColumns(new Object[] {PROPERTY_SHORTNAME, PROPERTY_XACMLID}); + this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"}); + // + // Respond to selection events + // + this.tableFunctions.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object id = self.tableFunctions.getValue(); + if (id != null) { + Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id); + if (item == null) { + return; + } + Property<?> property = item.getItemProperty(PROPERTY_XACMLID); + if (property == null) { + return; + } + selectedFunction = property.getValue().toString(); + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + }); + // + // Respond to double-click events + // + this.tableFunctions.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + self.doSave(); + } + } + }); + // + // Setup the default selection + // + this.buttonSave.setEnabled(false); + if (this.defaultFunctionID != null) { + for (Object id : FunctionSelectionWindow.highOrderFunctions.getItemIds()) { + Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id); + if (item != null) { + Property<?> property = item.getItemProperty(PROPERTY_XACMLID); + if (property != null && property.getValue().toString().equals(this.defaultFunctionID)) { + this.tableFunctions.select(id); + break; + } + } + } + } + } + + protected void initializeButtons() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.doSave(); + } + }); + } + + protected void doSave() { + try { + // + // Commit changes + // + self.tableFunctions.commit(); + // + // We are saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Nothing to do, Vaadin highlights + // + } + } + + public boolean isSaved() { + return this.isSaved; + } + + public String getSelectedFunction() { + return this.selectedFunction; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldFilter + textFieldFilter = new TextField(); + textFieldFilter.setCaption("Filter"); + textFieldFilter.setImmediate(false); + textFieldFilter.setWidth("-1px"); + textFieldFilter.setHeight("-1px"); + mainLayout.addComponent(textFieldFilter); + + // tableFunctions + tableFunctions = new Table(); + tableFunctions.setImmediate(false); + tableFunctions.setDescription("Functions To Select From"); + tableFunctions.setWidth("100.0%"); + tableFunctions.setHeight("-1px"); + mainLayout.addComponent(tableFunctions); + mainLayout.setExpandRatio(tableFunctions, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java new file mode 100644 index 0000000..cd75c07 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
@@ -0,0 +1,67 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.VerticalLayout; + +public class GitConflictResolver extends CustomComponent { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + /** + * + */ + private static final long serialVersionUID = 1L; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public GitConflictResolver() { + buildMainLayout(); + setCompositionRoot(mainLayout); + + // TODO add user code here + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java new file mode 100644 index 0000000..492d8b9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
@@ -0,0 +1,356 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheEntry; +import org.eclipse.jgit.errors.NoWorkTreeException; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.model.GitStatusContainer; +import org.apache.openaz.xacml.admin.model.GitStatusContainer.GitEntry; +import org.apache.openaz.xacml.admin.model.GitStatusContainer.StatusItem; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Item; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; +import com.vaadin.ui.Table.ColumnGenerator; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class GitPushWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonPush; + @AutoGenerated + private Table tableChanges; + @AutoGenerated + private TextArea textAreaComments; + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(GitPushWindow.class); + private final GitPushWindow self = this; + private final GitStatusContainer container; + private final Git git; + private final File target; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param git + * @param status + */ + public GitPushWindow(Git git, File target, Status status) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save data + // + this.git = git; + this.target = target; + this.container = new GitStatusContainer(status); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeText(); + this.initializeTable(status); + this.initializeButtons(); + // + // Focus + // + this.textAreaComments.focus(); + } + + protected void initializeText() { + this.textAreaComments.setImmediate(true); + this.textAreaComments.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText().isEmpty()) { + self.buttonPush.setEnabled(false); + } else { + if (self.container.getConflictCount() == 0) { + self.buttonPush.setEnabled(true); + } else { + self.buttonPush.setEnabled(false); + } + } + } + }); + } + + protected void initializeTable(Status status) { + // + // Setup the table + // + this.tableChanges.setContainerDataSource(this.container); + this.tableChanges.setPageLength(this.container.size()); + this.tableChanges.setImmediate(true); + // + // Generate column + // + this.tableChanges.addGeneratedColumn("Entry", new ColumnGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public Object generateCell(Table source, Object itemId, Object columnId) { + Item item = self.container.getItem(itemId); + assert item != null; + if (item instanceof StatusItem) { + return self.generateGitEntryComponent(((StatusItem) item).getGitEntry()); + } + assert item instanceof StatusItem; + return null; + } + }); + } + + protected Object generateGitEntryComponent(final GitEntry entry) { + // + // If its conflicting, take care of it + // + if (entry.isConflicting()) { + return this.generateConflictingEntry(entry); + } + if (entry.isUntracked()) { + return this.generateUntrackedEntry(entry); + } + /* + if (entry.isChanged() || + entry.isModified() || + entry.isUncommitted()) { + return this.generateUncommittedEntry(entry); + } + */ + return null; + } + + protected Object generateConflictingEntry(final GitEntry entry) { + Button resolve = new Button("Resolve"); + resolve.setImmediate(true); + resolve.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + + } + }); + return resolve; + } + + protected Object generateUntrackedEntry(final GitEntry entry) { + Button add = new Button("Add"); + add.setImmediate(true); + add.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + DirCache cache = self.git.add().addFilepattern(entry.getName()).call(); + DirCacheEntry cacheEntry = cache.getEntry(entry.getName()); + assert cacheEntry != null; + if (cacheEntry == null) { + return; + } + if (cacheEntry.isMerged()) { + self.refreshStatus(); + } + } catch (GitAPIException e) { + String error = "Failed to add: " + e.getLocalizedMessage(); + logger.error(error); + AdminNotification.error(error); + } + } + }); + return add; + } + + protected Object generateUncommittedEntry(final GitEntry entry) { + Button commit = new Button("Commit"); + commit.setImmediate(true); + commit.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + } + }); + return commit; + } + + protected void initializeButtons() { + this.buttonPush.setEnabled(false); + this.buttonPush.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textAreaComments.commit(); + // + // Mark as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch(SourceException | InvalidValueException idontcare) { //NOPMD + // + // Vaadin will highlight the failed requirement or validation + // + } + } + }); + } + + protected void refreshStatus() { + try { + // + // Grab our working repository + // + Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath(); + final Git git = Git.open(repoPath.toFile()); + // + // Get our status + // + final String base; + Status status; + if (target == null) { + base = "."; + } else { + Path relativePath = repoPath.relativize(Paths.get(target.getPath())); + base = relativePath.toString(); + } + if (logger.isDebugEnabled()) { + logger.debug("Status on base: " + base); + } + status = git.status().addPath(base).call(); + // + // Pass it to our container + // + this.container.refreshStatus(status); + this.tableChanges.refreshRowCache(); + } catch (NoWorkTreeException | IOException | GitAPIException e) { + String error = "Failed to refresh status: " + e.getLocalizedMessage(); + logger.error(error); + } + } + + public boolean isSaved() { + return this.isSaved; + } + + public String getComment() { + return this.textAreaComments.getValue(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textAreaComments + textAreaComments = new TextArea(); + textAreaComments.setCaption("Add Comments"); + textAreaComments.setImmediate(false); + textAreaComments + .setDescription("Enter comments that reflect the changes you have made to the repository domains and/or policy files."); + textAreaComments.setWidth("400px"); + textAreaComments.setHeight("-1px"); + textAreaComments.setInvalidAllowed(false); + textAreaComments.setRequired(true); + textAreaComments + .setInputPrompt("Eg. Add new rule for employees in marketing department."); + mainLayout.addComponent(textAreaComments); + + // tableChanges + tableChanges = new Table(); + tableChanges.setCaption("Changes To Be Pushed"); + tableChanges.setImmediate(false); + tableChanges.setWidth("100.0%"); + tableChanges.setHeight("-1px"); + mainLayout.addComponent(tableChanges); + mainLayout.setExpandRatio(tableChanges, 1.0f); + + // buttonPush + buttonPush = new Button(); + buttonPush.setCaption("Push Changes"); + buttonPush.setImmediate(true); + buttonPush.setWidth("-1px"); + buttonPush.setHeight("-1px"); + mainLayout.addComponent(buttonPush); + mainLayout.setComponentAlignment(buttonPush, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java new file mode 100644 index 0000000..da2edf7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
@@ -0,0 +1,158 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.IOException; +import java.nio.file.Path; + +import org.eclipse.jgit.api.Git; +// import org.eclipse.jgit.api.MergeResult; +import org.eclipse.jgit.api.PullResult; +// import org.eclipse.jgit.api.RebaseResult; +import org.eclipse.jgit.api.errors.GitAPIException; +// import org.eclipse.jgit.transport.FetchResult; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class GitSynchronizeWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSynchronize; + @AutoGenerated + private TextArea textAreaResults; + /** + * + */ + private static final long serialVersionUID = 1L; + private final GitSynchronizeWindow self = this; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public GitSynchronizeWindow() { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // + // + this.initializeButtons(); + } + + protected void initializeButtons() { + this.buttonSynchronize.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + if (self.buttonSynchronize.getCaption().equals("Synchronize")) { + self.synchronize(); + } else { + self.close(); + } + } + }); + } + + protected void synchronize() { + // + // Grab our working repository + // + Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath(); + try { + final Git git = Git.open(repoPath.toFile()); + + PullResult result = git.pull().call(); + // FetchResult fetch = result.getFetchResult(); + // MergeResult merge = result.getMergeResult(); + // RebaseResult rebase = result.getRebaseResult(); + if (result.isSuccessful()) { + // + // TODO add more notification + // + this.textAreaResults.setValue("Successful!"); + } else { + // + // TODO + // + this.textAreaResults.setValue("Failed."); + } + } catch (IOException | GitAPIException e) { + e.printStackTrace(); + } + this.buttonSynchronize.setCaption("Ok"); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textAreaResults + textAreaResults = new TextArea(); + textAreaResults.setCaption("Synch Results"); + textAreaResults.setImmediate(false); + textAreaResults.setWidth("462px"); + textAreaResults.setHeight("222px"); + mainLayout.addComponent(textAreaResults); + + // buttonSynchronize + buttonSynchronize = new Button(); + buttonSynchronize.setCaption("Synchronize"); + buttonSynchronize.setImmediate(true); + buttonSynchronize.setWidth("-1px"); + buttonSynchronize.setHeight("-1px"); + mainLayout.addComponent(buttonSynchronize); + mainLayout.setComponentAlignment(buttonSynchronize, new Alignment(24)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java new file mode 100644 index 0000000..eafb7e0 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
@@ -0,0 +1,304 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.Datatype; +import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Item; +import com.vaadin.data.Property; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.filter.Compare; +import com.vaadin.data.util.sqlcontainer.SQLContainer; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class MatchEditorWindow extends Window implements AttributeChangedEventListener { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private Table tableFunctions; + /** + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(MatchEditorWindow.class); + private final MatchEditorWindow self = this; + private final MatchType match; + private final Datatype datatype; + private boolean isSaved = false; + private static SQLContainer matchFunctions = ((XacmlAdminUI) UI.getCurrent()).getMatchFunctionContainer(); + + private static String PROPERTY_SHORTNAME = "shortname"; + private static String PROPERTY_XACMLID = "xacmlid"; + private static String PROPERTY_ARG2_DATATYPE = "arg2_datatype"; + + static { + // + // H2 seems to insist on capitalizing, even with the no uppercase switch. + // + for (Object prop : MatchEditorWindow.matchFunctions.getContainerPropertyIds()) { + logger.info("SQL Container Property Id: " + prop.toString()); + if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) { + PROPERTY_SHORTNAME = prop.toString(); + } else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) { + PROPERTY_XACMLID = prop.toString(); + } else if (prop.toString().equalsIgnoreCase(PROPERTY_ARG2_DATATYPE)) { + PROPERTY_ARG2_DATATYPE = prop.toString(); + } + } + + } + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public MatchEditorWindow(MatchType match, Datatype datatype) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save our data + // + this.match = match; + this.datatype = datatype; + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeFunctions(); + this.initializeButtons(); + // + // Set our focus + // + this.tableFunctions.focus(); + } + + protected void initializeFunctions() { + // + // Setup datasource and GUI properties + // + this.tableFunctions.setContainerDataSource(MatchEditorWindow.matchFunctions); + this.tableFunctions.setImmediate(true); + this.tableFunctions.setNullSelectionAllowed(false); + this.tableFunctions.setRequired(true); + this.tableFunctions.setRequiredError("Please select a function."); + this.tableFunctions.setSelectable(true); + this.tableFunctions.setPageLength(15); + this.tableFunctions.setVisibleColumns(PROPERTY_SHORTNAME, PROPERTY_XACMLID); + this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"}); + // + // Filter out functions where ARG2 is the given datatype. NOTE: The + // AttributeDesignator/AttributeSelector is the 2nd argument. + // + MatchEditorWindow.matchFunctions.removeAllContainerFilters(); + MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, this.datatype.getId())); + // + // Respond to selection events + // + this.tableFunctions.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object id = self.tableFunctions.getValue(); + if (id != null) { + Item item = MatchEditorWindow.matchFunctions.getItem(id); + if (item == null) { + return; + } + Property<?> property = item.getItemProperty(PROPERTY_XACMLID); + if (property == null) { + return; + } + self.match.setMatchId(property.getValue().toString()); + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + }); + // + // Respond to double-click events + // + this.tableFunctions.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + self.doSave(); + } + } + }); + // + // Default selection + // + this.buttonSave.setEnabled(false); + if (this.match.getMatchId() != null) { + for (Object id : MatchEditorWindow.matchFunctions.getItemIds()) { + Item item = MatchEditorWindow.matchFunctions.getItem(id); + if (item != null) { + Property<?> property = item.getItemProperty(PROPERTY_XACMLID); + if (property != null && property.getValue().toString().equals(this.match.getMatchId())) { + this.tableFunctions.select(id); + break; + } + } + } + } + } + + protected void initializeButtons() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.doSave(); + } + }); + } + + protected void doSave() { + try { + // + // Commit changes + // + self.tableFunctions.commit(); + // + // We are saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { + return; + } + } + + @Override + public void attributeChanged(Attribute attribute) { + if (logger.isDebugEnabled()) { + logger.debug("attributeChanged: " + attribute); + } + // + // Remove all filters. + // + MatchEditorWindow.matchFunctions.removeAllContainerFilters(); + if (attribute == null) { + return; + } + // + // Get the datatype for the attribute + // + Datatype datatype = attribute.getDatatypeBean(); + if (logger.isDebugEnabled()) { + logger.debug("datatype: " + datatype.getId()); + } + // + // Filter out functions where ARG2 is the datatype. The + // AttributeDesignator/AttributeSelector is the 2nd arg. + // + MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, datatype.getId())); + } + + public boolean isSaved() { + return this.isSaved; + } + + public MatchType getMatch() { + return this.match; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // tableFunctions + tableFunctions = new Table(); + tableFunctions.setCaption("Function"); + tableFunctions.setImmediate(true); + tableFunctions + .setDescription("Select a function for matching the attribute."); + tableFunctions.setWidth("100.0%"); + tableFunctions.setHeight("-1px"); + tableFunctions.setInvalidAllowed(false); + tableFunctions.setRequired(true); + mainLayout.addComponent(tableFunctions); + mainLayout.setExpandRatio(tableFunctions, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java new file mode 100644 index 0000000..960a2b7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
@@ -0,0 +1,184 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.openaz.xacml.admin.jpa.Obadvice; +import org.apache.openaz.xacml.admin.view.fields.OaExpressionsField; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.fieldgroup.FieldGroup; +import com.vaadin.data.fieldgroup.FieldGroup.CommitException; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Window; + +public class ObadviceEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + private static final long serialVersionUID = 1L; + private ObadviceEditorWindow self = this; + + private FormLayout mainLayout = new FormLayout(); + + @PropertyId("type") + OptionGroup typeOption = new OptionGroup("Type"); + + @PropertyId("xacmlId") + TextField xacmlID = new TextField("Obligation Id"); + + @PropertyId("description") + TextArea descriptionField = new TextArea("Description"); + + @PropertyId("fulfillOn") + OptionGroup fulfillOption = new OptionGroup("Fullfill On"); + + @PropertyId("obadviceExpressions") + OaExpressionsField expressionsField; + //Table tableExpressions = new Table("Attribute Assignments"); + + Button saveButton = new Button("Save"); + + private FieldGroup fieldGroup = null; + private final EntityItem<Obadvice> obad; + private boolean isSaved = false; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + * @param caption + */ + public ObadviceEditorWindow(EntityItem<Obadvice> obad) { + this.setContent(mainLayout); + // + // Save + // + this.obad = obad; + // + // Initialize main layout + // + this.mainLayout.setMargin(true); + this.mainLayout.setWidth("-1px"); + // + // Initialize components + // + this.typeOption.setNullSelectionAllowed(false); + this.typeOption.setImmediate(true); + this.typeOption.setDescription("Select whether this is an obligation or advice"); + this.typeOption.addItem("Obligation"); + this.typeOption.addItem("Advice"); + + this.fulfillOption.setNullSelectionAllowed(true); + this.fulfillOption.setDescription("Optionally restrict the use of the obligation/advice to a Permit or a Deny"); + this.fulfillOption.addItem("Permit"); + this.fulfillOption.addItem("Deny"); + + this.descriptionField.setNullRepresentation(""); + + this.expressionsField = new OaExpressionsField(this.obad); + // + // Add our form components + // + this.mainLayout.addComponent(this.typeOption); + this.mainLayout.addComponent(this.fulfillOption); + this.mainLayout.addComponent(this.xacmlID); + this.mainLayout.addComponent(this.descriptionField); + this.mainLayout.addComponent(this.expressionsField); +// this.mainLayout.addComponent(this.tableExpressions); + this.mainLayout.addComponent(this.saveButton); + // + // Now bind those fields to the data + // + this.fieldGroup = new FieldGroup(obad); + this.fieldGroup.bindMemberFields(this); + // + // Finish setting up + // + this.initializeButtons(); + this.initializeOptions(); + // + // Set focus + // + this.xacmlID.focus(); + } + + private void initializeButtons() { + this.saveButton.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + fieldGroup.commit(); + self.isSaved = true; + self.close(); + } catch (CommitException e) { + e.printStackTrace(); + } + } + + }); + } + + private void initializeOptions() { + self.setIDCaption(); + this.typeOption.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setIDCaption(); + } + + }); + } + + private void setIDCaption() { + String value = (String) self.typeOption.getValue(); + if (value.equals("Obligation")) { + self.xacmlID.setCaption("Obligation Id"); + } else { + self.xacmlID.setCaption("Advice Id"); + } + } + + public boolean isSaved() { + return this.isSaved; + } + + public void discard() { + // + // May be discarded automatically?? + // + this.fieldGroup.discard(); + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java new file mode 100644 index 0000000..21c2d45 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
@@ -0,0 +1,817 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Map; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.model.ObligationAdviceContainer; +import org.apache.openaz.xacml.util.XACMLObjectCopy; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Component; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ObligationAdviceEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TreeTable tableExpressions; + @AutoGenerated + private HorizontalLayout horizontalLayout_1; + @AutoGenerated + private Button buttonClear; + @AutoGenerated + private Button buttonRemove; + @AutoGenerated + private Button buttonAdd; + /** + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(ObligationAdviceEditorWindow.class); + private final ObligationAdviceEditorWindow self = this; + private final Object root; + private final Map<VariableDefinitionType, PolicyType> variables; + private ObligationAdviceContainer container; + private boolean isSaved = false; + + private static final Action ADD_OBLIGATION = new Action ("Add Obligation"); + private static final Action ADD_ADVICE = new Action ("Add Advice"); + private static final Action ADD_EXPRESSION = new Action ("Add Expression"); + private static final Action ADD_ATTRIBUTE = new Action ("Add Attribute"); + private static final Action EDIT_OBLIGATION = new Action ("Edit Obligation"); + private static final Action EDIT_ADVICE = new Action ("Edit Advice"); + private static final Action EDIT_EXPRESSION = new Action ("Edit Expression"); + private static final Action EDIT_ATTRIBUTE = new Action ("Edit Attribute"); + private static final Action REMOVE_OBLIGATION = new Action ("Remove Obligation"); + private static final Action REMOVE_ADVICE = new Action ("Remove Advice"); + private static final Action REMOVE_EXPRESSION = new Action ("Remove Expression"); + private static final Action REMOVE_ATTRIBUTE = new Action ("Remove Attribute"); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ObligationAdviceEditorWindow(Object root, Map<VariableDefinitionType, PolicyType> variables) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + if (! (root instanceof ObligationExpressionsType) && + ! (root instanceof AdviceExpressionsType) ) { + throw new IllegalArgumentException("This window supports Obligation or Advice Expressions only."); + } + this.root = root; + this.variables = variables; + this.container = new ObligationAdviceContainer(this.root); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeTable(); + this.initializeButtons(); + this.setupButtons(); + // + // Focus + // + this.tableExpressions.focus(); + } + + protected void initializeTable() { + // + // GUI properties + // + this.tableExpressions.setImmediate(true); + // + // Set the container + // + this.tableExpressions.setContainerDataSource(this.container); + this.tableExpressions.setVisibleColumns(new Object[] {ObligationAdviceContainer.PROPERTY_NAME, + ObligationAdviceContainer.PROPERTY_ID_SHORT, + ObligationAdviceContainer.PROPERTY_EFFECT, + ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT, + ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT}); + this.tableExpressions.setColumnHeaders(new String[] {"Name", "ID or Value", (this.root instanceof ObligationExpressionsType ? "Effect" : "Applies"), "Category", "Data Type"}); + //this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_NAME, 1.0f); + //this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_ID_SHORT, 1.0f); + //this.tableExpressions.setColumnWi + this.tableExpressions.setSelectable(true); + // + // Expand it out + // + for (Object item : this.tableExpressions.getItemIds()) { + this.tableExpressions.setCollapsed(item, false); + for (Object child : this.tableExpressions.getChildren(item)) { + this.tableExpressions.setCollapsed(child, false); + } + } + this.tableExpressions.setPageLength(this.container.size() + 3); + // + // Respond to events + // + this.tableExpressions.addActionHandler(new Handler() { + private static final long serialVersionUID = 1L; + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + if (self.root instanceof ObligationExpressionsType) { + return new Action[] {ADD_OBLIGATION}; + } + if (self.root instanceof AdviceExpressionsType) { + return new Action[] {ADD_ADVICE}; + } + } + if (target instanceof ObligationExpressionType) { + return new Action[] {EDIT_OBLIGATION, REMOVE_OBLIGATION, ADD_EXPRESSION}; + } + if (target instanceof AdviceExpressionType) { + return new Action[] {EDIT_ADVICE, REMOVE_ADVICE, ADD_EXPRESSION}; + } + if (target instanceof AttributeAssignmentExpressionType) { + return new Action[] {EDIT_EXPRESSION, REMOVE_EXPRESSION, ADD_ATTRIBUTE}; + } + if (target instanceof AttributeValueType || + target instanceof AttributeDesignatorType || + target instanceof AttributeSelectorType || + target instanceof ApplyType) { + return new Action[] {EDIT_ATTRIBUTE, REMOVE_ATTRIBUTE}; + } + return null; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_OBLIGATION) { + self.editObligation(null); + return; + } + if (action == EDIT_OBLIGATION) { + assert target instanceof ObligationExpressionType; + self.editObligation((ObligationExpressionType) target); + return; + } + if (action == REMOVE_OBLIGATION) { + assert target instanceof ObligationExpressionType; + if (self.container.removeItem(target) == false) { + logger.error("Failed to remove obligation"); + assert false; + } + return; + } + if (action == ADD_ADVICE) { + self.editAdvice(null); + return; + } + if (action == EDIT_ADVICE) { + assert target instanceof AdviceExpressionType; + self.editAdvice((AdviceExpressionType) target); + return; + } + if (action == REMOVE_ADVICE) { + assert target instanceof AdviceExpressionType; + if (self.container.removeItem(target) == false) { + logger.error("Failed to remove advice"); + assert false; + } + return; + } + if (action == ADD_EXPRESSION) { + assert target instanceof ObligationExpressionType || target instanceof AdviceExpressionType; + self.editExpression(null, target); + return; + } + if (action == EDIT_EXPRESSION) { + assert target instanceof AttributeAssignmentExpressionType; + self.editExpression((AttributeAssignmentExpressionType) target, self.container.getParent(target)); + return; + } + if (action == REMOVE_EXPRESSION) { + assert target instanceof AttributeAssignmentExpressionType; + if (self.container.removeItem(target) == false) { + logger.error("Failed to remove expression"); + assert false; + } + return; + } + if (action == ADD_ATTRIBUTE) { + assert target instanceof AttributeAssignmentExpressionType; + self.editAttribute(null, (AttributeAssignmentExpressionType) target); + return; + } + if (action == EDIT_ATTRIBUTE) { + assert target instanceof AttributeValueType || + target instanceof AttributeDesignatorType || + target instanceof AttributeSelectorType || + target instanceof ApplyType; + self.editAttribute(target, (AttributeAssignmentExpressionType) self.container.getParent(target)); + return; + } + if (action == REMOVE_ATTRIBUTE) { + assert target instanceof AttributeValueType || + target instanceof AttributeDesignatorType || + target instanceof AttributeSelectorType || + target instanceof ApplyType; + if (self.container.removeItem(target) == false) { + logger.error("Failed to remove attribute"); + assert false; + } + return; + } + } + }); + // + // Respond to selections + // + this.tableExpressions.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupButtons(); + } + }); + this.tableExpressions.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + if (event.getSource() instanceof AdviceExpressionType) { + self.editAdvice((AdviceExpressionType) event.getSource()); + } else if (event.getSource() instanceof ObligationExpressionType) { + self.editObligation((ObligationExpressionType) event.getSource()); + } else if (event.getSource() instanceof AttributeAssignmentExpressionType) { + self.editExpression((AttributeAssignmentExpressionType) event.getSource(), self.container.getParent(event.getSource())); + } else { + self.editAttribute(event.getSource(), (AttributeAssignmentExpressionType) self.container.getParent(event.getSource())); + } + } + } + }); + // + // Implement a description generator, to display the full XACML ID. + // + this.tableExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() { + private static final long serialVersionUID = 1L; + + @Override + public String generateDescription(Component source, Object itemId, Object propertyId) { + if (propertyId == ObligationAdviceContainer.PROPERTY_ID_SHORT) { + if (itemId instanceof AdviceExpressionType) { + return ((AdviceExpressionType) itemId).getAdviceId(); + } + if (itemId instanceof ObligationExpressionType) { + return ((ObligationExpressionType) itemId).getObligationId(); + } + if (itemId instanceof AttributeAssignmentExpressionType) { + return ((AttributeAssignmentExpressionType) itemId).getAttributeId(); + } + if (itemId instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) itemId).getAttributeId(); + } + if (itemId instanceof AttributeSelectorType) { + return ((AttributeSelectorType) itemId).getContextSelectorId(); + } + if (itemId instanceof ApplyType) { + return ((ApplyType) itemId).getDescription(); + } + } + if (propertyId == ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT) { + if (itemId instanceof AttributeAssignmentExpressionType) { + return ((AttributeAssignmentExpressionType) itemId).getCategory(); + } + if (itemId instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) itemId).getCategory(); + } + if (itemId instanceof AttributeSelectorType) { + return ((AttributeSelectorType) itemId).getCategory(); + } + if (itemId instanceof ApplyType) { + return null; + } + } + if (propertyId == ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT) { + if (itemId instanceof AttributeValueType) { + return ((AttributeValueType) itemId).getDataType(); + } + if (itemId instanceof AttributeDesignatorType) { + return ((AttributeDesignatorType) itemId).getDataType(); + } + if (itemId instanceof AttributeSelectorType) { + return ((AttributeSelectorType) itemId).getDataType(); + } + /* + if (itemId instanceof ApplyType) { + // + // TODO - get the datatype for the function + // + } + */ + } + return null; + } + }); + } + + protected void initializeButtons() { + this.buttonAdd.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + if (self.tableExpressions.getValue() == null) { + // + // Add new root advice or obligation + // + if (self.root instanceof AdviceExpressionsType) { + self.editAdvice(null); + } else { + self.editObligation(null); + } + } else { + // + // Add new assignment expression + // + self.editExpression(null, self.tableExpressions.getValue()); + } + } + }); + + this.buttonRemove.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object object = self.tableExpressions.getValue(); + if (object != null) { + if (object instanceof AttributeValueType || + object instanceof AttributeDesignatorType || + object instanceof AttributeSelectorType || + object instanceof ApplyType) { + if (self.container.removeItem(self.container.getParent(object)) == false) { + logger.error("Failed to remove attribute value/des/sel/apply"); + assert false; + } + } else { + if (self.container.removeItem(object) == false) { + logger.error("Failed to remove object"); + assert false; + } + } + } else { + logger.error("This code should never get executed if the button was properly disabled."); + } + } + }); + + this.buttonClear.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + Object object = self.tableExpressions.getValue(); + if (object == null) { + if (self.container.removeAllItems() == false) { + logger.error("Failed to remove all items"); + assert false; + } + } else { + if (self.container.removeAllAssignments() == false) { + logger.error("Failed to remove all assignments"); + assert false; + } + } + } + }); + + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Mark ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } + }); + } + + protected void setupButtons() { + Object target = this.tableExpressions.getValue(); + if (target == null) { + if (this.root instanceof AdviceExpressionsType) { + this.buttonAdd.setVisible(true); + this.buttonAdd.setCaption("Add Advice"); + this.buttonRemove.setCaption("Remove Advice"); + this.buttonClear.setCaption("Clear All Advice"); + this.buttonClear.setVisible(true); + } else { + this.buttonAdd.setVisible(true); + this.buttonAdd.setCaption("Add Obligation"); + this.buttonRemove.setCaption("Remove Obligation"); + this.buttonClear.setCaption("Clear All Obligations"); + this.buttonClear.setVisible(true); + } + this.buttonRemove.setEnabled(false); + } else { + if (target instanceof AdviceExpressionType || + target instanceof ObligationExpressionType) { + this.buttonAdd.setVisible(true); + this.buttonAdd.setCaption("Add Assignment"); + if (target instanceof AdviceExpressionType) { + this.buttonRemove.setCaption("Remove Advice"); + } else { + this.buttonRemove.setCaption("Remove Obligation"); + } + this.buttonClear.setCaption("Clear All Assignments"); + this.buttonClear.setVisible(true); + } else { + this.buttonAdd.setVisible(false); + this.buttonRemove.setCaption("Remove Assignment"); + this.buttonClear.setVisible(false); + } + this.buttonRemove.setEnabled(true); + } + if (this.tableExpressions.size() == 0) { + this.buttonClear.setEnabled(false); + } else { + this.buttonClear.setEnabled(true); + } + } + + protected void editAttribute(Object target, final AttributeAssignmentExpressionType parent) { + // + // Make a copy + // + final AttributeAssignmentExpressionType copyAssignment = (parent == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(parent)); + // + // Prompt user for attribute right away + // + final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, copyAssignment.getExpression() != null ? copyAssignment.getExpression().getValue() : null, null, self.variables); + builder.setCaption("Define Assignment Attribute"); + builder.setModal(true); + builder.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (builder.isSaved() == false) { + return; + } + // + // Yes - update it + // + parent.setExpression(copyAssignment.getExpression()); + if (parent.getExpression() != null) { + self.container.removeItem(parent.getExpression().getValue()); + } + self.container.addItem(copyAssignment.getExpression().getValue(), parent); + // + // Set the table size + // + self.tableExpressions.setPageLength(self.container.size() + 1); + } + }); + builder.center(); + UI.getCurrent().addWindow(builder); + } + + protected void editExpression(final AttributeAssignmentExpressionType assignment, final Object parent) { + // + // Copy + // + final AttributeAssignmentExpressionType copyAssignment = (assignment == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(assignment)); + // + // Create the window + // + final AttributeAssignmentExpressionEditorWindow window = new AttributeAssignmentExpressionEditorWindow(copyAssignment); + window.setCaption(assignment == null ? "Create Attribute Assignment" : "Edit Attribute Assignment"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user click save? + // + if (window.isSaved() == false) { + return; + } + // + // Was this a new assignment? + // + if (assignment == null) { + // + // Prompt user for attribute right away + // + final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, null, null, self.variables); + builder.setCaption("Define Assignment Attribute"); + builder.setModal(true); + builder.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (builder.isSaved() == false) { + return; + } + // + // Yes - add it to the container + // + if (self.container.addItem(copyAssignment, parent) == null) { + logger.error("Failed to add copy assignment"); + assert false; + } + // + // Set the table size + // + self.tableExpressions.setPageLength(self.container.size() + 1); + } + }); + builder.center(); + UI.getCurrent().addWindow(builder); + } else { + // + // No - copy back the data + // + assignment.setAttributeId(copyAssignment.getAttributeId()); + assignment.setIssuer(assignment.getIssuer()); + assignment.setCategory(copyAssignment.getCategory()); + // + // Update the container + // + self.container.updateItem(assignment); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editAdvice(final AdviceExpressionType advice) { + // + // Copy the advice + // + final AdviceExpressionType copyAdvice = (advice == null ? new AdviceExpressionType() : XACMLObjectCopy.copy(advice)); + // + // Setup the window + // + final AdviceEditorWindow window = new AdviceEditorWindow(copyAdvice); + window.setCaption("Edit Advice"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Is it saved? + // + if (window.isSaved() == false) { + return; + } + // + // Was this a new object? + // + if (advice == null) { + // + // New - add it to the container + // + if (self.container.addItem(copyAdvice) == null) { + logger.error("failed to add advice"); + assert false; + } + // + // Set the table size + // + self.tableExpressions.setPageLength(self.container.size() + 1); + } else { + // + // No - copy it back + // + advice.setAdviceId(copyAdvice.getAdviceId()); + advice.setAppliesTo(copyAdvice.getAppliesTo()); + // + // Update + // + self.container.updateItem(advice); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editObligation(final ObligationExpressionType obligation) { + // + // Copy the advice + // + final ObligationExpressionType copyObligation = (obligation == null ? new ObligationExpressionType() : XACMLObjectCopy.copy(obligation)); + // + // Setup the window + // + final ObligationEditorWindow window = new ObligationEditorWindow(copyObligation); + window.setCaption("Edit Obligation"); + window.setModal(true); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Is it saved? + // + if (window.isSaved() == false) { + return; + } + // + // Was this a new object? + // + if (obligation == null) { + // + // New - add it to the container + // + if (self.container.addItem(copyObligation) == null) { + logger.error("Failed to add obligation"); + assert false; + } + // + // Set the table size + // + self.tableExpressions.setPageLength(self.container.size() + 1); + } else { + // + // No - copy it back + // + obligation.setObligationId(copyObligation.getObligationId()); + obligation.setFulfillOn(copyObligation.getFulfillOn()); + // + // Update + // + self.container.updateItem(obligation); + } + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + public boolean isSaved() { + return this.isSaved; + } + + public Object getRootObject() { + return this.root; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // horizontalLayout_1 + horizontalLayout_1 = buildHorizontalLayout_1(); + mainLayout.addComponent(horizontalLayout_1); + + // tableExpressions + tableExpressions = new TreeTable(); + tableExpressions.setCaption("Expressions"); + tableExpressions.setImmediate(false); + tableExpressions.setWidth("100%"); + tableExpressions.setHeight("-1px"); + mainLayout.addComponent(tableExpressions); + mainLayout.setExpandRatio(tableExpressions, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + + @AutoGenerated + private HorizontalLayout buildHorizontalLayout_1() { + // common part: create layout + horizontalLayout_1 = new HorizontalLayout(); + horizontalLayout_1.setImmediate(false); + horizontalLayout_1.setWidth("-1px"); + horizontalLayout_1.setHeight("-1px"); + horizontalLayout_1.setMargin(false); + horizontalLayout_1.setSpacing(true); + + // buttonAdd + buttonAdd = new Button(); + buttonAdd.setCaption("Add Expression"); + buttonAdd.setImmediate(false); + buttonAdd.setWidth("-1px"); + buttonAdd.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonAdd); + + // buttonRemove + buttonRemove = new Button(); + buttonRemove.setCaption("Remove Expression"); + buttonRemove.setImmediate(false); + buttonRemove.setWidth("-1px"); + buttonRemove.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonRemove); + + // buttonClear + buttonClear = new Button(); + buttonClear.setCaption("Clear Expressions"); + buttonClear.setImmediate(false); + buttonClear.setWidth("-1px"); + buttonClear.setHeight("-1px"); + horizontalLayout_1.addComponent(buttonClear); + + return horizontalLayout_1; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java new file mode 100644 index 0000000..dac4eda --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
@@ -0,0 +1,208 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class ObligationEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private OptionGroup optionGroupFullfillOn; + @AutoGenerated + private TextField textFieldObligationID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final ObligationEditorWindow self = this; + private final ObligationExpressionType obligation; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public ObligationEditorWindow(ObligationExpressionType obligation) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.obligation = obligation; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initialize(); + this.initializeButton(); + // + // Focus + // + this.textFieldObligationID.focus(); + } + + protected void initialize() { + // + // The text field for the advice ID + // + this.textFieldObligationID.setNullRepresentation(""); + if (this.obligation.getObligationId() == null) { + this.textFieldObligationID.setValue(XacmlAdminUI.getDomain()); + } else { + this.textFieldObligationID.setValue(obligation.getObligationId()); + } + this.textFieldObligationID.setRequiredError("You must have an ID for the obligation"); + // + // The option + // + this.optionGroupFullfillOn.setRequiredError("You must select Permit or Deny for the obligation"); + this.optionGroupFullfillOn.addItem(EffectType.PERMIT); + this.optionGroupFullfillOn.addItem(EffectType.DENY); + if (this.obligation.getFulfillOn() == null) { + this.optionGroupFullfillOn.select(EffectType.PERMIT); + } else { + if (this.obligation.getFulfillOn().equals(EffectType.PERMIT)) { + this.optionGroupFullfillOn.select(EffectType.PERMIT); + } else { + this.optionGroupFullfillOn.select(EffectType.DENY); + } + } + } + + protected void initializeButton() { + this.buttonSave.setImmediate(true); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textFieldObligationID.commit(); + self.optionGroupFullfillOn.commit(); + // + // all good, save everything + // + self.obligation.setObligationId(self.textFieldObligationID.getValue()); + self.obligation.setFulfillOn((EffectType) self.optionGroupFullfillOn.getValue()); + // + // Set ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Vaadin displays the error + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public ObligationExpressionType getAdvice() { + return this.obligation; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldObligationID + textFieldObligationID = new TextField(); + textFieldObligationID.setCaption("Obligation ID"); + textFieldObligationID.setImmediate(false); + textFieldObligationID.setWidth("-1px"); + textFieldObligationID.setHeight("-1px"); + textFieldObligationID.setInvalidAllowed(false); + textFieldObligationID.setRequired(true); + textFieldObligationID.setInputPrompt("Eg. urn:com:foo:obligation:sample"); + mainLayout.addComponent(textFieldObligationID); + + // optionGroupFullfillOn + optionGroupFullfillOn = new OptionGroup(); + optionGroupFullfillOn.setCaption("Fulfill On"); + optionGroupFullfillOn.setImmediate(false); + optionGroupFullfillOn.setWidth("-1px"); + optionGroupFullfillOn.setHeight("-1px"); + optionGroupFullfillOn.setInvalidAllowed(false); + optionGroupFullfillOn.setRequired(true); + mainLayout.addComponent(optionGroupFullfillOn); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java new file mode 100644 index 0000000..de279a3 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
@@ -0,0 +1,264 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.api.pap.PDPPolicy; +import org.apache.openaz.xacml.api.pap.PDPStatus; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Label; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PDPStatusWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + + + @AutoGenerated + private Button buttonOK; + + + @AutoGenerated + private Table table; + + + private PDPStatus status; + + + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PDPStatusWindow.class); + private final PDPStatusWindow self = this; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PDPStatusWindow(PDPStatus status) { + buildMainLayout(); + setContent(mainLayout); + //setCompositionRoot(mainLayout); + // + // Save + // + this.status = status; + // + // Setup shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + this.buttonOK.setClickShortcut(KeyCode.ENTER); + // + // Initialize + // + try { + this.initialize(); + this.initializeButton(); + } catch (Exception e) { + logger.error("Initialize exception: " + e); + } + // + // Focus + // + this.buttonOK.focus(); + } + + protected void initialize() { + // + // Setup the table - real simple + // + this.table.addContainerProperty("Property", Label.class, null); + this.table.addContainerProperty("Value", TextArea.class, null); + // + // Set the status + // + StringBuilder builder; + int rows; + Integer id = 1; + this.table.addItem(new Object[] {new Label("Status"), this.createTextArea(this.status.getStatus().toString(), 1)}, id++); + // + // Setup Errors + // + builder = new StringBuilder(); + rows = 0; + for (String error : this.status.getLoadErrors()) { + builder.append(error); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Errors"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Setup Errors + // + builder = new StringBuilder(); + rows = 0; + for (String error : this.status.getLoadWarnings()) { + builder.append(error); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Warnings"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Setup the loaded policy table + // + builder = new StringBuilder(); + rows = 0; + for (PDPPolicy policy : this.status.getLoadedPolicies()) { + builder.append(policy.getName()); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Policies Loaded"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Setup the Failed policy table + // + builder = new StringBuilder(); + rows = 0; + for (PDPPolicy policy : this.status.getFailedPolicies()) { + builder.append(policy.getName()); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Policies Failed To Load"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Setup the Loaded PIP configuration table + // + builder = new StringBuilder(); + rows = 0; + for (PDPPIPConfig config : this.status.getLoadedPipConfigs()) { + builder.append(config.getName()); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Loaded PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Setup the Failed PIP configuration table + // + builder = new StringBuilder(); + rows = 0; + for (PDPPIPConfig config : this.status.getFailedPipConfigs()) { + builder.append(config.getName()); + builder.append(System.lineSeparator()); + rows++; + } + if (rows == 0) { + rows = 1; + } + this.table.addItem(new Object[] {new Label("Failed PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++); + // + // Set the length + // + table.setPageLength(id - 1); + table.setReadOnly(true); + table.setSizeFull(); + } + + protected TextArea createTextArea(String value, int lines) { + TextArea area = new TextArea(); + area.setValue(value); + area.setNullRepresentation(""); + area.setSizeFull(); + area.setReadOnly(true); + area.setRows(lines); + return area; + } + + protected void initializeButton() { + this.buttonOK.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + self.close(); + } + }); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("100.0%"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // table + table = new Table(); + table.setCaption("Status"); + table.setImmediate(false); + table.setWidth("100.0%"); + table.setHeight("-1px"); + mainLayout.addComponent(table); + + // buttonOK + buttonOK = new Button(); + buttonOK.setCaption("Ok"); + buttonOK.setImmediate(true); + buttonOK.setWidth("-1px"); + buttonOK.setHeight("-1px"); + mainLayout.addComponent(buttonOK); + mainLayout.setComponentAlignment(buttonOK, new Alignment(48)); + + return mainLayout; + } + + + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java new file mode 100644 index 0000000..08f9306 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java
@@ -0,0 +1,364 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Locale; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.admin.jpa.PIPType; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.admin.view.fields.ConfigParamField; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.fieldgroup.FieldGroup; +import com.vaadin.data.fieldgroup.FieldGroup.CommitException; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.data.util.converter.Converter; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.GridLayout; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.Window; + +public class PIPConfigurationEditorWindow extends Window { + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPConfigurationEditorWindow.class); + private final PIPConfigurationEditorWindow self = this; + private final EntityItem<PIPConfiguration> entity; + private FieldGroup fieldGroup; + private boolean isSaved = false; + + private GridLayout grid = new GridLayout(2,6); + + @PropertyId("piptype") + ComboBox comboType = new ComboBox("Type"); + + @PropertyId("name") + TextField fieldName = new TextField("Name"); + + @PropertyId("description") + TextArea areaDescription = new TextArea("Description"); + + @PropertyId("issuer") + TextField fieldIssuer = new TextField("Issuer"); + + @PropertyId("requiresResolvers") + CheckBox requiresResolvers = new CheckBox("Requires Resolvers"); + + @PropertyId("pipconfigParams") + ConfigParamField paramField = null; + + Button buttonSave = new Button("Save"); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPConfigurationEditorWindow(EntityItem<PIPConfiguration> entity) { + // + // Our base component + // + this.setContent(this.grid); + this.grid.setMargin(true); + this.grid.setSpacing(true); + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Save + // + this.entity = entity; + // + // Check if a brand new object and set the default + // pip type. + // + if (this.entity.getEntity().getPiptype() == null) { + this.entity.getEntity().setPiptype(JPAUtils.getPIPType(PIPType.TYPE_SQL)); + } + + // + // Initialize GUI components + // + this.initialize(); + // + // Add components + // + this.grid.addComponent(this.comboType, 0, 0); + this.grid.addComponent(this.fieldName, 0, 1); + this.grid.addComponent(this.fieldIssuer, 0, 2); + this.grid.addComponent(this.areaDescription, 0, 3); + this.grid.addComponent(this.requiresResolvers, 0, 4); + this.grid.addComponent(this.paramField, 1, 0, 1, 4); + this.grid.addComponent(this.buttonSave, 0, 5, 1, 5); + // + // Bind and initialize + // + this.initializeFields(); + // + // Post initialize + // + this.initializeButtons(); + // + // Set focus + // + this.fieldName.focus(); + // + // Initially call this to see if the entity is already + // saveable + // + this.formChanged(); + } + + protected void initialize() { + // + // + // + this.fieldName.setImmediate(true); + this.fieldName.setNullRepresentation(""); + this.fieldName.setRequired(true); + this.fieldName.setRequiredError("Enter a name for the configuration"); + this.fieldName.setInputPrompt("Eg. \"Company LDAP Server\" or \"MySQL Customer DB\""); + + this.fieldIssuer.setNullRepresentation(""); + this.fieldIssuer.setRequired(false); + this.fieldIssuer.setInputPrompt("Eg. urn:com:sample:hr"); + + this.areaDescription.setNullRepresentation(""); + this.areaDescription.setRequired(false); + this.areaDescription.setInputPrompt("Optionally write a description for this configuration."); + this.areaDescription.setRows(3); + this.areaDescription.setWidth("100%"); + // + // + // + this.requiresResolvers.setConverter(new Converter<Boolean, Object>() { + private static final long serialVersionUID = 1L; + + @Override + public Object convertToModel(Boolean value, + Class<? extends Object> targetType, Locale locale) + throws Converter.ConversionException { + if (targetType.isAssignableFrom(java.lang.Character.class)) { + if (value) { + return '1'; + } else { + return '0'; + } + } + return null; + } + + @Override + public Boolean convertToPresentation(Object value, + Class<? extends Boolean> targetType, Locale locale) + throws Converter.ConversionException { + if (value instanceof Character) { + return ((Character) value) == '1'; + } + return null; + } + + @Override + public Class<Object> getModelType() { + return Object.class; + } + + @Override + public Class<Boolean> getPresentationType() { + return Boolean.class; + } + }); + // + // + // + this.comboType.setContainerDataSource(((XacmlAdminUI)UI.getCurrent()).getPIPTypes()); + this.comboType.setImmediate(true); + this.comboType.setConverter(new SingleSelectConverter<Object>(this.comboType)); + this.comboType.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboType.setItemCaptionPropertyId("type"); + this.comboType.setNullSelectionAllowed(false); + this.comboType.setRequired(true); + this.comboType.setRequiredError("You need to identify what type of configuration this is."); + // + // + // + this.paramField = new ConfigParamField(this.entity); + this.paramField.setValidationVisible(false); + } + + protected void initializeFields() { + // + // Now create our field group and bind our fields. + // This will populate the components with the + // current value if we are editing an entity. + // + this.fieldGroup = new FieldGroup(this.entity); + this.fieldGroup.bindMemberFields(this); + // + // + // + this.fieldName.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + self.formChanged(); + } + + }); + this.fieldName.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.formChanged(); + } + }); + // + // + // + this.paramField.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.formChanged(); + } + }); + // + // Only custom PIP configurations should be allowed to + // check the "requires resolvers" box. We know that the + // SQL/LDAP/HyperSQL/CSV resolver already do require resolvers. + // + if (this.entity.getEntity().getPiptype().isCustom() == false) { + this.requiresResolvers.setEnabled(false); + } + // + // Finish GUI intialization + // + if (this.entity.isPersistent()) { + // + // The user is editing something, don't let them change + // the type + // + this.comboType.setReadOnly(true); + } + this.comboType.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + // + // Get the new value + // + Object id = self.comboType.getValue(); + EntityItem<PIPType> type = null; + if (id != null) { + type = ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItem(id); + } + // + // Have our custom field reset itself + // + self.paramField.resetContent(type != null ? type.getEntity() : null); + // + // Do we need to display the requires resolver check box? + // + if (type != null && type.getEntity().isCustom()) { + self.requiresResolvers.setEnabled(true); + self.requiresResolvers.setRequired(true); + self.requiresResolvers.setValue(self.entity.getEntity().requiresResolvers()); + } else { + self.requiresResolvers.setEnabled(false); + self.requiresResolvers.setRequired(false); + } + // + // Re-center the form + // + self.center(); + // + // Check if we can enable the save button + // + self.formChanged(); + } + }); + } + + protected void formChanged() { + if (this.fieldGroup.isValid() || this.entity.isModified()) { + this.buttonSave.setEnabled(true); + } else { + this.buttonSave.setEnabled(false); + } + } + + protected void initializeButtons() { + this.grid.setComponentAlignment(this.buttonSave, Alignment.BOTTOM_CENTER); + this.buttonSave.setImmediate(true); + this.buttonSave.setEnabled(false); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit changes + // + self.fieldGroup.commit(); + // + // Save + // + self.isSaved = true; + // + // We can close + // + self.close(); + } catch (CommitException e) { + logger.warn("Couldn't commit, the save button should NOT be enabled."); + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java new file mode 100644 index 0000000..e024d0e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java
@@ -0,0 +1,65 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.VerticalLayout; + +public class PIPCustomResolverEditorWindow extends CustomComponent { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + /** + * + */ + private static final long serialVersionUID = 1L; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPCustomResolverEditorWindow() { + buildMainLayout(); + setCompositionRoot(mainLayout); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(false); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java new file mode 100644 index 0000000..650ed09 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java
@@ -0,0 +1,116 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStream; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.Upload; +import com.vaadin.ui.Upload.Receiver; +import com.vaadin.ui.Upload.SucceededEvent; +import com.vaadin.ui.Upload.SucceededListener; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PIPImportWindow extends Window implements Receiver, SucceededListener { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + private static final Log logger = LogFactory.getLog(PolicyUploadWindow.class); + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Upload upload; + + private static final long serialVersionUID = 1L; + private String filename = null; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPImportWindow() { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Set ourselves up + // + this.upload.addSucceededListener(this); + this.upload.setReceiver(this); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // upload_1 + upload = new Upload(); + upload.setImmediate(false); + upload.setWidth("-1px"); + upload.setHeight("-1px"); + mainLayout.addComponent(upload); + + return mainLayout; + } + + @Override + public void uploadSucceeded(SucceededEvent event) { + this.filename = event.getFilename(); + this.close(); + } + + @Override + public OutputStream receiveUpload(String filename, String mimeType) { + // + // Try to create the output stream + // + try { + return new FileOutputStream(filename); + } catch (FileNotFoundException e) { + logger.error("Failed to create uploaded file", e); + } + return null; + } + + public String getUploadedFile() { + return this.filename; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java new file mode 100644 index 0000000..70942c2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java
@@ -0,0 +1,261 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.openaz.xacml.admin.jpa.PIPConfigParam; +import org.apache.openaz.xacml.admin.jpa.PIPResolverParam; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PIPParamEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldValue; + @AutoGenerated + private TextField textFieldName; + /** + * + */ + private static final long serialVersionUID = 1L; + private final PIPParamEditorWindow self = this; + private final Object config; + private boolean isSaved = false; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPParamEditorWindow(Object config) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save parameters + // + this.config = config; + // + // Initialize + // + this.initialize(); + // + // close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // focus + // + this.textFieldName.focus(); + } + + protected void initialize() { + // + // GUI properties + // + this.textFieldName.setImmediate(true); + this.textFieldName.setNullRepresentation(""); + this.textFieldValue.setImmediate(true); + this.textFieldValue.setNullRepresentation(""); + // + // Now setup based on the object + // + if (this.config instanceof PIPConfigParam) { + this.initializePIPConfiguration(); + } else if (this.config instanceof PIPResolverParam) { + this.initializePIPResolver(); + } else { + throw new IllegalArgumentException("Unknown object"); + } + this.initializeButtons(); + this.setupButtons(); + } + + protected void initializePIPConfiguration() { + final PIPConfigParam param = (PIPConfigParam) this.config; + // + // setup the name + // + this.textFieldName.setValue(param.getParamName()); + this.textFieldName.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + param.setParamName(self.textFieldName.getValue()); + self.setupButtons(); + } + }); + // + // setup the value + // + this.textFieldValue.setValue(param.getParamValue()); + this.textFieldValue.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + param.setParamValue(self.textFieldValue.getValue()); + self.setupButtons(); + } + }); + } + + protected void initializePIPResolver() { + final PIPResolverParam param = (PIPResolverParam) this.config; + // + // setup the name + // + this.textFieldName.setValue(param.getParamName()); + this.textFieldName.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + param.setParamName(self.textFieldName.getValue()); + self.setupButtons(); + } + }); + // + // setup the value + // + this.textFieldValue.setValue(param.getParamValue()); + this.textFieldValue.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + param.setParamValue(self.textFieldValue.getValue()); + self.setupButtons(); + } + }); + } + + protected void initializeButtons() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit the values + // + self.textFieldName.commit(); + self.textFieldValue.commit(); + // + // Done, save + // + self.isSaved = true; + // + // Close + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // Vaadin will display error + // + } + } + }); + } + + protected void setupButtons() { + if (this.textFieldName.getValue() != null && this.textFieldValue.getValue() != null) { + this.buttonSave.setEnabled(true); + } else { + this.buttonSave.setEnabled(false); + } + } + + public boolean isSaved() { + return this.isSaved; + } + + public Object getParameter() { + return this.config; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldName + textFieldName = new TextField(); + textFieldName.setCaption("Parameter Name"); + textFieldName.setImmediate(false); + textFieldName.setWidth("-1px"); + textFieldName.setHeight("-1px"); + textFieldName.setInvalidAllowed(false); + textFieldName.setRequired(true); + mainLayout.addComponent(textFieldName); + + // textFieldValue + textFieldValue = new TextField(); + textFieldValue.setCaption("Parameter Value"); + textFieldValue.setImmediate(false); + textFieldValue.setWidth("-1px"); + textFieldValue.setHeight("-1px"); + textFieldValue.setInvalidAllowed(false); + textFieldValue.setRequired(true); + mainLayout.addComponent(textFieldValue); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java new file mode 100644 index 0000000..530fddb --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java
@@ -0,0 +1,226 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.view.fields.ResolverParamField; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.fieldgroup.FieldGroup; +import com.vaadin.data.fieldgroup.FieldGroup.CommitException; +import com.vaadin.data.fieldgroup.PropertyId; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.GridLayout; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Window; + +public class PIPResolverEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPResolverEditorWindow.class); + private final PIPResolverEditorWindow self = this; + + private final EntityItem<PIPResolver> entity; + private FieldGroup fieldGroup; + private boolean isSaved = false; + private GridLayout grid = new GridLayout(2,4); + + @PropertyId("name") + TextField fieldName = new TextField("Name"); + + @PropertyId("description") + TextArea areaDescription = new TextArea("Description"); + + @PropertyId("issuer") + TextField fieldIssuer = new TextField("Issuer"); + + @PropertyId("pipresolverParams") + ResolverParamField paramField; + + Button buttonSave = new Button("Save"); + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPResolverEditorWindow(EntityItem<PIPResolver> entity) { + // + // Our base component + // + this.setContent(this.grid); + this.grid.setMargin(true); + this.grid.setSpacing(true); + // + // Save + // + this.entity = entity; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.initialize(); + // + // Add components + // + this.grid.addComponent(this.fieldName, 0, 0); + this.grid.addComponent(this.fieldIssuer, 0, 1); + this.grid.addComponent(this.areaDescription, 0, 2); + this.grid.addComponent(this.paramField, 1, 0, 1, 2); + this.grid.addComponent(this.buttonSave, 0, 3, 1, 3); + // + // Bind and initialize + // + this.initializeFields(); + // + // Post initialize + // + this.initializeButtons(); + // + // Set focus + // + this.fieldName.focus(); + // + // Initially call this to see if the entity is already + // saveable + // + this.formChanged(); + } + + protected void initialize() { + // + // + // + this.fieldName.setImmediate(true); + this.fieldName.setNullRepresentation(""); + this.fieldName.setRequired(true); + this.fieldName.setRequiredError("Enter a name for the resolver"); + this.fieldName.setInputPrompt("Eg. \"Resolve employee type\""); + + this.fieldIssuer.setNullRepresentation(""); + this.fieldIssuer.setRequired(false); + this.fieldIssuer.setInputPrompt("Eg. urn:com:sample:hr"); + + this.areaDescription.setNullRepresentation(""); + this.areaDescription.setRequired(false); + this.areaDescription.setInputPrompt("Optionally write a description for this resolver."); + this.areaDescription.setRows(3); + this.areaDescription.setWidth("100%"); + // + // Create our field + // + this.paramField = new ResolverParamField(this.entity); + //this.paramField.setValidationVisible(false); + } + + protected void initializeFields() { + // + // Now create our field group and bind our fields. + // This will populate the components with the + // current value if we are editing an entity. + // + this.fieldGroup = new FieldGroup(this.entity); + this.fieldGroup.bindMemberFields(this); + // + // + // + this.fieldName.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + self.formChanged(); + } + }); + // + // + // + this.paramField.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.formChanged(); + } + }); + } + + protected void formChanged() { + if (this.fieldGroup.isValid() || this.entity.isModified()) { + this.buttonSave.setEnabled(true); + } else { + this.buttonSave.setEnabled(false); + } + } + + protected void initializeButtons() { + this.grid.setComponentAlignment(this.buttonSave, Alignment.BOTTOM_CENTER); + this.buttonSave.setImmediate(true); + this.buttonSave.setEnabled(false); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit changes + // + self.fieldGroup.commit(); + // + // Save + // + self.isSaved = true; + // + // We can close + // + self.close(); + } catch (CommitException e) { + logger.warn("Couldn't commit, the save button should NOT be enabled."); + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java new file mode 100644 index 0000000..2fb4a25 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java
@@ -0,0 +1,1199 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.jpa.Attribute; +import org.apache.openaz.xacml.admin.jpa.PIPResolver; +import org.apache.openaz.xacml.admin.jpa.PIPResolverParam; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.admin.util.XACMLConstants; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener; +import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier; +import org.apache.openaz.xacml.api.XACML3; +import org.apache.openaz.xacml.std.pip.engines.csv.ConfigurableCSVResolver; +import org.apache.openaz.xacml.std.pip.engines.jdbc.ConfigurableJDBCResolver; +import org.apache.openaz.xacml.std.pip.engines.ldap.ConfigurableLDAPResolver; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.util.BeanItem; +import com.vaadin.data.util.BeanItemContainer; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Table; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window.CloseEvent; +import com.vaadin.ui.Window.CloseListener; + +public class PIPSQLResolverEditorWindow extends CustomComponent implements FormChangedEventNotifier, Handler { + + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Table tableAttributes; + + @AutoGenerated + private Table tableRequiredAttributes; + + @AutoGenerated + private CheckBox checkBoxShortIds; + + @AutoGenerated + private TextField textFieldFilter; + + @AutoGenerated + private TextField textFieldBase; + + @AutoGenerated + private TextArea textAreaSelect; + + private final Action ADD_ATTRIBUTE = new Action("Add Attribute"); + private final Action EDIT_ATTRIBUTE = new Action("Edit Attribute"); + private final Action CLONE_ATTRIBUTE = new Action("Clone Attribute"); + private final Action REMOVE_ATTRIBUTE = new Action("Remove Attribute"); + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + /** + * + */ + + protected class ResolverAttribute implements Serializable { + private static final long serialVersionUID = 1L; + String identifier = null; + String prefix = null; + PIPResolverParam id = null; + PIPResolverParam category = null; + PIPResolverParam datatype = null; + PIPResolverParam issuer = null; + PIPResolverParam column = null; + + public ResolverAttribute(String prefix, String identifier) { + this.prefix = prefix; + this.identifier = identifier; + } + + public ResolverAttribute(String prefix, String identifier, ResolverAttribute target) { + this(prefix, identifier); + this.setId(target.getId()); + this.setCategory(target.getCategory()); + this.setDatatype(target.getDatatype()); + this.setIssuer(target.getIssuer()); + this.setColumn(target.getColumn()); + this.setResolver(target.id.getPipresolver()); + } + + public String getIdentifier() { + return this.identifier; + } + + public String getId() { + if (this.id == null) { + return null; + } + return this.id.getParamValue(); + } + + public String getShortId() { + String id = this.getId(); + if (id == null) { + return null; + } + return XACMLConstants.extractShortName(id); + } + + public PIPResolverParam getIdParam() { + return this.id; + } + + public void setId(String id) { + if (this.id == null) { + this.id = new PIPResolverParam(); + this.id.setParamName(this.prefix + this.identifier + ".id"); + } + this.id.setParamValue(id); + } + + public void setId(PIPResolverParam param) { + this.id = param; + } + + public String getCategory() { + if (this.category == null) { + return null; + } + return this.category.getParamValue(); + } + + public String getShortCategory() { + String category = this.getCategory(); + if (category == null) { + return null; + } + return XACMLConstants.extractShortName(category); + } + + public PIPResolverParam getCategoryParam() { + return this.category; + } + + public void setCategory(String category) { + if (this.category == null) { + this.category = new PIPResolverParam(); + this.category.setParamName(this.prefix + this.identifier + ".category"); + } + this.category.setParamValue(category); + } + + public void setCategory(PIPResolverParam param) { + this.category = param; + } + + public String getDatatype() { + if (this.datatype == null) { + return null; + } + return this.datatype.getParamValue(); + } + + public String getShortDatatype() { + String dt = this.getDatatype(); + if (dt == null) { + return null; + } + return XACMLConstants.extractShortName(dt); + } + + public PIPResolverParam getDatatypeParam() { + return this.datatype; + } + + public void setDatatype(String datatype) { + if (this.datatype == null) { + this.datatype = new PIPResolverParam(); + this.datatype.setParamName(this.prefix + this.identifier + ".datatype"); + } + this.datatype.setParamValue(datatype); + } + + public void setDatatype(PIPResolverParam param) { + this.datatype = param; + } + + public String getIssuer() { + if (this.issuer == null) { + return null; + } + return this.issuer.getParamValue(); + } + + public String getShortIssuer() { + String issuer = this.getIssuer(); + if (issuer == null) { + return null; + } + return XACMLConstants.extractShortName(issuer); + } + + public PIPResolverParam getIssuerParam() { + return this.issuer; + } + + public void setIssuer(String issuer) { + if (this.issuer == null) { + this.issuer = new PIPResolverParam(); + this.issuer.setParamName(this.prefix + this.identifier + ".issuer"); + } + this.issuer.setParamValue(issuer); + } + + public void setIssuer(PIPResolverParam param) { + this.issuer = param; + } + + public Integer getColumn() { + if (this.column == null) { + return null; + } + try { + return Integer.parseInt(this.column.getParamValue()); + } catch (NumberFormatException e) { + logger.error("Failed to set column: " + e); + return null; + } + } + + public PIPResolverParam getColumnParam() { + return this.column; + } + + public void setColumn(Integer col) { + if (this.column == null) { + this.column = new PIPResolverParam(); + this.column.setParamName(this.prefix + this.identifier + "column"); + } + this.column.setParamValue(col.toString()); + } + + public void setColumn(PIPResolverParam param) { + this.column = param; + } + + public void setResolver(PIPResolver resolver) { + if (this.id != null) { + this.id.setPipresolver(resolver); + } + if (this.category != null) { + this.category.setPipresolver(resolver); + } + if (this.datatype != null) { + this.datatype.setPipresolver(resolver); + } + if (this.issuer != null) { + this.issuer.setPipresolver(resolver); + } + if (this.column != null) { + this.column.setPipresolver(resolver); + } + } + } + + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PIPSQLResolverEditorWindow.class); + private final PIPSQLResolverEditorWindow self = this; + private final EntityItem<PIPResolver> entity; + private final BeanItemContainer<ResolverAttribute> fieldsContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class); + private final BeanItemContainer<ResolverAttribute> parametersContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class); + private final BasicNotifier notifier = new BasicNotifier(); + boolean isSaved = false; + String fieldPrefix; + String parameterPrefix; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PIPSQLResolverEditorWindow(EntityItem<PIPResolver> entity) { + buildMainLayout(); + setCompositionRoot(mainLayout); + // + // Save + // + this.entity = entity; + // + // Initialize + // + this.initialize(); + } + + protected boolean isSQL() { + if (this.entity.getEntity().getPipconfiguration().getPiptype().isSQL() || + this.entity.getEntity().getPipconfiguration().getPiptype().isHyperCSV()) { + return true; + } + return false; + } + + protected boolean isLDAP() { + return this.entity.getEntity().getPipconfiguration().getPiptype().isLDAP(); + } + + protected boolean isCSV() { + return this.entity.getEntity().getPipconfiguration().getPiptype().isCSV(); + } + + protected void initialize() { + // + // Initialize entity + // + this.initializeEntity(); + // + // Go through the parameters, save them into a + // properties object. + // + boolean sourceInitialized = false; + boolean attributeInitialized = false; + for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) { + // + // Look for ones we know about + // + if (param.getParamName().equalsIgnoreCase("select")) { + this.textAreaSelect.setValue(param.getParamValue()); + this.textAreaSelect.setData(param); + } else if (param.getParamName().equals("fields") || param.getParamName().equals("filter.view")) { + this.initializeSourceTable(param.getParamValue()); + this.tableRequiredAttributes.setData(param); + sourceInitialized = true; + } else if (param.getParamName().equals("parameters") || param.getParamName().equals("filter.parameters")) { + this.initializeAttributeTable(param.getParamValue()); + this.tableAttributes.setData(param); + attributeInitialized = true; + } else if (param.getParamName().equalsIgnoreCase("base")) { + this.textFieldBase.setValue(param.getParamValue()); + this.textFieldBase.setData(param); + } else if (param.getParamName().equalsIgnoreCase("filter")) { + this.textFieldFilter.setValue(param.getParamValue()); + this.textFieldFilter.setData(param); + } + } + // + // Initialize GUI + // + this.initializeText(); + this.initializeCheckBox(); + // + // Verify the tables get setup, if this is a new object + // then they haven't been. + // + if (sourceInitialized == false) { + this.initializeSourceTable(""); + } + if (attributeInitialized == false) { + this.initializeAttributeTable(""); + } + } + + protected void initializeEntity() { + // + // Make sure the classname is set correctly + // + if (this.isSQL()) { + // + // + // + this.fieldPrefix = "field."; + this.parameterPrefix = "parameter."; + this.entity.getEntity().setClassname(ConfigurableJDBCResolver.class.getCanonicalName()); + } else if (this.isLDAP()) { + // + // + // + this.fieldPrefix = "filter.view."; + this.parameterPrefix = "filter.parameters."; + this.entity.getEntity().setClassname(ConfigurableLDAPResolver.class.getCanonicalName()); + } else if (this.isCSV()) { + // + // + // + this.fieldPrefix = "field."; + this.parameterPrefix = "parameter."; + this.entity.getEntity().setClassname(ConfigurableCSVResolver.class.getCanonicalName()); + } + } + + protected void initializeText() { + // + // Are we SQL or LDAP? + // + if (this.isSQL()) { + // + // Turn these off + // + this.textFieldBase.setRequired(false); + this.textFieldBase.setVisible(false); + this.textFieldFilter.setRequired(false); + this.textFieldFilter.setVisible(false); + // + // GUI properties + // + this.textAreaSelect.setImmediate(true); + // + // Respond to changes + // + this.textAreaSelect.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPResolverParam param = (PIPResolverParam) self.textAreaSelect.getData(); + if (param == null) { + param = new PIPResolverParam(); + param.setPipresolver(self.entity.getEntity()); + param.setParamName("select"); + self.entity.getEntity().addPipresolverParam(param); + self.textAreaSelect.setData(param); + } + param.setParamValue(self.textAreaSelect.getValue()); + self.fireFormChangedEvent(); + } + }); + } else if (this.isLDAP()) { + // + // Turn these off + // + this.textAreaSelect.setRequired(false); + this.textAreaSelect.setVisible(false); + // + // + // + this.textFieldBase.setImmediate(true); + this.textFieldBase.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPResolverParam param = (PIPResolverParam) self.textFieldBase.getData(); + if (param == null) { + param = new PIPResolverParam(); + param.setPipresolver(self.entity.getEntity()); + param.setParamName("base"); + self.entity.getEntity().addPipresolverParam(param); + self.textFieldBase.setData(param); + } + param.setParamValue(self.textFieldBase.getValue()); + self.fireFormChangedEvent(); + } + }); + // + // + // + this.textFieldFilter.setImmediate(true); + this.textFieldFilter.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + PIPResolverParam param = (PIPResolverParam) self.textFieldFilter.getData(); + if (param == null) { + param = new PIPResolverParam(); + param.setPipresolver(self.entity.getEntity()); + param.setParamName("filter"); + self.entity.getEntity().addPipresolverParam(param); + self.textFieldFilter.setData(param); + } + param.setParamValue(self.textFieldFilter.getValue()); + self.fireFormChangedEvent(); + } + }); + } else if (this.isCSV()) { + // + // Turn these off + // + this.textAreaSelect.setRequired(false); + this.textAreaSelect.setVisible(false); + this.textFieldBase.setRequired(false); + this.textFieldBase.setVisible(false); + this.textFieldFilter.setRequired(false); + this.textFieldFilter.setVisible(false); + } + } + + protected void initializeCheckBox() { + this.checkBoxShortIds.setValue(true); + this.checkBoxShortIds.setImmediate(true); + this.checkBoxShortIds.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.checkBoxShortIds.getValue()) { + self.tableRequiredAttributes.setColumnCollapsed("id", true); + self.tableRequiredAttributes.setColumnCollapsed("category", true); + self.tableRequiredAttributes.setColumnCollapsed("datatype", true); + self.tableRequiredAttributes.setColumnCollapsed("shortId", false); + self.tableRequiredAttributes.setColumnCollapsed("shortCategory", false); + self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", false); + } else { + self.tableRequiredAttributes.setColumnCollapsed("id", false); + self.tableRequiredAttributes.setColumnCollapsed("category", false); + self.tableRequiredAttributes.setColumnCollapsed("datatype", false); + self.tableRequiredAttributes.setColumnCollapsed("shortId", true); + self.tableRequiredAttributes.setColumnCollapsed("shortCategory", true); + self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", true); + } + } + }); + } + + protected void initializeSourceTable(String fields) { + // + // Add data into the container + // + this.populateData(this.fieldPrefix, fields, this.fieldsContainer); + // + // Set GUI properties + // + this.tableRequiredAttributes.setContainerDataSource(this.fieldsContainer); + this.tableRequiredAttributes.setPageLength((this.fieldsContainer.size() == 0 ? 3 : this.fieldsContainer.size() + 1)); + this.tableRequiredAttributes.setSizeFull(); + this.tableRequiredAttributes.setColumnCollapsingAllowed(true); + this.tableRequiredAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"}); + this.tableRequiredAttributes.setColumnHeaders(new String[] {"Field", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"}); + this.tableRequiredAttributes.setColumnCollapsed("id", true); + this.tableRequiredAttributes.setColumnCollapsed("category", true); + this.tableRequiredAttributes.setColumnCollapsed("datatype", true); + this.tableRequiredAttributes.setSelectable(true); + // + // Setup its handler + // + this.tableRequiredAttributes.addActionHandler(this); + // + // Respond to events + // + this.tableRequiredAttributes.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + Object id = event.getItemId(); + if (id == null) { + // + // Really shouldn't get here + // + return; + } + BeanItem<ResolverAttribute> beanItem = self.fieldsContainer.getItem(id); + if (beanItem == null) { + // + // Again, shouldn't get here + // + return; + } + self.editAttribute(self.tableRequiredAttributes, beanItem.getBean()); + } + } + }); + } + + protected void initializeAttributeTable(String parameters) { + // + // Add data into the container + // + this.populateData(this.parameterPrefix, parameters, this.parametersContainer); + // + // setup gui properties + // + this.tableAttributes.setContainerDataSource(this.parametersContainer); + this.tableAttributes.setPageLength(this.parametersContainer.size() + 1); + this.tableAttributes.setSizeFull(); + this.tableAttributes.setColumnCollapsingAllowed(true); + this.tableAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"}); + this.tableAttributes.setColumnHeaders(new String[] {"Position", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"}); + this.tableAttributes.setColumnCollapsed("id", true); + this.tableAttributes.setColumnCollapsed("category", true); + this.tableAttributes.setColumnCollapsed("datatype", true); + this.tableAttributes.setSelectable(true); + // + // Setup its handler + // + this.tableAttributes.addActionHandler(this); + // + // Respond to events + // + this.tableAttributes.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + Object id = event.getItemId(); + if (id == null) { + // + // Really shouldn't get here + // + return; + } + BeanItem<ResolverAttribute> beanItem = self.parametersContainer.getItem(id); + if (beanItem == null) { + // + // Again, shouldn't get here + // + return; + } + self.editAttribute(self.tableAttributes, beanItem.getBean()); + } + } + }); + } + + protected void populateData(String prefix, String list, BeanItemContainer<ResolverAttribute> container) { + for (String field : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) { + // + // Create a bean for this field + // + ResolverAttribute bean = new ResolverAttribute(prefix, field); + // + // Now try to find the attribute information + // + for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) { + if (param.getParamName().equals(prefix + field + ".id")) { + bean.setId(param); + } else if (param.getParamName().equals(prefix + field + ".category")) { + bean.setCategory(param); + } else if (param.getParamName().equals(prefix + field + ".datatype")) { + bean.setDatatype(param); + } else if (param.getParamName().equals(prefix + field + ".issuer")) { + bean.setIssuer(param); + } else if (param.getParamName().equals(prefix + field + ".column")) { + bean.setColumn(param); + } + } + container.addBean(bean); + } + } + + @Override + public Action[] getActions(Object target, Object sender) { + if (target == null) { + return new Action[] {ADD_ATTRIBUTE}; + } + return new Action[] {EDIT_ATTRIBUTE, CLONE_ATTRIBUTE, REMOVE_ATTRIBUTE}; + } + + @Override + public void handleAction(Action action, Object sender, Object target) { + if (action == ADD_ATTRIBUTE) { + if (sender.equals(this.tableRequiredAttributes)) { + this.editAttribute(self.tableRequiredAttributes, null); + } else { + this.editAttribute(self.tableAttributes, null); + } + return; + } + if (action == EDIT_ATTRIBUTE) { + assert target instanceof ResolverAttribute; + if (sender.equals(this.tableRequiredAttributes)) { + this.editAttribute(self.tableRequiredAttributes, (ResolverAttribute) target); + } else { + this.editAttribute(self.tableAttributes, (ResolverAttribute) target); + } + return; + } + if (action == CLONE_ATTRIBUTE) { + assert target instanceof ResolverAttribute; + try { + // + // Which table? + // + if (sender.equals(this.tableRequiredAttributes)) { + // + // Clone the attribute giving it a new + // field name. + // + ResolverAttribute clone = new ResolverAttribute(this.fieldPrefix, this.getNextField(), (ResolverAttribute) target); + // + // Add it to the container + // + this.fieldsContainer.addBean(clone); + // + // Reset the page length so we can see it and have room + // to add another. + // + this.tableRequiredAttributes.setPageLength(this.fieldsContainer.size() + 1); + // + // Select it + // + this.tableRequiredAttributes.select(clone); + } else { + // + // Clone the attribute giving it a new + // field name. + // + ResolverAttribute clone = new ResolverAttribute(this.parameterPrefix, this.getNextParameter(), (ResolverAttribute) target); + // + // Add it to the container + // + this.parametersContainer.addBean(clone); + // + // Reset the page length so we can see it and have room + // to add another. + // + this.tableAttributes.setPageLength(this.parametersContainer.size() + 1); + // + // Select it + // + this.tableAttributes.select(clone); + } + // + // We have changed + // + this.fireFormChangedEvent(); + } catch (Exception e) { + logger.error("Failed to clone: " + e); + } + return; + } + if (action == REMOVE_ATTRIBUTE) { + assert target instanceof ResolverAttribute; + // + // Help method to remove the attribute + // + this.removeAttribute((ResolverAttribute) target); + // + // Which table? + // + if (sender.equals(this.tableRequiredAttributes)) { + // + // Now remove it from the table + // + this.tableRequiredAttributes.removeItem(target); + } else { + // + // Now remove it from the table + // + this.tableAttributes.removeItem(target); + } + // + // we have changed + // + this.fireFormChangedEvent(); + return; + } + } + + protected void removeAttribute(ResolverAttribute target) { + this.entity.getEntity().removePipresolverParam(target.getIdParam()); + this.entity.getEntity().removePipresolverParam(target.getCategoryParam()); + this.entity.getEntity().removePipresolverParam(target.getDatatypeParam()); + this.entity.getEntity().removePipresolverParam(target.getIssuerParam()); + } + + protected void editAttribute(final Table table, final ResolverAttribute request) { + if (this.isCSV()) { + this.editCSVAttribute(table, request); + } else { + this.editResolverAttribute(table, request, null); + } + } + + protected void editCSVAttribute(final Table table, final ResolverAttribute request) { + assert this.isCSV(); + // + // Prompt for the column + // + final ColumnSelectionWindow window = new ColumnSelectionWindow((request != null ? request.getColumn() : 0)); + if (request == null) { + window.setCaption("Input the CSV Column for the new attribute"); + } else { + window.setCaption("Edit the CSV Column for the attribute"); + } + window.setModal(true); + window.center(); + window.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent e) { + // + // Did the user save? + // + if (window.isSaved() == false) { + return; + } + // + // Save it if its not a new + // + if (request != null) { + request.setColumn(window.getColumn()); + } + // + // Now we select the attribute, pass the column + // in case this is a brand new attribute. Yeah its messy. + // + self.editResolverAttribute(table, request, window.getColumn()); + } + }); + window.center(); + UI.getCurrent().addWindow(window); + } + + protected void editResolverAttribute(final Table table, final ResolverAttribute request, final Integer column) { + // + // Provide objects to the attribute selection window + // + AttributeDesignatorType designator = new AttributeDesignatorType(); + if (request == null) { + designator.setAttributeId(XACML3.ID_SUBJECT_SUBJECT_ID.stringValue()); + designator.setCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue()); + designator.setDataType(XACML3.ID_DATATYPE_STRING.stringValue()); + designator.setIssuer(this.entity.getEntity().getIssuer()); + } else { + designator.setAttributeId(request.getId()); + designator.setCategory(request.getCategory()); + designator.setDataType(request.getDatatype()); + designator.setIssuer(request.getIssuer()); + } + // + // Have user select an attribute + // + final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, designator); + selection.setModal(true); + selection.setCaption("Select Attribute"); + selection.addCloseListener(new CloseListener() { + private static final long serialVersionUID = 1L; + + @Override + public void windowClose(CloseEvent event) { + // + // User click Save button? + // + if (selection.isSaved() == false) { + return; + } + // + // Yes - get the final attribute + // + Attribute attribute = selection.getAttribute(); + // + // Is it a new one? + // + if (request == null) { + try { + // + // Create a new bean + // + ResolverAttribute bean = null; + if (table.equals(self.tableRequiredAttributes)) { + bean = new ResolverAttribute(self.fieldPrefix, self.getNextField()); + } else { + bean = new ResolverAttribute(self.parameterPrefix, self.getNextParameter()); + } + bean.setId(attribute.getXacmlId()); + bean.setCategory(attribute.getCategoryBean().getXacmlId()); + bean.setDatatype(attribute.getDatatypeBean().getXacmlId()); + if (attribute.getIssuer() != null) { + bean.setIssuer(attribute.getIssuer()); + } + if (column != null) { + bean.setColumn(column); + } + // + // Add it to the resolver + // + bean.setResolver(self.entity.getEntity()); + self.entity.getEntity().addPipresolverParam(bean.getIdParam()); + self.entity.getEntity().addPipresolverParam(bean.getCategoryParam()); + self.entity.getEntity().addPipresolverParam(bean.getDatatypeParam()); + if (bean.getIssuer() != null) { + self.entity.getEntity().addPipresolverParam(bean.getIssuerParam()); + } + // + // Which table? + // + if (table.equals(self.tableRequiredAttributes)) { + // + // Add to table + // + self.fieldsContainer.addBean(bean); + // + // Reset the page length + // + self.tableRequiredAttributes.setPageLength(self.fieldsContainer.size() + 1); + } else if (table.equals(self.tableAttributes)) { + // + // Add to table + // + self.parametersContainer.addBean(bean); + // + // Reset the page length + // + self.tableAttributes.setPageLength(self.parametersContainer.size() + 1); + } + if (logger.isDebugEnabled()) { + logger.debug("Added new attribute: " + bean); + } + } catch (Exception e) { + logger.error(e); + AdminNotification.error("Unable to add another required attribute field"); + } + } else { + // + // Update the table entry + // + request.setId(attribute.getXacmlId()); + request.setCategory(attribute.getCategoryBean().getXacmlId()); + request.setDatatype(attribute.getDatatypeBean().getXacmlId()); + request.setIssuer(attribute.getIssuer()); + // + // Let the table know + // + table.refreshRowCache(); + } + // + // we have changed + // + self.fireFormChangedEvent(); + } + }); + selection.center(); + UI.getCurrent().addWindow(selection); + } + + protected String getNextField() throws Exception { + // + // Start at the next index number. NOTE: The GUI needs + // to use numbers to index the fields. + // + int index = this.tableRequiredAttributes.size() + 1; + // + // Really if we get to 100, that's an insane number of fields + // needed for a SQL query. + // + while (index < 100) { + String field = String.format("%02d", index); + boolean exists = false; + for (Object id : this.tableRequiredAttributes.getItemIds()) { + @SuppressWarnings("unchecked") + BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableRequiredAttributes.getItem(id); + if (required.getBean().getIdentifier().equals(field)) { + exists = true; + index++; + break; + } + } + if (exists == false) { + return field; + } + } + // + // Sanity check + // + throw new Exception("Unable to find a next field name. Are there too many fields?"); + } + + protected String getNextParameter() throws Exception { + // + // Start at the next index number. NOTE: The GUI needs + // to use numbers to index the fields. + // + int index = this.tableAttributes.size() + 1; + // + // Really if we get to 100, that's an insane number of fields + // needed for a SQL query. + // + while (index < 100) { + String field = String.format("%02d", index); + boolean exists = false; + for (Object id : this.tableAttributes.getItemIds()) { + @SuppressWarnings("unchecked") + BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableAttributes.getItem(id); + if (required.getBean().getIdentifier().equals(field)) { + exists = true; + index++; + break; + } + } + if (exists == false) { + return field; + } + } + // + // Sanity check + // + throw new Exception("Unable to find a next parameter name. Are there too many parameters?"); + } + + public void discard() throws SourceException { + if (this.isSQL()) { + this.textAreaSelect.discard(); + } else if (this.isLDAP()) { + this.textFieldBase.discard(); + this.textFieldFilter.discard(); + // } else if (this.isCSV()) { + } + } + + public void validate() throws InvalidValueException { + if (this.isSQL()) { + this.textAreaSelect.validate(); + } else if (this.isLDAP()) { + this.textFieldBase.validate(); + this.textFieldFilter.validate(); + //} else if (this.isCSV()) { + + } + } + + public void commit() throws SourceException, InvalidValueException { + // + // Commit required fields + // + if (this.isSQL()) { + this.textAreaSelect.commit(); + } else if (this.isLDAP()) { + this.textFieldBase.commit(); + this.textFieldFilter.commit(); + // } else if (this.isCSV()) { + } + // + // Setup the fields + // + { + List<String> fields = new ArrayList<String>(this.fieldsContainer.size()); + for (ResolverAttribute attribute : this.fieldsContainer.getItemIds()) { + fields.add(attribute.getIdentifier()); + } + PIPResolverParam param = (PIPResolverParam) this.tableRequiredAttributes.getData(); + if (param == null) { + param = new PIPResolverParam(); + if (this.isSQL()) { + param.setParamName("fields"); + } else if (this.isLDAP()) { + param.setParamName("filter.view"); + } else if (this.isCSV()) { + param.setParamName("fields"); + } + this.entity.getEntity().addPipresolverParam(param); + this.tableRequiredAttributes.setData(param); + } + param.setParamValue(Joiner.on(',').join(fields)); + } + // + // Setup the parameters + // + { + List<String> parameters = new ArrayList<String>(this.parametersContainer.size()); + for (ResolverAttribute attribute : this.parametersContainer.getItemIds()) { + parameters.add(attribute.getIdentifier()); + } + PIPResolverParam param = (PIPResolverParam) this.tableAttributes.getData(); + if (param == null) { + param = new PIPResolverParam(); + if (this.isSQL()) { + param.setParamName("parameters"); + } else if (this.isLDAP()) { + param.setParamName("filter.parameters"); + } else if (this.isCSV()) { + param.setParamName("parameters"); + } + this.entity.getEntity().addPipresolverParam(param); + this.tableAttributes.setData(param); + } + param.setParamValue(Joiner.on(',').join(parameters)); + } + } + + public boolean isSaved() { + return this.isSaved; + } + + @Override + public boolean addListener(FormChangedEventListener listener) { + return this.notifier.addListener(listener); + } + + @Override + public boolean removeListener(FormChangedEventListener listener) { + return this.notifier.removeListener(listener); + } + + @Override + public void fireFormChangedEvent() { + this.notifier.fireFormChangedEvent(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textAreaSelect + textAreaSelect = new TextArea(); + textAreaSelect.setCaption("SQL Select Statement"); + textAreaSelect.setImmediate(false); + textAreaSelect.setWidth("100.0%"); + textAreaSelect.setHeight("-1px"); + textAreaSelect.setInvalidAllowed(false); + textAreaSelect.setRequired(true); + mainLayout.addComponent(textAreaSelect); + mainLayout.setExpandRatio(textAreaSelect, 1.0f); + + // textFieldBase + textFieldBase = new TextField(); + textFieldBase.setCaption("Base DN"); + textFieldBase.setImmediate(false); + textFieldBase.setWidth("-1px"); + textFieldBase.setHeight("-1px"); + mainLayout.addComponent(textFieldBase); + + // textFieldFilter + textFieldFilter = new TextField(); + textFieldFilter.setCaption("Filter"); + textFieldFilter.setImmediate(false); + textFieldFilter.setWidth("-1px"); + textFieldFilter.setHeight("-1px"); + mainLayout.addComponent(textFieldFilter); + + // checkBoxShortIds + checkBoxShortIds = new CheckBox(); + checkBoxShortIds.setCaption("Display short id’s."); + checkBoxShortIds.setImmediate(false); + checkBoxShortIds.setWidth("-1px"); + checkBoxShortIds.setHeight("-1px"); + mainLayout.addComponent(checkBoxShortIds); + + // tableRequiredAttributes + tableRequiredAttributes = new Table(); + tableRequiredAttributes.setCaption("Attributes Returned"); + tableRequiredAttributes.setImmediate(false); + tableRequiredAttributes.setWidth("-1px"); + tableRequiredAttributes.setHeight("-1px"); + mainLayout.addComponent(tableRequiredAttributes); + + // tableAttributes + tableAttributes = new Table(); + tableAttributes.setCaption("Parameters - Attributes Needed (i.e. ?)"); + tableAttributes.setImmediate(false); + tableAttributes.setWidth("-1px"); + tableAttributes.setHeight("-1px"); + tableAttributes.setInvalidAllowed(false); + tableAttributes.setRequired(true); + mainLayout.addComponent(tableAttributes); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java new file mode 100644 index 0000000..f9d70c8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java
@@ -0,0 +1,252 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Label; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PolicyEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextArea textAreaDescription; + @AutoGenerated + private ListSelect listSelectAlgorithm; + @AutoGenerated + private TextField textFieldVersion; + @AutoGenerated + private Label labelID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final PolicyEditorWindow self = this; + private final PolicyType policy; + private JPAContainer<RuleAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getRuleAlgorithms(); + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PolicyEditorWindow(PolicyType policy) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.policy = policy; + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeLabel(); + this.initializeText(); + this.initializeSelect(); + this.initializeButton(); + // + // Focus + // + this.textAreaDescription.focus(); + } + + protected void initializeLabel() { + if (this.policy.getPolicyId() == null) { + this.policy.setPolicyId(((XacmlAdminUI)UI.getCurrent()).newPolicyID()); + } + this.labelID.setValue(this.policy.getPolicyId()); + } + + protected void initializeText() { + // + // + // + this.textAreaDescription.setNullRepresentation(""); + this.textAreaDescription.setValue(this.policy.getDescription()); + // + // + // + if (this.policy.getVersion() == null) { + this.policy.setVersion("1"); + } + this.textFieldVersion.setRequiredError("The exact format is: ((\\d+|\\*)\\.)*(\\d+|\\*|\\+)"); + this.textFieldVersion.addValidator(new RegexpValidator("((\\d+|\\*)\\.)*(\\d+|\\*|\\+)", true, "The version MUST a number optionally separated by '.' eg. 1 or 1.0 or 1.1.1 etc.")); + this.textFieldVersion.setValue(this.policy.getVersion()); + } + + protected void initializeSelect() { + this.listSelectAlgorithm.setContainerDataSource(this.algorithms); + this.listSelectAlgorithm.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.listSelectAlgorithm.setItemCaptionPropertyId("xacmlId"); + this.listSelectAlgorithm.setNullSelectionAllowed(false); + + if (this.policy.getRuleCombiningAlgId() == null) { + this.policy.setRuleCombiningAlgId(XACML3.ID_RULE_FIRST_APPLICABLE.stringValue()); + } + this.listSelectAlgorithm.setValue(JPAUtils.findRuleAlgorithm(this.policy.getRuleCombiningAlgId()).getId()); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.listSelectAlgorithm.commit(); + self.textFieldVersion.commit(); + self.textAreaDescription.commit(); + // + // Save everything + // + self.policy.setDescription(self.textAreaDescription.getValue()); + self.policy.setVersion(self.textFieldVersion.getValue()); + Object id = self.listSelectAlgorithm.getValue(); + self.policy.setRuleCombiningAlgId(algorithms.getItem(id).getEntity().getXacmlId()); + // + // Mark ourselves as saved + // + self.isSaved = true; + // + // Close window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // VAADIN will show the required error message to the user + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public PolicyType getPolicySet() { + return this.policy; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // labelID + labelID = new Label(); + labelID.setCaption("Policy Set ID"); + labelID.setImmediate(false); + labelID.setWidth("100.0%"); + labelID.setHeight("-1px"); + labelID.setValue("Label"); + mainLayout.addComponent(labelID); + + // textFieldVersion + textFieldVersion = new TextField(); + textFieldVersion.setCaption("Version"); + textFieldVersion.setImmediate(false); + textFieldVersion + .setDescription("The format is numbers only separated by decimal point."); + textFieldVersion.setWidth("-1px"); + textFieldVersion.setHeight("-1px"); + textFieldVersion.setInvalidAllowed(false); + textFieldVersion.setRequired(true); + textFieldVersion.setInputPrompt("Eg. 1 or 1.0 or 1.0.0 etc."); + mainLayout.addComponent(textFieldVersion); + + // listSelectAlgorithm + listSelectAlgorithm = new ListSelect(); + listSelectAlgorithm.setCaption("Policy Combining Algorithm"); + listSelectAlgorithm.setImmediate(false); + listSelectAlgorithm.setWidth("100.0%"); + listSelectAlgorithm.setHeight("-1px"); + listSelectAlgorithm.setInvalidAllowed(false); + listSelectAlgorithm.setRequired(true); + mainLayout.addComponent(listSelectAlgorithm); + + // textAreaDescription + textAreaDescription = new TextArea(); + textAreaDescription.setCaption("Description"); + textAreaDescription.setImmediate(false); + textAreaDescription.setWidth("100.0%"); + textAreaDescription.setHeight("-1px"); + mainLayout.addComponent(textAreaDescription); + mainLayout.setExpandRatio(textAreaDescription, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java new file mode 100644 index 0000000..73149cc --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java
@@ -0,0 +1,369 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms; +import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.JPAContainerItem; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Window; + +public class PolicyNameEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(PolicyNameEditorWindow.class); + private final PolicyNameEditorWindow self = this; + private Object data = null; + private String filename = null; + private boolean isSaved = false; + + @AutoGenerated + private FormLayout mainLayout; + @AutoGenerated + private ComboBox comboAlgorithms; + @AutoGenerated + private OptionGroup optionPolicySet; + @AutoGenerated + private TextArea textAreaDescription; + @AutoGenerated + private TextField textFieldPolicyName; + @AutoGenerated + private Button buttonSave; + + JPAContainer<PolicyAlgorithms> policyAlgorithms; + JPAContainer<RuleAlgorithms> ruleAlgorithms; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PolicyNameEditorWindow(String filename, Object policyData, JPAContainer<PolicyAlgorithms> policyAlgs, JPAContainer<RuleAlgorithms> ruleAlgs) { + buildMainLayout(); + setContent(mainLayout); + + this.mainLayout.setMargin(true); + + this.filename = filename; + this.data = policyData; + this.policyAlgorithms = policyAlgs; + this.ruleAlgorithms = ruleAlgs; + + this.optionPolicySet.addItem("Policy Set"); + this.optionPolicySet.addItem("Policy"); + + this.comboAlgorithms.setNewItemsAllowed(false); + this.comboAlgorithms.setNullSelectionAllowed(false); + this.comboAlgorithms.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboAlgorithms.setItemCaptionPropertyId("xacmlId"); + // + // Setup the policy filename + // + this.textFieldPolicyName.setImmediate(true); + this.textFieldPolicyName.setNullRepresentation(""); + if (filename != null) { + this.textFieldPolicyName.setValue(filename); + } + this.textFieldPolicyName.addValidator(new Validator() { + private static final long serialVersionUID = 1L; + + @Override + public void validate(Object value) throws InvalidValueException { + if (value instanceof String) { + String filename = (String) value; + if (filename.endsWith(".xml")) { + filename = filename.substring(0, filename.length() - 4); + } + if (filename.length() == 0) { + throw new InvalidValueException("Invalid filename."); + } + if (filename.indexOf('.') != -1) { + throw new InvalidValueException("Please do not use a \'.\' in the filename."); + } + } + } + + }); + this.textFieldPolicyName.setValidationVisible(true); + // + // Are we editing or creating? + // + if (this.data != null) { + // + // We are editing + // + if (this.data instanceof PolicySetType) { + this.optionPolicySet.setValue("Policy Set"); + this.optionPolicySet.setVisible(false); + this.textAreaDescription.setValue(((PolicySetType)this.data).getDescription()); + this.comboAlgorithms.setContainerDataSource(policyAlgs); + for (Object object : this.policyAlgorithms.getItemIds()) { + PolicyAlgorithms a = (PolicyAlgorithms) this.policyAlgorithms.getItem(object).getEntity(); + if (a.getXacmlId().equals(((PolicySetType)this.data).getPolicyCombiningAlgId())) { + this.comboAlgorithms.select(object); + break; + } + } + } + if (this.data instanceof PolicyType) { + this.optionPolicySet.setValue("Policy"); + this.optionPolicySet.setVisible(false); + this.textAreaDescription.setValue(((PolicyType)this.data).getDescription()); + this.comboAlgorithms.setContainerDataSource(ruleAlgs); + for (Object object : this.ruleAlgorithms.getItemIds()) { + RuleAlgorithms a = (RuleAlgorithms) this.ruleAlgorithms.getItem(object).getEntity(); + if (a.getXacmlId().equals(((PolicyType)this.data).getRuleCombiningAlgId())) { + this.comboAlgorithms.select(object); + break; + } + } + } + } else { + // + // Creating a new policy + // + this.optionPolicySet.setValue("Policy Set"); + this.comboAlgorithms.setContainerDataSource(policyAlgs); + this.comboAlgorithms.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.comboAlgorithms.setItemCaptionPropertyId("xacmlId"); + for (Object object : this.policyAlgorithms.getItemIds()) { + PolicyAlgorithms a = (PolicyAlgorithms) this.policyAlgorithms.getItem(object).getEntity(); + if (a.getXacmlId().equals(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue())) { + this.comboAlgorithms.select(object); + break; + } + } + + this.optionPolicySet.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.optionPolicySet.getValue().toString().equals("Policy Set")) { + self.comboAlgorithms.setContainerDataSource(self.policyAlgorithms); + for (Object object : self.policyAlgorithms.getItemIds()) { + PolicyAlgorithms a = (PolicyAlgorithms) self.policyAlgorithms.getItem(object).getEntity(); + if (a.getXacmlId().equals(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue())) { + self.comboAlgorithms.select(object); + break; + } + } + } else if (self.optionPolicySet.getValue().toString().equals("Policy")) { + self.comboAlgorithms.setContainerDataSource(self.ruleAlgorithms); + for (Object object : self.ruleAlgorithms.getItemIds()) { + RuleAlgorithms a = (RuleAlgorithms) self.ruleAlgorithms.getItem(object).getEntity(); + if (a.getXacmlId().equals(XACML3.ID_RULE_FIRST_APPLICABLE.stringValue())) { + self.comboAlgorithms.select(object); + break; + } + } + } + } + + }); + } + + this.buttonSave.setClickShortcut(KeyCode.ENTER); + + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Make sure the policy filename was valid + // + if (self.textFieldPolicyName.isValid() == false) { + return; + } + // + // Grab the filename (NOTE: The user may or may not + // have changed the name). + // + self.filename = self.textFieldPolicyName.getValue(); + // + // Make sure the filename ends with an extension + // + if (self.filename.endsWith(".xml") == false) { + self.filename = self.filename + ".xml"; + } + // + // Set ourselves as saved + // + self.isSaved = true; + // + // Now grab the policy file's data + // + if (self.data == null) { + // + // This is a brand new Policy + // + if (self.optionPolicySet.getValue().toString().equals("Policy Set")) { + PolicySetType policySet = new PolicySetType(); + policySet.setVersion("1"); + policySet.setPolicySetId(((XacmlAdminUI)getUI()).newPolicyID()); + policySet.setTarget(new TargetType()); + self.data = policySet; + } else if (self.optionPolicySet.getValue().toString().equals("Policy")) { + PolicyType policy = new PolicyType(); + policy.setVersion("1"); + policy.setPolicyId(((XacmlAdminUI)getUI()).newPolicyID()); + policy.setTarget(new TargetType()); + self.data = policy; + } else { + logger.error("Policy option NOT setup correctly."); + } + } + if (self.data != null) { + // + // Save off everything + // + if (self.data instanceof PolicySetType) { + ((PolicySetType)self.data).setDescription(self.textAreaDescription.getValue()); + Object a = self.comboAlgorithms.getValue(); + PolicyAlgorithms alg = (PolicyAlgorithms) ((JPAContainerItem<?>)self.comboAlgorithms.getItem(a)).getEntity(); + ((PolicySetType)self.data).setPolicyCombiningAlgId(alg.getXacmlId()); + } else if (self.data instanceof PolicyType) { + ((PolicyType)self.data).setDescription(self.textAreaDescription.getValue()); + Object a = self.comboAlgorithms.getValue(); + RuleAlgorithms alg = (RuleAlgorithms) ((JPAContainerItem<?>)self.comboAlgorithms.getItem(a)).getEntity(); + ((PolicyType)self.data).setRuleCombiningAlgId(alg.getXacmlId()); + } else { + logger.error("Unsupported data object." + self.data.getClass().getCanonicalName()); + } + } + // + // Now we can close the window + // + self.close(); + } + }); + + this.textFieldPolicyName.focus(); + } + + public boolean isSaved() { + return this.isSaved; + } + + public Object getPolicyData() { + if (this.isSaved) { + return this.data; + } + return null; + } + + public String getPolicyFilename() { + if (this.isSaved) { + return this.filename; + } + return null; + } + + @AutoGenerated + private FormLayout buildMainLayout() { + // common part: create layout + mainLayout = new FormLayout(); + mainLayout.setImmediate(false); + + // textFieldPolicyName + textFieldPolicyName = new TextField(); + textFieldPolicyName.setCaption("Policy File Name"); + textFieldPolicyName.setImmediate(true); + textFieldPolicyName.setWidth("-1px"); + textFieldPolicyName.setHeight("-1px"); + textFieldPolicyName.setInputPrompt("Enter filename eg. foobar.xml"); + textFieldPolicyName.setRequired(true); + mainLayout.addComponent(textFieldPolicyName); + + // textAreaDescription + textAreaDescription = new TextArea(); + textAreaDescription.setCaption("Description"); + textAreaDescription.setImmediate(false); + textAreaDescription.setWidth("100%"); + textAreaDescription.setHeight("-1px"); + textAreaDescription + .setInputPrompt("Enter a description for the Policy/PolicySet."); + textAreaDescription.setNullSettingAllowed(true); + mainLayout.addComponent(textAreaDescription); + + // optionPolicySet + optionPolicySet = new OptionGroup(); + optionPolicySet.setCaption("Policy or PolicySet?"); + optionPolicySet.setImmediate(true); + optionPolicySet + .setDescription("Is the root level a Policy or Policy Set."); + optionPolicySet.setWidth("-1px"); + optionPolicySet.setHeight("-1px"); + optionPolicySet.setRequired(true); + mainLayout.addComponent(optionPolicySet); + + // comboAlgorithms + comboAlgorithms = new ComboBox(); + comboAlgorithms.setCaption("Combining Algorithm"); + comboAlgorithms.setImmediate(false); + comboAlgorithms.setDescription("Select the combining algorithm."); + comboAlgorithms.setWidth("-1px"); + comboAlgorithms.setHeight("-1px"); + comboAlgorithms.setRequired(true); + mainLayout.addComponent(comboAlgorithms); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java new file mode 100644 index 0000000..af2ae20 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java
@@ -0,0 +1,252 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms; +import org.apache.openaz.xacml.admin.util.JPAUtils; +import org.apache.openaz.xacml.api.XACML3; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Label; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PolicySetEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextArea textAreaDescription; + @AutoGenerated + private ListSelect listSelectAlgorithm; + @AutoGenerated + private TextField textFieldVersion; + @AutoGenerated + private Label labelID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final PolicySetEditorWindow self = this; + private final PolicySetType policySet; + private JPAContainer<PolicyAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getPolicyAlgorithms(); + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PolicySetEditorWindow(PolicySetType policySet) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.policySet = policySet; + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize GUI + // + this.initializeLabel(); + this.initializeText(); + this.initializeSelect(); + this.initializeButton(); + // + // Focus + // + this.textAreaDescription.focus(); + } + + protected void initializeLabel() { + if (this.policySet.getPolicySetId() == null) { + this.policySet.setPolicySetId(((XacmlAdminUI)UI.getCurrent()).newPolicyID()); + } + this.labelID.setValue(this.policySet.getPolicySetId()); + } + + protected void initializeText() { + // + // + // + this.textAreaDescription.setNullRepresentation(""); + this.textAreaDescription.setValue(this.policySet.getDescription()); + // + // + // + if (this.policySet.getVersion() == null) { + this.policySet.setVersion("1"); + } + this.textFieldVersion.setRequiredError("The exact format is: ((\\d+|\\*)\\.)*(\\d+|\\*|\\+)"); + this.textFieldVersion.addValidator(new RegexpValidator("((\\d+|\\*)\\.)*(\\d+|\\*|\\+)", true, "The version MUST a number optionally separated by '.' eg. 1 or 1.0 or 1.1.1 etc.")); + this.textFieldVersion.setValue(this.policySet.getVersion()); + } + + protected void initializeSelect() { + this.listSelectAlgorithm.setContainerDataSource(this.algorithms); + this.listSelectAlgorithm.setItemCaptionMode(ItemCaptionMode.PROPERTY); + this.listSelectAlgorithm.setItemCaptionPropertyId("xacmlId"); + this.listSelectAlgorithm.setNullSelectionAllowed(false); + + if (this.policySet.getPolicyCombiningAlgId() == null) { + this.policySet.setPolicyCombiningAlgId(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue()); + } + this.listSelectAlgorithm.setValue(JPAUtils.findPolicyAlgorithm(this.policySet.getPolicyCombiningAlgId()).getId()); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.listSelectAlgorithm.commit(); + self.textFieldVersion.commit(); + self.textAreaDescription.commit(); + // + // Save everything + // + self.policySet.setDescription(self.textAreaDescription.getValue()); + self.policySet.setVersion(self.textFieldVersion.getValue()); + Object id = self.listSelectAlgorithm.getValue(); + self.policySet.setPolicyCombiningAlgId(algorithms.getItem(id).getEntity().getXacmlId()); + // + // Mark ourselves as saved + // + self.isSaved = true; + // + // Close window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // VAADIN will show the required error message to the user + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public PolicySetType getPolicySet() { + return this.policySet; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // labelID + labelID = new Label(); + labelID.setCaption("Policy Set ID"); + labelID.setImmediate(false); + labelID.setWidth("100.0%"); + labelID.setHeight("-1px"); + labelID.setValue("Label"); + mainLayout.addComponent(labelID); + + // textFieldVersion + textFieldVersion = new TextField(); + textFieldVersion.setCaption("Version"); + textFieldVersion.setImmediate(false); + textFieldVersion + .setDescription("The format is numbers only separated by decimal point."); + textFieldVersion.setWidth("-1px"); + textFieldVersion.setHeight("-1px"); + textFieldVersion.setInvalidAllowed(false); + textFieldVersion.setRequired(true); + textFieldVersion.setInputPrompt("Eg. 1 or 1.0 or 1.0.0 etc."); + mainLayout.addComponent(textFieldVersion); + + // listSelectAlgorithm + listSelectAlgorithm = new ListSelect(); + listSelectAlgorithm.setCaption("Policy Combining Algorithm"); + listSelectAlgorithm.setImmediate(false); + listSelectAlgorithm.setWidth("100.0%"); + listSelectAlgorithm.setHeight("-1px"); + listSelectAlgorithm.setInvalidAllowed(false); + listSelectAlgorithm.setRequired(true); + mainLayout.addComponent(listSelectAlgorithm); + + // textAreaDescription + textAreaDescription = new TextArea(); + textAreaDescription.setCaption("Description"); + textAreaDescription.setImmediate(false); + textAreaDescription.setWidth("100.0%"); + textAreaDescription.setHeight("-1px"); + mainLayout.addComponent(textAreaDescription); + mainLayout.setExpandRatio(textAreaDescription, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java new file mode 100644 index 0000000..06afe28 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java
@@ -0,0 +1,238 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.Upload; +import com.vaadin.ui.Upload.Receiver; +import com.vaadin.ui.Upload.SucceededEvent; +import com.vaadin.ui.Upload.SucceededListener; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class PolicyUploadWindow extends Window implements Receiver, SucceededListener { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private CheckBox checkBoxImportAdvice; + @AutoGenerated + private CheckBox checkBoxImportObligations; + @AutoGenerated + private CheckBox checkBoxIgnoreStandard; + @AutoGenerated + private CheckBox checkBoxImportAttributes; + @AutoGenerated + private Upload upload; + private static final long serialVersionUID = 1L; + private final PolicyUploadWindow self = this; + private static final Log logger = LogFactory.getLog(PolicyUploadWindow.class); + private Path directory = null; + private Path newfile = null; + private boolean succeeded = false; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public PolicyUploadWindow(Path directory) { + buildMainLayout(); + // + // Create our main layout + // + this.setContent(mainLayout); + // + // Finish setting up the main layout + // + this.mainLayout.setSpacing(true); + this.mainLayout.setMargin(true); + + this.checkBoxImportAdvice.setValue(true); + this.checkBoxIgnoreStandard.setValue(true); + this.checkBoxImportAttributes.setValue(true); + this.checkBoxImportObligations.setValue(true); + + this.directory = directory; + + this.upload.addSucceededListener(this); + this.upload.setReceiver(this); + + this.checkBoxImportAttributes.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.checkBoxImportAttributes.getValue()) { + self.checkBoxIgnoreStandard.setEnabled(true); + } else { + self.checkBoxIgnoreStandard.setEnabled(false); + } + } + + }); + } + + @Override + public OutputStream receiveUpload(String filename, String mimeType) { + // + // Validate the mime type + // + if (! mimeType.equalsIgnoreCase("text/xml")) { + return null; + } + // + // Create its new full path + // + this.newfile = Paths.get(self.directory.toString(), filename); + // + // Does it already exist? + // + if (Files.exists(this.newfile)) { + // + // TODO Prompt them to overwrite and/or bump the version??? + // + return null; + } + // + // Try to create the output stream + // + try { + return new FileOutputStream(this.newfile.toFile()); + } catch (FileNotFoundException e) { + logger.error("Failed to create uploaded file", e); + } + return null; + } + + @Override + public void uploadSucceeded(SucceededEvent event) { + if (logger.isDebugEnabled()) { + logger.debug("upload succeeded"); + } + this.succeeded = true; + this.close(); + } + + public Path getUploadedFile() { + if (this.succeeded) { + return this.newfile; + } + return null; + } + + public boolean importAttributes() { + return this.checkBoxImportAttributes.getValue(); + } + + public boolean importObligations() { + return this.checkBoxImportObligations.getValue(); + } + + public boolean importAdvice() { + return this.checkBoxImportAdvice.getValue(); + } + + public boolean ignoreStandard() { + return this.checkBoxIgnoreStandard.getValue(); + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // upload + upload = new Upload(); + upload.setCaption("Upload Xacml Policy File"); + upload.setImmediate(false); + upload.setWidth("-1px"); + upload.setHeight("-1px"); + mainLayout.addComponent(upload); + + // checkBoxImportAttributes + checkBoxImportAttributes = new CheckBox(); + checkBoxImportAttributes + .setCaption("Import attributes into attribute dictionary."); + checkBoxImportAttributes.setImmediate(false); + checkBoxImportAttributes.setWidth("-1px"); + checkBoxImportAttributes.setHeight("-1px"); + mainLayout.addComponent(checkBoxImportAttributes); + + // checkBoxIgnoreStandard + checkBoxIgnoreStandard = new CheckBox(); + checkBoxIgnoreStandard.setCaption("Ignore Standard Attributes"); + checkBoxIgnoreStandard.setImmediate(false); + checkBoxIgnoreStandard.setWidth("-1px"); + checkBoxIgnoreStandard.setHeight("-1px"); + mainLayout.addComponent(checkBoxIgnoreStandard); + mainLayout.setComponentAlignment(checkBoxIgnoreStandard, new Alignment( + 20)); + + // checkBoxImportObligations + checkBoxImportObligations = new CheckBox(); + checkBoxImportObligations + .setCaption("Import obligations into obligation dictionary."); + checkBoxImportObligations.setImmediate(false); + checkBoxImportObligations.setWidth("-1px"); + checkBoxImportObligations.setHeight("-1px"); + mainLayout.addComponent(checkBoxImportObligations); + + // checkBoxImportAdvice + checkBoxImportAdvice = new CheckBox(); + checkBoxImportAdvice + .setCaption("Import advice into advice dictionary."); + checkBoxImportAdvice.setImmediate(false); + checkBoxImportAdvice.setWidth("-1px"); + checkBoxImportAdvice.setHeight("-1px"); + mainLayout.addComponent(checkBoxImportAdvice); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java new file mode 100644 index 0000000..3b9ade9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java
@@ -0,0 +1,147 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +// import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class RenamePolicyFileWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldFilename; + /** + * + */ + private static final long serialVersionUID = 1L; + private RenamePolicyFileWindow self = this; + private String newFilename = null; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public RenamePolicyFileWindow(String currentFilename) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize the text field + // + this.textFieldFilename.setValue(currentFilename); + this.textFieldFilename.setImmediate(true); + this.textFieldFilename.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() == null || event.getText().isEmpty()) { + self.buttonSave.setEnabled(false); + } else { + self.buttonSave.setEnabled(true); + } + } + }); + // + // Initialize the button + // + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Save the value + // + self.newFilename = self.textFieldFilename.getValue(); + // + // Make sure it ends with .xml + // + if (self.newFilename.endsWith(".xml") == false) { + self.newFilename = self.newFilename + ".xml"; + } + // + // Close the window + // + self.close(); + } + }); + this.textFieldFilename.focus(); + } + + public String getNewFilename() { + return this.newFilename; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldFilename + textFieldFilename = new TextField(); + textFieldFilename.setCaption("Policy File Name"); + textFieldFilename.setImmediate(false); + textFieldFilename.setWidth("-1px"); + textFieldFilename.setHeight("-1px"); + mainLayout.addComponent(textFieldFilename); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(24)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java new file mode 100644 index 0000000..e6baf44 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java
@@ -0,0 +1,219 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.Label; +import com.vaadin.ui.OptionGroup; +import com.vaadin.ui.TextArea; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class RuleEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextArea textAreaDescription; + @AutoGenerated + private OptionGroup optionGroupEffect; + @AutoGenerated + private Label labelRuleID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final RuleEditorWindow self = this; + private final RuleType rule; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public RuleEditorWindow(RuleType rule) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.rule = rule; + // + // Close shortcut + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.initializeLabel(); + this.initializeOption(); + this.initializeText(); + this.initializeButton(); + } + + protected void initializeLabel() { + if (this.rule.getRuleId() == null) { + this.rule.setRuleId(((XacmlAdminUI)UI.getCurrent()).newRuleID()); + } + this.labelRuleID.setValue(this.rule.getRuleId()); + } + + protected void initializeOption() { + this.optionGroupEffect.setRequiredError("You MUST select an effect (Permit or Deny for the rule."); + this.optionGroupEffect.addItem("Permit"); + this.optionGroupEffect.addItem("Deny"); + if (this.rule.getEffect() == null) { + this.rule.setEffect(EffectType.PERMIT); + } + if (this.rule.getEffect() == EffectType.PERMIT) { + this.optionGroupEffect.setValue("Permit"); + } else { + this.optionGroupEffect.setValue("Deny"); + } + } + + protected void initializeText() { + this.textAreaDescription.setValue(this.rule.getDescription()); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.optionGroupEffect.commit(); + self.textAreaDescription.commit(); + // + // Save everything + // + if (self.optionGroupEffect.getValue() == "Permit") { + self.rule.setEffect(EffectType.PERMIT); + } else { + self.rule.setEffect(EffectType.DENY); + } + self.rule.setDescription(self.textAreaDescription.getValue()); + // + // Set ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // + // VAADIN will show the required error message to the user + // + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public RuleType getRule() { + return this.rule; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // labelRuleID + labelRuleID = new Label(); + labelRuleID.setCaption("Rule ID"); + labelRuleID.setImmediate(false); + labelRuleID.setWidth("100.0%"); + labelRuleID.setHeight("-1px"); + labelRuleID.setValue("Label"); + mainLayout.addComponent(labelRuleID); + mainLayout.setExpandRatio(labelRuleID, 1.0f); + + // optionGroupEffect + optionGroupEffect = new OptionGroup(); + optionGroupEffect.setCaption("Choose the effect."); + optionGroupEffect.setImmediate(false); + optionGroupEffect.setWidth("-1px"); + optionGroupEffect.setHeight("-1px"); + optionGroupEffect.setInvalidAllowed(false); + optionGroupEffect.setRequired(true); + mainLayout.addComponent(optionGroupEffect); + + // textAreaDescription + textAreaDescription = new TextArea(); + textAreaDescription.setCaption("Enter a description for the Rule."); + textAreaDescription.setImmediate(false); + textAreaDescription.setWidth("100.0%"); + textAreaDescription.setHeight("-1px"); + textAreaDescription.setNullSettingAllowed(true); + textAreaDescription.setNullRepresentation(""); + mainLayout.addComponent(textAreaDescription); + mainLayout.setExpandRatio(textAreaDescription, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java new file mode 100644 index 0000000..fd3d8cb --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java
@@ -0,0 +1,207 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Set; + +import org.apache.openaz.xacml.api.pap.PDPGroup; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.AbstractSelect.ItemCaptionMode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class SelectPDPGroupWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private ListSelect listSelectPDPGroup; + /** + * + */ + private static final long serialVersionUID = 1L; + private final SelectPDPGroupWindow self = this; + + private boolean saved = false; + + private PDPGroup selectedGroup = null; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + // TODO - Refactor. Unused formal parameter: caption. Either determine + // that this parameter is unnecessary and remove it (including removing + // it from all constructor method consumers), or use it. + // NOTE: Setting to NOPMD for now. + public SelectPDPGroupWindow(Set<PDPGroup> groups, String caption) { //NOPMD + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Setup the shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + // + // initialize + // + this.initialize(groups); + // + // Focus + // + this.listSelectPDPGroup.focus(); + // + // setup the button + // + this.setupButtons(); + } + + protected void initialize(Set<PDPGroup> groups) { + // + // Initialize the list + // + this.initializeSelect(groups); + // + // Buttons + // + this.initializeButtons(); + } + + protected void initializeButtons() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Get the selected value + // + self.selectedGroup = (PDPGroup) self.listSelectPDPGroup.getValue(); + assert self.selectedGroup != null; + // + // Mark ourselves as saved + // + self.saved = true; + // + // Close window + // + self.close(); + } + }); + } + + public boolean isSaved() { + return saved; + } + + public PDPGroup selectedGroup() { + return this.selectedGroup; + } + + private void initializeSelect(Set<PDPGroup> groups) { + // + // Initialize GUI properties + // + this.listSelectPDPGroup.setImmediate(true); + this.listSelectPDPGroup.setItemCaptionMode(ItemCaptionMode.EXPLICIT); + this.listSelectPDPGroup.setNullSelectionAllowed(false); + this.listSelectPDPGroup.setNewItemsAllowed(false); + this.listSelectPDPGroup.setMultiSelect(false); + // + // Add items + // + for (PDPGroup group : groups) { + this.listSelectPDPGroup.addItem(group); + this.listSelectPDPGroup.setItemCaption(group, group.getName()); + } + // + // Listen to events + // + this.listSelectPDPGroup.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + self.setupButtons(); + } + }); + } + + protected void setupButtons() { + if (self.listSelectPDPGroup.getValue() == null) { + self.buttonSave.setEnabled(false); + } else { + self.buttonSave.setEnabled(true); + } + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // listSelectPDPGroup + listSelectPDPGroup = new ListSelect(); + listSelectPDPGroup.setImmediate(false); + listSelectPDPGroup.setWidth("-1px"); + listSelectPDPGroup.setHeight("-1px"); + listSelectPDPGroup.setInvalidAllowed(false); + listSelectPDPGroup.setRequired(true); + mainLayout.addComponent(listSelectPDPGroup); + mainLayout.setExpandRatio(listSelectPDPGroup, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java new file mode 100644 index 0000000..dfa92ee --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java
@@ -0,0 +1,217 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.jpa.PIPConfiguration; +import org.apache.openaz.xacml.api.pap.PDPGroup; +import org.apache.openaz.xacml.api.pap.PDPPIPConfig; +import org.apache.openaz.xacml.std.pap.StdPDPPIPConfig; +import com.vaadin.addon.jpacontainer.EntityItem; +import com.vaadin.addon.jpacontainer.JPAContainer; +import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +// import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Table; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class SelectPIPConfigurationWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private Table table; + /** + * + */ + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(SelectPIPConfigurationWindow.class); + private final SelectPIPConfigurationWindow self = this; + private final JPAContainer<PIPConfiguration> container = new JPAContainer<PIPConfiguration>(PIPConfiguration.class); + private boolean isSaved = false; + private Set<PDPPIPConfig> selectedConfigs = null; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public SelectPIPConfigurationWindow(PDPGroup group) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Initialize + // + this.initialize(group); + } + + protected void initialize(PDPGroup group) { + // + // Setup the container + // + this.container.setEntityProvider(new CachingLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager())); + + this.initializeTable(group); + this.initializeButton(); + } + + protected void initializeTable(PDPGroup group) { + // + // GUI properties + // + this.table.setContainerDataSource(this.container); + this.table.setImmediate(true); + this.table.setSelectable(true); + this.table.setMultiSelect(true); + this.table.setPageLength(this.container.size() > 10 ? 10 : this.container.size()); + this.table.setVisibleColumns("name", "description"); + // + // Pre-select the group's configurations + // + for (PDPPIPConfig config : group.getPipConfigs()) { + try { + Integer id = Integer.parseInt(config.getId()); + if (this.container.containsId(id)) { + this.table.select(id); + } + } catch (NumberFormatException e) { + logger.error("invalid config id: " + config.getId()); + } + } + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + // + // Commit the table so we have everything that was selected + // + self.table.commit(); + // + // We are going to fill this structure + // + self.selectedConfigs = new HashSet<PDPPIPConfig>(); + // + // Get all the selected values + // + Object values = self.table.getValue(); + if (values != null && values instanceof Collection) { + Collection<?> ids = (Collection<?>) values; + for (Object id : ids) { + // + // Get the entity + // + EntityItem<PIPConfiguration> entity = self.container.getItem(id); + PIPConfiguration config = entity.getEntity(); + // + // Create object needed by PAP REST + // + StdPDPPIPConfig pipConfig = new StdPDPPIPConfig(); + pipConfig.setId(Integer.toString(config.getId())); + pipConfig.setClassname(config.getClassname()); + pipConfig.setName(config.getName()); + pipConfig.setDescription(config.getDescription()); + Map<String, String> map = config.getConfiguration(null); + pipConfig.setValues(map); + // + // Add it to the saved Set + // + self.selectedConfigs.add(pipConfig); + } + } + // + // Mark ourselves as saved + // + self.isSaved = true; + // + // Close the window + // + self.close(); + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public Set<PDPPIPConfig> getSelectedConfigs() { + return this.selectedConfigs; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // table + table = new Table(); + table.setCaption("PIP Configurations"); + table.setImmediate(false); + table.setWidth("-1px"); + table.setHeight("-1px"); + mainLayout.addComponent(table); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java new file mode 100644 index 0000000..93cea8c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java
@@ -0,0 +1,331 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.openaz.xacml.admin.XacmlAdminUI; +import org.apache.openaz.xacml.admin.model.GitRepositoryContainer; +import org.apache.openaz.xacml.admin.model.GitRepositoryContainer.FileItem; +import org.apache.openaz.xacml.admin.util.AdminNotification; +import org.apache.openaz.xacml.std.pap.StdPDPPolicy; +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.event.ItemClickEvent; +import com.vaadin.event.ItemClickEvent.ItemClickListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TreeTable; +import com.vaadin.ui.UI; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class SelectWorkspacePoliciesWindow extends Window { + @AutoGenerated + private VerticalLayout mainLayout; + + @AutoGenerated + private Button buttonSave; + + @AutoGenerated + private TreeTable treeWorkspace; + + private static Log logger = LogFactory.getLog(SelectWorkspacePoliciesWindow.class); + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + /** + * + */ + private static final long serialVersionUID = 1L; + private final SelectWorkspacePoliciesWindow self = this; + private GitRepositoryContainer treeContainer; + private boolean isSaved = false; + private StdPDPPolicy selectedPolicy = null; + + + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public SelectWorkspacePoliciesWindow() { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + this.buttonSave.setClickShortcut(KeyCode.ENTER); + // + // + // + this.initializeTree(); + this.initializeButton(); + // + // + // + this.treeWorkspace.focus(); + } + + protected void initializeTree() { + // + // This is where the user's Git repository is located + // + final Path gitPath = ((XacmlAdminUI)UI.getCurrent()).getUserGitPath(); + // + // Create our Git file system container + // + this.treeContainer = new GitRepositoryContainer(gitPath, gitPath.toFile()); + // + // Create our own filter to filter out File extensions and + // also the Git directory. + // + this.treeContainer.setFilter(new FilenameFilter() { + + @Override + public boolean accept(File dir, String name) { + // + // We don't want any of the hidden files + // + if (name.startsWith(".git") || name.equals(".DS_Store")) { + return false; + } + // + // We definitely want xml files + // + if (name.endsWith(".xml")) { + return true; + } + // + // We should test if its a directory, we want those + // included. + // + Path path = Paths.get(dir.getAbsolutePath(), name); + if (Files.isDirectory(path)) { + return true; + } + logger.warn("Filtering out: " + path.toString()); + return false; + } + + }); + // + // Set TreeTables datasource as our git container + // + this.treeWorkspace.setContainerDataSource(this.treeContainer); + // + // Setup other properties etc. + // + this.treeWorkspace.setItemIconPropertyId("Icon"); + this.treeWorkspace.setVisibleColumns(new Object[]{"Name", "Version", "Size", "Last Modified", "Status"}); + this.treeWorkspace.setSizeFull(); + this.treeWorkspace.setSelectable(true); + this.treeWorkspace.setEditable(false); + // + // Expand the first couple of directories + // + for (Object id : this.treeWorkspace.getItemIds()) { + this.treeWorkspace.setCollapsed(id, false); + for (Object child : this.treeWorkspace.getChildren(id)) { + this.treeWorkspace.setCollapsed(child, false); + } + } + // + // Respond to table selections + // + this.treeWorkspace.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.treeWorkspace.getValue() != null) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + }); + // + // Double-click events + // + this.treeWorkspace.addItemClickListener(new ItemClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void itemClick(ItemClickEvent event) { + if (event.isDoubleClick()) { + // + // Save and close + // + self.doSave(); + } + } + }); + } + + protected void initializeButton() { + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + assert treeWorkspace.getValue() != null; + // + // Save everything + // + self.doSave(); + } + }); + } + + protected void doSave() { + // + // Get the current selection + // + FileItem selectedItem = (FileItem) this.treeWorkspace.getItem(this.treeWorkspace.getValue()); + // + // + // + assert selectedItem != null; + if (selectedItem == null) { + return; + } + + // create the id of the target file + + // Our standard for file naming is: + // <domain>.<filename>.<version>.xml + + // since the file name usually has a ".xml", we need to strip that before adding the other parts + String name = selectedItem.getName(); + String id = name; + if (id.endsWith(".xml")) { + id = id.substring(0, id.length() - 4); + } + + // add on the version string + + String version = selectedItem.getVersion(); + id += "." + version; + + // put the .xml on the end + id += ".xml"; + + // tack on the domain in front. Do this one level at a time until we reach one of the roots + + + File parentFile = selectedItem.getFile(); + while ((parentFile = (File) this.treeWorkspace.getParent(parentFile)) != null) { + if (this.treeContainer.isRoot(parentFile)) { + break; + } + id = parentFile.getName() + "." + id; + } + + // Default policy to be Root policy; user can change to deferred later + URI selectedURI = selectedItem.getFile().toURI(); + try { + // + // Create the policy + // + this.selectedPolicy = new StdPDPPolicy(id, true, name, selectedURI); + // + // Mark ourselves as saved + // + this.isSaved = true; + } catch (IOException e) { + logger.error("Unable to create policy '" + id + "': " + e.getMessage()); + AdminNotification.warn("Unable to create policy '" + id + "': " + e.getMessage()); + } + + // + // Close the window + // + this.close(); + } + + public boolean isSaved() { + return this.isSaved; + } + + public StdPDPPolicy getSelectedPolicy() { + return this.selectedPolicy; + } + + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // treeWorkspace + treeWorkspace = new TreeTable(); + treeWorkspace.setCaption("Select Policy(s) for PDP Group"); + treeWorkspace.setImmediate(true); + treeWorkspace.setWidth("100.0%"); + treeWorkspace.setHeight("-1px"); + mainLayout.addComponent(treeWorkspace); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + + + + + + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java new file mode 100644 index 0000000..0e38a67 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java
@@ -0,0 +1,204 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.annotations.AutoGenerated; +// import com.vaadin.data.Property.ValueChangeEvent; +// import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.TextField; +import com.vaadin.ui.Window; + +public class SubDomainEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private FormLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldSubdomain; + + // + // Full domain pattern: + // "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$"; + // + // We just want one part of it. + // + private static final String SUBDOMAIN_NAME_PATTERN = "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$"; + private static final String ERROR_MESSAGE = "Either enter a single subdomain via RFC1123 - letters, digits and a hyphen. Cannot start or end with a hyphen."; + + private static final long serialVersionUID = 1L; + private static final Log logger = LogFactory.getLog(SubDomainEditorWindow.class); + private final SubDomainEditorWindow self = this; + private boolean saved = false; + private String subdomain = null; + + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public SubDomainEditorWindow(String subdomain) { + buildMainLayout(); + setContent(mainLayout); + // + // Save + // + this.subdomain = subdomain; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.initializeTextField(); + this.initializeButtons(); + // + // Focus + // + this.textFieldSubdomain.focus(); + } + + protected void initializeTextField() { + this.textFieldSubdomain.setRequired(true); + this.textFieldSubdomain.setRequiredError("Please enter a valid sub domain"); + // + // Validate the name entered + // + this.textFieldSubdomain.addValidator(new RegexpValidator(SUBDOMAIN_NAME_PATTERN, true, ERROR_MESSAGE) { + private static final long serialVersionUID = 1L; + + }); + // + // Respond to events + // + this.textFieldSubdomain.setImmediate(true); + this.textFieldSubdomain.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() != null && event.getText().length() > 0) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + + }); + } + + protected void initializeButtons() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.setEnabled(false); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Make sure the text is valid + // + self.textFieldSubdomain.validate(); + // + // Parse our the subdomain parts + // + self.subdomain = self.textFieldSubdomain.getValue(); + self.saved = true; + // + // Close it up + // + self.close(); + } catch (InvalidValueException e) { + logger.error(e); + } + } + + }); + } + + public boolean isSaved() { + return this.saved; + } + + public String getSubDomain() { + return this.subdomain; + } + + @AutoGenerated + private FormLayout buildMainLayout() { + // common part: create layout + mainLayout = new FormLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldSubdomain + textFieldSubdomain = new TextField(); + textFieldSubdomain.setCaption("Enter Sub Domain"); + textFieldSubdomain.setImmediate(false); + textFieldSubdomain + .setDescription("You can enter sub domain name - do not use spaces or wildcard characters."); + textFieldSubdomain.setWidth("-1px"); + textFieldSubdomain.setHeight("-1px"); + textFieldSubdomain.setInvalidAllowed(false); + textFieldSubdomain + .setInputPrompt("Examples: sales hr business marketing."); + mainLayout.addComponent(textFieldSubdomain); + mainLayout.setExpandRatio(textFieldSubdomain, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java new file mode 100644 index 0000000..bec843e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java
@@ -0,0 +1,202 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class VariableDefinitionEditorWindow extends Window { + + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldID; + /** + * + */ + private static final long serialVersionUID = 1L; + private final VariableDefinitionEditorWindow self = this; + private final VariableDefinitionType variable; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public VariableDefinitionEditorWindow(VariableDefinitionType variable) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save + // + this.variable = variable; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.initializeText(); + this.initializeButton(); + // + // Initial focus + // + this.textFieldID.focus(); + } + + protected void initializeText() { + // + // Initialize GUI properties + // + this.textFieldID.setImmediate(true); + // + // Listen to changes + // + this.textFieldID.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() != null && event.getText().isEmpty() == false) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + + }); + this.textFieldID.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + if (self.textFieldID.getValue() != null && self.textFieldID.getValue().isEmpty() == false) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + }); + // + // Set the value + // + this.textFieldID.setValue(variable.getVariableId()); + } + + protected void initializeButton() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit it + // + self.textFieldID.commit(); + // + // Save it + // + self.variable.setVariableId(self.textFieldID.getValue()); + self.isSaved = true; + // + // Close window + // + self.close(); + } catch (SourceException | InvalidValueException e) { //NOPMD + // Vaadin will display error + // TODO - Verify that Vaadin will display error and update this + // inline documentation accordingly + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public VariableDefinitionType getVariable() { + return this.variable; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // textFieldID + textFieldID = new TextField(); + textFieldID.setCaption("Variable ID"); + textFieldID.setImmediate(false); + textFieldID.setWidth("-1px"); + textFieldID.setHeight("-1px"); + textFieldID.setInvalidAllowed(false); + textFieldID.setRequired(true); + textFieldID.setNullRepresentation(""); + mainLayout.addComponent(textFieldID); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save and Continue"); + buttonSave.setImmediate(false); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java new file mode 100644 index 0000000..53b47c4 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java
@@ -0,0 +1,242 @@ +/* + * 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 org.apache.openaz.xacml.admin.view.windows; + +import java.util.Map; + +import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType; +import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.vaadin.annotations.AutoGenerated; +import com.vaadin.data.Buffered.SourceException; +import com.vaadin.data.Property.ValueChangeEvent; +import com.vaadin.data.Property.ValueChangeListener; +import com.vaadin.data.Validator.InvalidValueException; +import com.vaadin.event.FieldEvents.TextChangeEvent; +import com.vaadin.event.FieldEvents.TextChangeListener; +import com.vaadin.event.ShortcutAction.KeyCode; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; +import com.vaadin.ui.ListSelect; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class VariableReferenceEditorWindow extends Window { + /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ + + @AutoGenerated + private VerticalLayout mainLayout; + @AutoGenerated + private Button buttonSave; + @AutoGenerated + private TextField textFieldVariable; + @AutoGenerated + private ListSelect listSelectVariables; + /* + * + */ + private static final long serialVersionUID = 1L; + private static Log logger = LogFactory.getLog(VariableReferenceEditorWindow.class); + private final VariableReferenceEditorWindow self = this; + private final VariableReferenceType variable; + private boolean isSaved = false; + /** + * The constructor should first build the main layout, set the + * composition root and then do any custom initialization. + * + * The constructor will not be automatically regenerated by the + * visual editor. + */ + public VariableReferenceEditorWindow(VariableReferenceType variable, Map<VariableDefinitionType, PolicyType> variables) { + buildMainLayout(); + //setCompositionRoot(mainLayout); + setContent(mainLayout); + // + // Save parameters + // + this.variable = variable; + // + // Set our shortcuts + // + this.setCloseShortcut(KeyCode.ESCAPE); + // + // Initialize + // + this.initializeTextField(); + this.initializeSelect(variables); + this.initializeButtons(); + // + // Focus + // + this.textFieldVariable.focus(); + } + + protected void initializeTextField() { + this.textFieldVariable.setImmediate(true); + this.textFieldVariable.setNullRepresentation(""); + this.textFieldVariable.addTextChangeListener(new TextChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void textChange(TextChangeEvent event) { + if (event.getText() != null && event.getText().isEmpty() == false) { + self.buttonSave.setEnabled(true); + } else { + self.buttonSave.setEnabled(false); + } + } + + }); + this.textFieldVariable.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + String value = self.textFieldVariable.getValue(); + if (value == null || value.isEmpty()) { + self.buttonSave.setEnabled(false); + } else { + self.buttonSave.setEnabled(true); + } + } + }); + if (this.variable != null) { + this.textFieldVariable.setValue(this.variable.getVariableId()); + } + } + + protected void initializeSelect(Map<VariableDefinitionType, PolicyType> vars) { + // + // Add existing variables into the table + // + if (vars != null) { + for (VariableDefinitionType var : vars.keySet()) { + this.listSelectVariables.addItem(var.getVariableId()); + } + } + // + // Respond to changes + // + this.listSelectVariables.setImmediate(true); + this.listSelectVariables.addValueChangeListener(new ValueChangeListener() { + private static final long serialVersionUID = 1L; + + @Override + public void valueChange(ValueChangeEvent event) { + Object value = self.listSelectVariables.getValue(); + if (value != null) { + self.textFieldVariable.setValue(value.toString()); + } + } + }); + } + + protected void initializeButtons() { + this.buttonSave.setClickShortcut(KeyCode.ENTER); + this.buttonSave.addClickListener(new ClickListener() { + private static final long serialVersionUID = 1L; + + @Override + public void buttonClick(ClickEvent event) { + try { + // + // Commit + // + self.textFieldVariable.commit(); + // + // Now we can save + // + self.isSaved = true; + self.variable.setVariableId(self.textFieldVariable.getValue()); + // + // And close the window + // + self.close(); + } catch (SourceException | InvalidValueException e) { + logger.error("Commit variable id: " + e); + } + } + }); + } + + public boolean isSaved() { + return this.isSaved; + } + + public VariableReferenceType getVariableReference() { + return this.variable; + } + + @AutoGenerated + private VerticalLayout buildMainLayout() { + // common part: create layout + mainLayout = new VerticalLayout(); + mainLayout.setImmediate(false); + mainLayout.setWidth("-1px"); + mainLayout.setHeight("-1px"); + mainLayout.setMargin(true); + mainLayout.setSpacing(true); + + // top-level component properties + setWidth("-1px"); + setHeight("-1px"); + + // listSelectVariables + listSelectVariables = new ListSelect(); + listSelectVariables.setCaption("Defined Variables"); + listSelectVariables.setImmediate(false); + listSelectVariables.setWidth("100.0%"); + listSelectVariables.setHeight("-1px"); + mainLayout.addComponent(listSelectVariables); + mainLayout.setExpandRatio(listSelectVariables, 1.0f); + + // textFieldVariable + textFieldVariable = new TextField(); + textFieldVariable.setCaption("Variable"); + textFieldVariable.setImmediate(false); + textFieldVariable.setWidth("-1px"); + textFieldVariable.setHeight("-1px"); + textFieldVariable.setInvalidAllowed(false); + textFieldVariable.setRequired(true); + textFieldVariable.setInputPrompt("Eg. \"12345\" or \"myVariable1\""); + mainLayout.addComponent(textFieldVariable); + mainLayout.setExpandRatio(textFieldVariable, 1.0f); + + // buttonSave + buttonSave = new Button(); + buttonSave.setCaption("Save"); + buttonSave.setImmediate(true); + buttonSave.setWidth("-1px"); + buttonSave.setHeight("-1px"); + mainLayout.addComponent(buttonSave); + mainLayout.setComponentAlignment(buttonSave, new Alignment(48)); + + return mainLayout; + } + +}
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql new file mode 100644 index 0000000..a679b4d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql
@@ -0,0 +1,723 @@ +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (1,'Range','Set a range of min and/or max integer/double values the attribute can be set to during policy creation.'); +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (2,'Regular Expression','Define a regular expression the attribute must match against during policy creation.'); +INSERT INTO ConstraintType (id, constraint_type, description) VALUES (3,'Enumeration','Enumerate a set of values that the attribute may be set to during policy creation.'); + +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (4,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject','intermediary-subject'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (5,'resource','S','urn:oasis:names:tc:xacml:3.0:attribute-category:resource','resource'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (6,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:codebase','codebase'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (7,'action','S','urn:oasis:names:tc:xacml:3.0:attribute-category:action','action'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (8,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:access-subject','access-subject'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (9,'environment','S','urn:oasis:names:tc:xacml:3.0:attribute-category:environment','environment'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (10,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:requesting-machine','requesting-machine'); +INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (11,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject','recipient-subject'); + +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (12,'S','integer','http://www.w3.org/2001/XMLSchema#integer'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (13,'S','base64Binary','http://www.w3.org/2001/XMLSchema#base64Binary'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (14,'S','x500Name','urn:oasis:names:tc:xacml:1.0:data-type:x500Name'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (15,'S','dayTimeDuration','http://www.w3.org/2001/XMLSchema#dayTimeDuration'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (16,'S','time','http://www.w3.org/2001/XMLSchema#time'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (17,'S','dnsName','urn:oasis:names:tc:xacml:2.0:data-type:dnsName'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (18,'S','boolean','http://www.w3.org/2001/XMLSchema#boolean'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (19,'S','dateTime','http://www.w3.org/2001/XMLSchema#dateTime'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (20,'S','rfc822Name','urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (21,'S','date','http://www.w3.org/2001/XMLSchema#date'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (22,'S','ipAddress','urn:oasis:names:tc:xacml:2.0:data-type:ipAddress'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (23,'S','yearMonthDuration','http://www.w3.org/2001/XMLSchema#yearMonthDuration'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (24,'S','hexBinary','http://www.w3.org/2001/XMLSchema#hexBinary'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (25,'S','double','http://www.w3.org/2001/XMLSchema#double'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (26,'S','string','http://www.w3.org/2001/XMLSchema#string'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (27,'S','anyURI','http://www.w3.org/2001/XMLSchema#anyURI'); +INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (28,'S','xpathExpression','urn:oasis:names:tc:xacml:3.0:data-type:xpathExpression'); + +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (29,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (30,'S','on-permit-apply-second','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (31,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (32,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (33,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (34,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (35,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (36,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable'); +INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (37,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides'); + +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (38,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (39,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (40,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (41,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (42,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (43,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (44,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:only-one-applicable'); +INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (45,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable'); + +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (1,'integer-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (2,'integer-subtract','urn:oasis:names:tc:xacml:1.0:function:integer-subtract',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (3,'double-to-integer','urn:oasis:names:tc:xacml:1.0:function:double-to-integer',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (4,'integer-one-and-only','urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (5,'double-one-and-only','urn:oasis:names:tc:xacml:1.0:function:double-one-and-only',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (6,'string-equal','urn:oasis:names:tc:xacml:1.0:function:string-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (7,'string-equal-ignore-case','urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (8,'string-starts-with','urn:oasis:names:tc:xacml:3.0:function:string-starts-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (9,'string-ends-with','urn:oasis:names:tc:xacml:3.0:function: string-ends-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (10,'string-concatenate','urn:oasis:names:tc:xacml:2.0:function:string-concatenate',26,0,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (11,'boolean-from-string','urn:oasis:names:tc:xacml:3.0:function:boolean-from-string',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (12,'string-from-boolean','urn:oasis:names:tc:xacml:3.0:function:string-from-boolean',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (13,'integer-from-string','urn:oasis:names:tc:xacml:3.0:function:integer-from-string',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (14,'string-from-integer','urn:oasis:names:tc:xacml:3.0:function:string-from-integer',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (15,'double-from-string','urn:oasis:names:tc:xacml:3.0:function:double-from-string',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (16,'string-from-double','urn:oasis:names:tc:xacml:3.0:function:string-from-double',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (17,'time-from-string','urn:oasis:names:tc:xacml:3.0:function:time-from-string',16,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (18,'string-from-time','urn:oasis:names:tc:xacml:3.0:function:string-from-time',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (19,'date-from-string','urn:oasis:names:tc:xacml:3.0:function:date-from-string',21,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (20,'string-from-date','urn:oasis:names:tc:xacml:3.0:function:string-from-date',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (21,'dateTime-from-string','urn:oasis:names:tc:xacml:3.0:function:dateTime-from-string',19,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (22,'string-from-dateTime','urn:oasis:names:tc:xacml:3.0:function:string-from-dateTime',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (23,'anyURI-from-string','urn:oasis:names:tc:xacml:3.0:function:anyURI-from-string',27,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (24,'string-from-anyURI','urn:oasis:names:tc:xacml:3.0:function:string-from-anyURI',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (25,'dayTimeDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-from-string',15,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (26,'string-from-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-dayTimeDuration',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (27,'yearMonthDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-from-string',23,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (28,'string-from-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-yearMonthDuration',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (29,'x500Name-from-string','urn:oasis:names:tc:xacml:3.0:function:x500Name-from-string',14,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (30,'string-from-x500Name','urn:oasis:names:tc:xacml:3.0:function:string-from-x500Name',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (31,'rfc822Name-from-string','urn:oasis:names:tc:xacml:3.0:function:rfc822Name-from-string',20,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (32,'string-from-rfc822Name','urn:oasis:names:tc:xacml:3.0:function:string-from-rfc822Name',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (33,'ipAddress-from-string','urn:oasis:names:tc:xacml:3.0:function:ipAddress-from-string',22,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (34,'string-from-ipAddress','urn:oasis:names:tc:xacml:3.0:function:string-from-ipAddress',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (35,'dnsName-from-string','urn:oasis:names:tc:xacml:3.0:function:dnsName-from-string',17,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (36,'string-from-dnsName','urn:oasis:names:tc:xacml:3.0:function:string-from-dnsName',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (37,'anyURI-starts-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-starts-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (38,'anyURI-ends-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-ends-with',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (39,'string-contains','urn:oasis:names:tc:xacml:3.0:function:string-contains',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (40,'anyURI-contains','urn:oasis:names:tc:xacml:3.0:function:anyURI-contains',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (41,'string-substring','urn:oasis:names:tc:xacml:3.0:function:string-substring',26,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (42,'anyURI-substring','urn:oasis:names:tc:xacml:3.0:function:anyURI-substring',26,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (43,'boolean-equal','urn:oasis:names:tc:xacml:1.0:function:boolean-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (44,'integer-equal','urn:oasis:names:tc:xacml:1.0:function:integer-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (45,'double-equal','urn:oasis:names:tc:xacml:1.0:function:double-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (46,'date-equal','urn:oasis:names:tc:xacml:1.0:function:date-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (47,'time-equal','urn:oasis:names:tc:xacml:1.0:function:time-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (48,'dateTime-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (49,'dayTimeDuration-equal','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (50,'yearMonthDuration-equal','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (51,'anyURI-equal','urn:oasis:names:tc:xacml:1.0:function:anyURI-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (52,'x500Name-equal','urn:oasis:names:tc:xacml:1.0:function:x500Name-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (53,'rfc822Name-equal','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (54,'hexBinary-equal','urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (55,'base64Binary-equal','urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (56,'integer-add','urn:oasis:names:tc:xacml:1.0:function:integer-add',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (57,'double-add','urn:oasis:names:tc:xacml:1.0:function:double-add',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (58,'double-subtract','urn:oasis:names:tc:xacml:1.0:function:double-subtract',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (59,'integer-multiply','urn:oasis:names:tc:xacml:1.0:function:integer-multiply',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (60,'double-multiply','urn:oasis:names:tc:xacml:1.0:function:double-multiply',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (61,'integer-divide','urn:oasis:names:tc:xacml:1.0:function:integer-divide',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (62,'double-divide','urn:oasis:names:tc:xacml:1.0:function:double-divide',25,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (63,'integer-mod','urn:oasis:names:tc:xacml:1.0:function:integer-mod',12,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (64,'integer-abs','urn:oasis:names:tc:xacml:1.0:function:integer-abs',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (65,'double-abs','urn:oasis:names:tc:xacml:1.0:function:double-abs',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (66,'round','urn:oasis:names:tc:xacml:1.0:function:round',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (67,'floor','urn:oasis:names:tc:xacml:1.0:function:floor',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (68,'string-normalize-space','urn:oasis:names:tc:xacml:1.0:function:string-normalize-space',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (69,'string-normalize-to-lower-case','urn:oasis:names:tc:xacml:1.0:function:string-normalize-to-lower-case',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (70,'integer-to-double','urn:oasis:names:tc:xacml:1.0:function:integer-to-double',25,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (71,'integer-greater-than','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (72,'integer-less-than','urn:oasis:names:tc:xacml:1.0:function:integer-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (73,'integer-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (74,'double-greater-than','urn:oasis:names:tc:xacml:1.0:function:double-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (75,'double-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (76,'double-less-than','urn:oasis:names:tc:xacml:1.0:function:double-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (77,'double-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (78,'dateTime-add-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (79,'dateTime-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (80,'dateTime-subtract-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (81,'dateTime-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (82,'date-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-add-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (83,'date-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-subtract-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (84,'string-greater-than','urn:oasis:names:tc:xacml:1.0:function:string-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (85,'string-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (86,'string-less-than','urn:oasis:names:tc:xacml:1.0:function:string-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (87,'string-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (88,'time-greater-than','urn:oasis:names:tc:xacml:1.0:function:time-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (89,'time-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (90,'time-less-than','urn:oasis:names:tc:xacml:1.0:function:time-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (91,'time-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (92,'time-in-range','urn:oasis:names:tc:xacml:2.0:function:time-in-range',18,0,0,3,3,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (93,'dateTime-greater-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (94,'dateTime-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (95,'dateTime-less-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (96,'dateTime-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (97,'date-greater-than','urn:oasis:names:tc:xacml:1.0:function:date-greater-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (98,'date-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (99,'date-less-than','urn:oasis:names:tc:xacml:1.0:function:date-less-than',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (100,'date-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (101,'string-one-and-only','urn:oasis:names:tc:xacml:1.0:function:string-one-and-only',26,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (102,'string-bag-size','urn:oasis:names:tc:xacml:1.0:function:string-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (103,'string-is-in','urn:oasis:names:tc:xacml:1.0:function:string-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (104,'string-bag','urn:oasis:names:tc:xacml:1.0:function:string-bag',26,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (105,'integer-bag-size','urn:oasis:names:tc:xacml:1.0:function:integer-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (106,'integer-is-in','urn:oasis:names:tc:xacml:1.0:function:integer-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (107,'integer-bag','urn:oasis:names:tc:xacml:1.0:function:integer-bag',12,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (108,'double-bag-size','urn:oasis:names:tc:xacml:1.0:function:double-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (109,'double-is-in','urn:oasis:names:tc:xacml:1.0:function:double-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (110,'double-bag','urn:oasis:names:tc:xacml:1.0:function:double-bag',25,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (111,'boolean-one-and-only','urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (112,'boolean-bag-size','urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (113,'boolean-is-in','urn:oasis:names:tc:xacml:1.0:function:boolean-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (114,'boolean-bag','urn:oasis:names:tc:xacml:1.0:function:boolean-bag',18,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (115,'time-one-and-only','urn:oasis:names:tc:xacml:1.0:function:time-one-and-only',16,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (116,'time-bag-size','urn:oasis:names:tc:xacml:1.0:function:time-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (117,'time-is-in','urn:oasis:names:tc:xacml:1.0:function:time-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (118,'time-bag','urn:oasis:names:tc:xacml:1.0:function:time-bag',16,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (119,'date-one-and-only','urn:oasis:names:tc:xacml:1.0:function:date-one-and-only',21,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (120,'date-bag-size','urn:oasis:names:tc:xacml:1.0:function:date-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (121,'date-is-in','urn:oasis:names:tc:xacml:1.0:function:date-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (122,'date-bag','urn:oasis:names:tc:xacml:1.0:function:date-bag',21,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (123,'dateTime-one-and-only','urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only',19,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (124,'dateTime-bag-size','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (125,'dateTime-is-in','urn:oasis:names:tc:xacml:1.0:function:dateTime-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (126,'dateTime-bag','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag',19,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (127,'anyURI-one-and-only','urn:oasis:names:tc:xacml:1.0:function:anyURI-one-and-only',27,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (128,'anyURI-bag-size','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (129,'anyURI-is-in','urn:oasis:names:tc:xacml:1.0:function:anyURI-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (130,'anyURI-bag','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag',27,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (131,'hexBinary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:hexBinary-one-and-only',24,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (132,'hexBinary-bag-size','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (133,'hexBinary-is-in','urn:oasis:names:tc:xacml:1.0:function:hexBinary-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (134,'hexBinary-bag','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag',24,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (135,'base64Binary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:base64Binary-one-and-only',13,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (136,'base64Binary-bag-size','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (137,'base64Binary-is-in','urn:oasis:names:tc:xacml:1.0:function:base64Binary-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (138,'base64Binary-bag','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag',13,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (139,'dayTimeDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-one-and-only',15,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (140,'dayTimeDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (141,'dayTimeDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (142,'dayTimeDuration-bag','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag',15,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (143,'yearMonthDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-one-and-only',23,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (144,'yearMonthDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (145,'yearMonthDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (146,'yearMonthDuration-bag','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag',23,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (147,'x500Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:x500Name-one-and-only',14,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (148,'x500Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (149,'x500Name-is-in','urn:oasis:names:tc:xacml:1.0:function:x500Name-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (150,'x500Name-bag','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag',14,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (151,'rfc822Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-one-and-only',20,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (152,'rfc822Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (153,'rfc822Name-is-in','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (154,'rfc822Name-bag','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag',20,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (155,'ipAddress-one-and-only','urn:oasis:names:tc:xacml:2.0:function:ipAddress-one-and-only',22,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (156,'ipAddress-bag-size','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (157,'ipAddress-is-in','urn:oasis:names:tc:xacml:2.0:function:ipAddress-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (158,'ipAddress-bag','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag',22,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (159,'dnsName-one-and-only','urn:oasis:names:tc:xacml:2.0:function:dnsName-one-and-only',17,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (160,'dnsName-bag-size','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag-size',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (161,'dnsName-is-in','urn:oasis:names:tc:xacml:2.0:function:dnsName-is-in',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (162,'dnsName-bag','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag',17,1,0,1,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (163,'string-regexp-match','urn:oasis:names:tc:xacml:1.0:function:string-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (164,'anyURI-regexp-match','urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (165,'ipAddress-regexp-match','urn:oasis:names:tc:xacml:2.0:function:ipAddress-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (166,'dnsName-regexp-match','urn:oasis:names:tc:xacml:2.0:function:dnsName-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (167,'rfc822Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:rfc822Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (168,'x500Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:x500Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (169,'string-intersection','urn:oasis:names:tc:xacml:1.0:function:string-intersection',26,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (170,'string-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (171,'string-union','urn:oasis:names:tc:xacml:1.0:function:string-union',26,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (172,'string-subset','urn:oasis:names:tc:xacml:1.0:function:string-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (173,'string-set-equals','urn:oasis:names:tc:xacml:1.0:function:string-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (174,'integer-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:integer-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (175,'integer-union','urn:oasis:names:tc:xacml:1.0:function:integer-union',12,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (176,'integer-subset','urn:oasis:names:tc:xacml:1.0:function:integer-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (177,'integer-set-equals','urn:oasis:names:tc:xacml:1.0:function:integer-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (178,'double-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:double-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (179,'double-union','urn:oasis:names:tc:xacml:1.0:function:double-union',25,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (180,'double-subset','urn:oasis:names:tc:xacml:1.0:function:double-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (181,'double-set-equals','urn:oasis:names:tc:xacml:1.0:function:double-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (182,'boolean-intersection','urn:oasis:names:tc:xacml:1.0:function:boolean-intersection',18,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (183,'boolean-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:boolean-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (184,'boolean-union','urn:oasis:names:tc:xacml:1.0:function:boolean-union',18,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (185,'boolean-subset','urn:oasis:names:tc:xacml:1.0:function:boolean-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (186,'boolean-set-equals','urn:oasis:names:tc:xacml:1.0:function:boolean-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (187,'time-intersection','urn:oasis:names:tc:xacml:1.0:function:time-intersection',16,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (188,'time-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:time-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (189,'time-union','urn:oasis:names:tc:xacml:1.0:function:time-union',16,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (190,'time-subset','urn:oasis:names:tc:xacml:1.0:function:time-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (191,'time-set-equals','urn:oasis:names:tc:xacml:1.0:function:time-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (192,'date-intersection','urn:oasis:names:tc:xacml:1.0:function:date-intersection',21,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (193,'date-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:date-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (194,'date-union','urn:oasis:names:tc:xacml:1.0:function:date-union',21,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (195,'date-subset','urn:oasis:names:tc:xacml:1.0:function:date-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (196,'date-set-equals','urn:oasis:names:tc:xacml:1.0:function:date-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (197,'dateTime-intersection','urn:oasis:names:tc:xacml:1.0:function:dateTime-intersection',19,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (198,'dateTime-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:dateTime-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (199,'dateTime-union','urn:oasis:names:tc:xacml:1.0:function:dateTime-union',19,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (200,'dateTime-subset','urn:oasis:names:tc:xacml:1.0:function:dateTime-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (201,'dateTime-set-equals','urn:oasis:names:tc:xacml:1.0:function:dateTime-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (202,'anyURI-intersection','urn:oasis:names:tc:xacml:1.0:function:anyURI-intersection',27,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (203,'anyURI-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (204,'anyURI-union','urn:oasis:names:tc:xacml:1.0:function:anyURI-union',27,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (205,'anyURI-subset','urn:oasis:names:tc:xacml:1.0:function:anyURI-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (206,'anyURI-set-equals','urn:oasis:names:tc:xacml:1.0:function:anyURI-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (207,'hexBinary-intersection','urn:oasis:names:tc:xacml:1.0:function:hexBinary-intersection',24,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (208,'hexBinary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:hexBinary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (209,'hexBinary-union','urn:oasis:names:tc:xacml:1.0:function:hexBinary-union',24,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (210,'hexBinary-subset','urn:oasis:names:tc:xacml:1.0:function:hexBinary-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (211,'hexBinary-set-equals','urn:oasis:names:tc:xacml:1.0:function:hexBinary-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (212,'base64Binary-intersection','urn:oasis:names:tc:xacml:1.0:function:base64Binary-intersection',13,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (213,'base64Binary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:base64Binary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (214,'base64Binary-union','urn:oasis:names:tc:xacml:1.0:function:base64Binary-union',13,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (215,'base64Binary-subset','urn:oasis:names:tc:xacml:1.0:function:base64Binary-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (216,'base64Binary-set-equals','urn:oasis:names:tc:xacml:1.0:function:base64Binary-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (217,'dayTimeDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-intersection',15,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (218,'dayTimeDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (219,'dayTimeDuration-union','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-union',15,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (220,'dayTimeDuration-subset','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (221,'dayTimeDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (222,'yearMonthDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-intersection',23,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (223,'yearMonthDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (224,'yearMonthDuration-union','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-union',23,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (225,'yearMonthDuration-subset','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (226,'yearMonthDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (227,'x500Name-intersection','urn:oasis:names:tc:xacml:1.0:function:x500Name-intersection',14,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (228,'x500Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:x500Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (229,'x500Name-union','urn:oasis:names:tc:xacml:1.0:function:x500Name-union',14,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (230,'x500Name-subset','urn:oasis:names:tc:xacml:1.0:function:x500Name-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (231,'x500Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:x500Name-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (232,'rfc822Name-intersection','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-intersection',20,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (233,'rfc822Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (234,'rfc822Name-union','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-union',20,1,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (235,'rfc822Name-subset','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-subset',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (236,'rfc822Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-set-equals',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (237,'x500Name-match','urn:oasis:names:tc:xacml:1.0:function:x500Name-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (238,'rfc822Name-match','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (239,'integer-intersection','urn:oasis:names:tc:xacml:1.0:function:integer-intersection',12,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (240,'double-intersection','urn:oasis:names:tc:xacml:1.0:function:double-intersection',25,1,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (241,'or','urn:oasis:names:tc:xacml:1.0:function:or',18,0,0,0,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (242,'and','urn:oasis:names:tc:xacml:1.0:function:and',18,0,0,0,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (243,'n-of','urn:oasis:names:tc:xacml:1.0:function:n-of',18,0,0,2,-1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (244,'not','urn:oasis:names:tc:xacml:1.0:function:not',18,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (245,'any-of','urn:oasis:names:tc:xacml:3.0:function:any-of',18,0,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (246,'all-of','urn:oasis:names:tc:xacml:3.0:function:all-of',18,0,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (247,'any-of-any','urn:oasis:names:tc:xacml:3.0:function:any-of-any',18,0,1,2,-1,1,-1,0); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (248,'all-of-any','urn:oasis:names:tc:xacml:1.0:function:all-of-any',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (249,'any-of-all','urn:oasis:names:tc:xacml:1.0:function:any-of-all',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (250,'all-of-all','urn:oasis:names:tc:xacml:1.0:function:all-of-all',18,0,1,3,3,2,2,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (251,'map','urn:oasis:names:tc:xacml:3.0:function:map',NULL,1,1,2,-1,1,-1,1); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (252,'xpath-node-count','urn:oasis:names:tc:xacml:3.0:function:xpath-node-count',12,0,0,1,1,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (253,'xpath-node-equal','urn:oasis:names:tc:xacml:3.0:function:xpath-node-equal',18,0,0,2,2,NULL,NULL,NULL); +INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (254,'xpath-node-match','urn:oasis:names:tc:xacml:3.0:function:xpath-node-match',18,0,0,2,2,NULL,NULL,NULL); + +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (1,0,1,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (2,0,1,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (3,0,2,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (4,0,2,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (5,0,3,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (6,1,4,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (7,1,5,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (8,0,6,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (9,0,6,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (10,0,7,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (11,0,7,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (12,0,8,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (13,0,8,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (14,0,9,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (15,0,9,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (16,0,10,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (17,0,11,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (18,0,12,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (19,0,13,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (20,0,14,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (21,0,15,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (22,0,16,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (23,0,17,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (24,0,18,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (25,0,19,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (26,0,20,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (27,0,21,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (28,0,22,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (29,0,23,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (30,0,24,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (31,0,25,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (32,0,26,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (33,0,27,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (34,0,28,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (35,0,29,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (36,0,30,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (37,0,31,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (38,0,32,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (39,0,33,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (40,0,34,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (41,0,35,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (42,0,36,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (43,0,37,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (44,0,37,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (45,0,38,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (46,0,38,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (47,0,39,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (48,0,39,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (49,0,40,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (50,0,40,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (51,0,41,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (52,0,41,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (53,0,41,3,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (54,0,42,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (55,0,42,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (56,0,42,3,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (57,0,43,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (58,0,43,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (59,0,44,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (60,0,44,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (61,0,45,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (62,0,45,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (63,0,46,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (64,0,46,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (65,0,47,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (66,0,47,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (67,0,48,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (68,0,48,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (69,0,49,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (70,0,49,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (71,0,50,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (72,0,50,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (73,0,51,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (74,0,51,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (75,0,52,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (76,0,52,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (77,0,53,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (78,0,53,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (79,0,54,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (80,0,54,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (81,0,55,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (82,0,55,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (83,0,56,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (84,0,56,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (85,0,57,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (86,0,57,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (89,0,58,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (90,0,58,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (91,0,59,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (92,0,59,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (93,0,60,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (94,0,60,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (95,0,61,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (96,0,61,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (97,0,62,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (98,0,62,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (99,0,63,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (100,0,63,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (101,0,64,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (102,0,65,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (103,0,66,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (104,0,67,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (125,0,68,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (126,0,69,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (128,0,70,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (129,0,71,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (130,0,71,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (131,0,72,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (132,0,72,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (133,0,73,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (134,0,73,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (135,0,74,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (136,0,74,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (137,0,75,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (138,0,75,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (139,0,76,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (140,0,76,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (141,0,77,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (142,0,77,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (143,0,78,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (144,0,78,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (145,0,79,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (146,0,79,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (147,0,80,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (148,0,80,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (149,0,81,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (150,0,81,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (151,0,82,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (152,0,82,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (153,0,83,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (154,0,83,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (155,0,84,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (156,0,84,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (157,0,85,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (158,0,85,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (159,0,86,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (160,0,86,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (161,0,87,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (162,0,87,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (163,0,88,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (164,0,88,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (165,0,89,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (166,0,89,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (167,0,90,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (168,0,90,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (169,0,91,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (170,0,91,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (171,0,92,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (172,0,92,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (173,0,93,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (174,0,93,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (175,0,94,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (176,0,94,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (177,0,95,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (178,0,95,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (179,0,96,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (180,0,96,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (181,0,97,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (182,0,97,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (183,0,98,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (184,0,98,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (185,0,99,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (186,0,99,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (187,0,100,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (188,0,100,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (189,1,101,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (190,1,102,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (191,0,103,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (192,1,103,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (193,0,104,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (194,1,105,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (195,0,106,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (196,1,106,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (197,0,107,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (198,1,108,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (199,0,109,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (200,1,109,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (201,0,110,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (202,1,111,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (203,1,112,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (204,0,113,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (205,1,113,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (206,0,114,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (207,1,115,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (208,1,116,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (209,0,117,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (210,1,117,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (211,0,118,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (212,1,119,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (213,1,120,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (214,0,121,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (215,1,121,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (216,0,122,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (217,1,123,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (218,1,124,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (219,0,125,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (220,1,125,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (221,0,126,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (222,1,127,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (223,1,128,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (224,0,129,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (225,1,129,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (226,0,130,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (227,1,131,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (228,1,132,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (229,0,133,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (230,1,133,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (231,0,134,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (232,1,135,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (233,1,136,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (234,0,137,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (235,1,137,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (236,0,138,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (237,1,139,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (238,1,140,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (239,0,141,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (240,1,141,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (241,0,142,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (242,1,143,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (243,1,144,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (244,1,145,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (245,0,145,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (246,0,146,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (247,1,147,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (248,1,148,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (249,0,149,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (250,1,149,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (251,0,150,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (252,1,151,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (253,1,152,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (254,0,153,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (255,1,153,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (256,0,154,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (257,1,155,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (258,1,156,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (259,0,157,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (260,1,157,2,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (261,0,158,1,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (262,1,159,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (263,1,160,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (264,0,161,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (265,1,161,2,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (266,0,162,1,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (267,0,163,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (268,0,163,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (269,0,164,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (270,0,164,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (271,0,165,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (272,0,165,2,22); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (273,0,166,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (274,0,166,2,17); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (275,0,167,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (276,0,167,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (277,0,168,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (278,0,168,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (279,1,169,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (280,1,169,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (281,1,170,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (282,1,170,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (283,1,171,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (284,1,172,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (285,1,172,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (286,1,173,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (287,1,173,2,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (288,1,174,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (289,1,174,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (290,1,175,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (292,1,176,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (293,1,176,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (294,1,177,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (295,1,177,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (296,1,178,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (297,1,178,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (298,1,179,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (299,1,180,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (300,1,180,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (301,1,181,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (302,1,181,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (303,1,182,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (304,1,182,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (305,1,183,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (306,1,183,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (307,1,184,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (308,1,185,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (309,1,185,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (310,1,186,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (311,1,186,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (312,1,187,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (313,1,187,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (314,1,188,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (315,1,188,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (316,1,189,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (317,1,190,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (318,1,190,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (319,1,191,1,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (320,1,191,2,16); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (321,1,192,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (322,1,192,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (323,1,193,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (324,1,193,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (325,1,194,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (326,1,195,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (327,1,195,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (328,1,196,1,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (329,1,196,2,21); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (330,1,197,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (331,1,197,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (332,1,198,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (333,1,198,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (334,1,199,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (335,1,200,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (336,1,200,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (337,1,201,1,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (338,1,201,2,19); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (339,1,202,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (340,1,202,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (341,1,203,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (342,1,203,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (343,1,204,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (344,1,205,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (345,1,205,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (346,1,206,1,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (347,1,206,2,27); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (348,1,207,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (349,1,207,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (350,1,208,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (351,1,208,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (352,1,209,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (353,1,210,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (354,1,210,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (355,1,211,1,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (356,1,211,2,24); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (357,1,212,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (358,1,212,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (359,1,213,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (360,1,213,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (361,1,214,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (362,1,215,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (363,1,215,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (364,1,216,1,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (365,1,216,2,13); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (366,1,217,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (367,1,217,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (368,1,218,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (369,1,218,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (370,1,219,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (371,1,220,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (372,1,220,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (373,1,221,1,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (374,1,221,2,15); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (375,1,222,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (376,1,222,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (377,1,223,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (378,1,223,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (380,1,224,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (381,1,225,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (382,1,225,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (383,1,226,2,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (384,1,226,1,23); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (385,1,227,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (386,1,227,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (387,1,228,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (388,1,228,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (389,1,229,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (390,1,230,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (391,1,230,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (392,1,231,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (393,1,231,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (394,1,232,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (395,1,232,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (396,1,233,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (397,1,233,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (398,1,234,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (399,1,235,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (400,1,235,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (401,1,236,1,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (402,1,236,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (403,0,237,1,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (404,0,237,2,14); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (405,0,238,1,26); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (406,0,238,2,20); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (407,1,239,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (408,1,239,2,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (409,1,240,1,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (410,1,240,2,25); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (411,0,241,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (412,0,242,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (413,0,243,1,12); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (414,0,243,2,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (415,0,244,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (416,0,245,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (417,0,245,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (418,1,245,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (419,0,246,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (420,0,246,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (421,1,246,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (422,0,247,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (423,1,247,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (424,1,247,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (433,0,248,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (434,1,248,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (435,1,248,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (436,0,249,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (437,1,249,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (438,1,249,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (439,0,250,1,18); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (440,1,250,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (441,1,250,3,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (442,0,251,1,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (447,1,251,2,NULL); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (448,0,252,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (449,0,253,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (450,0,253,2,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (451,0,254,1,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (452,0,254,2,28); +INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (453,0,92,3,16); + +INSERT INTO PIPType VALUES (500,'SQL'), (501,'LDAP'), (502,'CSV'), (503,'Hyper-CSV'), (504,'Custom');
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql new file mode 100644 index 0000000..8aee7ee --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql
@@ -0,0 +1,21 @@ +DROP TABLE IF EXISTS AttributeAssignment; +DROP TABLE IF EXISTS ConstraintValues; +DROP TABLE IF EXISTS ObadviceExpressions; +DROP TABLE IF EXISTS Attribute; +DROP TABLE IF EXISTS Category; +DROP TABLE IF EXISTS ConstraintType; +DROP VIEW IF EXISTS match_functions; +DROP VIEW IF EXISTS higherorder_bag_functions; +DROP VIEW IF EXISTS function_flattener; +DROP TABLE IF EXISTS FunctionArguments; +DROP TABLE IF EXISTS FunctionDefinition; +DROP TABLE IF EXISTS Datatype; +DROP TABLE IF EXISTS Obadvice; +DROP TABLE IF EXISTS PIPConfigParams; +DROP TABLE IF EXISTS PIPResolverParams; +DROP TABLE IF EXISTS PIPResolver; +DROP TABLE IF EXISTS PIPConfiguration; +DROP TABLE IF EXISTS PIPType; +DROP TABLE IF EXISTS PolicyAlgorithms; +DROP TABLE IF EXISTS RuleAlgorithms; +DROP TABLE IF EXISTS SEQUENCE; \ No newline at end of file
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml b/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..79594a9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> + <persistence-unit name="XACML-PAP-ADMIN"> + <class>org.apache.openaz.xacml.admin.jpa.Attribute</class> + <class>org.apache.openaz.xacml.admin.jpa.AttributeAssignment</class> + <class>org.apache.openaz.xacml.admin.jpa.Category</class> + <class>org.apache.openaz.xacml.admin.jpa.ConstraintType</class> + <class>org.apache.openaz.xacml.admin.jpa.ConstraintValue</class> + <class>org.apache.openaz.xacml.admin.jpa.Datatype</class> + <class>org.apache.openaz.xacml.admin.jpa.Obadvice</class> + <class>org.apache.openaz.xacml.admin.jpa.ObadviceExpression</class> + <class>org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms</class> + <class>org.apache.openaz.xacml.admin.jpa.RuleAlgorithms</class> + <class>org.apache.openaz.xacml.admin.jpa.FunctionArgument</class> + <class>org.apache.openaz.xacml.admin.jpa.FunctionDefinition</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPConfigParam</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPConfiguration</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPResolver</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPResolverParam</class> + <class>org.apache.openaz.xacml.admin.jpa.PIPType</class> + <properties> + <!-- + The properties defined below are the default settings to be used when someone initially + wants to start working with the XACML-PAP-ADMIN web gui. They are not intended for production + use. + + They are setup to drop and create the tables and then load an initial set of data into the database + every time the application is deployed. So if you add anything to the dictionaries or PIP + configuration, they will get lost upon each deployment. It uses an H2 database engine configured + for a local file so you don't have to setup you're own SQL database environment to start. + + Instead of modifying this file directly, please refer to the xacml.admin.properties file for + customizing the application settings. + + --> + <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> + <property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/> + <property name="javax.persistence.schema-generation.create-script-source" value="META-INF/views.sql" /> + <property name="javax.persistence.schema-generation.drop-source" value="script"/> + <property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop.sql" /> + <property name="javax.persistence.sql-load-script-source" value="META-INF/data.sql" /> + + <!-- + + These properties should be set in the xacml.admin.properties file, so they can be re-used by non-JPA + database functionality. + + <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> + <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:sql/xacml"/> + <property name="javax.persistence.jdbc.user" value="sa"/> + <property name="javax.persistence.jdbc.password" value=""/> + --> + </properties> + </persistence-unit> +</persistence>
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql new file mode 100644 index 0000000..7c4a820 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql
@@ -0,0 +1,6 @@ + +CREATE VIEW match_functions AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.XACML_ID AS xacmlid, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype FROM (FunctionDefinition D left join FunctionArguments A1 on (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 on (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2)) where (D.ARG_LB = 2 and D.ARG_UB = 2 and D.RETURN_DATATYPE = 18 and A1.IS_BAG = 0) order by D.SHORT_NAME; + +CREATE VIEW function_flattener AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.IS_HIGHER_ORDER AS is_higher_order, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype, A3.IS_BAG AS arg3_isbag, A3.DATATYPE_ID AS arg3_datatype FROM (FunctionDefinition D left join FunctionArguments A1 ON (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 ON (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2) LEFT JOIN FunctionArguments A3 ON (A3.FUNCTION_ID = D.ID and A3.ARG_INDEX = 3)) ORDER BY D.ID; + +CREATE VIEW higherorder_bag_functions AS SELECT * FROM function_flattener WHERE is_higher_order = 1 AND is_bag_return = 1 AND return_datatype=18 AND arg_lb=2 AND arg_ub=2 AND arg1_isbag = 1 AND (arg2_isbag = 1 OR arg2_isbag IS NULL);
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss new file mode 100644 index 0000000..a5670b7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss
@@ -0,0 +1,7 @@ +/* This file is automatically managed and will be overwritten from time to time. */ +/* Do not manually edit this file. */ + +/* Import and include this mixin into your project theme to include the addon themes */ +@mixin addons { +} +
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico new file mode 100644 index 0000000..bfd212e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png new file mode 100644 index 0000000..9980604 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png new file mode 100644 index 0000000..c7443d1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png new file mode 100644 index 0000000..3de9e04 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png new file mode 100644 index 0000000..a3c243b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png new file mode 100644 index 0000000..bc7ad9e --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png new file mode 100644 index 0000000..ef73ffa --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png new file mode 100644 index 0000000..7b22aa8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png new file mode 100644 index 0000000..e0592a6 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png new file mode 100644 index 0000000..65e4985 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png new file mode 100644 index 0000000..282bba6 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png new file mode 100644 index 0000000..c033369 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png new file mode 100644 index 0000000..05787f5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png new file mode 100644 index 0000000..8d207b9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png new file mode 100644 index 0000000..f735262 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png new file mode 100644 index 0000000..5feb76c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png new file mode 100644 index 0000000..69f72f9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png new file mode 100644 index 0000000..758257f --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png new file mode 100644 index 0000000..247d066 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png new file mode 100644 index 0000000..993faab --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png new file mode 100644 index 0000000..a5e228f --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png new file mode 100644 index 0000000..d8239e1 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png new file mode 100644 index 0000000..6e249f7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png new file mode 100644 index 0000000..b4fc229 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png new file mode 100644 index 0000000..b7f0fa7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png new file mode 100644 index 0000000..ffeec58 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png new file mode 100644 index 0000000..fa300a8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png new file mode 100644 index 0000000..2d8ba95 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png new file mode 100644 index 0000000..234f9f5 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png new file mode 100644 index 0000000..1c53527 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png new file mode 100644 index 0000000..732d7b6 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png new file mode 100644 index 0000000..c35c84d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png new file mode 100644 index 0000000..a1533f2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png new file mode 100644 index 0000000..189cc11 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png new file mode 100644 index 0000000..4524177 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png new file mode 100644 index 0000000..a11fffd --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png new file mode 100644 index 0000000..99cd51b --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png new file mode 100644 index 0000000..64693e2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png new file mode 100644 index 0000000..4a23967 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png new file mode 100644 index 0000000..945e15c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png new file mode 100644 index 0000000..01e9c68 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png new file mode 100644 index 0000000..48f3b6c --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png new file mode 100644 index 0000000..7386e4f --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png new file mode 100644 index 0000000..74a6ca2 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png new file mode 100644 index 0000000..43e92f9 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png new file mode 100644 index 0000000..c4affb6 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png new file mode 100644 index 0000000..9f6e629 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png new file mode 100644 index 0000000..8f612a7 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss new file mode 100644 index 0000000..77baa29 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss
@@ -0,0 +1,9 @@ +@import "addons.scss"; +@import "xacml_pap_admin.scss"; + +/* This file prefixes all rules with the theme name to avoid causing conflicts with other themes. */ +/* The actual styles should be defined in xacml_pap_admin.scss */ +.xacml_pap_admin { + @include addons; + @include xacml_pap_admin; +}
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss new file mode 100644 index 0000000..fb29c5d --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss
@@ -0,0 +1,42 @@ +/* Import the reindeer theme.*/ +/* This only allows us to use the mixins defined in it and does not add any styles by itself. */ +@import "../reindeer/reindeer.scss"; + +/* This contains all of your theme.*/ +/* If somebody wants to extend the theme she will include this mixin. */ +@mixin xacml_pap_admin { + /* Include all the styles from the reindeer theme */ + @include reindeer; + + /* Insert your theme rules here */ + + .v-textfield-dashing { + border: thin dashed; + background: white; /* Has shading image by default */ + } + +/* Lay the options horizontally */ +.v-select-optiongroup-horizontal .v-select-option { + display: inline-block; +} + +/* Avoid wrapping if the layout is too tight */ +.v-select-optiongroup-horizontal { + white-space: nowrap; +} + +/* Some extra spacing is needed */ +.v-select-optiongroup-horizontal + .v-select-option.v-radiobutton { + padding-right: 10px; +} + +.v-textfield { + min-width:400px; +} + +.v-textarea { + min-width:250px; +} + +}
diff --git a/openaz-xacml-pap-admin/src/main/resources/log4j.properties b/openaz-xacml-pap-admin/src/main/resources/log4j.properties new file mode 100644 index 0000000..aeee9f8 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/resources/log4j.properties
@@ -0,0 +1,13 @@ +# +# Use this properties for debugging and development. +# +# +# Set root logger level +log4j.rootLogger=DEBUG, MAIN_LOG + +# console is set to be a ConsoleAppender. +log4j.appender.MAIN_LOG=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.MAIN_LOG.layout=org.apache.log4j.PatternLayout +log4j.appender.MAIN_LOG.layout.ConversionPattern=%d{yyyy_MM_dd_HH_mm_ss_SSS} [%t] %-5p %l- %m%n
diff --git a/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml b/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..9e06c81 --- /dev/null +++ b/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!-- + 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. +--> + +<web-app xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee + http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0" + metadata-complete="true"> + + <display-name>Apache OpenAZ</display-name> + <description></description> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + <welcome-file>index.htm</welcome-file> + <welcome-file>index.jsp</welcome-file> + <welcome-file>default.html</welcome-file> + <welcome-file>default.htm</welcome-file> + <welcome-file>default.jsp</welcome-file> + </welcome-file-list> + + + <!-- Policy Engine PAP Administration --> + <servlet> + <servlet-name>PePapAdmin</servlet-name> + + <!-- <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> --> + <servlet-class>org.apache.openaz.xacml.admin.XacmlAdminServlet</servlet-class> + + <init-param> + <description>Vaadin UI Class: XacmlAdminUI</description> + <param-name>UI</param-name> + <param-value>org.apache.openaz.xacml.admin.XacmlAdminUI</param-value> + </init-param> + + <init-param> + <description>The location of the properties file holding configuration information.</description> + <param-name>XACML_PROPERTIES_NAME</param-name> + <param-value>/opt/app/xacml/etc/xacml.admin.properties</param-value> + </init-param> + + </servlet> + + <servlet-mapping> + <servlet-name>PePapAdmin</servlet-name> + <url-pattern>/*</url-pattern> + </servlet-mapping> +</web-app>