http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/pom.xml b/syncope620/archetype/pom.xml index be93a6b..94e7e0d 100644 --- a/syncope620/archetype/pom.xml +++ b/syncope620/archetype/pom.xml @@ -124,66 +124,66 @@ under the License. </resource> <resource> - <directory>../server/provisioning-java/src/main/resources</directory> + <directory>../core/provisioning-java/src/main/resources</directory> <excludes> <exclude>*Context.xml</exclude> </excludes> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> </resource> <resource> - <directory>../server/persistence-jpa/src/main/resources</directory> + <directory>../core/persistence-jpa/src/main/resources</directory> <excludes> <exclude>*Context.xml</exclude> <exclude>META-INF/spring-persistence.xml</exclude> </excludes> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> </resource> <resource> - <directory>../server/persistence-jpa/src/test/resources</directory> + <directory>../core/persistence-jpa/src/test/resources</directory> <includes> <include>persistence.properties</include> </includes> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/test/resources</targetPath> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/test/resources</targetPath> </resource> <resource> - <directory>../server/logic/src/main/resources</directory> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <directory>../core/logic/src/main/resources</directory> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> <excludes> <exclude>*Context.xml</exclude> </excludes> </resource> <resource> - <directory>../server/misc/src/main/resources</directory> + <directory>../core/misc/src/main/resources</directory> <includes> <include>security.properties</include> </includes> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> </resource> <resource> - <directory>../fit/server-reference/src/main/resources</directory> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <directory>../fit/core-reference/src/main/resources</directory> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> <includes> - <include>serverContext.xml</include> + <include>coreContext.xml</include> <include>log4j2.xml</include> </includes> </resource> <resource> - <directory>../fit/server-reference/src/main/resources/all</directory> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/resources</targetPath> + <directory>../fit/core-reference/src/main/resources/all</directory> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/resources</targetPath> <includes> <include>workflow.properties</include> </includes> </resource> <resource> - <directory>../fit/server-reference/src/main/webapp</directory> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/test/resources</targetPath> + <directory>../fit/core-reference/src/main/webapp</directory> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/test/resources</targetPath> <includes> <include>*.jsp</include> </includes> </resource> <resource> - <directory>../fit/server-reference/src/main/webapp/WEB-INF</directory> - <targetPath>${project.build.outputDirectory}/archetype-resources/server/src/main/webapp/WEB-INF</targetPath> + <directory>../fit/core-reference/src/main/webapp/WEB-INF</directory> + <targetPath>${project.build.outputDirectory}/archetype-resources/core/src/main/webapp/WEB-INF</targetPath> </resource> <resource>
http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/syncope620/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index a23bb67..44f3cfb 100644 --- a/syncope620/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/syncope620/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -26,7 +26,7 @@ under the License. </requiredProperties> <modules> - <module id="server" dir="server" name="server"> + <module id="core" dir="core" name="core"> <fileSets> <fileSet filtered="false" encoding="UTF-8"> <directory>src/main/resources</directory> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/archetype-resources/console/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/archetype-resources/console/pom.xml b/syncope620/archetype/src/main/resources/archetype-resources/console/pom.xml index 82c79c1..0344a40 100644 --- a/syncope620/archetype/src/main/resources/archetype-resources/console/pom.xml +++ b/syncope620/archetype/src/main/resources/archetype-resources/console/pom.xml @@ -211,11 +211,11 @@ under the License. <phase>package</phase> <configuration> <target> - <copy file="../server/target/test-classes/persistence.properties" - todir="../server/target/syncope/WEB-INF/classes" + <copy file="../core/target/test-classes/persistence.properties" + todir="../core/target/syncope/WEB-INF/classes" overwrite="true"/> - <copy file="../server/target/test-classes/db.jsp" - todir="../server/target/syncope" + <copy file="../core/target/test-classes/db.jsp" + todir="../core/target/syncope" overwrite="true"/> <copy file="${project.build.directory}/test-classes/console.properties" @@ -255,7 +255,7 @@ under the License. </configuration> <deployables> <deployable> - <location>../server/target/syncope</location> + <location>../core/target/syncope</location> <properties> <context>syncope</context> </properties> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/archetype-resources/core/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/archetype-resources/core/pom.xml b/syncope620/archetype/src/main/resources/archetype-resources/core/pom.xml new file mode 100644 index 0000000..0dac78f --- /dev/null +++ b/syncope620/archetype/src/main/resources/archetype-resources/core/pom.xml @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>${groupId}</groupId> + <artifactId>${rootArtifactId}</artifactId> + <version>${version}</version> + </parent> + + <name>Apache Syncope sample project - Core</name> + <groupId>${groupId}</groupId> + <artifactId>${artifactId}</artifactId> + <packaging>war</packaging> + + <dependencies> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet.jsp</groupId> + <artifactId>javax.servlet.jsp-api</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-rest-cxf</artifactId> + </dependency> + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-java</artifactId> + </dependency> + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-persistence-jpa</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-activiti</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + </dependency> + <dependency> + <groupId>com.lmax</groupId> + <artifactId>disruptor</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j-impl</artifactId> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + </dependency> + + <dependency> + <groupId>org.webjars</groupId> + <artifactId>jquery</artifactId> + </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>jquery-ui</artifactId> + </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>highlightjs</artifactId> + </dependency> + </dependencies> + + <build> + <finalName>syncope</finalName> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <inherited>true</inherited> + <configuration> + <failOnMissingWebXml>false</failOnMissingWebXml> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <inherited>true</inherited> + <executions> + <execution> + <id>set-bundles</id> + <phase>process-test-resources</phase> + <goals> + <goal>copy</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + + <resources> + <resource> + <directory>src/main/resources</directory> + <filtering>true</filtering> + </resource> + </resources> + + <testResources> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + </testResource> + </testResources> + </build> + +</project> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/archetype-resources/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/archetype-resources/pom.xml b/syncope620/archetype/src/main/resources/archetype-resources/pom.xml index e08edd2..6b2029c 100644 --- a/syncope620/archetype/src/main/resources/archetype-resources/pom.xml +++ b/syncope620/archetype/src/main/resources/archetype-resources/pom.xml @@ -40,24 +40,24 @@ under the License. <dependencyManagement> <dependencies> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-rest-cxf</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-rest-cxf</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-java</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-java</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-persistence-jpa</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-persistence-jpa</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-activiti</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-activiti</artifactId> <version>${syncope.version}</version> </dependency> @@ -103,7 +103,7 @@ under the License. </build> <modules> - <module>server</module> + <module>core</module> <module>console</module> </modules> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/archetype-resources/server/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/archetype-resources/server/pom.xml b/syncope620/archetype/src/main/resources/archetype-resources/server/pom.xml deleted file mode 100644 index 8acc6c4..0000000 --- a/syncope620/archetype/src/main/resources/archetype-resources/server/pom.xml +++ /dev/null @@ -1,155 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>${groupId}</groupId> - <artifactId>${rootArtifactId}</artifactId> - <version>${version}</version> - </parent> - - <name>Apache Syncope sample project - Server</name> - <groupId>${groupId}</groupId> - <artifactId>${artifactId}</artifactId> - <packaging>war</packaging> - - <dependencies> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - </dependency> - <dependency> - <groupId>javax.servlet.jsp</groupId> - <artifactId>javax.servlet.jsp-api</artifactId> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jstl</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-rest-cxf</artifactId> - </dependency> - <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-java</artifactId> - </dependency> - <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-persistence-jpa</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-activiti</artifactId> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-api</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-core</artifactId> - </dependency> - <dependency> - <groupId>com.lmax</groupId> - <artifactId>disruptor</artifactId> - </dependency> - <dependency> - <groupId>org.apache.logging.log4j</groupId> - <artifactId>log4j-slf4j-impl</artifactId> - </dependency> - <dependency> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> - </dependency> - - <dependency> - <groupId>org.webjars</groupId> - <artifactId>jquery</artifactId> - </dependency> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>jquery-ui</artifactId> - </dependency> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>highlightjs</artifactId> - </dependency> - </dependencies> - - <build> - <finalName>syncope</finalName> - - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <inherited>true</inherited> - <configuration> - <failOnMissingWebXml>false</failOnMissingWebXml> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <inherited>true</inherited> - <executions> - <execution> - <id>set-bundles</id> - <phase>process-test-resources</phase> - <goals> - <goal>copy</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - - <resources> - <resource> - <directory>src/main/resources</directory> - <filtering>true</filtering> - </resource> - </resources> - - <testResources> - <testResource> - <directory>src/test/resources</directory> - <filtering>true</filtering> - </testResource> - </testResources> - </build> - -</project> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/archetype/src/main/resources/meta-pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/archetype/src/main/resources/meta-pom.xml b/syncope620/archetype/src/main/resources/meta-pom.xml index bb26a01..4ce00b3 100644 --- a/syncope620/archetype/src/main/resources/meta-pom.xml +++ b/syncope620/archetype/src/main/resources/meta-pom.xml @@ -44,24 +44,24 @@ under the License. <dependencyManagement> <dependencies> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-rest-cxf</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-rest-cxf</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-java</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-java</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-persistence-jpa</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-persistence-jpa</artifactId> <version>${syncope.version}</version> </dependency> <dependency> - <groupId>org.apache.syncope.server</groupId> - <artifactId>syncope-server-workflow-activiti</artifactId> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-activiti</artifactId> <version>${syncope.version}</version> </dependency> @@ -107,7 +107,7 @@ under the License. </build> <modules> - <module>server</module> + <module>core</module> <module>console</module> </modules> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java ---------------------------------------------------------------------- diff --git a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java index 1150e60..5a92daa 100644 --- a/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java +++ b/syncope620/common/lib/src/main/java/org/apache/syncope/common/lib/types/EntityViolationType.java @@ -24,38 +24,38 @@ import javax.xml.bind.annotation.XmlEnum; public enum EntityViolationType { Standard(""), - InvalidAccountPolicy("org.apache.syncope.server.persistence.validation.accountpolicy"), - InvalidConnInstanceLocation("org.apache.syncope.server.persistence.validation.conninstance.location"), - InvalidConnPoolConf("org.apache.syncope.server.persistence.validation.conninstance.poolConf"), - InvalidCPlainSchema("org.apache.syncope.server.persistence.validation.attrvalue.cPlainSchema"), - InvalidMapping("org.apache.syncope.server.persistence.validation.mapping"), - InvalidMPlainSchema("org.apache.syncope.server.persistence.validation.attrvalue.mPlainSchema"), - InvalidMDerSchema("org.apache.syncope.server.persistence.validation.attrvalue.mDerSchema"), - InvalidMVirSchema("org.apache.syncope.server.persistence.validation.attrvalue.mVirSchema"), - InvalidName("org.apache.syncope.server.persistence.validation.name"), - InvalidNotification("org.apache.syncope.server.persistence.validation.notification"), - InvalidPassword("org.apache.syncope.server.persistence.validation.user.password"), - InvalidPasswordPolicy("org.apache.syncope.server.persistence.validation.passwordpolicy"), - InvalidPolicy("org.apache.syncope.server.persistence.validation.policy"), - InvalidPropagationTask("org.apache.syncope.server.persistence.validation.propagationtask"), - InvalidRPlainSchema("org.apache.syncope.server.persistence.validation.attrvalue.rPlainSchema"), - InvalidRDerSchema("org.apache.syncope.server.persistence.validation.attrvalue.rDerSchema"), - InvalidRVirSchema("org.apache.syncope.server.persistence.validation.attrvalue.rVirSchema"), - InvalidReport("org.apache.syncope.server.persistence.validation.report"), - InvalidResource("org.apache.syncope.server.persistence.validation.externalresource"), - InvalidRoleOwner("org.apache.syncope.server.persistence.validation.role.owner"), - InvalidSchemaEncrypted("org.apache.syncope.server.persistence.validation.schema.encrypted"), - InvalidSchemaEnum("org.apache.syncope.server.persistence.validation.schema.enum"), - InvalidSchemaMultivalueUnique("org.apache.syncope.server.persistence.validation.schema.multivalueUnique"), - InvalidSchedTask("org.apache.syncope.server.persistence.validation.schedtask"), - InvalidSyncTask("org.apache.syncope.server.persistence.validation.synctask"), - InvalidSyncPolicy("org.apache.syncope.server.persistence.validation.syncpolicy"), - InvalidUPlainSchema("org.apache.syncope.server.persistence.validation.attrvalue.uPlainSchema"), - InvalidUDerSchema("org.apache.syncope.server.persistence.validation.attrvalue.derSchema"), - InvalidUVirSchema("org.apache.syncope.server.persistence.validation.attrvalue.uVirSchema"), - InvalidUsername("org.apache.syncope.server.persistence.validation.user.username"), - InvalidValueList("org.apache.syncope.server.persistence.validation.attr.valueList"), - MoreThanOneNonNull("org.apache.syncope.server.persistence.validation.attrvalue.moreThanOneNonNull"); + InvalidAccountPolicy("org.apache.syncope.core.persistence.validation.accountpolicy"), + InvalidConnInstanceLocation("org.apache.syncope.core.persistence.validation.conninstance.location"), + InvalidConnPoolConf("org.apache.syncope.core.persistence.validation.conninstance.poolConf"), + InvalidCPlainSchema("org.apache.syncope.core.persistence.validation.attrvalue.cPlainSchema"), + InvalidMapping("org.apache.syncope.core.persistence.validation.mapping"), + InvalidMPlainSchema("org.apache.syncope.core.persistence.validation.attrvalue.mPlainSchema"), + InvalidMDerSchema("org.apache.syncope.core.persistence.validation.attrvalue.mDerSchema"), + InvalidMVirSchema("org.apache.syncope.core.persistence.validation.attrvalue.mVirSchema"), + InvalidName("org.apache.syncope.core.persistence.validation.name"), + InvalidNotification("org.apache.syncope.core.persistence.validation.notification"), + InvalidPassword("org.apache.syncope.core.persistence.validation.user.password"), + InvalidPasswordPolicy("org.apache.syncope.core.persistence.validation.passwordpolicy"), + InvalidPolicy("org.apache.syncope.core.persistence.validation.policy"), + InvalidPropagationTask("org.apache.syncope.core.persistence.validation.propagationtask"), + InvalidRPlainSchema("org.apache.syncope.core.persistence.validation.attrvalue.rPlainSchema"), + InvalidRDerSchema("org.apache.syncope.core.persistence.validation.attrvalue.rDerSchema"), + InvalidRVirSchema("org.apache.syncope.core.persistence.validation.attrvalue.rVirSchema"), + InvalidReport("org.apache.syncope.core.persistence.validation.report"), + InvalidResource("org.apache.syncope.core.persistence.validation.externalresource"), + InvalidRoleOwner("org.apache.syncope.core.persistence.validation.role.owner"), + InvalidSchemaEncrypted("org.apache.syncope.core.persistence.validation.schema.encrypted"), + InvalidSchemaEnum("org.apache.syncope.core.persistence.validation.schema.enum"), + InvalidSchemaMultivalueUnique("org.apache.syncope.core.persistence.validation.schema.multivalueUnique"), + InvalidSchedTask("org.apache.syncope.core.persistence.validation.schedtask"), + InvalidSyncTask("org.apache.syncope.core.persistence.validation.synctask"), + InvalidSyncPolicy("org.apache.syncope.core.persistence.validation.syncpolicy"), + InvalidUPlainSchema("org.apache.syncope.core.persistence.validation.attrvalue.uPlainSchema"), + InvalidUDerSchema("org.apache.syncope.core.persistence.validation.attrvalue.derSchema"), + InvalidUVirSchema("org.apache.syncope.core.persistence.validation.attrvalue.uVirSchema"), + InvalidUsername("org.apache.syncope.core.persistence.validation.user.username"), + InvalidValueList("org.apache.syncope.core.persistence.validation.attr.valueList"), + MoreThanOneNonNull("org.apache.syncope.core.persistence.validation.attrvalue.moreThanOneNonNull"); private String message; http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/common/rest-api/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/common/rest-api/pom.xml b/syncope620/common/rest-api/pom.xml index addc3b9..f4409c5 100644 --- a/syncope620/common/rest-api/pom.xml +++ b/syncope620/common/rest-api/pom.xml @@ -69,7 +69,7 @@ under the License. <build> <plugins> - <!-- Generating javadoc JAR artifact for usage with CXF's WADL generator (for server) --> + <!-- Generating javadoc JAR artifact for usage with CXF's WADL generator (for core) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/pom.xml ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/pom.xml b/syncope620/core/logic/pom.xml new file mode 100644 index 0000000..6a9aaa3 --- /dev/null +++ b/syncope620/core/logic/pom.xml @@ -0,0 +1,181 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.syncope</groupId> + <artifactId>syncope-core</artifactId> + <version>2.0.0-SNAPSHOT</version> + </parent> + + <name>Apache Syncope Core Logic</name> + <description>Apache Syncope Core Logic</description> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-logic</artifactId> + <packaging>jar</packaging> + + <properties> + <rootpom.basedir>${basedir}/../..</rootpom.basedir> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-dbcp2</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jdbc</artifactId> + </dependency> + + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjweaver</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.cocoon.sax</groupId> + <artifactId>cocoon-sax</artifactId> + </dependency> + <dependency> + <groupId>org.apache.cocoon.optional</groupId> + <artifactId>cocoon-optional</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.xmlgraphics</groupId> + <artifactId>fop</artifactId> + </dependency> + <dependency> + <groupId>org.apache.avalon.framework</groupId> + <artifactId>avalon-framework-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.avalon.framework</groupId> + <artifactId>avalon-framework-impl</artifactId> + </dependency> + + <dependency> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + </dependency> + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-provisioning-java</artifactId> + <version>${project.version}</version> + </dependency> + + <!-- TEST --> + <dependency> + <groupId>com.icegreen</groupId> + <artifactId>greenmail</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-workflow-java</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>javax.el</groupId> + <artifactId>javax.el-api</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.syncope.core</groupId> + <artifactId>syncope-core-persistence-jpa</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>${slf4j.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <resources> + <resource> + <directory>${basedir}/src/main/resources</directory> + <filtering>true</filtering> + </resource> + </resources> + <testResources> + <testResource> + <directory>${basedir}/src/test/resources</directory> + <filtering>true</filtering> + </testResource> + <testResource> + <directory>${basedir}/../persistence-jpa/src/test/resources</directory> + <filtering>true</filtering> + </testResource> + </testResources> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-pmd-plugin</artifactId> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java new file mode 100644 index 0000000..35e806a --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractLogic.java @@ -0,0 +1,58 @@ +/* + * 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.syncope.core.logic; + +import java.lang.reflect.Method; +import org.apache.syncope.common.lib.AbstractBaseBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.transaction.annotation.Transactional; + +/** + * Superclass for all controllers. + * + * @param <T> transfer object used for input / output + */ +abstract class AbstractLogic<T extends AbstractBaseBean> { + + /** + * Logger. + */ + protected static final Logger LOG = LoggerFactory.getLogger(AbstractLogic.class); + + /** + * Resolves stored bean (if existing) referred by the given CUD method. + * <br /> + * Read-only methods will be unresolved for performance reasons. + * + * @param method method. + * @param args method arguments. + * @return referred stored bean. + * @throws UnresolvedReferenceException in case of failures, read-only methods and unresolved bean. + */ + public T resolveBeanReference(final Method method, final Object... args) throws UnresolvedReferenceException { + final Transactional transactional = method.getAnnotation(Transactional.class); + if (transactional != null && transactional.readOnly()) { + throw new UnresolvedReferenceException(); + } + return resolveReference(method, args); + } + + protected abstract T resolveReference(Method method, Object... args) throws UnresolvedReferenceException; +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractResourceAssociator.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractResourceAssociator.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractResourceAssociator.java new file mode 100644 index 0000000..3d3b393 --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractResourceAssociator.java @@ -0,0 +1,37 @@ +/* + * 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.syncope.core.logic; + +import java.util.Collection; +import org.apache.syncope.common.lib.to.AbstractAttributableTO; + +public abstract class AbstractResourceAssociator<T extends AbstractAttributableTO> extends AbstractLogic<T> { + + public abstract T unlink(Long id, Collection<String> resources); + + public abstract T link(Long id, Collection<String> resources); + + public abstract T unassign(Long id, Collection<String> resources); + + public abstract T assign(Long id, Collection<String> resources, boolean changepwd, String password); + + public abstract T deprovision(Long userId, Collection<String> resources); + + public abstract T provision(Long userId, Collection<String> resources, boolean changepwd, String password); +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractSubjectLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractSubjectLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractSubjectLogic.java new file mode 100644 index 0000000..a1a94b4 --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractSubjectLogic.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.syncope.core.logic; + +import java.util.List; +import org.apache.syncope.common.lib.mod.AbstractSubjectMod; +import org.apache.syncope.common.lib.to.AbstractSubjectTO; +import org.apache.syncope.core.persistence.api.dao.search.OrderByClause; +import org.apache.syncope.core.persistence.api.dao.search.SearchCond; + +public abstract class AbstractSubjectLogic<T extends AbstractSubjectTO, V extends AbstractSubjectMod> + extends AbstractResourceAssociator<T> { + + public abstract T read(Long key); + + public abstract int count(); + + public abstract T update(V attributableMod); + + public abstract T delete(Long key); + + public abstract List<T> list(int page, int size, List<OrderByClause> orderBy); + + public abstract List<T> search(SearchCond searchCondition, int page, int size, List<OrderByClause> orderBy); + + public abstract int searchCount(SearchCond searchCondition); +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.java new file mode 100644 index 0000000..08f2069 --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractTransactionalLogic.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.syncope.core.logic; + +import org.apache.syncope.common.lib.AbstractBaseBean; +import org.springframework.transaction.annotation.Transactional; + +/** + * Adds Spring's transactional support to {@link AbstractLogic}. + * + * @param <T> transfer object used for input / output + */ +@Transactional(rollbackFor = { Throwable.class }) +abstract class AbstractTransactionalLogic<T extends AbstractBaseBean> extends AbstractLogic<T> { +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java new file mode 100644 index 0000000..9874e4d --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java @@ -0,0 +1,112 @@ +/* + * 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.syncope.core.logic; + +import java.io.OutputStream; +import java.lang.reflect.Method; +import org.apache.syncope.common.lib.to.AttrTO; +import org.apache.syncope.common.lib.to.ConfTO; +import org.apache.syncope.core.persistence.api.content.ContentExporter; +import org.apache.syncope.core.persistence.api.dao.ConfDAO; +import org.apache.syncope.core.persistence.api.dao.NotFoundException; +import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; +import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr; +import org.apache.syncope.core.persistence.api.entity.conf.CPlainSchema; +import org.apache.syncope.core.provisioning.api.data.ConfigurationDataBinder; +import org.apache.syncope.core.workflow.api.RoleWorkflowAdapter; +import org.apache.syncope.core.workflow.api.UserWorkflowAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class ConfigurationLogic extends AbstractTransactionalLogic<ConfTO> { + + @Autowired + private ConfDAO confDAO; + + @Autowired + private PlainSchemaDAO plainSchemaDAO; + + @Autowired + private ConfigurationDataBinder binder; + + @Autowired + private ContentExporter exporter; + + @Autowired + private UserWorkflowAdapter uwfAdapter; + + @Autowired + private RoleWorkflowAdapter rwfAdapter; + + @PreAuthorize("hasRole('CONFIGURATION_DELETE')") + public void delete(final String key) { + confDAO.delete(key); + } + + @PreAuthorize("hasRole('CONFIGURATION_LIST')") + public ConfTO list() { + return binder.getConfTO(confDAO.get()); + } + + @PreAuthorize("isAuthenticated()") + public AttrTO read(final String key) { + AttrTO result; + + CPlainAttr conf = confDAO.find(key); + if (conf == null) { + CPlainSchema schema = plainSchemaDAO.find(key, CPlainSchema.class); + if (schema == null) { + throw new NotFoundException("Configuration key " + key); + } + + result = new AttrTO(); + result.setSchema(key); + } else { + result = binder.getAttrTO(conf); + } + + return result; + } + + @PreAuthorize("hasRole('CONFIGURATION_SET')") + public void set(final AttrTO value) { + confDAO.save(binder.getAttribute(value)); + } + + @PreAuthorize("hasRole('CONFIGURATION_EXPORT')") + @Transactional(readOnly = true) + public void export(final OutputStream os) { + try { + exporter.export(os, uwfAdapter.getPrefix(), rwfAdapter.getPrefix()); + LOG.debug("Database content successfully exported"); + } catch (Exception e) { + LOG.error("While exporting database content", e); + } + } + + @Override + protected ConfTO resolveReference(final Method method, final Object... args) + throws UnresolvedReferenceException { + + throw new UnresolvedReferenceException(); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java new file mode 100644 index 0000000..f5a707f --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java @@ -0,0 +1,341 @@ +/* + * 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.syncope.core.logic; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.to.BulkAction; +import org.apache.syncope.common.lib.to.BulkActionResult; +import org.apache.syncope.common.lib.to.ConnBundleTO; +import org.apache.syncope.common.lib.to.ConnInstanceTO; +import org.apache.syncope.common.lib.types.ClientExceptionType; +import org.apache.syncope.common.lib.types.ConnConfProperty; +import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO; +import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; +import org.apache.syncope.core.persistence.api.dao.NotFoundException; +import org.apache.syncope.core.persistence.api.entity.ConnInstance; +import org.apache.syncope.core.persistence.api.entity.ExternalResource; +import org.apache.syncope.core.provisioning.api.ConnIdBundleManager; +import org.apache.syncope.core.provisioning.api.Connector; +import org.apache.syncope.core.provisioning.api.ConnectorFactory; +import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder; +import org.identityconnectors.common.l10n.CurrentLocale; +import org.identityconnectors.framework.api.ConfigurationProperties; +import org.identityconnectors.framework.api.ConnectorInfo; +import org.identityconnectors.framework.api.ConnectorKey; +import org.identityconnectors.framework.common.objects.ObjectClass; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> { + + @Autowired + private ConnIdBundleManager connIdBundleManager; + + @Autowired + private ExternalResourceDAO resourceDAO; + + @Autowired + private ConnInstanceDAO connInstanceDAO; + + @Autowired + private ConnInstanceDataBinder binder; + + @Autowired + private ConnectorFactory connFactory; + + @PreAuthorize("hasRole('CONNECTOR_CREATE')") + public ConnInstanceTO create(final ConnInstanceTO connInstanceTO) { + ConnInstance connInstance = binder.getConnInstance(connInstanceTO); + try { + connInstance = connInstanceDAO.save(connInstance); + } catch (SyncopeClientException e) { + throw e; + } catch (Exception e) { + SyncopeClientException ex = SyncopeClientException.build(ClientExceptionType.InvalidConnInstance); + ex.getElements().add(e.getMessage()); + throw ex; + } + + return binder.getConnInstanceTO(connInstance); + } + + @PreAuthorize("hasRole('CONNECTOR_UPDATE')") + public ConnInstanceTO update(final ConnInstanceTO connInstanceTO) { + ConnInstance connInstance = binder.updateConnInstance(connInstanceTO.getKey(), connInstanceTO); + try { + connInstance = connInstanceDAO.save(connInstance); + } catch (SyncopeClientException e) { + throw e; + } catch (Exception e) { + SyncopeClientException ex = SyncopeClientException.build(ClientExceptionType.InvalidConnInstance); + ex.getElements().add(e.getMessage()); + throw ex; + } + + return binder.getConnInstanceTO(connInstance); + } + + @PreAuthorize("hasRole('CONNECTOR_DELETE')") + public ConnInstanceTO delete(final Long connInstanceId) { + ConnInstance connInstance = connInstanceDAO.find(connInstanceId); + if (connInstance == null) { + throw new NotFoundException("Connector '" + connInstanceId + "'"); + } + + if (!connInstance.getResources().isEmpty()) { + SyncopeClientException associatedResources = SyncopeClientException.build( + ClientExceptionType.AssociatedResources); + for (ExternalResource resource : connInstance.getResources()) { + associatedResources.getElements().add(resource.getKey()); + } + throw associatedResources; + } + + ConnInstanceTO connToDelete = binder.getConnInstanceTO(connInstance); + + connInstanceDAO.delete(connInstanceId); + + return connToDelete; + } + + @PreAuthorize("hasRole('CONNECTOR_LIST')") + @Transactional(readOnly = true) + public List<ConnInstanceTO> list(final String lang) { + if (StringUtils.isBlank(lang)) { + CurrentLocale.set(Locale.ENGLISH); + } else { + CurrentLocale.set(new Locale(lang)); + } + + List<ConnInstance> connInstances = connInstanceDAO.findAll(); + + final List<ConnInstanceTO> connInstanceTOs = new ArrayList<>(); + + for (ConnInstance connector : connInstances) { + try { + connInstanceTOs.add(binder.getConnInstanceTO(connector)); + } catch (NotFoundException e) { + LOG.error("Connector '{}#{}' not found", connector.getBundleName(), connector.getVersion()); + } + } + + return connInstanceTOs; + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public ConnInstanceTO read(final Long connInstanceId) { + ConnInstance connInstance = connInstanceDAO.find(connInstanceId); + if (connInstance == null) { + throw new NotFoundException("Connector '" + connInstanceId + "'"); + } + + return binder.getConnInstanceTO(connInstance); + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public List<ConnBundleTO> getBundles(final String lang) { + if (StringUtils.isBlank(lang)) { + CurrentLocale.set(Locale.ENGLISH); + } else { + CurrentLocale.set(new Locale(lang)); + } + + List<ConnBundleTO> connectorBundleTOs = new ArrayList<>(); + for (Map.Entry<String, List<ConnectorInfo>> entry : connIdBundleManager.getConnectorInfos().entrySet()) { + for (ConnectorInfo bundle : entry.getValue()) { + ConnBundleTO connBundleTO = new ConnBundleTO(); + connBundleTO.setDisplayName(bundle.getConnectorDisplayName()); + + connBundleTO.setLocation(entry.getKey()); + + ConnectorKey key = bundle.getConnectorKey(); + connBundleTO.setBundleName(key.getBundleName()); + connBundleTO.setConnectorName(key.getConnectorName()); + connBundleTO.setVersion(key.getBundleVersion()); + + ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(bundle); + + for (String propName : properties.getPropertyNames()) { + connBundleTO.getProperties().add(binder.buildConnConfPropSchema(properties.getProperty(propName))); + } + + LOG.debug("Connector bundle: {}", connBundleTO); + + connectorBundleTOs.add(connBundleTO); + } + } + + return connectorBundleTOs; + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public List<String> getSchemaNames(final ConnInstanceTO connInstanceTO, final boolean includeSpecial) { + final ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey()); + if (connInstance == null) { + throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'"); + } + + // consider the possibility to receive overridden properties only + final Set<ConnConfProperty> conf = binder.mergeConnConfProperties(connInstanceTO.getConfiguration(), + connInstance.getConfiguration()); + + // We cannot use Spring bean because this method could be used during resource definition or modification: + // bean couldn't exist or couldn't be updated. + // This is the reason why we should take a "not mature" connector facade proxy to ask for schema names. + final List<String> result = new ArrayList<>(connFactory.createConnector(connInstance, conf). + getSchemaNames(includeSpecial)); + + return result; + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public List<String> getSupportedObjectClasses(final ConnInstanceTO connInstanceTO) { + final ConnInstance connInstance = connInstanceDAO.find(connInstanceTO.getKey()); + if (connInstance == null) { + throw new NotFoundException("Connector '" + connInstanceTO.getKey() + "'"); + } + + // consider the possibility to receive overridden properties only + final Set<ConnConfProperty> conf = binder.mergeConnConfProperties(connInstanceTO.getConfiguration(), + connInstance.getConfiguration()); + + // We cannot use Spring bean because this method could be used during resource definition or modification: + // bean couldn't exist or couldn't be updated. + // This is the reason why we should take a "not mature" connector facade proxy to ask for object classes. + Set<ObjectClass> objectClasses = connFactory.createConnector(connInstance, conf).getSupportedObjectClasses(); + + List<String> result = new ArrayList<>(objectClasses.size()); + for (ObjectClass objectClass : objectClasses) { + result.add(objectClass.getObjectClassValue()); + } + + return result; + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public List<ConnConfProperty> getConfigurationProperties(final Long connInstanceId) { + + final ConnInstance connInstance = connInstanceDAO.find(connInstanceId); + if (connInstance == null) { + throw new NotFoundException("Connector '" + connInstanceId + "'"); + } + + return new ArrayList<ConnConfProperty>(connInstance.getConfiguration()); + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public boolean check(final ConnInstanceTO connInstanceTO) { + final Connector connector = connFactory.createConnector( + binder.getConnInstance(connInstanceTO), connInstanceTO.getConfiguration()); + + boolean result; + try { + connector.test(); + result = true; + } catch (Exception ex) { + LOG.error("Test connection failure {}", ex); + result = false; + } + + return result; + } + + @PreAuthorize("hasRole('CONNECTOR_READ')") + @Transactional(readOnly = true) + public ConnInstanceTO readByResource(final String resourceName) { + ExternalResource resource = resourceDAO.find(resourceName); + if (resource == null) { + throw new NotFoundException("Resource '" + resourceName + "'"); + } + return binder.getConnInstanceTO(connFactory.getConnector(resource).getActiveConnInstance()); + } + + @PreAuthorize("hasRole('CONNECTOR_RELOAD')") + @Transactional(readOnly = true) + public void reload() { + connFactory.unload(); + connFactory.load(); + } + + @PreAuthorize("hasRole('CONNECTOR_DELETE') and #bulkAction.operation == #bulkAction.operation.DELETE") + public BulkActionResult bulk(final BulkAction bulkAction) { + BulkActionResult res = new BulkActionResult(); + + if (bulkAction.getOperation() == BulkAction.Type.DELETE) { + for (String id : bulkAction.getTargets()) { + try { + res.add(delete(Long.valueOf(id)).getKey(), BulkActionResult.Status.SUCCESS); + } catch (Exception e) { + LOG.error("Error performing delete for connector {}", id, e); + res.add(id, BulkActionResult.Status.FAILURE); + } + } + } + + return res; + } + + /** + * {@inheritDoc} + */ + @Override + protected ConnInstanceTO resolveReference(final Method method, final Object... args) + throws UnresolvedReferenceException { + + Long id = null; + + if (ArrayUtils.isNotEmpty(args)) { + for (int i = 0; id == null && i < args.length; i++) { + if (args[i] instanceof Long) { + id = (Long) args[i]; + } else if (args[i] instanceof ConnInstanceTO) { + id = ((ConnInstanceTO) args[i]).getKey(); + } + } + } + + if ((id != null) && !id.equals(0l)) { + try { + return binder.getConnInstanceTO(connInstanceDAO.find(id)); + } catch (Throwable ignore) { + LOG.debug("Unresolved reference", ignore); + throw new UnresolvedReferenceException(ignore); + } + } + + throw new UnresolvedReferenceException(); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/EntitlementLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/EntitlementLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/EntitlementLogic.java new file mode 100644 index 0000000..312ed19 --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/EntitlementLogic.java @@ -0,0 +1,58 @@ +/* + * 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.syncope.core.logic; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.apache.syncope.common.lib.wrap.EntitlementTO; +import org.apache.syncope.core.persistence.api.dao.EntitlementDAO; +import org.apache.syncope.core.persistence.api.entity.Entitlement; +import org.apache.syncope.core.misc.security.AuthContextUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class EntitlementLogic extends AbstractTransactionalLogic<EntitlementTO> { + + @Autowired + private EntitlementDAO entitlementDAO; + + public List<String> getAll() { + List<Entitlement> entitlements = entitlementDAO.findAll(); + List<String> result = new ArrayList<>(entitlements.size()); + for (Entitlement entitlement : entitlements) { + result.add(entitlement.getKey()); + } + + return result; + } + + public Set<String> getOwn() { + return AuthContextUtil.getOwnedEntitlementNames(); + } + + @Override + protected EntitlementTO resolveReference(final Method method, final Object... args) + throws UnresolvedReferenceException { + + throw new UnresolvedReferenceException(); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java new file mode 100644 index 0000000..f1efdea --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java @@ -0,0 +1,307 @@ +/* + * 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.syncope.core.logic; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.SyncopeConstants; +import org.apache.syncope.common.lib.to.EventCategoryTO; +import org.apache.syncope.common.lib.to.LoggerTO; +import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType; +import org.apache.syncope.common.lib.types.AuditLoggerName; +import org.apache.syncope.common.lib.types.ClientExceptionType; +import org.apache.syncope.common.lib.types.LoggerLevel; +import org.apache.syncope.common.lib.types.LoggerType; +import org.apache.syncope.common.lib.types.ResourceOperation; +import org.apache.syncope.common.lib.types.TaskType; +import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; +import org.apache.syncope.core.persistence.api.dao.LoggerDAO; +import org.apache.syncope.core.persistence.api.dao.NotFoundException; +import org.apache.syncope.core.persistence.api.dao.TaskDAO; +import org.apache.syncope.core.persistence.api.entity.EntityFactory; +import org.apache.syncope.core.persistence.api.entity.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.Logger; +import org.apache.syncope.core.persistence.api.entity.task.SchedTask; +import org.apache.syncope.core.persistence.api.entity.task.SyncTask; +import org.apache.syncope.core.misc.spring.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ClassUtils; +import org.springframework.util.SystemPropertyUtils; + +@Component +public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> { + + @Autowired + private LoggerDAO loggerDAO; + + @Autowired + private ExternalResourceDAO resourceDAO; + + @Autowired + private TaskDAO taskDAO; + + @Autowired + private EntityFactory entityFactory; + + private List<LoggerTO> list(final LoggerType type) { + List<LoggerTO> result = new ArrayList<>(); + for (Logger logger : loggerDAO.findAll(type)) { + LoggerTO loggerTO = new LoggerTO(); + BeanUtils.copyProperties(logger, loggerTO); + result.add(loggerTO); + } + + return result; + } + + @PreAuthorize("hasRole('LOG_LIST')") + @Transactional(readOnly = true) + public List<LoggerTO> listLogs() { + return list(LoggerType.LOG); + } + + @PreAuthorize("hasRole('AUDIT_LIST')") + @Transactional(readOnly = true) + public List<AuditLoggerName> listAudits() { + List<AuditLoggerName> result = new ArrayList<>(); + + for (LoggerTO logger : list(LoggerType.AUDIT)) { + try { + result.add(AuditLoggerName.fromLoggerName(logger.getKey())); + } catch (Exception e) { + LOG.warn("Unexpected audit logger name: {}", logger.getKey(), e); + } + } + + return result; + } + + private void throwInvalidLogger(final LoggerType type) { + SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidLogger); + sce.getElements().add("Expected " + type.name()); + + throw sce; + } + + private LoggerTO setLevel(final String name, final Level level, final LoggerType expectedType) { + Logger syncopeLogger = loggerDAO.find(name); + if (syncopeLogger == null) { + LOG.debug("Logger {} not found: creating new...", name); + + syncopeLogger = entityFactory.newEntity(Logger.class); + syncopeLogger.setKey(name); + syncopeLogger.setType(name.startsWith(LoggerType.AUDIT.getPrefix()) + ? LoggerType.AUDIT + : LoggerType.LOG); + } + + if (expectedType != syncopeLogger.getType()) { + throwInvalidLogger(expectedType); + } + + syncopeLogger.setLevel(LoggerLevel.fromLevel(level)); + syncopeLogger = loggerDAO.save(syncopeLogger); + + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + LoggerConfig logConf = SyncopeConstants.ROOT_LOGGER.equals(name) + ? ctx.getConfiguration().getLoggerConfig(LogManager.ROOT_LOGGER_NAME) + : ctx.getConfiguration().getLoggerConfig(name); + logConf.setLevel(level); + ctx.updateLoggers(); + + LoggerTO result = new LoggerTO(); + BeanUtils.copyProperties(syncopeLogger, result); + + return result; + } + + @PreAuthorize("hasRole('LOG_SET_LEVEL')") + public LoggerTO setLogLevel(final String name, final Level level) { + return setLevel(name, level, LoggerType.LOG); + } + + @PreAuthorize("hasRole('AUDIT_ENABLE')") + public void enableAudit(final AuditLoggerName auditLoggerName) { + try { + setLevel(auditLoggerName.toLoggerName(), Level.DEBUG, LoggerType.AUDIT); + } catch (IllegalArgumentException e) { + SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidLogger); + sce.getElements().add(e.getMessage()); + throw sce; + } + } + + private LoggerTO delete(final String name, final LoggerType expectedType) throws NotFoundException { + Logger syncopeLogger = loggerDAO.find(name); + if (syncopeLogger == null) { + throw new NotFoundException("Logger " + name); + } else if (expectedType != syncopeLogger.getType()) { + throwInvalidLogger(expectedType); + } + + LoggerTO loggerToDelete = new LoggerTO(); + BeanUtils.copyProperties(syncopeLogger, loggerToDelete); + + // remove SyncopeLogger from local storage, so that LoggerLoader won't load this next time + loggerDAO.delete(syncopeLogger); + + // set log level to OFF in order to disable configured logger until next reboot + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + org.apache.logging.log4j.core.Logger logger = SyncopeConstants.ROOT_LOGGER.equals(name) + ? ctx.getLogger(LogManager.ROOT_LOGGER_NAME) : ctx.getLogger(name); + logger.setLevel(Level.OFF); + ctx.updateLoggers(); + + return loggerToDelete; + } + + @PreAuthorize("hasRole('LOG_DELETE')") + public LoggerTO deleteLog(final String name) throws NotFoundException { + return delete(name, LoggerType.LOG); + } + + @PreAuthorize("hasRole('AUDIT_DISABLE')") + public void disableAudit(final AuditLoggerName auditLoggerName) { + try { + delete(auditLoggerName.toLoggerName(), LoggerType.AUDIT); + } catch (NotFoundException e) { + LOG.debug("Ignoring disable of non existing logger {}", auditLoggerName.toLoggerName()); + } catch (IllegalArgumentException e) { + SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidLogger); + sce.getElements().add(e.getMessage()); + throw sce; + } + } + + @PreAuthorize("hasRole('AUDIT_LIST') or hasRole('NOTIFICATION_LIST')") + public List<EventCategoryTO> listAuditEvents() { + // use set to avoi duplications or null elements + final Set<EventCategoryTO> events = new HashSet<EventCategoryTO>(); + + try { + final ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); + final MetadataReaderFactory metadataReaderFactory = + new CachingMetadataReaderFactory(resourcePatternResolver); + + final String packageSearchPath = + ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + ClassUtils.convertClassNameToResourcePath( + SystemPropertyUtils.resolvePlaceholders(this.getClass().getPackage().getName())) + + "/" + "**/*.class"; + + final Resource[] resources = resourcePatternResolver.getResources(packageSearchPath); + for (Resource resource : resources) { + if (resource.isReadable()) { + final MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); + final Class<?> clazz = Class.forName(metadataReader.getClassMetadata().getClassName()); + + if (clazz.isAnnotationPresent(Component.class) + && AbstractLogic.class.isAssignableFrom(clazz)) { + final EventCategoryTO eventCategoryTO = new EventCategoryTO(); + eventCategoryTO.setCategory(clazz.getSimpleName()); + for (Method method : clazz.getDeclaredMethods()) { + if (Modifier.isPublic(method.getModifiers())) { + eventCategoryTO.getEvents().add(method.getName()); + } + } + events.add(eventCategoryTO); + } + } + } + + //SYNCOPE-608 + final EventCategoryTO authenticationControllerEvents = new EventCategoryTO(); + authenticationControllerEvents.setCategory("AuthenticationController"); + authenticationControllerEvents.getEvents().add("login"); + events.add(authenticationControllerEvents); + + events.add(new EventCategoryTO(EventCategoryType.PROPAGATION)); + events.add(new EventCategoryTO(EventCategoryType.SYNCHRONIZATION)); + events.add(new EventCategoryTO(EventCategoryType.PUSH)); + + for (AttributableType attributableType : AttributableType.values()) { + for (ExternalResource resource : resourceDAO.findAll()) { + final EventCategoryTO propEventCategoryTO = new EventCategoryTO(EventCategoryType.PROPAGATION); + final EventCategoryTO syncEventCategoryTO = new EventCategoryTO(EventCategoryType.SYNCHRONIZATION); + final EventCategoryTO pushEventCategoryTO = new EventCategoryTO(EventCategoryType.PUSH); + + propEventCategoryTO.setCategory(attributableType.name().toLowerCase()); + propEventCategoryTO.setSubcategory(resource.getKey()); + + syncEventCategoryTO.setCategory(attributableType.name().toLowerCase()); + pushEventCategoryTO.setCategory(attributableType.name().toLowerCase()); + syncEventCategoryTO.setSubcategory(resource.getKey()); + pushEventCategoryTO.setSubcategory(resource.getKey()); + + for (ResourceOperation resourceOperation : ResourceOperation.values()) { + propEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase()); + syncEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase()); + pushEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase()); + } + + events.add(propEventCategoryTO); + events.add(syncEventCategoryTO); + events.add(pushEventCategoryTO); + } + } + + for (SchedTask task : taskDAO.<SchedTask>findAll(TaskType.SCHEDULED)) { + final EventCategoryTO eventCategoryTO = new EventCategoryTO(EventCategoryType.TASK); + eventCategoryTO.setCategory(Class.forName(task.getJobClassName()).getSimpleName()); + events.add(eventCategoryTO); + } + + for (SyncTask task : taskDAO.<SyncTask>findAll(TaskType.SYNCHRONIZATION)) { + final EventCategoryTO eventCategoryTO = new EventCategoryTO(EventCategoryType.TASK); + eventCategoryTO.setCategory(Class.forName(task.getJobClassName()).getSimpleName()); + events.add(eventCategoryTO); + } + } catch (Exception e) { + LOG.error("Failure retrieving audit/notification events", e); + } + + return new ArrayList<>(events); + } + + @Override + protected LoggerTO resolveReference(final Method method, final Object... args) + throws UnresolvedReferenceException { + + throw new UnresolvedReferenceException(); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/d30c8526/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java ---------------------------------------------------------------------- diff --git a/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java new file mode 100644 index 0000000..968a34c --- /dev/null +++ b/syncope620/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java @@ -0,0 +1,108 @@ +/* + * 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.syncope.core.logic; + +import java.lang.reflect.Method; +import java.util.Arrays; +import org.apache.syncope.common.lib.types.AuditElements; +import org.apache.syncope.core.misc.AuditManager; +import org.apache.syncope.core.provisioning.api.notification.NotificationManager; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +@Aspect +public class LogicInvocationHandler { + + /** + * Logger. + */ + private static final Logger LOG = LoggerFactory.getLogger(LogicInvocationHandler.class); + + @Autowired + private NotificationManager notificationManager; + + @Autowired + private AuditManager auditManager; + + @Around("execution(* org.apache.syncope.core.logic.AbstractLogic+.*(..))") + public Object around(final ProceedingJoinPoint joinPoint) throws Throwable { + final Class<?> clazz = joinPoint.getTarget().getClass(); + + final Object[] input = joinPoint.getArgs(); + + final String category = clazz.getSimpleName(); + + final MethodSignature ms = (MethodSignature) joinPoint.getSignature(); + Method method = ms.getMethod(); + + final String event = joinPoint.getSignature().getName(); + + AuditElements.Result result = null; + Object output = null; + Object before = null; + + try { + LOG.debug("Before {}.{}({})", clazz.getSimpleName(), event, + input == null || input.length == 0 ? "" : Arrays.asList(input)); + + try { + before = ((AbstractLogic) joinPoint.getTarget()).resolveBeanReference(method, input); + } catch (UnresolvedReferenceException ignore) { + LOG.debug("Unresolved bean reference ..."); + } + + output = joinPoint.proceed(); + result = AuditElements.Result.SUCCESS; + + LOG.debug("After returning {}.{}: {}", clazz.getSimpleName(), event, output); + return output; + } catch (Throwable t) { + output = t; + result = AuditElements.Result.FAILURE; + + LOG.debug("After throwing {}.{}", clazz.getSimpleName(), event); + throw t; + } finally { + notificationManager.createTasks( + AuditElements.EventCategoryType.REST, + category, + null, + event, + result, + before, + output, + input); + + auditManager.audit( + AuditElements.EventCategoryType.REST, + category, + null, + event, + result, + before, + output, + input); + } + } +}
