merge validation2 and model 3.5 into trunk
authorAndreas Müller <a.mueller@bgbm.org>
Thu, 19 Mar 2015 13:49:54 +0000 (13:49 +0000)
committerAndreas Müller <a.mueller@bgbm.org>
Thu, 19 Mar 2015 13:49:54 +0000 (13:49 +0000)
35 files changed:
.gitattributes
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationController.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationDefaultConfiguration.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/ICdmApplicationConfiguration.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/MonitoredListableBeanFactory.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/CommonServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityConstraintViolationServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationResultServiceImpl.java [deleted file]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationServiceImpl.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ICommonService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityConstraintViolationService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationResultService.java [deleted file]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationService.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UpdateResult.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/VersionableServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationEventListener.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationTask.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/ValidationManager.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidationUtil.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidator.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/EntityValidationUnit.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/ValidationScheduler.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/validation/constraint/NoDuplicateNamesValidator.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/application/FirstDataInserterTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/ClassifcationServiceDeepTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/CommonServiceImplTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidatorTest.java [new file with mode: 0644]
cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/Datasource.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestModelUpdate.java [new file with mode: 0644]
cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestValidationManager.java [new file with mode: 0644]
cdmlib-services/src/test/resources/dbscripts/001-cdm.h2.sql
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml

index 9d84eba6d92d4fddbec6b0829c1602ca76f8d5b1..62f03938ef4cdb0356da1e4de51820d3e25e0867 100644 (file)
@@ -2220,7 +2220,7 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImp
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionNodeByAreaLabelComparator.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DistributionTree.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityConstraintViolationServiceImpl.java -text
-cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationResultServiceImpl.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EventBaseServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/FeatureNodeServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/FeatureTreeServiceImpl.java -text
@@ -2236,7 +2236,7 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ICommonService.java -
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDatabaseService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityConstraintViolationService.java -text
-cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationResultService.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEventBaseService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IFeatureNodeService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IFeatureTreeService.java -text
@@ -2363,6 +2363,13 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/AbstractRelation
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/util/TaxonRelationshipEdge.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/utility/DescriptionUtility.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/utility/ImagesUtility.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationEventListener.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationTask.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/ValidationManager.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidationUtil.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidator.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/EntityValidationUnit.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/ValidationScheduler.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/validation/constraint/NoDuplicateNamesValidator.java -text
 cdmlib-services/src/main/java/org/apache/lucene/search/MultiCollector.java -text
 cdmlib-services/src/main/resources/eu/etaxonomy/cdm/defaultApplicationContext.xml -text
@@ -2424,6 +2431,7 @@ cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/molecular/PrimerServi
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/molecular/SequenceServiceTest.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/pager/PagerTest.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/utility/DescriptionUtilityTest.java -text
+cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidatorTest.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/scripts/FixMultipleTextDataInImageGalleries.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/example/ApplicationExample.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/ConcurrentSessionTest.java -text
@@ -2433,8 +2441,10 @@ cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestC3P0Configurati
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestConversationEnabled.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestDatabase.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestLocationServiceImpl.java -text
+cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestModelUpdate.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestService.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestTaxonFunction.java -text
+cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestValidationManager.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/integration/CreateDataTest.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/integration/CreateDataTestNoUnit.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/integration/TermLoaderIntegrationTest.java -text
index 62c6ffe37695edfbeb6b2b7e3f39349224f37307..7fa91694b8e75d55b10965e958696c3448b4ab8b 100644 (file)
@@ -39,7 +39,7 @@ import eu.etaxonomy.cdm.api.service.ICommonService;
 import eu.etaxonomy.cdm.api.service.IDatabaseService;\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;\r
-import eu.etaxonomy.cdm.api.service.IEntityValidationResultService;\r
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;\r
@@ -76,7 +76,6 @@ import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator
 \r
 /**\r
  * @author a.mueller\r
- * \r
  */\r
 public class CdmApplicationController implements ICdmApplicationConfiguration {\r
        private static final Logger logger = Logger.getLogger(CdmApplicationController.class);\r
@@ -94,11 +93,10 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Constructor, opens a spring ApplicationContext by using the default data source\r
-        * \r
+        *\r
         * @throws DataSourceNotFoundException\r
         */\r
-       public static CdmApplicationController NewInstance() throws DataSourceNotFoundException\r
-       {\r
+       public static CdmApplicationController NewInstance() throws DataSourceNotFoundException{\r
                logger.info("Start CdmApplicationController with default data source");\r
                CdmPersistentDataSource dataSource = getDefaultDatasource();\r
                DbSchemaValidation dbSchemaValidation = defaultDbSchemaValidation;\r
@@ -108,13 +106,12 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Constructor, opens a spring ApplicationContext by using the default data source\r
-        * \r
+        *\r
         * @param dbSchemaValidation\r
         *            validation type for database schema\r
         * @throws DataSourceNotFoundException\r
         */\r
-       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException\r
-       {\r
+       public static CdmApplicationController NewInstance(DbSchemaValidation dbSchemaValidation) throws DataSourceNotFoundException{\r
                logger.info("Start CdmApplicationController with default data source");\r
                CdmPersistentDataSource dataSource = getDefaultDatasource();\r
                return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
@@ -124,37 +121,30 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * Constructor, opens an spring ApplicationContext by using the according data source\r
         * and the default database schema validation type\r
-        * \r
+        *\r
         * @param dataSource\r
         */\r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource)\r
-       {\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource){\r
                return CdmApplicationController.NewInstance(null, dataSource, defaultDbSchemaValidation, false);\r
        }\r
 \r
 \r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation)\r
-       {\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){\r
                return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, false);\r
        }\r
 \r
 \r
-       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading)\r
-       {\r
+       public static CdmApplicationController NewInstance(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
                return CdmApplicationController.NewInstance(null, dataSource, dbSchemaValidation, omitTermLoading);\r
        }\r
 \r
-\r
        public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,\r
-                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading)\r
-       {\r
+                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
                return CdmApplicationController.NewInstance(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, null);\r
        }\r
 \r
-\r
        public static CdmApplicationController NewInstance(Resource applicationContextResource, ICdmDataSource dataSource,\r
-                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor)\r
-       {\r
+                       DbSchemaValidation dbSchemaValidation, boolean omitTermLoading, IProgressMonitor progressMonitor){\r
                return new CdmApplicationController(applicationContextResource, dataSource, dbSchemaValidation, omitTermLoading, progressMonitor, null);\r
        }\r
 \r
@@ -167,8 +157,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * @return\r
         */\r
-       protected static ClassPathResource getClasspathResource()\r
-       {\r
+       protected static ClassPathResource getClasspathResource(){\r
                return new ClassPathResource(DEFAULT_APPLICATION_CONTEXT_RESOURCE);\r
        }\r
 \r
@@ -177,20 +166,18 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
         * @return\r
         * @throws DataSourceNotFoundException\r
         */\r
-       protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException\r
-       {\r
+       protected static CdmPersistentDataSource getDefaultDatasource() throws DataSourceNotFoundException{\r
                CdmPersistentDataSource dataSource = CdmPersistentDataSource.NewDefaultInstance();\r
                return dataSource;\r
        }\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * FIXME:Remoting this constructor is added only to allow extension of this cntroller\r
         * class. and should be removed after refactoring\r
         */\r
-       protected CdmApplicationController()\r
-       {\r
+       protected CdmApplicationController(){\r
                applicationContextResource = null;\r
                progressMonitor = null;\r
        }\r
@@ -199,14 +186,13 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * Constructor, opens an spring 2.5 ApplicationContext by using the according data\r
         * source\r
-        * \r
+        *\r
         * @param dataSource\r
         * @param dbSchemaValidation\r
         * @param omitTermLoading\r
         */\r
        protected CdmApplicationController(Resource applicationContextResource, ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation,\r
-                       boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners)\r
-       {\r
+                       boolean omitTermLoading, IProgressMonitor progressMonitor, List<ApplicationListener> listeners){\r
                logger.info("Start CdmApplicationController with datasource: " + dataSource.getName());\r
 \r
                if (dbSchemaValidation == null) {\r
@@ -222,12 +208,11 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * Sets the application context to a new spring ApplicationContext by using the\r
         * according data source and initializes the Controller.\r
-        * \r
+        *\r
         * @param dataSource\r
         */\r
        private boolean setNewDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,\r
-                       List<ApplicationListener> listeners)\r
-       {\r
+                       List<ApplicationListener> listeners){\r
 \r
                if (dbSchemaValidation == null) {\r
                        dbSchemaValidation = defaultDbSchemaValidation;\r
@@ -291,11 +276,10 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Tests if some DefinedTermsAreMissing.\r
-        * \r
+        *\r
         * @return true, if at least one is missing, else false\r
         */\r
-       public boolean testDefinedTermsAreMissing()\r
-       {\r
+       public boolean testDefinedTermsAreMissing(){\r
                UUID englishUuid = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");\r
                DefinedTermBase<?> english = this.getTermService().load(englishUuid);\r
                if (english == null || !english.getUuid().equals(englishUuid)) {\r
@@ -309,11 +293,10 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Changes the ApplicationContext to the new dataSource\r
-        * \r
+        *\r
         * @param dataSource\r
         */\r
-       public boolean changeDataSource(ICdmDataSource dataSource)\r
-       {\r
+       public boolean changeDataSource(ICdmDataSource dataSource){\r
                //logger.info("Change datasource to : " + dataSource);\r
                return setNewDataSource(dataSource, DbSchemaValidation.VALIDATE, false, null);\r
        }\r
@@ -321,12 +304,11 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Changes the ApplicationContext to the new dataSource\r
-        * \r
+        *\r
         * @param dataSource\r
         * @param dbSchemaValidation\r
         */\r
-       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation)\r
-       {\r
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation){\r
                //logger.info("Change datasource to : " + dataSource);\r
                return setNewDataSource(dataSource, dbSchemaValidation, false, null);\r
        }\r
@@ -334,13 +316,12 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Changes the ApplicationContext to the new dataSource\r
-        * \r
+        *\r
         * @param dataSource\r
         * @param dbSchemaValidation\r
         * @param omitTermLoading\r
         */\r
-       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading)\r
-       {\r
+       public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading){\r
                logger.info("Change datasource to : " + dataSource);\r
                return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, null);\r
        }\r
@@ -348,14 +329,13 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Changes the ApplicationContext to the new dataSource\r
-        * \r
+        *\r
         * @param dataSource\r
         * @param dbSchemaValidation\r
         * @param omitTermLoading\r
         */\r
        public boolean changeDataSource(ICdmDataSource dataSource, DbSchemaValidation dbSchemaValidation, boolean omitTermLoading,\r
-                       List<ApplicationListener> listeners)\r
-       {\r
+                       List<ApplicationListener> listeners){\r
                logger.info("Change datasource to : " + dataSource);\r
                return setNewDataSource(dataSource, dbSchemaValidation, omitTermLoading, listeners);\r
        }\r
@@ -363,11 +343,10 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /**\r
         * Sets a new application Context.\r
-        * \r
+        *\r
         * @param ac\r
         */\r
-       public void setApplicationContext(AbstractApplicationContext ac)\r
-       {\r
+       public void setApplicationContext(AbstractApplicationContext ac){\r
                closeApplicationContext(); //closes old application context if necessary\r
                applicationContext = ac;\r
                applicationContext.registerShutdownHook();\r
@@ -377,12 +356,11 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /*\r
         * (non-Javadoc)\r
-        * \r
+        *\r
         * @see java.lang.Object#finalize()\r
         */\r
        @Override\r
-       public void finalize()\r
-       {\r
+       public void finalize(){\r
                close();\r
        }\r
 \r
@@ -390,8 +368,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * closes the application\r
         */\r
-       public void close()\r
-       {\r
+       public void close(){\r
                closeApplicationContext();\r
        }\r
 \r
@@ -399,8 +376,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * closes the application context\r
         */\r
-       protected void closeApplicationContext()\r
-       {\r
+       protected void closeApplicationContext(){\r
                if (applicationContext != null) {\r
                        logger.info("Close ApplicationContext");\r
                        applicationContext.close();\r
@@ -408,8 +384,7 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        }\r
 \r
 \r
-       protected void init()\r
-       {\r
+       protected void init(){\r
                logger.debug("Init " + this.getClass().getName() + " ... ");\r
                if (logger.isDebugEnabled()) {\r
                        for (String beanName : applicationContext.getBeanDefinitionNames()) {\r
@@ -437,231 +412,185 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /* ****** Services ******** */\r
        @Override\r
-       public final INameService getNameService()\r
-       {\r
+       public final INameService getNameService(){\r
                return configuration.getNameService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ITaxonService getTaxonService()\r
-       {\r
+       public final ITaxonService getTaxonService(){\r
                return configuration.getTaxonService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IClassificationService getClassificationService()\r
-       {\r
+       public final IClassificationService getClassificationService(){\r
                return configuration.getClassificationService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ITaxonNodeService getTaxonNodeService()\r
-       {\r
+       public final ITaxonNodeService getTaxonNodeService(){\r
                return configuration.getTaxonNodeService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IReferenceService getReferenceService()\r
-       {\r
+       public final IReferenceService getReferenceService(){\r
                return configuration.getReferenceService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IAgentService getAgentService()\r
-       {\r
+       public final IAgentService getAgentService(){\r
                return configuration.getAgentService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IDatabaseService getDatabaseService()\r
-       {\r
+       public final IDatabaseService getDatabaseService(){\r
                return configuration.getDatabaseService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ITermService getTermService()\r
-       {\r
+       public final ITermService getTermService(){\r
                return configuration.getTermService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IDescriptionService getDescriptionService()\r
-       {\r
+       public final IDescriptionService getDescriptionService(){\r
                return configuration.getDescriptionService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IOccurrenceService getOccurrenceService()\r
-       {\r
+       public final IOccurrenceService getOccurrenceService(){\r
                return configuration.getOccurrenceService();\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAmplificationService\r
-        * ()\r
-        */\r
        @Override\r
-       public IAmplificationService getAmplificationService()\r
-       {\r
+       public IAmplificationService getAmplificationService(){\r
                return configuration.getAmplificationService();\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getSequenceService()\r
-        */\r
        @Override\r
-       public ISequenceService getSequenceService()\r
-       {\r
+       public ISequenceService getSequenceService(){\r
                return configuration.getSequenceService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IPrimerService getPrimerService()\r
-       {\r
+       public final IPrimerService getPrimerService(){\r
                return configuration.getPrimerService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IMediaService getMediaService()\r
-       {\r
+       public final IMediaService getMediaService(){\r
                return configuration.getMediaService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ICommonService getCommonService()\r
-       {\r
+       public final ICommonService getCommonService(){\r
                return configuration.getCommonService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ILocationService getLocationService()\r
-       {\r
+       public final ILocationService getLocationService(){\r
                return configuration.getLocationService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IUserService getUserService()\r
-       {\r
+       public final IUserService getUserService(){\r
                return configuration.getUserService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IGrantedAuthorityService getGrantedAuthorityService()\r
-       {\r
+       public final IGrantedAuthorityService getGrantedAuthorityService(){\r
                return configuration.getGrantedAuthorityService();\r
        }\r
 \r
 \r
        @Override\r
-       public IGroupService getGroupService()\r
-       {\r
+       public IGroupService getGroupService(){\r
                return configuration.getGroupService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ICollectionService getCollectionService()\r
-       {\r
+       public final ICollectionService getCollectionService(){\r
                return configuration.getCollectionService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IFeatureTreeService getFeatureTreeService()\r
-       {\r
+       public final IFeatureTreeService getFeatureTreeService(){\r
                return configuration.getFeatureTreeService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IFeatureNodeService getFeatureNodeService()\r
-       {\r
+       public final IFeatureNodeService getFeatureNodeService(){\r
                return configuration.getFeatureNodeService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IVocabularyService getVocabularyService()\r
-       {\r
+       public final IVocabularyService getVocabularyService(){\r
                return configuration.getVocabularyService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IIdentificationKeyService getIdentificationKeyService()\r
-       {\r
+       public final IIdentificationKeyService getIdentificationKeyService(){\r
                return configuration.getIdentificationKeyService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IPolytomousKeyService getPolytomousKeyService()\r
-       {\r
+       public final IPolytomousKeyService getPolytomousKeyService(){\r
                return configuration.getPolytomousKeyService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IPolytomousKeyNodeService getPolytomousKeyNodeService()\r
-       {\r
+       public final IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
                return configuration.getPolytomousKeyNodeService();\r
        }\r
 \r
 \r
        @Override\r
-       public IEntityValidationResultService getEntityValidationResultService()\r
-       {\r
-               return configuration.getEntityValidationResultService();\r
+       public IEntityValidationService getEntityValidationService(){\r
+               return configuration.getEntityValidationService();\r
        }\r
 \r
 \r
        @Override\r
-       public IEntityConstraintViolationService getEntityConstraintViolationService()\r
-       {\r
+       public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
                return configuration.getEntityConstraintViolationService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IService<CdmBase> getMainService()\r
-       {\r
+       public final IService<CdmBase> getMainService(){\r
                return configuration.getMainService();\r
        }\r
 \r
 \r
        @Override\r
-       public final IWorkingSetService getWorkingSetService()\r
-       {\r
+       public final IWorkingSetService getWorkingSetService(){\r
                return configuration.getWorkingSetService();\r
        }\r
 \r
 \r
        @Override\r
-       public final ConversationHolder NewConversation()\r
-       {\r
+       public final ConversationHolder NewConversation(){\r
                //return (ConversationHolder)applicationContext.getBean("conversationHolder");\r
                return configuration.NewConversation();\r
        }\r
@@ -669,40 +598,22 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
 \r
        /* **** Security ***** */\r
 \r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#authenticate(java\r
-        * .lang.String, java.lang.String)\r
-        */\r
        @Override\r
-       public void authenticate(String username, String password)\r
-       {\r
+       public void authenticate(String username, String password){\r
                UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);\r
                Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);\r
                SecurityContext context = SecurityContextHolder.getContext();\r
                context.setAuthentication(authentication);\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAuthenticationManager\r
-        * ()\r
-        */\r
        @Override\r
-       public final ProviderManager getAuthenticationManager()\r
-       {\r
+       public final ProviderManager getAuthenticationManager(){\r
                return configuration.getAuthenticationManager();\r
        }\r
 \r
 \r
        @Override\r
-       public ICdmPermissionEvaluator getPermissionEvaluator()\r
-       {\r
+       public ICdmPermissionEvaluator getPermissionEvaluator(){\r
                return configuration.getPermissionEvaluator();\r
        }\r
 \r
@@ -710,28 +621,25 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
        /**\r
         * @see org.springframework.security.access.PermissionEvaluator#hasPermission(org.springframework.security.core.Authentication,\r
         *      java.lang.Object, java.lang.Object)\r
-        * \r
+        *\r
         * @param targetDomainObject\r
         * @param permission\r
         * @return\r
         */\r
-       public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission)\r
-       {\r
+       public boolean currentAuthentiationHasPermissions(CdmBase targetDomainObject, EnumSet<CRUD> permission){\r
                SecurityContext context = SecurityContextHolder.getContext();\r
                return getPermissionEvaluator().hasPermission(context.getAuthentication(), targetDomainObject, permission);\r
        }\r
 \r
 \r
        @Override\r
-       public final PlatformTransactionManager getTransactionManager()\r
-       {\r
+       public final PlatformTransactionManager getTransactionManager(){\r
                return configuration.getTransactionManager();\r
        }\r
 \r
 \r
        @Override\r
-       public final Object getBean(String name)\r
-       {\r
+       public final Object getBean(String name){\r
                return this.applicationContext.getBean(name);\r
        }\r
 \r
@@ -741,39 +649,32 @@ public class CdmApplicationController implements ICdmApplicationConfiguration {
         */\r
 \r
        /* **** flush ********** */\r
-       public void flush()\r
-       {\r
+       public void flush(){\r
                SessionFactory sf = (SessionFactory) applicationContext.getBean("sessionFactory");\r
                sf.getCurrentSession().flush();\r
        }\r
 \r
 \r
-       public SessionFactory getSessionFactory()\r
-       {\r
+       public SessionFactory getSessionFactory(){\r
                return (SessionFactory) applicationContext.getBean("sessionFactory");\r
        }\r
 \r
 \r
        @Override\r
-       public TransactionStatus startTransaction()\r
-       {\r
+       public TransactionStatus startTransaction(){\r
                return startTransaction(false);\r
        }\r
 \r
 \r
        @Override\r
-       public TransactionStatus startTransaction(Boolean readOnly)\r
-       {\r
+       public TransactionStatus startTransaction(Boolean readOnly){\r
                return configuration.startTransaction(readOnly);\r
        }\r
 \r
-\r
        @Override\r
-       public void commitTransaction(TransactionStatus txStatus)\r
-       {\r
+       public void commitTransaction(TransactionStatus txStatus){\r
                PlatformTransactionManager txManager = configuration.getTransactionManager();\r
                txManager.commit(txStatus);\r
                return;\r
        }\r
-\r
 }\r
index dae15f4d39c596b40031a8a1285802bc6e8d0548..c50f5ce08733a7142926ac098e64e19c739ae47b 100644 (file)
@@ -38,7 +38,7 @@ import eu.etaxonomy.cdm.api.service.ICommonService;
 import eu.etaxonomy.cdm.api.service.IDatabaseService;\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;\r
-import eu.etaxonomy.cdm.api.service.IEntityValidationResultService;\r
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;\r
@@ -150,7 +150,7 @@ public class CdmApplicationDefaultConfiguration implements ICdmApplicationConfig
        @Autowired\r
        private IPolytomousKeyNodeService polytomousKeyNodeService;\r
        @Autowired\r
-       private IEntityValidationResultService entityValidationResultService;\r
+       private IEntityValidationService entityValidationService;\r
        @Autowired\r
        private IEntityConstraintViolationService entityConstraintViolationService;\r
        @Autowired\r
@@ -169,507 +169,221 @@ public class CdmApplicationDefaultConfiguration implements ICdmApplicationConfig
        /**\r
         * Constructor\r
         */\r
-       protected CdmApplicationDefaultConfiguration()\r
-       {\r
-       }\r
+       protected CdmApplicationDefaultConfiguration(){}\r
 \r
 \r
        // ****************************** APPLICATION CONTEXT *************************************************/\r
 \r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.\r
-        * springframework.context.ApplicationContext)\r
-        */\r
        @Override\r
-       public void setApplicationContext(ApplicationContext applicationContext) throws BeansException\r
-       {\r
+       public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{\r
                this.applicationContext = applicationContext;\r
        }\r
 \r
-\r
        // ****************************** GETTER *************************************************/\r
 \r
        @Override\r
-       public final Object getBean(String name)\r
-       {\r
+       public final Object getBean(String name){\r
                return this.applicationContext.getBean(name);\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAgentService()\r
-        */\r
        @Override\r
-       public IAgentService getAgentService()\r
-       {\r
+       public IAgentService getAgentService(){\r
                return this.agentService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getDatabaseService()\r
-        */\r
        @Override\r
-       public IDatabaseService getDatabaseService()\r
-       {\r
+       public IDatabaseService getDatabaseService(){\r
                return this.databaseService;\r
        }\r
 \r
 \r
        @Autowired\r
-       public void setDataSource(DataSource dataSource)\r
-       {\r
+       public void setDataSource(DataSource dataSource){\r
                this.dataSource = dataSource;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getNameService()\r
-        */\r
        @Override\r
-       public INameService getNameService()\r
-       {\r
+       public INameService getNameService(){\r
                return this.nameService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getReferenceService()\r
-        */\r
        @Override\r
-       public IReferenceService getReferenceService()\r
-       {\r
+       public IReferenceService getReferenceService(){\r
                return this.referenceService;\r
        }\r
 \r
-\r
        @Autowired\r
-       public void setSessionFactory(SessionFactory sessionFactory)\r
-       {\r
+       public void setSessionFactory(SessionFactory sessionFactory){\r
                this.sessionFactory = sessionFactory;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getTaxonService()\r
-        */\r
        @Override\r
-       public ITaxonService getTaxonService()\r
-       {\r
+       public ITaxonService getTaxonService(){\r
                return this.taxonService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getClassificationService\r
-        * ()\r
-        */\r
        @Override\r
-       public IClassificationService getClassificationService()\r
-       {\r
+       public IClassificationService getClassificationService(){\r
                return this.classificationService;\r
        }\r
 \r
-\r
        @Override\r
-       public ITaxonNodeService getTaxonNodeService()\r
-       {\r
+       public ITaxonNodeService getTaxonNodeService(){\r
                return this.taxonNodeService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getDescriptionService\r
-        * ()\r
-        */\r
        @Override\r
-       public IDescriptionService getDescriptionService()\r
-       {\r
+       public IDescriptionService getDescriptionService(){\r
                return this.descriptionService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getOccurrenceService\r
-        * ()\r
-        */\r
        @Override\r
-       public IOccurrenceService getOccurrenceService()\r
-       {\r
+       public IOccurrenceService getOccurrenceService(){\r
                return this.occurrenceService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getOccurrenceService\r
-        * ()\r
-        */\r
        @Override\r
-       public IPrimerService getPrimerService()\r
-       {\r
+       public IPrimerService getPrimerService(){\r
                return this.primerService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAmplificationService\r
-        * ()\r
-        */\r
        @Override\r
-       public IAmplificationService getAmplificationService()\r
-       {\r
+       public IAmplificationService getAmplificationService(){\r
                return this.amplificationService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getSequenceService()\r
-        */\r
        @Override\r
-       public ISequenceService getSequenceService()\r
-       {\r
+       public ISequenceService getSequenceService(){\r
                return this.sequenceService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getMediaService()\r
-        */\r
        @Override\r
-       public IMediaService getMediaService()\r
-       {\r
+       public IMediaService getMediaService(){\r
                return this.mediaService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getTermService()\r
-        */\r
        @Override\r
-       public ITermService getTermService()\r
-       {\r
+       public ITermService getTermService(){\r
                return this.termService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getCommonService()\r
-        */\r
        @Override\r
-       public ICommonService getCommonService()\r
-       {\r
+       public ICommonService getCommonService(){\r
                return this.commonService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getLocationService()\r
-        */\r
        @Override\r
-       public ILocationService getLocationService()\r
-       {\r
+       public ILocationService getLocationService(){\r
                return this.locationService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getUserService()\r
-        */\r
        @Override\r
-       public IUserService getUserService()\r
-       {\r
+       public IUserService getUserService(){\r
                return this.userService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getUserService()\r
-        */\r
        @Override\r
-       public IGrantedAuthorityService getGrantedAuthorityService()\r
-       {\r
+       public IGrantedAuthorityService getGrantedAuthorityService(){\r
                return this.grantedAuthorityService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getCommonService()\r
-        */\r
        @Override\r
-       public IService<CdmBase> getMainService()\r
-       {\r
+       public IService<CdmBase> getMainService(){\r
                return this.mainService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getTransactionManager\r
-        * ()\r
-        */\r
        @Override\r
-       public PlatformTransactionManager getTransactionManager()\r
-       {\r
+       public PlatformTransactionManager getTransactionManager(){\r
                return this.transactionManager;\r
        }\r
 \r
 \r
        @Autowired\r
-       public void setTransactionManager(PlatformTransactionManager transactionManager)\r
-       {\r
+       public void setTransactionManager(PlatformTransactionManager transactionManager){\r
                this.transactionManager = (HibernateTransactionManager) transactionManager;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getAuthenticationManager\r
-        * ()\r
-        */\r
        @Override\r
-       public ProviderManager getAuthenticationManager()\r
-       {\r
+       public ProviderManager getAuthenticationManager(){\r
                return this.authenticationManager;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#NewConversation()\r
-        */\r
        @Override\r
-       public ConversationHolder NewConversation()\r
-       {\r
+       public ConversationHolder NewConversation(){\r
                // TODO make this a prototype\r
                return new ConversationHolder(dataSource, sessionFactory, transactionManager);\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getCollectionService\r
-        * ()\r
-        */\r
        @Override\r
-       public ICollectionService getCollectionService()\r
-       {\r
+       public ICollectionService getCollectionService(){\r
                return collectionService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getFeatureTreeService\r
-        * ()\r
-        */\r
        @Override\r
-       public IFeatureTreeService getFeatureTreeService()\r
-       {\r
+       public IFeatureTreeService getFeatureTreeService(){\r
                return featureTreeService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getFeatureNodeService\r
-        * ()\r
-        */\r
        @Override\r
-       public IFeatureNodeService getFeatureNodeService()\r
-       {\r
+       public IFeatureNodeService getFeatureNodeService(){\r
                return featureNodeService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getVocabularyService\r
-        * ()\r
-        */\r
        @Override\r
-       public IVocabularyService getVocabularyService()\r
-       {\r
+       public IVocabularyService getVocabularyService(){\r
                return vocabularyService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#\r
-        * getIdentificationKeyService()\r
-        */\r
        @Override\r
-       public IIdentificationKeyService getIdentificationKeyService()\r
-       {\r
+       public IIdentificationKeyService getIdentificationKeyService(){\r
                return identificationKeyService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getPolytomousKeyService\r
-        * ()\r
-        */\r
        @Override\r
-       public IPolytomousKeyService getPolytomousKeyService()\r
-       {\r
+       public IPolytomousKeyService getPolytomousKeyService(){\r
                return polytomousKeyService;\r
        }\r
 \r
 \r
        @Override\r
-       public IPolytomousKeyNodeService getPolytomousKeyNodeService()\r
-       {\r
+       public IPolytomousKeyNodeService getPolytomousKeyNodeService(){\r
                return polytomousKeyNodeService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getWorkingSetService\r
-        * ()\r
-        */\r
        @Override\r
-       public IWorkingSetService getWorkingSetService()\r
-       {\r
+       public IWorkingSetService getWorkingSetService(){\r
                return workingSetService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getGroupService()\r
-        */\r
        @Override\r
-       public IGroupService getGroupService()\r
-       {\r
+       public IGroupService getGroupService(){\r
                return groupService;\r
        }\r
 \r
 \r
        @Override\r
-       public IEntityValidationResultService getEntityValidationResultService()\r
-       {\r
-               return entityValidationResultService;\r
+       public IEntityValidationService getEntityValidationService(){\r
+               return entityValidationService;\r
        }\r
 \r
 \r
        @Override\r
-       public IEntityConstraintViolationService getEntityConstraintViolationService()\r
-       {\r
+       public IEntityConstraintViolationService getEntityConstraintViolationService(){\r
                return entityConstraintViolationService;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#getPermissionEvaluator\r
-        * ()\r
-        */\r
        @Override\r
-       public ICdmPermissionEvaluator getPermissionEvaluator()\r
-       {\r
+       public ICdmPermissionEvaluator getPermissionEvaluator(){\r
                return permissionEvaluator;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction()\r
-        */\r
        @Override\r
-       public TransactionStatus startTransaction()\r
-       {\r
+       public TransactionStatus startTransaction(){\r
                return startTransaction(false);\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#startTransaction()\r
-        */\r
        @Override\r
-       public TransactionStatus startTransaction(Boolean readOnly)\r
-       {\r
+       public TransactionStatus startTransaction(Boolean readOnly){\r
 \r
                PlatformTransactionManager txManager = getTransactionManager();\r
 \r
@@ -695,24 +409,14 @@ public class CdmApplicationDefaultConfiguration implements ICdmApplicationConfig
 \r
 \r
        @Override\r
-       public void commitTransaction(TransactionStatus txStatus)\r
-       {\r
+       public void commitTransaction(TransactionStatus txStatus){\r
                PlatformTransactionManager txManager = getTransactionManager();\r
                txManager.commit(txStatus);\r
                return;\r
        }\r
 \r
-\r
-       /*\r
-        * (non-Javadoc)\r
-        * \r
-        * @see\r
-        * eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration#authenticate(java\r
-        * .lang.String, java.lang.String)\r
-        */\r
        @Override\r
-       public void authenticate(String username, String password)\r
-       {\r
+       public void authenticate(String username, String password){\r
                UsernamePasswordAuthenticationToken tokenForUser = new UsernamePasswordAuthenticationToken(username, password);\r
                Authentication authentication = this.getAuthenticationManager().authenticate(tokenForUser);\r
                SecurityContext context = SecurityContextHolder.getContext();\r
index 30e1dd121ee5eab670f7c006e6df325f5a794847..7c374fe9395b597b6f768c171746a8df587cc463 100644 (file)
@@ -22,7 +22,7 @@ import eu.etaxonomy.cdm.api.service.ICommonService;
 import eu.etaxonomy.cdm.api.service.IDatabaseService;\r
 import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
 import eu.etaxonomy.cdm.api.service.IEntityConstraintViolationService;\r
-import eu.etaxonomy.cdm.api.service.IEntityValidationResultService;\r
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureNodeService;\r
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
 import eu.etaxonomy.cdm.api.service.IGrantedAuthorityService;\r
@@ -53,15 +53,14 @@ import eu.etaxonomy.cdm.persistence.hibernate.permission.ICdmPermissionEvaluator
  * @author a.mueller\r
  * @created 21.05.2008\r
  */\r
-public interface ICdmApplicationConfiguration {\r
+public interface ICdmApplicationConfiguration{\r
 \r
-       public TransactionStatus startTransaction();\r
 \r
+    public TransactionStatus startTransaction();\r
 \r
-       public TransactionStatus startTransaction(Boolean readOnly);\r
+    public TransactionStatus startTransaction(Boolean readOnly);\r
 \r
-\r
-       public void commitTransaction(TransactionStatus tx);\r
+    public void commitTransaction(TransactionStatus tx);\r
 \r
 \r
        public Object getBean(String string);\r
@@ -86,7 +85,7 @@ public interface ICdmApplicationConfiguration {
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public ITaxonNodeService getTaxonNodeService();\r
@@ -159,28 +158,28 @@ public interface ICdmApplicationConfiguration {
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public ILocationService getLocationService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IUserService getUserService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IGroupService getGroupService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IGrantedAuthorityService getGrantedAuthorityService();\r
@@ -205,7 +204,7 @@ public interface ICdmApplicationConfiguration {
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public ProviderManager getAuthenticationManager();\r
@@ -218,28 +217,28 @@ public interface ICdmApplicationConfiguration {
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public ICollectionService getCollectionService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IFeatureTreeService getFeatureTreeService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IFeatureNodeService getFeatureNodeService();\r
 \r
 \r
        /**\r
-        * \r
+        *\r
         * @return\r
         */\r
        public IVocabularyService getVocabularyService();\r
@@ -266,7 +265,7 @@ public interface ICdmApplicationConfiguration {
        /**\r
         * @return\r
         */\r
-       public IEntityValidationResultService getEntityValidationResultService();\r
+       public IEntityValidationService getEntityValidationService();\r
 \r
 \r
        /**\r
index b688ae81d0cbf4b6f6a64ded02065cc6f4d1f9c4..ea7e9394013966487466052b751cdc5b3673c129 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$\r
 /**\r
 * Copyright (C) 2009 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -30,21 +30,21 @@ import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 public class MonitoredListableBeanFactory extends DefaultListableBeanFactory {\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(MonitoredListableBeanFactory.class);\r
-       \r
+\r
        private boolean isInitializingBeans = false;\r
        private IProgressMonitor currentMonitor;\r
-       \r
+\r
        private static List<String> beansToMonitor = Arrays.asList("sessionFactory","defaultBeanInitializer","persistentTermInitializer");\r
-       private Set<String> alreadyMonitoredBeans = new HashSet<String>();\r
+       private final Set<String> alreadyMonitoredBeans = new HashSet<String>();\r
 \r
        public MonitoredListableBeanFactory(){\r
        }\r
-       \r
+\r
 //     @Override\r
 //     protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {\r
 //             if (registeredBeanNames.contains(beanName)){\r
 //                     return super.getMergedLocalBeanDefinition(beanName);\r
-//                             \r
+//\r
 //             }\r
 ////           String message = "Handle bean '%s'";\r
 ////           message = String.format(message, beanName);\r
@@ -54,8 +54,9 @@ public class MonitoredListableBeanFactory extends DefaultListableBeanFactory {
 ////           registeredBeanNames.add(beanName);\r
 //             return result;\r
 //     }\r
-       \r
-       public void preInstantiateSingletons() throws BeansException {\r
+\r
+       @Override\r
+    public void preInstantiateSingletons() throws BeansException {\r
                isInitializingBeans = true;\r
                checkMonitorCancelled(currentMonitor);\r
                int countBeans = 0;\r
@@ -86,7 +87,8 @@ public class MonitoredListableBeanFactory extends DefaultListableBeanFactory {
 //             }\r
 //             return result;\r
 //     }\r
-       \r
+\r
+       @Override\r
        protected Object createBean(final String name, final RootBeanDefinition mbd, final Object[] args){\r
                boolean doMonitor = isInitializingBeans && beansToMonitor.contains(name) && !alreadyMonitoredBeans.contains(name);\r
                checkMonitorCancelled(currentMonitor);\r
@@ -111,18 +113,18 @@ public class MonitoredListableBeanFactory extends DefaultListableBeanFactory {
                return result;\r
        }\r
 \r
-       \r
+\r
        /**\r
         * @param mainMonitor the mainMonitor to set\r
         */\r
        public void setCurrentMonitor(IProgressMonitor monitor) {\r
                this.currentMonitor = monitor;\r
        }\r
-       \r
+\r
        private void checkMonitorCancelled(IProgressMonitor monitor) {\r
                if (monitor != null && monitor.isCanceled()){\r
                        throw new CancellationException();\r
-               }       \r
+               }\r
        }\r
-               \r
+\r
 }\r
index 9368e169cdb921e63bd310c742ec7def4a8eb253..16090a6e6f9d1734562d0f14058c246fd11edb0b 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$\r
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -26,11 +26,11 @@ import org.springframework.transaction.annotation.Transactional;
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.ISourceable;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
-import eu.etaxonomy.cdm.model.common.OriginalSourceBase;\r
 import eu.etaxonomy.cdm.model.metadata.CdmMetaData;\r
 import eu.etaxonomy.cdm.model.metadata.CdmMetaData.MetaDataPropertyName;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IOriginalSourceDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;\r
 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;\r
 import eu.etaxonomy.cdm.strategy.match.IMatchable;\r
@@ -43,34 +43,28 @@ import eu.etaxonomy.cdm.strategy.merge.MergeException;
 \r
 @Service\r
 @Transactional(readOnly = true)\r
-public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalSourceDao> implements ICommonService {\r
+public class CommonServiceImpl /*extends ServiceBase<OriginalSourceBase,IOriginalSourceDao>*/ implements ICommonService {\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(CommonServiceImpl.class);\r
-       \r
-       @Autowired\r
-       IOriginalSourceDao originalSourceDao;\r
-       \r
-       @Autowired\r
-       ICdmGenericDao genericDao;\r
 \r
+       @Autowired\r
+       private IOriginalSourceDao originalSourceDao;\r
 \r
        @Autowired\r
-       protected void setDao(IOriginalSourceDao dao) {\r
-               this.dao = dao;\r
-       }\r
-       \r
+       private ICdmGenericDao genericDao;\r
+\r
        @Override\r
        public CdmBase find(Class<? extends CdmBase> clazz, int id){\r
                return genericDao.find(clazz, id);\r
        }\r
-       \r
+\r
 \r
        @Override\r
        public Map<String, ? extends ISourceable> getSourcedObjectsByIdInSource(Class clazz, Set<String> idInSourceSet, String idNamespace) {\r
                Map<String, ? extends ISourceable> list = originalSourceDao.findOriginalSourcesByIdInSource(clazz, idInSourceSet, idNamespace);\r
                return list;\r
        }\r
-       \r
+\r
        @Override\r
        public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace) {\r
                ISourceable result = null;\r
@@ -79,33 +73,33 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
                        result = list.get(0);\r
                }return result;\r
        }\r
-       \r
-       \r
+\r
+\r
        @Override\r
        public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase){\r
                return this.genericDao.getReferencingObjects(referencedCdmBase);\r
-       }       \r
-       \r
-       \r
+       }\r
+\r
+\r
        @Override\r
        public Set<CdmBase> getReferencingObjectsForDeletion(CdmBase referencedCdmBase){\r
                return this.genericDao.getReferencingObjectsForDeletion(referencedCdmBase);\r
        }\r
 //             try {\r
 //                     Set<Class<? extends CdmBase>> allCdmClasses = genericDao.getAllCdmClasses(false); //findAllCdmClasses();\r
-//                     \r
+//\r
 //                     referencedCdmBase = (CdmBase)HibernateProxyHelper.deproxy(referencedCdmBase);\r
 //                     Class referencedClass = referencedCdmBase.getClass();\r
 //                     Set<CdmBase> result = new HashSet<CdmBase>();\r
 //                     logger.debug("Referenced Class: " + referencedClass.getName());\r
-//                     \r
+//\r
 //                     for (Class<? extends CdmBase> cdmClass : allCdmClasses){\r
 //                             Set<Field> fields = getFields(cdmClass);\r
 //                             for (Field field: fields){\r
 //                                     Class<?> type = field.getType();\r
 //                                     //class\r
 //                                     if (! type.isInterface()){\r
-//                                             if (referencedClass.isAssignableFrom(type)|| \r
+//                                             if (referencedClass.isAssignableFrom(type)||\r
 //                                                             type.isAssignableFrom(referencedClass) && CdmBase.class.isAssignableFrom(type)){\r
 //                                                     handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);\r
 //                                             }\r
@@ -113,9 +107,9 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
 //                                     }else if (type.isAssignableFrom(referencedClass)){\r
 //                                                     handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, false);\r
 //                                     }else if (Collection.class.isAssignableFrom(type)){\r
-//                                             \r
+//\r
 //                                             if (checkIsSetOfType(field, referencedClass, type) == true){\r
-//                                                     handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);     \r
+//                                                     handleSingleClass(referencedClass, type, field, cdmClass, result, referencedCdmBase, true);\r
 //                                             }\r
 //                                     }\r
 ////                           Class[] interfaces = referencedClass.getInterfaces();\r
@@ -125,16 +119,16 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
 ////                                           handleSingleClass(interfaze, type, field, cdmClass, result, referencedCdmBase);\r
 ////                                   }\r
 ////                           }\r
-//                             }       \r
+//                             }\r
 //                     }\r
 //                     return result;\r
 //             } catch (Exception e) {\r
 //                     e.printStackTrace();\r
 //                     throw new RuntimeException(e);\r
 //             }\r
-//             \r
+//\r
 //     }\r
-//     \r
+//\r
 //     private boolean checkIsSetOfType(Field field, Class referencedClass, Class<?> type){\r
 //             Type genericType = (ParameterizedTypeImpl)field.getGenericType();\r
 //             if (genericType instanceof ParameterizedTypeImpl){\r
@@ -169,28 +163,28 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
 //             }\r
 //             return false;\r
 //     }\r
-//     \r
-//     \r
-//     \r
-//     \r
+//\r
+//\r
+//\r
+//\r
 //     private boolean handleSingleClass(Class itemClass, Class type, Field field, Class cdmClass, Set<CdmBase> result,CdmBase value, boolean isCollection){\r
 //             if (! Modifier.isStatic(field.getModifiers())){\r
 //                     String methodName = StringUtils.rightPad(field.getName(), 30);\r
 //                     String className = StringUtils.rightPad(cdmClass.getSimpleName(), 30);\r
 //                     String returnTypeName = StringUtils.rightPad(type.getSimpleName(), 30);\r
-//                     \r
+//\r
 //                     logger.debug(methodName +   "\t\t" + className + "\t\t" + returnTypeName);\r
 ////                   result_old.add(method);\r
 //                     result.addAll(getCdmBasesByFieldAndClass(field, itemClass, cdmClass, value, isCollection));\r
 //             }\r
 //             return true;\r
 //     }\r
-//     \r
+//\r
 //     private Set<Field> getFields(Class clazz){\r
 //             Set<Field> result = new HashSet<Field>();\r
 //             for (Field field: clazz.getDeclaredFields()){\r
 //                     if (!Modifier.isStatic(field.getModifiers())){\r
-//                             result.add(field);      \r
+//                             result.add(field);\r
 //                     }\r
 //             }\r
 //             Class superclass = clazz.getSuperclass();\r
@@ -199,7 +193,7 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
 //             }\r
 //             return result;\r
 //     }\r
-//     \r
+//\r
 //     private Set<CdmBase> getCdmBasesByFieldAndClass(Field field, Class itemClass, Class otherClazz, CdmBase item, boolean isCollection){\r
 //             Set<CdmBase> result = new HashSet<CdmBase>();\r
 //             if (isCollection){\r
@@ -209,7 +203,7 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
 //             }\r
 //             return result;\r
 //     }\r
-       \r
+\r
        @Override\r
        public List getHqlResult(String hqlQuery){\r
                return genericDao.getHqlResult(hqlQuery);\r
@@ -231,19 +225,7 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
                }\r
                return genericDao.findMatching(objectToMatch, matchStrategy);\r
        }\r
-       \r
-       \r
-       \r
-//     /* (non-Javadoc)\r
-//      * @see eu.etaxonomy.cdm.api.service.IService#list(java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
-//      */\r
-//     @Override\r
-//     public <TYPE extends OriginalSourceBase> Pager<TYPE> list(Class<TYPE> type,\r
-//                     Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,\r
-//                     List<String> propertyPaths) {\r
-//             logger.warn("Not yet implemented");\r
-//             return null;\r
-//     }\r
+\r
 \r
        @Transactional(readOnly = false)\r
        @Override\r
@@ -271,33 +253,33 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
             return genericDao.initializeCollection(col);\r
 \r
     }\r
-    \r
+\r
     @Override\r
     public boolean isEmpty(PersistentCollection col) {\r
             return genericDao.isEmpty(col);\r
 \r
     }\r
-    \r
+\r
     @Override\r
        public int size(PersistentCollection col) {\r
        return genericDao.size(col);\r
     }\r
-    \r
+\r
     @Override\r
     public Object get(PersistentCollection col, int index) {\r
        return genericDao.get(col, index);\r
     }\r
-    \r
+\r
     @Override\r
     public boolean contains(PersistentCollection col, Object element) {\r
        return genericDao.contains(col, element);\r
     }\r
-    \r
-    @Override    \r
+\r
+    @Override\r
     public boolean containsKey(PersistentCollection col, Object key) {\r
        return genericDao.containsKey(col, key);\r
     }\r
-    \r
+\r
     @Override\r
     public boolean containsValue(PersistentCollection col, Object element) {\r
        return genericDao.containsValue(col, element);\r
@@ -308,4 +290,23 @@ public class CommonServiceImpl extends ServiceBase<OriginalSourceBase,IOriginalS
        public void createFullSampleData() {\r
                genericDao.createFullSampleData();\r
        }\r
+\r
+\r
+    @Override\r
+    public void updateEntity(CdmBase cdmBase) {\r
+        genericDao.update(cdmBase);\r
+    }\r
+\r
+    @Override\r
+    public <S extends CdmBase> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths){\r
+        return genericDao.list(type,limit, start, orderHints,propertyPaths);\r
+    }\r
+\r
+    @Override\r
+    public <S extends CdmBase> int count(Class<S> type) {\r
+        return genericDao.count(type);\r
+    }\r
+\r
+\r
+\r
 }\r
index 9c594ea208fd712380705ddf3fe586c6c35c0f43..165588bf7c7c73b96bc0484ead2c3310e49d08cd 100644 (file)
@@ -1,53 +1,64 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
 package eu.etaxonomy.cdm.api.service;\r
 \r
 import java.util.List;\r
 \r
+import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
 import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;\r
-import eu.etaxonomy.cdm.persistence.dao.validation.IEntityConstraintViolationDao;\r
 import eu.etaxonomy.cdm.model.validation.Severity;\r
+import eu.etaxonomy.cdm.persistence.dao.validation.IEntityConstraintViolationDao;\r
 \r
+/**\r
+ *\r
+ * @author ayco_holleman\r
+ * @date 15 jan. 2015\r
+ *\r
+ */\r
 @Service\r
 @Transactional(readOnly = true)\r
 public class EntityConstraintViolationServiceImpl extends ServiceBase<EntityConstraintViolation, IEntityConstraintViolationDao> implements\r
                IEntityConstraintViolationService {\r
 \r
-       IEntityConstraintViolationDao dao;\r
+    @Autowired\r
+       private IEntityConstraintViolationDao dao;\r
 \r
 \r
        @Override\r
-       protected void setDao(IEntityConstraintViolationDao dao)\r
-       {\r
+       protected void setDao(IEntityConstraintViolationDao dao){\r
                this.dao = dao;\r
        }\r
 \r
 \r
        @Override\r
-       public List<EntityConstraintViolation> getConstraintViolations()\r
-       {\r
+       public List<EntityConstraintViolation> getConstraintViolations(){\r
                return dao.getConstraintViolations();\r
        }\r
 \r
 \r
        @Override\r
-       public List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass)\r
-       {\r
+       public List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass){\r
                return dao.getConstraintViolations(validatedEntityClass);\r
        }\r
 \r
 \r
        @Override\r
-       public List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass, Severity severity)\r
-       {\r
+       public List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass, Severity severity){\r
                return dao.getConstraintViolations(validatedEntityClass, severity);\r
        }\r
 \r
 \r
        @Override\r
-       public List<EntityConstraintViolation> getConstraintViolations(Severity severity)\r
-       {\r
+       public List<EntityConstraintViolation> getConstraintViolations(Severity severity){\r
                return dao.getConstraintViolations(severity);\r
        }\r
 \r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationResultServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationResultServiceImpl.java
deleted file mode 100644 (file)
index 64c1427..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-package eu.etaxonomy.cdm.api.service;\r
-\r
-import java.util.List;\r
-\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.stereotype.Service;\r
-import org.springframework.transaction.annotation.Transactional;\r
-\r
-import eu.etaxonomy.cdm.model.validation.EntityValidationResult;\r
-import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationResultDao;\r
-import eu.etaxonomy.cdm.model.validation.Severity;\r
-\r
-@Service\r
-@Transactional(readOnly = true)\r
-public class EntityValidationResultServiceImpl extends ServiceBase<EntityValidationResult, IEntityValidationResultDao> implements\r
-               IEntityValidationResultService {\r
-\r
-       @Autowired\r
-       IEntityValidationResultDao dao;\r
-\r
-\r
-       @Override\r
-       protected void setDao(IEntityValidationResultDao dao)\r
-       {\r
-               this.dao = dao;\r
-       }\r
-\r
-\r
-       @Override\r
-       public EntityValidationResult getValidationResult(String validatedEntityClass, int validatedEntityId)\r
-       {\r
-               return dao.getValidationResult(validatedEntityClass, validatedEntityId);\r
-       }\r
-\r
-\r
-       @Override\r
-       public List<EntityValidationResult> getValidationResults()\r
-       {\r
-               return dao.getValidationResults();\r
-       }\r
-\r
-\r
-       @Override\r
-       public List<EntityValidationResult> getEntityValidationResults(String validatedEntityClass)\r
-       {\r
-               return dao.getEntityValidationResults(validatedEntityClass);\r
-       }\r
-\r
-\r
-       @Override\r
-       public List<EntityValidationResult> getEntitiesViolatingConstraint(String validatorClass)\r
-       {\r
-               return dao.getEntitiesViolatingConstraint(validatorClass);\r
-       }\r
-\r
-\r
-       @Override\r
-       public List<EntityValidationResult> getValidationResults(String validatedEntityClass, Severity severity)\r
-       {\r
-               return dao.getValidationResults(validatedEntityClass, severity);\r
-       }\r
-\r
-\r
-       @Override\r
-       public List<EntityValidationResult> getValidationResults(Severity severity)\r
-       {\r
-               // TODO Auto-generated method stub\r
-               return null;\r
-       }\r
-\r
-}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/EntityValidationServiceImpl.java
new file mode 100644 (file)
index 0000000..3259109
--- /dev/null
@@ -0,0 +1,89 @@
+/**\r
+ * Copyright (C) 2007 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.validation.ConstraintViolation;\r
+\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Service;\r
+import org.springframework.transaction.annotation.Transactional;\r
+\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
+import eu.etaxonomy.cdm.model.validation.EntityValidation;\r
+import eu.etaxonomy.cdm.model.validation.Severity;\r
+import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationDao;\r
+\r
+/**\r
+ *\r
+ * @author ayco_holleman\r
+ * @date 15 jan. 2015\r
+ *\r
+ */\r
+@Service\r
+@Transactional(readOnly = true)\r
+public class EntityValidationServiceImpl extends ServiceBase<EntityValidation, IEntityValidationDao>\r
+        implements IEntityValidationService {\r
+\r
+    @Autowired\r
+    IEntityValidationDao dao;\r
+\r
+    @Override\r
+    protected void setDao(IEntityValidationDao dao) {\r
+        this.dao = dao;\r
+    }\r
+\r
+    @Override\r
+    public EntityValidation getValidationResult(String validatedEntityClass, int validatedEntityId) {\r
+        return dao.getEntityValidation(validatedEntityClass, validatedEntityId);\r
+    }\r
+\r
+    @Override\r
+    public List<EntityValidation> getValidationResults() {\r
+        return dao.getEntityValidations();\r
+    }\r
+\r
+    @Override\r
+    public List<EntityValidation> getEntityValidations(String validatedEntityClass) {\r
+        return dao.getEntityValidations(validatedEntityClass);\r
+    }\r
+\r
+    @Override\r
+    public List<EntityValidation> getEntitiesViolatingConstraint(String validatorClass) {\r
+        return dao.getEntitiesViolatingConstraint(validatorClass);\r
+    }\r
+\r
+    @Override\r
+    public List<EntityValidation> getValidationResults(String validatedEntityClass, Severity severity) {\r
+        return dao.getEntityValidations(validatedEntityClass, severity);\r
+    }\r
+\r
+    @Override\r
+    public List<EntityValidation> getValidationResults(Severity severity) {\r
+        return dao.getEntityValidations(severity);\r
+    }\r
+\r
+    @Override\r
+    @Transactional(readOnly = false)\r
+    public <T extends ICdmBase> void saveEntityValidation(T validatedEntity, Set<ConstraintViolation<T>> errors,\r
+            CRUDEventType crudEventType, Class<?>[] validationGroups) {\r
+        dao.saveEntityValidation(validatedEntity, errors, crudEventType, validationGroups);\r
+\r
+    }\r
+\r
+    @Override\r
+    @Transactional(readOnly = false)\r
+    public void deleteEntityValidation(String validatedEntityClass, int validatedEntityId) {\r
+        dao.deleteEntityValidation(validatedEntityClass, validatedEntityId);\r
+    }\r
+\r
+}\r
index b41a231aa0e65e4513e303ca212a8bd7f386de98..ac3e6be29ec7fd078f7939d55a45cf8527414bdb 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
@@ -18,15 +18,12 @@ import java.util.Set;
 import org.hibernate.Session;
 import org.hibernate.collection.spi.PersistentCollection;
 
-import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
-import eu.etaxonomy.cdm.database.DatabaseSchemaMismatchException;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ISourceable;
-import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
 import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
 import eu.etaxonomy.cdm.model.metadata.CdmMetaData.MetaDataPropertyName;
-import eu.etaxonomy.cdm.model.reference.IGeneric;
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmGenericDao;
+import eu.etaxonomy.cdm.persistence.query.OrderHint;
 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
 import eu.etaxonomy.cdm.strategy.match.IMatchable;
 import eu.etaxonomy.cdm.strategy.match.MatchException;
@@ -35,8 +32,8 @@ import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy;
 import eu.etaxonomy.cdm.strategy.merge.MergeException;
 
 
-public interface ICommonService extends IService<OriginalSourceBase>{
-//     
+public interface ICommonService /*extends IService<OriginalSourceBase>*/{
+//
 //     /** find cdmBase by UUID**/
 //     public abstract CdmBase getCdmBaseByUuid(UUID uuid);
 //
@@ -48,16 +45,16 @@ public interface ICommonService extends IService<OriginalSourceBase>{
         * @param metaData
         */
        public void saveAllMetaData(Collection<CdmMetaData> metaData);
-       
+
        /**
         * Returns all meta data.
         * @return
         */
        public Map<MetaDataPropertyName, CdmMetaData> getCdmMetaData();
-       
-       
+
+
        /**
-        * Returns a map of identifiable entities of class <code>clazz</code> which have an original source of 
+        * Returns a map of identifiable entities of class <code>clazz</code> which have an original source of
         * with namespace <code>idNamespace</code> and with an idInSource in <code>idInSourceSet</code> <BR>
         * The key of the map is the idInSource. If there are multiple objects that have the same id an arbitrary one is chosen.
         * @param clazz
@@ -66,7 +63,7 @@ public interface ICommonService extends IService<OriginalSourceBase>{
         * @return
         */
        public Map<String, ? extends ISourceable> getSourcedObjectsByIdInSource(Class clazz, Set<String> idInSourceSet, String idNamespace);
-       
+
        /**
         * Returns a list of identifiable entities according to their class, idInSource and idNamespace
         * @param clazz
@@ -76,17 +73,17 @@ public interface ICommonService extends IService<OriginalSourceBase>{
         */
        public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace);
 
-       
+
        /**
         * Returns all CdmBase objects that reference the referencedCdmBase.
         * For example, if referencedCdmBase is an agent it may return all taxon names
-        * that have this person as an author but also all books, articles, etc. that have 
+        * that have this person as an author but also all books, articles, etc. that have
         * this person as an author
         * @param referencedCdmBase
         * @return
         */
        public Set<CdmBase> getReferencingObjects(CdmBase referencedCdmBase);
-       
+
        /**
         * Merges mergeSecond into mergeFirst. All references to mergeSecond will be replaced by references
         * to merge first. If no merge strategy is defined (null), the DefaultMergeStrategy will be taken as default.
@@ -97,7 +94,7 @@ public interface ICommonService extends IService<OriginalSourceBase>{
         * @throws MergeException
         */
        public <T extends IMergable> void   merge(T mergeFirst, T mergeSecond, IMergeStrategy mergeStrategy) throws MergeException;
-       
+
        /**
         * Returns all objects that match the object to match according to the given match strategy.
         * If no match strategy is defined the default match strategy is taken.
@@ -108,7 +105,7 @@ public interface ICommonService extends IService<OriginalSourceBase>{
         * @throws MatchException
         */
        public <T extends IMatchable> List<T> findMatching(T objectToMatch, IMatchStrategy matchStrategy) throws MatchException;
-               
+
        /**
         * A generic method to retrieve any CdmBase object by its id and class.<BR>
         * @see ICdmGenericDao#find(Class, int)
@@ -123,73 +120,100 @@ public interface ICommonService extends IService<OriginalSourceBase>{
 
        /**
         * Initializes a lazy loaded persistent collection.
-        * 
+        *
         * @param col the persistent collection to initialize
         * @return the initialized persistent collection
         */
        public PersistentCollection initializeCollection(PersistentCollection col);
-       
+
        /**
         * Checks if a lazy loaded persistent collection is empty.
-        * 
-        * @param col the persistent collection 
+        *
+        * @param col the persistent collection
         * @return the initialized persistent collection
         */
        public boolean isEmpty(PersistentCollection col);
-               
+
        /**
         * Returns the size of a persistent collection.
-        * 
+        *
         * @param col the persistent collection to initialize
         * @return the size of the persistent collection
         */
        public int size(PersistentCollection col);
-       
+
        /**
         * Returns the object contained in a persistent collection at the given index.
-        * 
-        * @param col the persistent collection 
+        *
+        * @param col the persistent collection
         * @param index the index of the requested element
         * @return the object at the requested index
         */
        public Object get(PersistentCollection col, int index);
-       
+
        /**
         * checks whether an object is contained within a persistent collection.
-        * 
-        * @param col the persistent collection 
+        *
+        * @param col the persistent collection
         * @param element the element to check for
         * @return true if the element exists in the collection, false o/w
         */
        public boolean contains(PersistentCollection col, Object element);
-       
+
        /**
         * checks whether an index object exists within a persistent collection
         * (usually a map)
-        * 
-        * @param col the persistent collection 
+        *
+        * @param col the persistent collection
         * @param key the index object to look for.
         * @return true if the index object exists in the collection, false o/w
         */
        public boolean containsKey(PersistentCollection col, Object key);
-       
+
        /**
         * checks whether an value object exists within a persistent collection
         * (usually a map)
-        * 
-        * @param col the persistent collection 
+        *
+        * @param col the persistent collection
         * @param key the value object to look for.
         * @return true if the value object exists in the collection, false o/w
         */
        public boolean containsValue(PersistentCollection col, Object element);
 
        public Set<CdmBase> getReferencingObjectsForDeletion(CdmBase referencedCdmBase);
-       
+
        /**
         * Preliminary, may be moved to test later
         */
        @Deprecated
        public void createFullSampleData();
-       
-       
+
+       //TODO as common service currently implements OriginalSourceBase this is additionally needed
+       //maybe fixed in future
+    void updateEntity(CdmBase cdmBase);
+
+
+
+    /**
+     * Returns the number of objects that belong to a certain class.
+     * @param type the CdmBase class
+     * @return the number of objects in the database
+     */
+    public <S extends CdmBase> int count(Class<S> type);
+
+
+    /**
+     * Generic method to retrieve a list of objects. Use only if no specific service class
+     * can be used.
+     * @param type
+     * @param limit
+     * @param start
+     * @param orderHints
+     * @param propertyPaths
+     * @see IService#list(Class, Integer, Integer, List, List)
+     * @return
+     */
+    public <S extends CdmBase> List<S> list(Class<S> type, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths);
+
+
 }
\ No newline at end of file
index c9cdda2e22a5baa1725a8bab1e85531ff89be382..73204677c432d4f3b691f5976e612edce48d933d 100644 (file)
@@ -1,3 +1,13 @@
+// $Id: IEntityConstraintViolationService.java 22374 2014-12-10 23:02:58Z ayco_holleman $\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
 package eu.etaxonomy.cdm.api.service;\r
 \r
 import java.util.List;\r
@@ -9,19 +19,19 @@ import eu.etaxonomy.cdm.model.validation.Severity;
  * A service that provides several retrieval methods for entity validation outcomes. The\r
  * focus is on the constraints being violated rather than on the entities that violated\r
  * them.\r
- * \r
+ *\r
  * @author ayco_holleman\r
- * \r
+ *\r
  */\r
 public interface IEntityConstraintViolationService extends IService<EntityConstraintViolation> {\r
 \r
        /**\r
         * Get all constraint violations for all validated entities. The constraint violations\r
         * are sorted according to the type and id of the validated entities.\r
-        * \r
+        *\r
         * @param validatedEntityClass\r
         *            The fully qualified class name of the entity class\r
-        * \r
+        *\r
         * @return The {@code EntityConstraintViolation}s\r
         */\r
        List<EntityConstraintViolation> getConstraintViolations();\r
@@ -31,10 +41,10 @@ public interface IEntityConstraintViolationService extends IService<EntityConstr
         * Get all constraint violations for all entities of the specified type. The\r
         * constraint violations are sorted according to the type and id of the validated\r
         * entities.\r
-        * \r
+        *\r
         * @param validatedEntityClass\r
         *            The fully qualified class name of the entity class\r
-        * \r
+        *\r
         * @return The {@code EntityConstraintViolation}s\r
         */\r
        List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass);\r
@@ -44,13 +54,13 @@ public interface IEntityConstraintViolationService extends IService<EntityConstr
         * Get all constraint violations of the specified severity for all entities of the\r
         * specified type. The constraint violations are sorted according to the type and id\r
         * of the validated entities.\r
-        * \r
+        *\r
         * @param validatedEntityClass\r
         *            The fully qualified class name of the entity class\r
         * @param severity\r
         *            The severity of the {@link EntityConstraintViolation}s associated with\r
-        *            the {@code EntityValidationResult}\r
-        * \r
+        *            the {@code EntityValidation}\r
+        *\r
         * @return The {@code EntityConstraintViolation}s\r
         */\r
        List<EntityConstraintViolation> getConstraintViolations(String validatedEntityClass, Severity severity);\r
@@ -59,11 +69,11 @@ public interface IEntityConstraintViolationService extends IService<EntityConstr
        /**\r
         * Get all constraint violations of the specified severity. The constraint violations\r
         * are sorted according to the type and id of the validated entities.\r
-        * \r
+        *\r
         * @param severity\r
         *            The severity of the {@link EntityConstraintViolation}s associated with\r
-        *            the {@code EntityValidationResult}\r
-        * \r
+        *            the {@code EntityValidation}\r
+        *\r
         * @return The {@code EntityConstraintViolation}s\r
         */\r
        List<EntityConstraintViolation> getConstraintViolations(Severity severity);\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationResultService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationResultService.java
deleted file mode 100644 (file)
index 06fcad0..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-package eu.etaxonomy.cdm.api.service;\r
-\r
-import java.util.List;\r
-\r
-import javax.validation.ConstraintValidator;\r
-\r
-import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;\r
-import eu.etaxonomy.cdm.model.validation.EntityValidationResult;\r
-import eu.etaxonomy.cdm.model.validation.Severity;\r
-\r
-/**\r
- * A service that provides several retrieval methods for entity validation outcomes. The\r
- * focus is on the entities rather than on the constraint violations being validated\r
- * (irrespective of the entities that violated them).\r
- * \r
- * @author ayco_holleman\r
- * \r
- */\r
-public interface IEntityValidationResultService extends IService<EntityValidationResult> {\r
-\r
-       /**\r
-        * Get the validation result for a particular entity.\r
-        * \r
-        * @param validatedEntityClass\r
-        *            The fully qualified class name of the entity's class.\r
-        * @param validatedEntityId\r
-        *            The id of the entity\r
-        * @return The {@code EntityValidationResult} or null if the entity has not been\r
-        *         validated yet\r
-        * \r
-        */\r
-       EntityValidationResult getValidationResult(String validatedEntityClass, int validatedEntityId);\r
-\r
-\r
-       /**\r
-        * Get all validation results for all validated entities. The results are sorted\r
-        * according the type and id of the validated entities.\r
-        * \r
-        * @return The {@code EntityValidationResult}s\r
-        */\r
-       List<EntityValidationResult> getValidationResults();\r
-\r
-\r
-       /**\r
-        * Get all validation results for all validated entities of the specified type. The\r
-        * results are sorted according to the type and id of the validated entities.\r
-        * \r
-        * @param validatedEntityClass\r
-        *            The fully qualified class name of the entity class\r
-        * \r
-        * @return The {@code EntityValidationResult}s\r
-        */\r
-       List<EntityValidationResult> getEntityValidationResults(String validatedEntityClass);\r
-\r
-\r
-       /**\r
-        * Get all entities that violated a particular constraint. The results are sorted\r
-        * according to the type and id of the validated entities. Note that the\r
-        * {@code validatorClass} argument is a {@code String} (like all the {@code ***Class}\r
-        * arguments). This is because it is stored as such in the database, and also because\r
-        * the {@code Class} object itself may not be on the caller's classpath - e.g. when\r
-        * called from the TaxEditor.\r
-        * \r
-        * @param validatorClass\r
-        *            The fully qualified class name of the {@link ConstraintValidator}.\r
-        * \r
-        * @return The {@code EntityValidationResult}s\r
-        */\r
-       List<EntityValidationResult> getEntitiesViolatingConstraint(String validatorClass);\r
-\r
-\r
-       /**\r
-        * Get all validation results for all entities of the specified type. Only constraint\r
-        * violations of the specified severity are returned as part of the validation result.\r
-        * The results are sorted according to the type and id of the validated entities.\r
-        * \r
-        * @param validatedEntityClass\r
-        *            The fully qualified class name of the entity class.\r
-        * @param severity\r
-        *            The severity of the {@link EntityConstraintViolation}s associated with\r
-        *            the {@code EntityValidationResult}\r
-        * \r
-        * @return The {@code EntityValidationResult}s\r
-        */\r
-       List<EntityValidationResult> getValidationResults(String validatedEntityClass, Severity severity);\r
-\r
-\r
-       /**\r
-        * Get all validation results. Only constraint violations of the specified severity\r
-        * are returned as part of the validation result. The results are sorted according the\r
-        * type and id of the validated entities.\r
-        * \r
-        * @param severity\r
-        *            The severity of the {@link EntityConstraintViolation}s associated with\r
-        *            the {@code EntityValidationResult}\r
-        * \r
-        * @return The {@code EntityValidationResult}s\r
-        */\r
-       List<EntityValidationResult> getValidationResults(Severity severity);\r
-\r
-}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IEntityValidationService.java
new file mode 100644 (file)
index 0000000..83098d8
--- /dev/null
@@ -0,0 +1,150 @@
+// $Id: IEntityConstraintViolationService.java 22374 2014-12-10 23:02:58Z ayco_holleman $\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintViolation;\r
+\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
+import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;\r
+import eu.etaxonomy.cdm.model.validation.EntityValidation;\r
+import eu.etaxonomy.cdm.model.validation.Severity;\r
+import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationCrud;\r
+\r
+/**\r
+ * A service that provides several retrieval methods for entity validation outcomes. The\r
+ * focus is on the entities rather than on the constraint violations being validated\r
+ * (irrespective of the entities that violated them).\r
+ *\r
+ * @author ayco_holleman\r
+ *\r
+ */\r
+public interface IEntityValidationService extends IService<EntityValidation>,\r
+        IEntityValidationCrud {\r
+\r
+    /**\r
+     * Save the result of an entity validation to the error tables. Previous validation\r
+     * results of the same entity will be cleared first.\r
+     * @param validatedEntity\r
+     *            The validated entity\r
+     * @param errors\r
+     *            All constraints violated by the specified entity\r
+     * @param crudEventType\r
+     *            The CRUD operation triggering the validation\r
+     */\r
+@Override\r
+//    Note that this method should not\r
+//    * be exposed via cdmlib-services, because this is a backend-only affair. Populating\r
+//    * the error tables is done by the CVI (more particularly by an\r
+//    * {@link EntityValidationTaskBase}). External software like the TaxEditor can and should\r
+//    * not have access to this method.\r
+    <T extends ICdmBase> void  saveEntityValidation(T validatedEntity, Set<ConstraintViolation<T>> errors, CRUDEventType crudEventType, Class<?>[] validationGroups);\r
+\r
+\r
+    /**\r
+     * Delete validation result for the specified entity, presumably because it has become\r
+     * obsolete.\r
+     *\r
+     * @param validatedEntityClass\r
+     *            The fully qualified class name of the entity's class.\r
+     * @param validatedEntityId\r
+     *            The id of the entity\r
+     */\r
+@Override\r
+//    This method should not be exposed via cdmlib-services.\r
+    void deleteEntityValidation(String validatedEntityClass, int validatedEntityId);\r
+\r
+\r
+       /**\r
+        * Get the validation result for a particular entity.\r
+        *\r
+        * @param validatedEntityClass\r
+        *            The fully qualified class name of the entity's class.\r
+        * @param validatedEntityId\r
+        *            The id of the entity\r
+        * @return The {@code EntityValidation} or null if the entity has not been\r
+        *         validated yet\r
+        *\r
+        */\r
+       EntityValidation getValidationResult(String validatedEntityClass, int validatedEntityId);\r
+\r
+\r
+       /**\r
+        * Get all validation results for all validated entities. The results are sorted\r
+        * according the type and id of the validated entities.\r
+        *\r
+        * @return The {@code EntityValidation}s\r
+        */\r
+       List<EntityValidation> getValidationResults();\r
+\r
+\r
+       /**\r
+        * Get all validation results for all validated entities of the specified type. The\r
+        * results are sorted according to the type and id of the validated entities.\r
+        *\r
+        * @param validatedEntityClass\r
+        *            The fully qualified class name of the entity class\r
+        *\r
+        * @return The {@code EntityValidation}s\r
+        */\r
+       List<EntityValidation> getEntityValidations(String validatedEntityClass);\r
+\r
+\r
+       /**\r
+        * Get all entities that violated a particular constraint. The results are sorted\r
+        * according to the type and id of the validated entities. Note that the\r
+        * {@code validatorClass} argument is a {@code String} (like all the {@code ***Class}\r
+        * arguments). This is because it is stored as such in the database, and also because\r
+        * the {@code Class} object itself may not be on the caller's classpath - e.g. when\r
+        * called from the TaxEditor.\r
+        *\r
+        * @param validatorClass\r
+        *            The fully qualified class name of the {@link ConstraintValidator}.\r
+        *\r
+        * @return The {@code EntityValidation}s\r
+        */\r
+       List<EntityValidation> getEntitiesViolatingConstraint(String validatorClass);\r
+\r
+\r
+       /**\r
+        * Get all validation results for all entities of the specified type. Only constraint\r
+        * violations of the specified severity are returned as part of the validation result.\r
+        * The results are sorted according to the type and id of the validated entities.\r
+        *\r
+        * @param validatedEntityClass\r
+        *            The fully qualified class name of the entity class.\r
+        * @param severity\r
+        *            The severity of the {@link EntityConstraintViolation}s associated with\r
+        *            the {@code EntityValidation}\r
+        *\r
+        * @return The {@code EntityValidation}s\r
+        */\r
+       List<EntityValidation> getValidationResults(String validatedEntityClass, Severity severity);\r
+\r
+\r
+       /**\r
+        * Get all validation results. Only constraint violations of the specified severity\r
+        * are returned as part of the validation result. The results are sorted according the\r
+        * type and id of the validated entities.\r
+        *\r
+        * @param severity\r
+        *            The severity of the {@link EntityConstraintViolation}s associated with\r
+        *            the {@code EntityValidation}\r
+        *\r
+        * @return The {@code EntityValidation}s\r
+        */\r
+       List<EntityValidation> getValidationResults(Severity severity);\r
+\r
+}\r
index 2dd5765dff63965b1b876acf3e301f996eba6b35..4e494d0f4f490ffdb1333f26945303e53f812548 100644 (file)
@@ -18,7 +18,6 @@ import java.util.Set;
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.hibernate.LockMode;\r
 import org.hibernate.LockOptions;\r
 import org.hibernate.Session;\r
 import org.springframework.context.ApplicationContext;\r
@@ -26,7 +25,6 @@ import org.springframework.context.ApplicationContextAware;
 import org.springframework.dao.DataAccessException;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
-import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;\r
 import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
@@ -104,7 +102,7 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
     public T find(UUID uuid) {\r
         return uuid == null ? null : dao.findByUuid(uuid);\r
     }\r
-    \r
+\r
     @Override\r
     @Transactional(readOnly = true)\r
     public T findWithoutFlush(UUID uuid) {\r
@@ -227,7 +225,7 @@ public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T
     public List<T> list(T example, Set<String> includeProperties, Integer limit, Integer start, List<OrderHint> orderHints, List<String> propertyPaths) {\r
         return dao.list(example, includeProperties, limit, start, orderHints, propertyPaths);\r
     }\r
-    \r
-    \r
+\r
+\r
 \r
 }\r
index 143e3a8f7aaf9228fb9930ddb1b0637c46f32485..daa16de63a0361cd2f6681593cb48ebcbed973f8 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$\r
 /**\r
 * Copyright (C) 2007 EDIT\r
-* European Distributed Institute of Taxonomy \r
+* European Distributed Institute of Taxonomy\r
 * http://www.e-taxonomy.eu\r
-* \r
+*\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
 */\r
@@ -12,7 +12,6 @@ package eu.etaxonomy.cdm.api.service;
 \r
 import org.apache.log4j.Logger;\r
 import org.springframework.stereotype.Service;\r
-import org.springframework.transaction.annotation.Propagation;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
@@ -23,14 +22,15 @@ import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;
 public class ServiceImpl extends ServiceBase<CdmBase, ICdmEntityDao<CdmBase>> implements IService<CdmBase> {\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(ServiceImpl.class);\r
-       \r
+\r
        //@Autowired\r
        //@Qualifier("mainDao")\r
        protected ICdmEntityDao<CdmBase> mainDao;\r
-       \r
+\r
        //@Autowired\r
-       protected void setDao(ICdmEntityDao<CdmBase> dao) {\r
+       @Override\r
+    protected void setDao(ICdmEntityDao<CdmBase> dao) {\r
                this.dao = dao;\r
        }\r
-       \r
+\r
 }\r
index c99e1ea04b252a37a6fa7a1ae695abbf495bf7d8..7c21fc2d77868fb2fe4926982b7be8c55c70943b 100644 (file)
@@ -93,7 +93,6 @@ import eu.etaxonomy.cdm.model.location.NamedArea;
 import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
 import eu.etaxonomy.cdm.model.media.MediaUtils;\r
-import eu.etaxonomy.cdm.model.molecular.Amplification;\r
 import eu.etaxonomy.cdm.model.molecular.AmplificationResult;\r
 import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
 import eu.etaxonomy.cdm.model.molecular.Sequence;\r
@@ -683,7 +682,6 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                results = dao.getTaxaByNameForEditor(configurator.isDoTaxa(), configurator.isDoSynonyms(), configurator.isDoNamesWithoutTaxa(), configurator.isDoMisappliedNames(),configurator.getTitleSearchStringSqlized(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas());\r
         }\r
         if (configurator.isDoTaxaByCommonNames()) {\r
-            \r
             //if(configurator.getPageSize() == null ){\r
                 List<UuidAndTitleCache<IdentifiableEntity>> commonNameResults = dao.getTaxaByCommonNameForEditor(configurator.getTitleSearchStringSqlized(), configurator.getClassification(), configurator.getMatchMode(), configurator.getNamedAreas());\r
                 if(commonNameResults != null){\r
@@ -991,7 +989,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
      */\r
     @Override\r
     public DeleteResult deleteTaxon(Taxon taxon, TaxonDeletionConfigurator config, Classification classification)  {\r
-       \r
+\r
        if (config == null){\r
             config = new TaxonDeletionConfigurator();\r
         }\r
@@ -1189,12 +1187,8 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 \r
                         //remove name if possible (and required)\r
                         if (name != null && config.isDeleteNameIfPossible()){\r
-\r
                                nameResult = nameService.delete(name, config.getNameDeletionConfig());\r
-\r
                         }\r
-\r
-                        \r
                         \r
                         if (nameResult.isError()){\r
                                //result.setError();\r
@@ -1346,7 +1340,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                 taxonSet.addAll(synonym.getAcceptedTaxa());\r
             }\r
             for (Taxon relatedTaxon : taxonSet){\r
-               HibernateProxyHelper.deproxy(relatedTaxon, Taxon.class);\r
+               relatedTaxon = HibernateProxyHelper.deproxy(relatedTaxon, Taxon.class);\r
                 relatedTaxon.removeSynonym(synonym, false);\r
                 this.saveOrUpdate(relatedTaxon);\r
             }\r
@@ -1356,11 +1350,10 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
 \r
             //remove synonym (if necessary)\r
 \r
-            UUID uuid = null;\r
             if (synonym.getSynonymRelations().isEmpty()){\r
                 TaxonNameBase<?,?> name = synonym.getName();\r
                 synonym.setName(null);\r
-                uuid = dao.delete(synonym);\r
+                dao.delete(synonym);\r
 \r
                 //remove name if possible (and required)\r
                 if (name != null && config.isDeleteNameIfPossible()){\r
@@ -1379,7 +1372,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                 return result;\r
             }\r
 \r
-        \r
+\r
         }\r
         return result;\r
 //        else{\r
@@ -3104,34 +3097,34 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
             if (!(ref instanceof TaxonNameBase)){\r
                 if (!config.isDeleteSynonymRelations() && (ref instanceof SynonymRelationship)){\r
                     message = "The Taxon can't be deleted as long as it has synonyms.";\r
-                    \r
+\r
                 }\r
                 if (!config.isDeleteDescriptions() && (ref instanceof DescriptionBase)){\r
                     message = "The Taxon can't be deleted as long as it has factual data.";\r
-                   \r
+\r
                 }\r
 \r
                 if (!config.isDeleteTaxonNodes() && (ref instanceof TaxonNode)){\r
                     message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
-                    \r
+\r
                 }\r
                 if (!config.isDeleteTaxonRelationships() && (ref instanceof TaxonNode)){\r
                     if (!config.isDeleteMisappliedNamesAndInvalidDesignations() && (((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR())|| ((TaxonRelationship)ref).getType().equals(TaxonRelationshipType.INVALID_DESIGNATION_FOR()))){\r
                         message = "The Taxon can't be deleted as long as it has misapplied names or invalid designations.";\r
-                        \r
+\r
                     } else{\r
                         message = "The Taxon can't be deleted as long as it belongs to a taxon node.";\r
-                        \r
+\r
                     }\r
                 }\r
                 if (ref instanceof PolytomousKeyNode){\r
                     message = "The Taxon can't be deleted as long as it is referenced by a polytomous key node.";\r
-                    \r
+\r
                 }\r
 \r
                 if (HibernateProxyHelper.isInstanceOf(ref, IIdentificationKey.class)){\r
                    message = "Taxon can't be deleted as it is used in an identification key. Remove from identification key prior to deleting this name";\r
-                   \r
+\r
 \r
                 }\r
 \r
@@ -3145,13 +3138,13 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                 //TaxonInteraction\r
                 if (ref.isInstanceOf(TaxonInteraction.class)){\r
                     message = "Taxon can't be deleted as it is used in taxonInteraction#taxon2";\r
-                    \r
+\r
                 }\r
 \r
               //TaxonInteraction\r
                 if (ref.isInstanceOf(DeterminationEvent.class)){\r
                     message = "Taxon can't be deleted as it is used in a determination event";\r
-                    \r
+\r
                 }\r
 \r
             }\r
@@ -3291,7 +3284,7 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
         }\r
         return result;\r
     }\r
-    \r
+\r
     @Override\r
     public List<TaxonBase> findTaxaByName(MatchingTaxonConfigurator config){\r
         List<TaxonBase> taxonList = dao.getTaxaByName(true, false, false, config.getTaxonNameTitle(), null, MatchMode.EXACT, null, 0, 0, config.getPropertyPath());\r
@@ -3326,5 +3319,4 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                return new DefaultPagerImpl<FindByIdentifierDTO<S>>(pageNumber, numberOfResults, pageSize, result);\r
        }\r
 \r
-\r
 }\r
index 77ca422924375ae5216d7335054231416fd465dc..631e8f33d9a217f24b702a5c8b98dfced588fc07 100644 (file)
@@ -8,19 +8,18 @@
        * The contents of this file are subject to the Mozilla Public License Version 1.1\r
        * See LICENSE.TXT at the top of this package for the full license terms.\r
        */\r
-       package eu.etaxonomy.cdm.api.service;\r
+package eu.etaxonomy.cdm.api.service;\r
 \r
-       import java.io.Serializable;\r
+import java.io.Serializable;\r
 import java.util.ArrayList;\r
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Set;\r
 \r
-       import org.apache.log4j.Logger;\r
+import org.apache.log4j.Logger;\r
 \r
-       import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 \r
        /**\r
         * This class represents the result of an update action.\r
index c756fc244a462937459c6387102fb6f20e025a58..91ca7d0d8204ab1aa69110d4080369a09e7670d8 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 /**
  * Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy 
+ * European Distributed Institute of Taxonomy
  * http://www.e-taxonomy.eu
- * 
+ *
  * The contents of this file are subject to the Mozilla Public License Version 1.1
  * See LICENSE.TXT at the top of this package for the full license terms.
  */
@@ -22,7 +22,6 @@ import eu.etaxonomy.cdm.api.service.config.DeleteConfiguratorBase;
 import eu.etaxonomy.cdm.api.service.exception.ReferencedObjectUndeletableException;
 import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
-import eu.etaxonomy.cdm.model.agent.AgentBase;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.VersionableEntity;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
@@ -33,44 +32,48 @@ import eu.etaxonomy.cdm.persistence.dao.common.IVersionableDao;
 public abstract class VersionableServiceBase<T extends VersionableEntity, DAO extends IVersionableDao<T>> extends ServiceBase<T,DAO> implements IVersionableService<T> {
        @Autowired
     protected ICommonService commonService;
-       @Transactional(readOnly = true)
+       @Override
+    @Transactional(readOnly = true)
        public Pager<AuditEventRecord<T>> pageAuditEvents(T t, Integer pageSize,        Integer pageNumber, AuditEventSort sort, List<String> propertyPaths) {
                Integer numberOfResults = dao.countAuditEvents(t, sort);
-                       
+
                List<AuditEventRecord<T>> results = new ArrayList<AuditEventRecord<T>>();
                if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
                        results = dao.getAuditEvents(t, pageSize, pageNumber, sort,propertyPaths);
                }
-               
+
                return new DefaultPagerImpl<AuditEventRecord<T>>(pageNumber, numberOfResults, pageSize, results);
        }
 
-       @Transactional(readOnly = true)
+       @Override
+    @Transactional(readOnly = true)
        public AuditEventRecord<T> getNextAuditEvent(T t) {
                return dao.getNextAuditEvent(t);
        }
 
-       @Transactional(readOnly = true)
+       @Override
+    @Transactional(readOnly = true)
        public AuditEventRecord<T> getPreviousAuditEvent(T t) {
                return dao.getPreviousAuditEvent(t);
        }
-       
-       @Transactional(readOnly = true)
+
+       @Override
+    @Transactional(readOnly = true)
        public Pager<AuditEventRecord<T>> pageAuditEvents(Class<? extends T> clazz,AuditEvent from,AuditEvent to, List<AuditCriterion> criteria, Integer pageSize, Integer pageNumber, AuditEventSort sort,List<String> propertyPaths) {
                Integer numberOfResults = dao.countAuditEvents(clazz, from, to, criteria);
-               
+
                List<AuditEventRecord<T>> results = new ArrayList<AuditEventRecord<T>>();
                if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
                        results = dao.getAuditEvents(clazz,from,to,criteria, pageSize, pageNumber, sort,propertyPaths);
                }
-               
+
                return new DefaultPagerImpl<AuditEventRecord<T>>(pageNumber, numberOfResults, pageSize, results);
        }
-       
+
         /**
      * the basic isDeletable method return false if the object is referenced from any other object.
      */
-    
+
     @Override
     public DeleteResult isDeletable(T base, DeleteConfiguratorBase config){
        DeleteResult result = new DeleteResult();
@@ -88,6 +91,4 @@ public abstract class VersionableServiceBase<T extends VersionableEntity, DAO ex
        }
        return result;
     }
-    
-    
-    }
+}
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationEventListener.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationEventListener.java
new file mode 100644 (file)
index 0000000..11d266a
--- /dev/null
@@ -0,0 +1,40 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.api.validation;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
+import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationCrud;\r
+import eu.etaxonomy.cdm.persistence.hibernate.Level3ValidationEventListener;\r
+import eu.etaxonomy.cdm.persistence.validation.EntityValidationTaskBase;\r
+\r
+@SuppressWarnings("serial")\r
+class Level3TransactionalValidationEventListener extends Level3ValidationEventListener{\r
+\r
+       @SuppressWarnings("unused")\r
+    private static final Logger logger = Logger.getLogger(Level3TransactionalValidationEventListener.class);\r
+\r
+       private final ICdmApplicationConfiguration repository;\r
+\r
+       public Level3TransactionalValidationEventListener(ICdmApplicationConfiguration repository, IEntityValidationCrud dao){\r
+        super(dao);\r
+        this.repository = repository;\r
+    }\r
+\r
+\r
+    @Override\r
+    protected EntityValidationTaskBase createValidationTask(ICdmBase entity, CRUDEventType trigger) {\r
+        return new Level3TransactionalValidationTask(entity, trigger, getDao(), repository);\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationTask.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/Level3TransactionalValidationTask.java
new file mode 100644 (file)
index 0000000..a08da27
--- /dev/null
@@ -0,0 +1,61 @@
+/**\r
+ * Copyright (C) 2009 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.validation;\r
+\r
+import java.util.Set;\r
+\r
+import javax.validation.ConstraintViolation;\r
+\r
+import org.springframework.transaction.TransactionStatus;\r
+\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
+import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationCrud;\r
+import eu.etaxonomy.cdm.persistence.validation.Level3ValidationTask;\r
+\r
+/**\r
+ * A {@link Runnable} performing Level-3 validation of a JPA entity\r
+ *\r
+ * @author ayco_holleman\r
+ *\r
+ */\r
+class Level3TransactionalValidationTask extends Level3ValidationTask {\r
+\r
+    private ICdmApplicationConfiguration repository;\r
+\r
+    public Level3TransactionalValidationTask(CdmBase entity, IEntityValidationCrud dao) {\r
+        super(entity, dao);\r
+    }\r
+\r
+    public Level3TransactionalValidationTask(ICdmBase entity, CRUDEventType crudEventType, IEntityValidationCrud dao, ICdmApplicationConfiguration repository) {\r
+        super(entity, crudEventType, dao);\r
+        this.repository = repository;\r
+    }\r
+\r
+    @Override\r
+    protected Set<ConstraintViolation<ICdmBase>> validateWithErrorHandling() {\r
+        if (repository != null){\r
+            TransactionStatus tx = repository.startTransaction(true);\r
+            //TODO what if getEntity() is not CdmBase?\r
+            CdmBase cdmBase = CdmBase.deproxy(getEntity(), CdmBase.class);\r
+            repository.getCommonService().find(cdmBase.getClass(), cdmBase.getId());\r
+            //was "create Entity in 2 open sessions" error\r
+            //not sure if the above works, should set the entity, but allowing to do so is critical the id is part of hash function, so we have to make sure that only entities with the same id can be replaced\r
+//            repository.getCommonService().updateEntity(cdmBase);\r
+            Set<ConstraintViolation<ICdmBase>> result = super.validateWithErrorHandling();\r
+            repository.commitTransaction(tx);\r
+            return result;\r
+        }else{\r
+            return super.validateWithErrorHandling();\r
+        }\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/ValidationManager.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/ValidationManager.java
new file mode 100644 (file)
index 0000000..dc692e8
--- /dev/null
@@ -0,0 +1,152 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2015 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.api.validation;\r
+\r
+import javax.annotation.PostConstruct;\r
+\r
+import org.hibernate.SessionFactory;\r
+import org.hibernate.event.service.spi.EventListenerRegistry;\r
+import org.hibernate.event.spi.EventType;\r
+import org.hibernate.internal.SessionFactoryImpl;\r
+import org.hibernate.service.spi.ServiceRegistryImplementor;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.beans.factory.annotation.Qualifier;\r
+import org.springframework.context.annotation.Lazy;\r
+import org.springframework.scheduling.TaskScheduler;\r
+import org.springframework.stereotype.Component;\r
+\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.api.validation.batch.BatchValidator;\r
+import eu.etaxonomy.cdm.api.validation.batch.ValidationScheduler;\r
+import eu.etaxonomy.cdm.persistence.dao.jdbc.validation.EntityValidationCrudJdbcImpl;\r
+import eu.etaxonomy.cdm.persistence.hibernate.Level2ValidationEventListener;\r
+import eu.etaxonomy.cdm.persistence.hibernate.Level3ValidationEventListener;\r
+import eu.etaxonomy.cdm.persistence.validation.ValidationExecutor;\r
+\r
+/**\r
+ * This bean\r
+ *\r
+ * @author a.mueller\r
+ * @date 09.01.2015\r
+ *\r
+ */\r
+@Component\r
+@Lazy(false)\r
+public class ValidationManager {\r
+\r
+    private boolean validationEnabled = true;\r
+    private final boolean batchValidationEnabled = true;\r
+\r
+    private boolean level2Enabled = false;\r
+    private boolean level3Enabled = false;\r
+\r
+    private boolean isInitialized  = false;\r
+\r
+    private Level2ValidationEventListener l2Listener;\r
+    private Level3ValidationEventListener l3Listener;\r
+\r
+    @Autowired\r
+    private SessionFactory sessionFactory;\r
+\r
+    @Autowired\r
+    private BatchValidator batchValidator;\r
+\r
+    @Autowired\r
+    @Qualifier("cdmApplicationDefaultConfiguration")\r
+    private ICdmApplicationConfiguration cdmApplicationDefaultConfiguration;\r
+\r
+    @Autowired\r
+//    IEntityValidationService validationService;\r
+//    IEntityValidationCrud validationService;\r
+    private EntityValidationCrudJdbcImpl validationDao;\r
+\r
+//    private TaskExecutor taskExecutor;\r
+\r
+    private TaskScheduler scheduler;\r
+\r
+    @PostConstruct\r
+    public void initializeManager(){\r
+        registerValidationListeners();\r
+        initTaskExecutor();\r
+    }\r
+\r
+\r
+    /**\r
+     *\r
+     */\r
+    private void initTaskExecutor() {\r
+//        taskExecutor = new ThreadPoolTaskExecutor();\r
+        ValidationScheduler validationScheduler = new ValidationScheduler();\r
+        validationScheduler.initialize();\r
+        scheduler = validationScheduler;\r
+        scheduler.scheduleWithFixedDelay(batchValidator, 5000);\r
+        //TODO how to disable scheduling if not wanted for a certain time\r
+\r
+    }\r
+\r
+    public void startBatchValidation(){\r
+        batchValidator.run();\r
+    }\r
+\r
+\r
+    public void registerValidationListeners(){\r
+        if (!isInitialized){\r
+            if (sessionFactory != null && sessionFactory instanceof SessionFactoryImpl){\r
+                ServiceRegistryImplementor serviceRegistry = ((SessionFactoryImpl)sessionFactory).getServiceRegistry();\r
+\r
+                final EventListenerRegistry eventRegistry = serviceRegistry.getService(EventListenerRegistry.class);\r
+\r
+                //duplication strategy\r
+    //            eventRegistry.addDuplicationStrategy(CdmListenerDuplicationStrategy.NewInstance);\r
+                eventRegistry.getEventListenerGroup(EventType.POST_INSERT);\r
+\r
+                ValidationExecutor validationExecutor = new ValidationExecutor();\r
+\r
+                //level2\r
+                l2Listener = new Level2ValidationEventListener(validationDao);\r
+                l2Listener.setValidationExecutor(validationExecutor);\r
+\r
+                //level3\r
+                l3Listener = new Level3TransactionalValidationEventListener(cdmApplicationDefaultConfiguration, validationDao);\r
+                l3Listener.setValidationExecutor(validationExecutor);\r
+\r
+                // prepend to register before or append to register after\r
+\r
+                eventRegistry.appendListeners(EventType.POST_INSERT, l2Listener , l3Listener);\r
+                eventRegistry.appendListeners(EventType.POST_UPDATE, l2Listener , l3Listener);\r
+                //TODO don't we need l2Listener validation also for deleting the results?\r
+                eventRegistry.appendListeners(EventType.POST_DELETE, l3Listener);\r
+\r
+                isInitialized = true;\r
+\r
+            }else{\r
+                throw new RuntimeException("Session factory not available or not of type SessionFactoryImpl");\r
+            }\r
+        }\r
+    }\r
+\r
+    //for future use\r
+    private void enableLevel2Listener(boolean enabled){\r
+        level2Enabled = enabled;\r
+        l2Listener.setEnabled(level2Enabled && validationEnabled);\r
+    }\r
+\r
+    private void enableLevel3Listener(boolean enabled){\r
+        level3Enabled = enabled;\r
+        l3Listener.setEnabled(level3Enabled && validationEnabled);\r
+    }\r
+\r
+    private void enableValidation(boolean enabled){\r
+        validationEnabled = enabled;\r
+        l2Listener.setEnabled(level2Enabled);\r
+        l3Listener.setEnabled(level3Enabled);\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidationUtil.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidationUtil.java
new file mode 100644 (file)
index 0000000..a587fb1
--- /dev/null
@@ -0,0 +1,135 @@
+// $Id$\r
+/**\r
+ * Copyright (C) 2015 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.validation.batch;\r
+\r
+import java.lang.reflect.ParameterizedType;\r
+import java.lang.reflect.Type;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+\r
+import javax.print.attribute.standard.Media;\r
+import javax.validation.Validator;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.api.service.ITaxonService;\r
+import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
+import eu.etaxonomy.cdm.model.common.Group;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
+import eu.etaxonomy.cdm.model.description.FeatureNode;\r
+import eu.etaxonomy.cdm.model.description.FeatureTree;\r
+import eu.etaxonomy.cdm.model.description.PolytomousKey;\r
+import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;\r
+import eu.etaxonomy.cdm.model.description.WorkingSet;\r
+import eu.etaxonomy.cdm.model.molecular.Amplification;\r
+import eu.etaxonomy.cdm.model.molecular.Primer;\r
+import eu.etaxonomy.cdm.model.molecular.Sequence;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.name.TypeDesignationBase;\r
+import eu.etaxonomy.cdm.model.occurrence.Collection;\r
+import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;\r
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
+import eu.etaxonomy.cdm.model.taxon.Classification;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
+\r
+/**\r
+ * @author ayco_holleman\r
+ * @date 28 jan. 2015\r
+ *\r
+ */\r
+class BatchValidationUtil {\r
+\r
+    public static void main(String[] args) {\r
+        System.out.println(ITaxonService.class.getGenericInterfaces()[0]);\r
+    }\r
+\r
+    @SuppressWarnings("unused")\r
+    private static final Logger logger = Logger.getLogger(BatchValidationUtil.class);\r
+\r
+    // Ideally retrieved dynamically through reflection, but got stuck on\r
+    // getXXXService methods in ICdmApplicationConfiguration returning proxies\r
+    // (com.sun.proxy.$Proxy), which is a dead end when attempting to infer\r
+    // parameter arguments (e.g. the AgentBase in IAgentService<AgentBase>).\r
+    @SuppressWarnings({ "unchecked", "rawtypes" })\r
+    public static <T extends ICdmBase, S extends T> List<EntityValidationUnit<T, S>> getAvailableServices(\r
+            ICdmApplicationConfiguration appConfig) {\r
+        List<EntityValidationUnit<T, S>> services = new ArrayList<EntityValidationUnit<T, S>>();\r
+        services.add(new EntityValidationUnit(AgentBase.class, appConfig.getAgentService()));\r
+        services.add(new EntityValidationUnit(Amplification.class, appConfig.getAmplificationService()));\r
+        services.add(new EntityValidationUnit(Classification.class, appConfig.getClassificationService()));\r
+        services.add(new EntityValidationUnit(Collection.class, appConfig.getCollectionService()));\r
+//        services.add(new EntityValidationUnit(OriginalSourceBase.class, appConfig.getCommonService()));\r
+        services.add(new EntityValidationUnit(DescriptionBase.class, appConfig.getDescriptionService()));\r
+        services.add(new EntityValidationUnit(FeatureNode.class, appConfig.getFeatureNodeService()));\r
+        services.add(new EntityValidationUnit(FeatureTree.class, appConfig.getFeatureTreeService()));\r
+        services.add(new EntityValidationUnit(Group.class, appConfig.getGroupService()));\r
+        // Causes some AOP-related error when calling list() method on it\r
+        //services.add(new EntityValidationUnit(DefinedTermBase.class, appConfig.getLocationService()));\r
+        services.add(new EntityValidationUnit(Media.class, appConfig.getMediaService()));\r
+        services.add(new EntityValidationUnit(TaxonNameBase.class, appConfig.getNameService()));\r
+        services.add(new EntityValidationUnit(SpecimenOrObservationBase.class, appConfig.getOccurrenceService()));\r
+        services.add(new EntityValidationUnit(PolytomousKeyNode.class, appConfig.getPolytomousKeyNodeService()));\r
+        services.add(new EntityValidationUnit(PolytomousKey.class, appConfig.getPolytomousKeyService()));\r
+        services.add(new EntityValidationUnit(Primer.class, appConfig.getPrimerService()));\r
+        services.add(new EntityValidationUnit(Reference.class, appConfig.getReferenceService()));\r
+        services.add(new EntityValidationUnit(Sequence.class, appConfig.getSequenceService()));\r
+        services.add(new EntityValidationUnit(TaxonNode.class, appConfig.getTaxonNodeService()));\r
+        services.add(new EntityValidationUnit(TaxonBase.class, appConfig.getTaxonService()));\r
+        services.add(new EntityValidationUnit(DefinedTermBase.class, appConfig.getTermService()));\r
+        services.add(new EntityValidationUnit(User.class, appConfig.getUserService()));\r
+        services.add(new EntityValidationUnit(TermVocabulary.class, appConfig.getVocabularyService()));\r
+        services.add(new EntityValidationUnit(WorkingSet.class, appConfig.getWorkingSetService()));\r
+        return services;\r
+    }\r
+\r
+    public static <T extends ICdmBase, S extends T> List<Class<CdmBase>> getClassesToValidate(){\r
+        List<Class<CdmBase>> classesToValidate = new ArrayList<Class<CdmBase>>();\r
+        classesToValidate.addAll((List)Arrays.asList(new Class[]{\r
+                Reference.class,\r
+                NameRelationship.class,\r
+                TaxonNameBase.class,\r
+                TypeDesignationBase.class,\r
+                TaxonBase.class,\r
+                SynonymRelationship.class,\r
+                TaxonNode.class,\r
+                GatheringEvent.class}));\r
+        return classesToValidate;\r
+    }\r
+\r
+\r
+    // Created to infer (1st) parameter type of parametrized type,\r
+    // but won't work because the service argument appears to be a\r
+    // proxy object (com.sun.proxy.$Proxy).\r
+    public static Class<?> getServicedEntity(IService<?> service) {\r
+        Class<?> serviceClass = service.getClass();\r
+        System.out.println(serviceClass.getName());\r
+        ParameterizedType pt = (ParameterizedType) serviceClass.getGenericInterfaces()[0];\r
+        Type type = pt.getActualTypeArguments()[0];\r
+        return (Class<?>) type;\r
+    }\r
+\r
+    public static boolean isConstrainedEntityClass(Validator validator, Class<? extends ICdmBase> entityClass) {\r
+        return validator.getConstraintsForClass(entityClass).hasConstraints();\r
+    }\r
+\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidator.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidator.java
new file mode 100644 (file)
index 0000000..480dcb9
--- /dev/null
@@ -0,0 +1,303 @@
+// $Id$\r
+/**\r
+ * Copyright (C) 2015 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.validation.batch;\r
+\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.validation.ConstraintViolation;\r
+import javax.validation.Validation;\r
+import javax.validation.Validator;\r
+import javax.validation.ValidatorFactory;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.hibernate.validator.HibernateValidator;\r
+import org.hibernate.validator.HibernateValidatorConfiguration;\r
+import org.springframework.context.ApplicationContext;\r
+import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.orm.hibernate4.HibernateTransactionManager;\r
+import org.springframework.stereotype.Component;\r
+import org.springframework.transaction.PlatformTransactionManager;\r
+import org.springframework.transaction.TransactionDefinition;\r
+import org.springframework.transaction.TransactionStatus;\r
+import org.springframework.transaction.support.DefaultTransactionDefinition;\r
+\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.api.service.ICommonService;\r
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+import eu.etaxonomy.cdm.model.validation.CRUDEventType;\r
+import eu.etaxonomy.cdm.persistence.dao.jdbc.validation.EntityValidationCrudJdbcImpl;\r
+import eu.etaxonomy.cdm.validation.Level2;\r
+import eu.etaxonomy.cdm.validation.Level3;\r
+\r
+/**\r
+ * @author ayco_holleman\r
+ * @author a.mueller\r
+ * @date 27 jan. 2015\r
+ *\r
+ */\r
+@Component("batchValidator")\r
+public class BatchValidator implements Runnable, ApplicationContextAware {\r
+\r
+    static final Class<?>[] DEFAULT_VALIDATION_GROUPS = new Class<?>[] { Level2.class, Level3.class };\r
+\r
+    private static final Logger logger = Logger.getLogger(BatchValidator.class);\r
+\r
+\r
+    private ICdmApplicationConfiguration repository;\r
+\r
+    private ApplicationContext appContext;\r
+\r
+    private Validator validator;\r
+    private Class<?>[] validationGroups;\r
+\r
+\r
+    @Override\r
+    public void setApplicationContext(ApplicationContext appContext) {\r
+        this.appContext = appContext;\r
+    }\r
+\r
+    @Override\r
+    public void run() {\r
+        Thread.currentThread().setPriority(1);\r
+        initValidator();\r
+        validate();\r
+    }\r
+\r
+    /**\r
+     *\r
+     */\r
+    private void initValidator() {\r
+        if (getValidator() == null){\r
+            HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure();\r
+            ValidatorFactory factory = config.buildValidatorFactory();\r
+            setValidator(factory.getValidator());\r
+        }\r
+        if (validationGroups == null) {\r
+            validationGroups = DEFAULT_VALIDATION_GROUPS;\r
+        }\r
+    }\r
+\r
+\r
+\r
+    private <T extends ICdmBase, S extends T> void validate() {\r
+        logger.info("Starting batch validation");\r
+\r
+       // Get service for saving errors to database\r
+//        IEntityValidationService validationResultService = context.getEntityValidationService();\r
+        IEntityValidationService entityValidationService = appContext.getBean(IEntityValidationService.class);\r
+\r
+        EntityValidationCrudJdbcImpl jdbcPersister = appContext.getBean(EntityValidationCrudJdbcImpl.class);\r
+\r
+        // Get all services dealing with "real" entities\r
+        List<Class<CdmBase>> classesToValidate = BatchValidationUtil.getClassesToValidate();\r
+\r
+        for (Class<CdmBase> entityClass : classesToValidate) {\r
+            //TODO currently this seems to work only on the exact class, we may move it down\r
+            //to single entity validation again but cache the information for each class\r
+            if (true || BatchValidationUtil.isConstrainedEntityClass(validator, entityClass)){\r
+\r
+    //          ICommonService commonService = repository.getCommonService();\r
+                ICommonService commonService = appContext.getBean(ICommonService.class);\r
+                logger.info("Loading entities of type " + entityClass.getName());\r
+                //false for saving validation results\r
+                //TODO can we handle results in a different transaction?\r
+                boolean readOnly = false;\r
+                TransactionStatus txStatus =  startTransaction(readOnly);\r
+                handleSingleClass(commonService, entityClass, entityValidationService, jdbcPersister);\r
+                commitTransaction(txStatus);\r
+            }\r
+        }\r
+\r
+        logger.info("Batch validation complete");\r
+    }\r
+\r
+    /**\r
+     * @param txStatus\r
+     */\r
+    private void commitTransaction(TransactionStatus txStatus) {\r
+        PlatformTransactionManager txManager = getTransactionManager();\r
+        txManager.commit(txStatus);\r
+\r
+    }\r
+\r
+    /**\r
+     * @param readOnly\r
+     * @return\r
+     *\r
+     */\r
+    private TransactionStatus startTransaction(boolean readOnly) {\r
+        PlatformTransactionManager txManager = getTransactionManager();\r
+\r
+        DefaultTransactionDefinition defaultTxDef = new DefaultTransactionDefinition();\r
+        defaultTxDef.setReadOnly(readOnly);\r
+        TransactionDefinition txDef = defaultTxDef;\r
+        TransactionStatus txStatus = txManager.getTransaction(txDef);\r
+        return txStatus;\r
+    }\r
+\r
+    /**\r
+     * @return\r
+     */\r
+    private PlatformTransactionManager getTransactionManager() {\r
+        PlatformTransactionManager txManager = appContext.getBean(HibernateTransactionManager.class);\r
+        return txManager;\r
+    }\r
+\r
+    private void handleSingleClass(ICommonService commonService, Class<CdmBase> entityClass, IEntityValidationService entityValidationService, EntityValidationCrudJdbcImpl jdbcPersister) {\r
+        int n = commonService.count(entityClass);\r
+        int pageSize = 1000;\r
+        for (int page = 0; page < n ; page = page + pageSize ){\r
+            handlePage(commonService, entityClass, entityValidationService, jdbcPersister,\r
+                    page/pageSize, pageSize);\r
+        }\r
+    }\r
+\r
+\r
+    /**\r
+     * @param commonService\r
+     * @param entityClass\r
+     * @param entityValidationService\r
+     * @param jdbcPersister\r
+     *\r
+     */\r
+    private void handlePage(ICommonService commonService, Class<CdmBase> entityClass, IEntityValidationService entityValidationService, EntityValidationCrudJdbcImpl jdbcPersister, int start, int pageSize) {\r
+\r
+        List<CdmBase> entities;\r
+\r
+        try {\r
+//            commonService.count()\r
+            entities = commonService.list(entityClass, pageSize, 0, null, null);\r
+        } catch (Throwable t) {\r
+            //TODO handle exception\r
+            logger.error("Failed to load entities", t);\r
+            return;\r
+        }\r
+        for (CdmBase entity : entities) {\r
+            try {\r
+                Set<ConstraintViolation<CdmBase>> errors = getValidator().validate(entity, getValidationGroups());\r
+                if (errors.size() != 0) {\r
+                    if (logger.isInfoEnabled()){logger.info(errors.size() + " constraint violation(s) detected in entity " + entity.toString());}\r
+//                    entityValidationService.saveEntityValidation(entity, errors, CRUDEventType.NONE,\r
+//                            getValidationGroups());\r
+\r
+                    jdbcPersister.saveEntityValidation(entity, errors, CRUDEventType.NONE, getValidationGroups());\r
+                }\r
+            } catch (Exception e) {\r
+                // TODO Exception handling\r
+                e.printStackTrace();\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    private <T extends ICdmBase, S extends T> void validate_old() {\r
+        logger.info("Starting batch validation");\r
+\r
+        if (validationGroups == null) {\r
+            validationGroups = DEFAULT_VALIDATION_GROUPS;\r
+        }\r
+\r
+        // Get service for saving errors to database\r
+        IEntityValidationService validationResultService = repository.getEntityValidationService();\r
+\r
+        // Get all services dealing with "real" entities\r
+        List<EntityValidationUnit<T, S>> validationUnits = BatchValidationUtil.getAvailableServices(repository);\r
+\r
+        for (EntityValidationUnit<T, S> unit : validationUnits) {\r
+            Class<S> entityClass = unit.getEntityClass();\r
+            IService<T> entityLoader = unit.getEntityLoader();\r
+            logger.info("Loading entities of type " + entityClass.getName());\r
+            List<S> entities;\r
+            try {\r
+                entities = entityLoader.list(entityClass, 0, 0, null, null);\r
+            } catch (Throwable t) {\r
+                logger.error("Failed to load entities", t);\r
+                continue;\r
+            }\r
+            for (S entity : entities) {\r
+                if (BatchValidationUtil.isConstrainedEntityClass(getValidator(), entity.getClass())) {\r
+                    Set<ConstraintViolation<S>> errors = getValidator().validate(entity, validationGroups);\r
+                    if (errors.size() != 0) {\r
+                        logger.warn(errors.size() + " error(s) detected in entity " + entity.toString());\r
+                        validationResultService.saveEntityValidation(entity, errors, CRUDEventType.NONE,\r
+                                validationGroups);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        logger.info("Batch validation complete");\r
+    }\r
+\r
+    /**\r
+     * Get the application context that will provide the services that will, on\r
+     * their turn, provide the entities to be validated.\r
+     *\r
+     * @return The application context\r
+     */\r
+    public ICdmApplicationConfiguration getAppController() {\r
+        return repository;\r
+    }\r
+\r
+    /**\r
+     * Set the application context.\r
+     *\r
+     * @param context\r
+     *            The application context\r
+     */\r
+    public void setAppController(ICdmApplicationConfiguration context) {\r
+        this.repository = context;\r
+    }\r
+\r
+    /**\r
+     * Get the {@code Validator} instance that will carry out the validations.\r
+     *\r
+     * @return The {@code Validator}\r
+     */\r
+    public Validator getValidator() {\r
+        return validator;\r
+    }\r
+\r
+    /**\r
+     * Set the {@code Validator} instance that will carry out the validations.\r
+     *\r
+     * @param validator\r
+     *            The {@code Validator}\r
+     */\r
+    public void setValidator(Validator validator) {\r
+        this.validator = validator;\r
+    }\r
+\r
+    /**\r
+     * Get the validation groups to be applied by the {@code Validator}.\r
+     *\r
+     * @return The validation groups\r
+     */\r
+    public Class<?>[] getValidationGroups() {\r
+        return validationGroups;\r
+    }\r
+\r
+    /**\r
+     * Set the validation groups to be applied by the {@code Validator}. By\r
+     * default all Level2 and Level3 will be checked. So if that is what you\r
+     * want, you do not need to call this method before calling {@link #run()}.\r
+     *\r
+     * @param validationGroups\r
+     *            The validation groups\r
+     */\r
+    public void setValidationGroups(Class<?>... validationGroups) {\r
+        this.validationGroups = validationGroups;\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/EntityValidationUnit.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/EntityValidationUnit.java
new file mode 100644 (file)
index 0000000..07d4168
--- /dev/null
@@ -0,0 +1,45 @@
+// $Id$\r
+/**\r
+ * Copyright (C) 2015 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.validation.batch;\r
+\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
+\r
+/**\r
+ * Probably not required anymore\r
+ * @author ayco_holleman\r
+ * @date 29 jan. 2015\r
+ *\r
+ */\r
+class EntityValidationUnit<T extends ICdmBase, S extends T> {\r
+\r
+    private final Class<S> entityClass;\r
+    private final IService<T> entityLoader;\r
+\r
+    EntityValidationUnit(Class<S> entityClass, IService<T> entityLoader) {\r
+        this.entityClass = entityClass;\r
+        this.entityLoader = entityLoader;\r
+    }\r
+\r
+    /**\r
+     * @return the entityClass\r
+     */\r
+    Class<S> getEntityClass() {\r
+        return entityClass;\r
+    }\r
+\r
+    /**\r
+     * @return the entityLoader\r
+     */\r
+    IService<T> getEntityLoader() {\r
+        return entityLoader;\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/ValidationScheduler.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/validation/batch/ValidationScheduler.java
new file mode 100644 (file)
index 0000000..8a4490a
--- /dev/null
@@ -0,0 +1,25 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2015 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.api.validation.batch;\r
+\r
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;\r
+import org.springframework.stereotype.Component;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 19.02.2015\r
+ *\r
+ */\r
+@Component\r
+public class ValidationScheduler extends ThreadPoolTaskScheduler {\r
+    private static final long serialVersionUID = 7110200522760862056L;\r
+\r
+    public ValidationScheduler(){}\r
+}\r
index f51ec61fa854e533822bfa3969f02c3637431566..3c3606d064d8cc3dd76d7d2aae87743cafeeb38b 100644 (file)
@@ -5,7 +5,7 @@
 *\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
-*/ \r
+*/\r
 \r
 package eu.etaxonomy.cdm.validation.constraint;\r
 \r
@@ -25,9 +25,9 @@ import eu.etaxonomy.cdm.validation.annotation.NoDuplicateNames;
 \r
 public class NoDuplicateNamesValidator implements\r
                ConstraintValidator<NoDuplicateNames,NonViralName> {\r
-       \r
+\r
        private static Set<String> includeProperties;\r
-       \r
+\r
        static {\r
                includeProperties = new HashSet<String>();\r
                includeProperties.add("genusOrUninomial");\r
@@ -42,16 +42,18 @@ public class NoDuplicateNamesValidator implements
                includeProperties.add("combinationAuthorTeam");\r
                includeProperties.add("exCombinationAuthorTeam");\r
        }\r
-       \r
+\r
        private INameService nameService;\r
-       \r
+\r
        @Autowired\r
        public void setNameService(INameService nameService) {\r
                this.nameService = nameService;\r
        }\r
 \r
+       @Override\r
        public void initialize(NoDuplicateNames noDuplicateNames) { }\r
 \r
+    @Override\r
        public boolean isValid(NonViralName name, ConstraintValidatorContext constraintContext) {\r
                if(name == null) {\r
                        return true;\r
index 6cd2d29e9d9a6a31a948587ebe564c1cc1c61349..d9287245b011de6eeb1ac13251da525e0601405f 100644 (file)
@@ -9,13 +9,12 @@
 */
 package eu.etaxonomy.cdm.api.application;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 import java.io.FileNotFoundException;
 import java.util.Set;
 import java.util.UUID;
 
-
 import org.apache.log4j.Logger;
 import org.junit.Test;
 import org.unitils.dbunit.annotation.DataSet;
@@ -30,14 +29,7 @@ import eu.etaxonomy.cdm.api.service.ITaxonService;
 import eu.etaxonomy.cdm.api.service.TaxonServiceImplTest;
 import eu.etaxonomy.cdm.datagenerator.TaxonGenerator;
 import eu.etaxonomy.cdm.model.description.TaxonDescription;
-import eu.etaxonomy.cdm.model.name.BotanicalName;
-import eu.etaxonomy.cdm.model.name.Rank;
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.model.reference.IBook;
-import eu.etaxonomy.cdm.model.reference.Reference;
-import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
-import eu.etaxonomy.cdm.strategy.cache.reference.IReferenceBaseCacheStrategy;
 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
 
 /**
@@ -66,10 +58,10 @@ public class FirstDataInserterTest extends CdmTransactionalIntegrationTest {
 
     @SpringBeanByType
     private IClassificationService classificationService;
-    
+
     @SpringBeanByType
     private IDescriptionService descriptionService;
-    
+
     @Test
     @DataSet(value="FirstDataInserterTest.testBlankDB.xml")
     @ExpectedDataSet(value="FirstDataInserterTest.testBlankDB-result.xml")
@@ -78,7 +70,7 @@ public class FirstDataInserterTest extends CdmTransactionalIntegrationTest {
         commitAndStartNewTransaction(null);
 //        printDataSet(System.err, tableNames);
     }
-    
+
     @Test
     @DataSet(value="FirstDataInserterTest.testBlankDB.xml")
     public void testInsertData(){
@@ -86,8 +78,8 @@ public class FirstDataInserterTest extends CdmTransactionalIntegrationTest {
        TaxonGenerator.getTestTaxon();
        Taxon newTaxon =        TaxonGenerator.getTestTaxon();
        UUID taxonUUID = taxonService.save(newTaxon);
-       
-       
+
+
        TaxonDescription description = TaxonGenerator.getTestDescription(1);
        newTaxon.addDescription(description);
        Set<TaxonDescription> descriptions = newTaxon.getDescriptions();
@@ -96,20 +88,12 @@ public class FirstDataInserterTest extends CdmTransactionalIntegrationTest {
        newTaxon = (Taxon)taxonService.find(taxonUUID);
        descriptions = newTaxon.getDescriptions();
        assertEquals(2, descriptions.size());
-       
-       
-       
-       
-       
     }
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.test.integration.CdmIntegrationTest#createTestData()
-     */
+
     @Override
     public void createTestDataSet() throws FileNotFoundException {
         // TODO Auto-generated method stub
-        
     }
 
 }
index b51bb74f0b14e303446e46da67e2be913cde1658..eb2785c789ba2ccdfdb82ee2481e589cc7904b34 100644 (file)
@@ -12,7 +12,6 @@ package eu.etaxonomy.cdm.api.service;
 
 import java.io.FileNotFoundException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -20,7 +19,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
-import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.junit.Assert;
 import org.junit.Ignore;
@@ -28,25 +26,11 @@ import org.junit.Test;
 import org.unitils.dbunit.annotation.DataSet;
 import org.unitils.spring.annotation.SpringBeanByType;
 
-import eu.etaxonomy.cdm.model.molecular.AmplificationResult;
-import eu.etaxonomy.cdm.model.molecular.DnaSample;
-import eu.etaxonomy.cdm.model.molecular.Sequence;
-import eu.etaxonomy.cdm.model.molecular.SingleRead;
-import eu.etaxonomy.cdm.model.name.BotanicalName;
-import eu.etaxonomy.cdm.model.name.NonViralName;
-import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;
-import eu.etaxonomy.cdm.model.occurrence.DerivationEventType;
-import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
-import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
-import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;
 import eu.etaxonomy.cdm.model.taxon.Classification;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonNode;
-import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator;
 import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
-import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;
 import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
 
 /**
index a81dcdf51d4e842d75f1eb04ac12d8bb1c36e4cf..1ddf2d3f934b8ee63d714c869fd0fba361933360 100644 (file)
@@ -15,9 +15,8 @@ import java.io.FileNotFoundException;
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
-import org.junit.Assert;\r
-\r
 import org.apache.log4j.Logger;\r
+import org.junit.Assert;\r
 import org.junit.Ignore;\r
 import org.junit.Test;\r
 import org.unitils.dbunit.annotation.DataSet;\r
@@ -168,6 +167,6 @@ public class CommonServiceImplTest extends CdmIntegrationTest {
     @Override\r
     public void createTestDataSet() throws FileNotFoundException {\r
         // TODO Auto-generated method stub\r
-        \r
+\r
     }\r
 }\r
diff --git a/cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidatorTest.java b/cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/validation/batch/BatchValidatorTest.java
new file mode 100644 (file)
index 0000000..d1dd58f
--- /dev/null
@@ -0,0 +1,129 @@
+// $Id$\r
+/**\r
+ * Copyright (C) 2015 EDIT\r
+ * European Distributed Institute of Taxonomy\r
+ * http://www.e-taxonomy.eu\r
+ *\r
+ * The contents of this file are subject to the Mozilla Public License Version 1.1\r
+ * See LICENSE.TXT at the top of this package for the full license terms.\r
+ */\r
+package eu.etaxonomy.cdm.api.validation.batch;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.sql.SQLException;\r
+import java.util.List;\r
+import java.util.Set;\r
+\r
+import javax.validation.Validation;\r
+import javax.validation.Validator;\r
+import javax.validation.ValidatorFactory;\r
+\r
+import org.hibernate.validator.HibernateValidator;\r
+import org.hibernate.validator.HibernateValidatorConfiguration;\r
+import org.junit.Assert;\r
+import org.junit.Ignore;\r
+import org.junit.Test;\r
+import org.springframework.context.ApplicationContext;\r
+import org.unitils.spring.annotation.SpringApplicationContext;\r
+\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
+import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;\r
+import eu.etaxonomy.cdm.api.service.IEntityValidationService;\r
+import eu.etaxonomy.cdm.api.service.IReferenceService;\r
+import eu.etaxonomy.cdm.api.validation.batch.BatchValidator;\r
+import eu.etaxonomy.cdm.database.CdmDataSource;\r
+import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
+import eu.etaxonomy.cdm.database.ICdmDataSource;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
+import eu.etaxonomy.cdm.model.validation.EntityValidation;\r
+import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;\r
+\r
+/**\r
+ * @author admin.ayco.holleman\r
+ * @date 11 feb. 2015\r
+ *\r
+ */\r
+public class BatchValidatorTest extends CdmTransactionalIntegrationTest {\r
+\r
+//    @SpringBeanByType\r
+//    private BatchValidator batchValidator;\r
+\r
+//    @SpringBeanByName  //does not exist as such\r
+    private ICdmApplicationConfiguration app;\r
+\r
+    @SpringApplicationContext\r
+    private ApplicationContext applicationContext;\r
+\r
+    /**\r
+     * Test method for\r
+     * {@link eu.etaxonomy.cdm.api.validation.batch.BatchValidator#run()}.\r
+     *\r
+     * @throws SQLException\r
+     */\r
+    @Test\r
+    @Ignore\r
+    public void testRun() throws SQLException {\r
+\r
+        ICdmDataSource dataSource = CdmDataSource.NewH2EmbeddedInstance("PUBLIC", "sa", "");\r
+        app = CdmApplicationController.NewInstance(dataSource, DbSchemaValidation.CREATE);\r
+\r
+        HibernateValidatorConfiguration config = Validation.byProvider(HibernateValidator.class).configure();\r
+        ValidatorFactory validatorFactory = config.buildValidatorFactory();\r
+        Validator validator = validatorFactory.getValidator();\r
+\r
+        BatchValidator batchValidator = new BatchValidator();\r
+        batchValidator.setAppController(app);\r
+        batchValidator.setValidator(validator);\r
+        batchValidator.setValidationGroups(BatchValidator.DEFAULT_VALIDATION_GROUPS);\r
+\r
+        // Create 10 References of type book and 10 of type Journal\r
+\r
+        IReferenceService refService = app.getReferenceService();\r
+        for (int i = 0; i < 10; ++i) {\r
+            Reference<?> ref0 = ReferenceFactory.newBook();\r
+            ref0.setIsbn("bla bla");\r
+            ref0.setIssn("foo foo");\r
+            // Each book should violate 3 constraints\r
+            if (i == 0) {\r
+                Set<?> errors = validator.validate(ref0, BatchValidator.DEFAULT_VALIDATION_GROUPS);\r
+                // We 're really not testing the BatchValidator here, but our\r
+                // knowledge of the constraints on the Reference class, so we\r
+                // do a plain java language assert here.\r
+                assert (errors.size() == 3);\r
+            }\r
+            refService.save(ref0);\r
+            Reference<?> ref1 = ReferenceFactory.newJournal();\r
+            ref1.setIsbn("bar bar");\r
+            ref1.setIssn("baz baz");\r
+            // Each journal should violate 4 constraints\r
+            if (i == 0) {\r
+                Set<?> errors = validator.validate(ref1, BatchValidator.DEFAULT_VALIDATION_GROUPS);\r
+                assert (errors.size() == 4);\r
+            }\r
+            refService.save(ref1);\r
+        }\r
+\r
+        batchValidator.run();\r
+\r
+        // So we should have 20 validation results (10 for books, 10 for\r
+        // journals);\r
+        IEntityValidationService validationResultService = app.getEntityValidationService();\r
+        List<EntityValidation> results = validationResultService.getValidationResults();\r
+        Assert.assertEquals("Expected 20 validation results", 20, results.size());\r
+\r
+        // And we should have a total of 70 (10 * (3+4)) constraint violations\r
+        int errors = 0;\r
+        for(EntityValidation result: results) {\r
+            errors += result.getEntityConstraintViolations().size();\r
+        }\r
+        Assert.assertEquals("Expected 70 errors", 70, errors);\r
+\r
+    }\r
+\r
+    @Override\r
+    public void createTestDataSet() throws FileNotFoundException {\r
+        // TODO Auto-generated method stub\r
+    }\r
+\r
+}\r
index 0da8c28adcc226c5675ac91a35079426650f1da8..a76386ae23de2e8cbaa813236b3ae8ab273c20b1 100644 (file)
@@ -5,7 +5,7 @@
 *\r
 * The contents of this file are subject to the Mozilla Public License Version 1.1\r
 * See LICENSE.TXT at the top of this package for the full license terms.\r
-*/ \r
+*/\r
 \r
 package eu.etaxonomy.cdm.test.function;\r
 \r
@@ -20,8 +20,7 @@ import org.apache.log4j.Level;
 import org.apache.log4j.Logger;\r
 import org.hibernate.Query;\r
 import org.hibernate.Session;\r
-import org.hibernate.SessionFactory;\r
-import org.hibernate.internal.SessionFactoryImpl;\r
+import org.springframework.orm.hibernate4.HibernateTransactionManager;\r
 import org.springframework.transaction.TransactionStatus;\r
 \r
 import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
@@ -29,6 +28,7 @@ import eu.etaxonomy.cdm.api.application.CdmApplicationUtils;
 import eu.etaxonomy.cdm.api.service.ITaxonNodeService;\r
 import eu.etaxonomy.cdm.api.service.ITaxonService;\r
 import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;\r
+import eu.etaxonomy.cdm.api.validation.ValidationManager;\r
 import eu.etaxonomy.cdm.common.AccountStore;\r
 import eu.etaxonomy.cdm.common.monitor.DefaultProgressMonitor;\r
 import eu.etaxonomy.cdm.database.CdmDataSource;\r
@@ -61,16 +61,17 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 public class Datasource {\r
        private static final Logger logger = Logger.getLogger(Datasource.class);\r
 \r
-       \r
+\r
        private void testNewConfigControler(){\r
                List<CdmPersistentDataSource> lsDataSources = CdmPersistentDataSource.getAllDataSources();\r
                DbSchemaValidation schema = DbSchemaValidation.CREATE;\r
+\r
                System.out.println(lsDataSources);\r
                ICdmDataSource dataSource;\r
-               \r
+\r
                dataSource = lsDataSources.get(1);\r
 //             DatabaseTypeEnum dbType = DatabaseTypeEnum.MySQL;\r
-               \r
+\r
                String server = "localhost";\r
                String database = (schema == DbSchemaValidation.VALIDATE  ? "cdm34" : "cdm341");\r
                database = "cdm_test";\r
@@ -82,7 +83,7 @@ public class Datasource {
 //             String username = "edit";\r
 //             dataSource = CdmDataSource.NewMySqlInstance(server, database, username, AccountStore.readOrStorePassword(server, database, username, null));\r
 \r
-               \r
+\r
 //             String server = "test.e-taxonomy.eu";\r
 ////           String database = "cdm_test";\r
 //             String database = "cdm_edit_flora_malesiana";\r
@@ -92,22 +93,22 @@ public class Datasource {
 //             String server = "localhost";\r
 //             String database = "testCDM";\r
 //             String username = "postgres";\r
-//             dataSource = CdmDataSource.NewInstance(DatabaseTypeEnum.PostgreSQL, server, database, DatabaseTypeEnum.PostgreSQL.getDefaultPort(), username, AccountStore.readOrStorePassword(server, database, username, null)); \r
-               \r
-               \r
+//             dataSource = CdmDataSource.NewInstance(DatabaseTypeEnum.PostgreSQL, server, database, DatabaseTypeEnum.PostgreSQL.getDefaultPort(), username, AccountStore.readOrStorePassword(server, database, username, null));\r
+\r
+\r
 //             //SQLServer\r
 //             database = "CDMTest";\r
 //             int port = 1433;\r
 //             username = "pesiexport";\r
 ////           dataSource = CdmDataSource.NewSqlServer2005Instance(server, database, port, username, AccountStore.readOrStorePassword(server, database, username, null));\r
-//             \r
+//\r
                //H2\r
 //             String path = "C:\\Users\\a.mueller\\eclipse\\svn\\cdmlib-trunk\\cdmlib-remote-webapp\\src\\test\\resources\\h2";\r
        String path = "C:\\Users\\pesiimport\\.cdmLibrary\\writableResources\\h2\\LocalH2_test34";\r
                username = "sa";\r
        dataSource = CdmDataSource.NewH2EmbeddedInstance("cdmTest", username, "", path,   NomenclaturalCode.ICNAFP);\r
 //     dataSource = CdmDataSource.NewH2EmbeddedInstance(database, username, "sa", NomenclaturalCode.ICNAFP);\r
-       \r
+\r
                try {\r
                        CdmUpdater updater = new CdmUpdater();\r
                        if (schema == DbSchemaValidation.VALIDATE){\r
@@ -116,17 +117,25 @@ public class Datasource {
                } catch (Exception e) {\r
                        e.printStackTrace();\r
                }\r
-               \r
+\r
                //CdmPersistentDataSource.save(dataSource.getName(), dataSource);\r
                CdmApplicationController appCtr;\r
                appCtr = CdmApplicationController.NewInstance(dataSource,schema);\r
-               \r
+\r
 //             appCtr.getCommonService().createFullSampleData();\r
 \r
-               //              insertSomeData(appCtr);\r
-//             deleteHighLevelNode(appCtr);   //->problem with Duplicate Key in Classification_TaxonNode               \r
+               HibernateTransactionManager transMan = (HibernateTransactionManager)appCtr.getBean("transactionManager");\r
+\r
+               ValidationManager valMan = (ValidationManager)appCtr.getBean("validationManager");\r
+               valMan.registerValidationListeners();\r
+\r
+               Reference<?> ref = ReferenceFactory.newDatabase();\r
+               ref.setIsbn("1234");\r
+               appCtr.getReferenceService().save(ref);\r
 \r
-               \r
+\r
+               //              insertSomeData(appCtr);\r
+//             deleteHighLevelNode(appCtr);   //->problem with Duplicate Key in Classification_TaxonNode\r
                appCtr.close();\r
        }\r
 \r
@@ -140,7 +149,7 @@ public class Datasource {
                Taxon taxon = node.getTaxon();\r
                //try {\r
                        taxonService.deleteTaxon(taxon, new TaxonDeletionConfigurator(), node.getClassification());\r
-                       \r
+\r
                /*} catch (DataChangeNoRollbackException e) {\r
                        e.printStackTrace();\r
                }*/\r
@@ -151,65 +160,65 @@ public class Datasource {
                        e.printStackTrace();\r
                }\r
                TaxonNode node2 = service.find(60554);\r
-               \r
-               \r
+\r
+\r
        }\r
 \r
        private void insertSomeData(CdmApplicationController appCtr) {\r
                Classification cl = Classification.NewInstance("myClass");\r
                TaxonNode node1 = cl.addChildTaxon(Taxon.NewInstance(BotanicalName.NewInstance(null), null), null, null);\r
                appCtr.getClassificationService().save(cl);\r
-               \r
+\r
                Taxon t2 = Taxon.NewInstance(null, null);\r
                t2.setTitleCache("Taxon2", true);\r
                TaxonNode node2 = node1.addChildTaxon(t2, null, null);\r
-               \r
+\r
                Taxon t3 = Taxon.NewInstance(null, null);\r
                t3.setTitleCache("Taxon3", true);\r
                TaxonNode node3 = node1.addChildTaxon(t3, 0, null, null);\r
-               \r
+\r
                appCtr.getTaxonNodeService().saveOrUpdate(node1);\r
-               \r
+\r
                cl.addChildNode(node3, 0, null, null);\r
                appCtr.getTaxonNodeService().saveOrUpdate(node3);\r
                appCtr.getClassificationService().saveOrUpdate(cl);\r
-               \r
+\r
                FeatureTree ft1 = FeatureTree.NewInstance();\r
                FeatureNode fn1 = FeatureNode.NewInstance(null);\r
                ft1.getRoot().addChild(fn1);\r
                appCtr.getFeatureNodeService().save(fn1);\r
-               \r
+\r
                FeatureNode fn2 = FeatureNode.NewInstance(null);\r
                fn1.addChild(fn2);\r
-               \r
+\r
                FeatureNode fn3 = FeatureNode.NewInstance(null);\r
                fn1.addChild(fn2, 0);\r
-               \r
+\r
                appCtr.getFeatureNodeService().saveOrUpdate(fn1);\r
-               \r
+\r
                ft1.getRoot().addChild(fn3, 0);\r
                appCtr.getFeatureNodeService().saveOrUpdate(fn3);\r
                appCtr.getFeatureTreeService().saveOrUpdate(ft1);\r
        }\r
-       \r
+\r
        private void testDatabaseChange() throws DataSourceNotFoundException{\r
                CdmApplicationController appCtr;\r
                appCtr = CdmApplicationController.NewInstance();\r
-       \r
+\r
 //             DatabaseTypeEnum dbType = DatabaseTypeEnum.MySQL;\r
 //             String server = "192.168.2.10";\r
 //             String database = "cdm_test_andreas";\r
 //             String user = "edit";\r
 //             String pwd = "wp5";\r
-//             \r
+//\r
                DatabaseTypeEnum dbType = DatabaseTypeEnum.SqlServer2005;\r
                String server = "LAPTOPHP";\r
                String database = "cdmTest";\r
                String username = "edit";\r
                String password = "";\r
-               \r
+\r
                ICdmDataSource dataSource = CdmDataSource.NewInstance(DatabaseTypeEnum.SqlServer2005, "LAPTOPHP", "cdmTest", DatabaseTypeEnum.SqlServer2005.getDefaultPort(), "edit", "");\r
-               \r
+\r
                appCtr.getDatabaseService().saveDataSource("testSqlServer", dataSource);\r
                try {\r
                        appCtr.getDatabaseService().connectToDatabase(dbType, server, database, username, password);\r
@@ -217,7 +226,7 @@ public class Datasource {
                        // TODO Auto-generated catch block\r
                        e.printStackTrace();\r
                }\r
-               \r
+\r
                appCtr.close();\r
        }\r
 \r
@@ -227,9 +236,9 @@ public class Datasource {
                String database = "cdmTest";\r
                String username = "edit";\r
                String password = "";\r
-               \r
-               ICdmDataSource dataSource = CdmDataSource.NewInstance(databaseTypeEnum, server, database, databaseTypeEnum.getDefaultPort(), username, password); \r
-               \r
+\r
+               ICdmDataSource dataSource = CdmDataSource.NewInstance(databaseTypeEnum, server, database, databaseTypeEnum.getDefaultPort(), username, password);\r
+\r
                CdmPersistentDataSource ds = CdmPersistentDataSource.save("testSqlServer", dataSource);\r
 \r
                CdmApplicationController appCtr = CdmApplicationController.NewInstance(ds);\r
@@ -238,18 +247,18 @@ public class Datasource {
                TaxonNameBase<?,?> tn = BotanicalName.NewInstance(null);\r
                appCtr.getNameService().save(tn);\r
                appCtr.close();\r
-               \r
+\r
        }\r
-       \r
+\r
        private void testPostgreServer(){\r
                DatabaseTypeEnum databaseTypeEnum = DatabaseTypeEnum.PostgreSQL;\r
                String server = "192.168.1.17";\r
                String database = "cdm_test";\r
                String username = "edit";\r
                String password = "";\r
-               \r
-               ICdmDataSource dataSource = CdmDataSource.NewInstance(databaseTypeEnum, server, database, databaseTypeEnum.getDefaultPort(), username, password); \r
-               \r
+\r
+               ICdmDataSource dataSource = CdmDataSource.NewInstance(databaseTypeEnum, server, database, databaseTypeEnum.getDefaultPort(), username, password);\r
+\r
                CdmPersistentDataSource ds = CdmPersistentDataSource.save("PostgreTest", dataSource);\r
 \r
                CdmApplicationController appCtr = CdmApplicationController.NewInstance(ds);\r
@@ -260,7 +269,7 @@ public class Datasource {
                appCtr.close();\r
 \r
        }\r
-       \r
+\r
        private void testLocalHsql() throws DataSourceNotFoundException{\r
                CdmApplicationController appCtr = null;\r
                try {\r
@@ -275,22 +284,22 @@ public class Datasource {
                        logger.error("Runtime Exception");\r
                        e.printStackTrace();\r
                        appCtr.close();\r
-                       \r
+\r
                } catch (DataSourceNotFoundException e) {\r
                        logger.error("Runtime Exception");\r
                        e.printStackTrace();\r
                }\r
        }\r
-       \r
+\r
        private void testLocalH2(){\r
-               \r
+\r
                DbSchemaValidation validation = DbSchemaValidation.CREATE;\r
-               ICdmDataSource ds = \r
+               ICdmDataSource ds =\r
                        CdmDataSource.NewH2EmbeddedInstance("cdm", "sa", "", null);\r
 //                     ds =\r
 //                              CdmPersistentDataSource.NewInstance("localH2");\r
                CdmApplicationController appCtr = CdmApplicationController.NewInstance(ds, validation);\r
-               \r
+\r
                boolean exists = appCtr.getUserService().userExists("admin");\r
                try {\r
                        BotanicalName name = BotanicalName.NewInstance(null);\r
@@ -305,41 +314,41 @@ public class Datasource {
                        NamedArea area1 = appCtr.getTermService().getAreaByTdwgAbbreviation("GER");\r
                        Distribution distribution = Distribution.NewInstance(area1, PresenceAbsenceTerm.PRESENT());\r
                        description.addElement(distribution);\r
-                       \r
+\r
                        List<Distribution> distrList = new ArrayList<Distribution>();\r
                        distrList.add(distribution);\r
                        List<NamedArea> areaList = new ArrayList<NamedArea>();\r
                        areaList.add(area1);\r
-                       \r
+\r
                //      distribution.getInDescription().get\r
                        appCtr.getTaxonService().save(taxon);\r
 \r
                        System.out.println(taxon.getDescriptions().size());\r
-                       \r
+\r
                        TransactionStatus txStatus = appCtr.startTransaction();\r
-                       \r
+\r
                        Session session = appCtr.getSessionFactory().getCurrentSession();\r
-                       \r
-                       //String hqlQuery = "from DescriptionBase d join d.elements  as e " \r
+\r
+                       //String hqlQuery = "from DescriptionBase d join d.elements  as e "\r
 //                             String hqlQuery = "from Taxon t join t.descriptions  as d "+\r
 //                              " inner join d.elements e on e member of d "\r
 //                             +\r
-//                             "";//" where e.area = :namedArea " ; \r
+//                             "";//" where e.area = :namedArea " ;\r
                        String hqlQuery = "Select t from Distribution e join e.inDescription d join d.taxon t join t.name n "+\r
-                               " WHERE e.area in (:namedArea) AND n.nameCache = :nameCache ";                          \r
+                               " WHERE e.area in (:namedArea) AND n.nameCache = :nameCache ";\r
                        Query query = session.createQuery(hqlQuery);\r
-                       \r
+\r
                        //query.setEntity("namedArea", area1);\r
                        query.setParameter("nameCache", nameCache);\r
                        query.setParameterList("namedArea", areaList);\r
                        List resultList = query.list();\r
                        //List list = appCtr.getCommonService().getHqlResult(hqlQuery);\r
-                       \r
+\r
                        for (Object o:resultList){\r
                                System.out.println(o);\r
                        }\r
                        appCtr.commitTransaction(txStatus);\r
-                       \r
+\r
                        //System.out.println(l);\r
                        //Agent agent = new Agent();\r
                        //appCtr.getAgentService().saveAgent(agent);\r
@@ -348,10 +357,10 @@ public class Datasource {
                        logger.error("Runtime Exception");\r
                        e.printStackTrace();\r
                        appCtr.close();\r
-                       \r
+\r
                }\r
        }\r
-               \r
+\r
        private boolean testWritableResourceDirectory() throws IOException{\r
                CdmApplicationUtils.getWritableResourceDir();\r
                return true;\r
@@ -362,7 +371,7 @@ public class Datasource {
 //             if (true)return true;\r
 \r
                DbSchemaValidation validation = DbSchemaValidation.CREATE;\r
-               ICdmDataSource ds = \r
+               ICdmDataSource ds =\r
                        CdmDataSource.NewH2EmbeddedInstance("cdm", "sa", "", null);\r
                        //CdmDataSource.NewH2EmbeddedInstance("cdm", "sa", "");\r
 //             ds =\r
@@ -379,39 +388,39 @@ public class Datasource {
                                Logger loggerTrace = logger.getLogger("org.hibernate.type");\r
                                loggerTrace.setLevel(Level.TRACE);\r
                                System.out.println(logger.getName());\r
-                               \r
+\r
                                appCtr.getNameService().save(botName1);\r
                                ResultSet rs = ds.executeQuery("Select count(*) as n FROM NameRelationship");\r
                                rs.next();\r
                                int c = rs.getInt("n");\r
                                System.out.println("Begin :" + c);\r
-                               \r
+\r
                                botName1.removeRelationToTaxonName(botName2);\r
                                botName1.setSpecificEpithet("DELETED");\r
                                botName2.addHybridParent(hybridName, HybridRelationshipType.FIRST_PARENT(), null);\r
-                               \r
+\r
                                TransactionStatus tx = appCtr.startTransaction();\r
                                appCtr.getNameService().saveOrUpdate(botName2);\r
                                rs = ds.executeQuery("Select count(*) as n FROM NameRelationship");\r
                                rs.next();\r
                                c = rs.getInt("n");\r
                                System.out.println("End: " + c);\r
-       \r
+\r
                                appCtr.commitTransaction(tx);\r
-                               \r
+\r
                                appCtr.getNameService().saveOrUpdate(botName1);\r
-                               \r
+\r
                                rs = ds.executeQuery("Select count(*) as n FROM NameRelationship");\r
                                rs.next();\r
                                c = rs.getInt("n");\r
                                System.out.println("End: " + c);\r
-                               \r
+\r
                        } catch (SQLException e) {\r
                                // TODO Auto-generated catch block\r
                                e.printStackTrace();\r
                        }\r
-                       \r
-                       \r
+\r
+\r
                        //Agent agent = new Agent();\r
                        //appCtr.getAgentService().saveAgent(agent);\r
                        appCtr.close();\r
@@ -420,18 +429,18 @@ public class Datasource {
                        logger.error("Runtime Exception");\r
                        e.printStackTrace();\r
                        appCtr.close();\r
-                       \r
+\r
                }\r
                return false;\r
        }\r
-       \r
+\r
        private void test(){\r
                System.out.println("Start Datasource");\r
                testNewConfigControler();\r
        //testDatabaseChange();\r
-               \r
+\r
                //testSqlServer();\r
-               \r
+\r
                //CdmUtils.findLibrary(au.com.bytecode.opencsv.CSVReader.class);\r
                //testPostgreServer();\r
                //testLocalHsql();\r
@@ -440,7 +449,7 @@ public class Datasource {
 //             testH2();\r
                System.out.println("\nEnd Datasource");\r
        }\r
-       \r
+\r
        /**\r
         * @param args\r
         */\r
diff --git a/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestModelUpdate.java b/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestModelUpdate.java
new file mode 100644 (file)
index 0000000..7231dff
--- /dev/null
@@ -0,0 +1,122 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.test.function;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
+import eu.etaxonomy.cdm.common.AccountStore;\r
+import eu.etaxonomy.cdm.common.monitor.DefaultProgressMonitor;\r
+import eu.etaxonomy.cdm.database.CdmDataSource;\r
+import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
+import eu.etaxonomy.cdm.database.update.CdmUpdater;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
+import eu.etaxonomy.cdm.model.common.IntextReference;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.common.LanguageString;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+public class TestModelUpdate {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(TestModelUpdate.class);\r
+\r
+       \r
+       private void testMySQL(){\r
+               DbSchemaValidation schema = DbSchemaValidation.VALIDATE;\r
+\r
+//             DatabaseTypeEnum dbType = DatabaseTypeEnum.MySQL;\r
+               \r
+               String server = "localhost";\r
+               String database = (schema == DbSchemaValidation.VALIDATE  ? "cdm34" : "cdm35");\r
+//             database = "validation_cichorieae";\r
+               String username = "edit";\r
+               CdmDataSource dataSource = CdmDataSource.NewMySqlInstance(server, database, username, AccountStore.readOrStorePassword(server, database, username, null));\r
+\r
+       \r
+               try {\r
+                       CdmUpdater updater = new CdmUpdater();\r
+                       if (schema == DbSchemaValidation.VALIDATE){\r
+                               updater.updateToCurrentVersion(dataSource, DefaultProgressMonitor.NewInstance());\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+               \r
+               //CdmPersistentDataSource.save(dataSource.getName(), dataSource);\r
+               CdmApplicationController appCtr;\r
+               appCtr = CdmApplicationController.NewInstance(dataSource,schema);\r
+               \r
+               Person person = Person.NewInstance();\r
+               TextData textData = TextData.NewInstance();\r
+               Taxon taxon = Taxon.NewInstance(null, null);\r
+               TaxonDescription description = TaxonDescription.NewInstance(taxon);\r
+               description.addElement(textData);\r
+               LanguageString text = textData.putText(Language.ENGLISH(), "Ich bin ein toller text");\r
+               IntextReference.NewAgentInstance(person, text, 3, 5);\r
+\r
+               appCtr.getAgentService().save(person);\r
+               appCtr.getTaxonService().save(taxon);\r
+//             appCtr.getCommonService().createFullSampleData();\r
+\r
+               //              insertSomeData(appCtr);\r
+//             deleteHighLevelNode(appCtr);   //->problem with Duplicate Key in Classification_TaxonNode               \r
+               \r
+               appCtr.close();\r
+       }\r
+       \r
+       \r
+\r
+//     String server = "localhost";\r
+//     String database = "testCDM";\r
+//     String username = "postgres";\r
+//     dataSource = CdmDataSource.NewInstance(DatabaseTypeEnum.PostgreSQL, server, database, DatabaseTypeEnum.PostgreSQL.getDefaultPort(), username, AccountStore.readOrStorePassword(server, database, username, null)); \r
+       \r
+       \r
+//     //SQLServer\r
+//     database = "CDMTest";\r
+//     int port = 1433;\r
+//     username = "pesiexport";\r
+////   dataSource = CdmDataSource.NewSqlServer2005Instance(server, database, port, username, AccountStore.readOrStorePassword(server, database, username, null));\r
+//     \r
+       //H2\r
+//     String path = "C:\\Users\\a.mueller\\eclipse\\svn\\cdmlib-trunk\\cdmlib-remote-webapp\\src\\test\\resources\\h2";\r
+//     String path = "C:\\Users\\a.mueller\\.cdmLibrary\\writableResources\\h2\\LocalH2_test34";\r
+//     username = "sa";\r
+//     dataSource = CdmDataSource.NewH2EmbeddedInstance("cdmTest", username, "", path,   NomenclaturalCode.ICNAFP);\r
+//     dataSource = CdmDataSource.NewH2EmbeddedInstance(database, username, "sa", NomenclaturalCode.ICNAFP);\r
+\r
+\r
+       private void test(){\r
+               System.out.println("Start Datasource");\r
+               testMySQL();\r
+       //testDatabaseChange();\r
+               \r
+               //testSqlServer();\r
+               \r
+               //CdmUtils.findLibrary(au.com.bytecode.opencsv.CSVReader.class);\r
+               //testPostgreServer();\r
+               //testLocalHsql();\r
+               //testLocalH2();\r
+               //testWritableResourceDirectory();\r
+//             testH2();\r
+               System.out.println("\nEnd Datasource");\r
+       }\r
+       \r
+       /**\r
+        * @param args\r
+        */\r
+       public static void  main(String[] args) {\r
+               TestModelUpdate cc = new TestModelUpdate();\r
+       cc.test();\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestValidationManager.java b/cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/function/TestValidationManager.java
new file mode 100644 (file)
index 0000000..8b460d1
--- /dev/null
@@ -0,0 +1,75 @@
+// $Id$\r
+/**\r
+* Copyright (C) 2015 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.test.function;\r
+\r
+import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
+import eu.etaxonomy.cdm.api.validation.ValidationManager;\r
+import eu.etaxonomy.cdm.common.AccountStore;\r
+import eu.etaxonomy.cdm.database.CdmDataSource;\r
+import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceFactory;\r
+\r
+/**\r
+ * @author a.mueller\r
+ * @date 23.01.2015\r
+ *\r
+ */\r
+public class TestValidationManager {\r
+\r
+\r
+    public void testMe(){\r
+        DbSchemaValidation schema = DbSchemaValidation.CREATE;\r
+\r
+\r
+        String path = "C:\\Users\\a.mueller\\.cdmLibrary\\writableResources\\h2\\testValidation2";\r
+        String username = "sa";\r
+        CdmDataSource dataSource = CdmDataSource.NewH2EmbeddedInstance("validationTest", username, "", path,   NomenclaturalCode.ICNAFP);\r
+//        dataSource = getMySQLDatasource(schema);\r
+\r
+\r
+        //CdmPersistentDataSource.save(dataSource.getName(), dataSource);\r
+        CdmApplicationController appCtr;\r
+        appCtr = CdmApplicationController.NewInstance(dataSource,schema);\r
+//      appCtr.getCommonService().createFullSampleData();\r
+\r
+        ValidationManager valMan = (ValidationManager)appCtr.getBean("validationManager");\r
+        valMan.registerValidationListeners();\r
+\r
+        Reference<?> ref = ReferenceFactory.newDatabase();\r
+        ref.setIsbn("1234");\r
+        appCtr.getReferenceService().save(ref);\r
+\r
+\r
+        //      insertSomeData(appCtr);\r
+//      deleteHighLevelNode(appCtr);   //->problem with Duplicate Key in Classification_TaxonNode\r
+\r
+        appCtr.close();\r
+\r
+\r
+    }\r
+\r
+    private CdmDataSource getMySQLDatasource (DbSchemaValidation schema){\r
+        String server = "localhost";\r
+        String database = (schema == DbSchemaValidation.VALIDATE  ? "AM_test" : "AM_test");\r
+        String username = "edit";\r
+        CdmDataSource dataSource = CdmDataSource.NewMySqlInstance(server, database, username, AccountStore.readOrStorePassword(server, database, username, null));\r
+        return dataSource;\r
+    }\r
+\r
+    /**\r
+     * @param args\r
+     */\r
+    public static void  main(String[] args) {\r
+        TestValidationManager cc = new TestValidationManager();\r
+        cc.testMe();\r
+    }\r
+}\r
index 9e8d9e2674df19ea81bc86942629e8781c4a9685..264715ec5a837733a8be29d0aae2182eb0b133af 100644 (file)
@@ -1715,21 +1715,24 @@ CREATE CACHED TABLE PUBLIC.DNAQUALITY_AUD(
 );
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.DNAQUALITY_AUD;
 
-CREATE CACHED TABLE PUBLIC.ENTITYVALIDATIONRESULT(
+CREATE CACHED TABLE PUBLIC.ENTITYVALIDATION(
     ID INTEGER NOT NULL,
     UUID VARCHAR(36),
     CREATED TIMESTAMP,
     VALIDATEDENTITYID INTEGER,
     VALIDATEDENTITYUUID VARCHAR(36),
     VALIDATEDENTITYCLASS VARCHAR(255),
+    VALIDATIONCOUNT INTEGER,
+    UPDATED TIMESTAMP,
     USERFRIENDLYDESCRIPTION VARCHAR(255),
     USERFRIENDLYTYPENAME VARCHAR(255),
     CREATEDBY_ID INTEGER,
     UPDATEDBY_ID INTEGER,
-    CRUDEVENTTYPE VARCHAR(24)
+    CRUDEVENTTYPE VARCHAR(24),
+    STATUS VARCHAR(16)
 );
+-- 0 +/- SELECT COUNT(*) FROM PUBLIC.ENTITYVALIDATION;
 
--- 0 +/- SELECT COUNT(*) FROM PUBLIC.ENTITYVALIDATIONRESULT;
 CREATE CACHED TABLE PUBLIC.ENTITYCONSTRAINTVIOLATION(
     ID INTEGER NOT NULL,
     UUID VARCHAR(36),
@@ -1740,12 +1743,13 @@ CREATE CACHED TABLE PUBLIC.ENTITYCONSTRAINTVIOLATION(
     SEVERITY VARCHAR(24),
     MESSAGE VARCHAR(255),
     VALIDATOR VARCHAR(255),
+    VALIDATIONGROUP VARCHAR(63),
     CREATEDBY_ID INTEGER,
     UPDATEDBY_ID INTEGER,
-    ENTITYVALIDATIONRESULT_ID INTEGER
+    ENTITYVALIDATION_ID INTEGER
 );
-
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.ENTITYCONSTRAINTVIOLATION;
+
 CREATE CACHED TABLE PUBLIC.EXTENSION(
     ID INTEGER NOT NULL,
     CREATED TIMESTAMP,
@@ -2206,6 +2210,47 @@ CREATE CACHED TABLE PUBLIC.IDENTIFIER_AUD(
        TYPE_ID INTEGER  
 );
 -- 0 +/- SELECT COUNT(*) FROM PUBLIC.IDENTIFIER_AUD;
+CREATE CACHED TABLE PUBLIC.INTEXTREFERENCE(
+    ID INTEGER NOT NULL,
+    UUID VARCHAR(36),
+    CREATED TIMESTAMP,
+    UPDATED TIMESTAMP,
+    CREATEDBY_ID INTEGER,
+    UPDATEDBY_ID INTEGER,
+       STARTPOS INT,
+       ENDPOS INT,
+       AGENT_ID INT,
+       ANNOTATION_ID INT,
+       LANGUAGESTRING_ID INT,
+       MEDIA_ID INT,
+       OCCURRENCE_ID INT,
+       REFERENCE_ID INT,
+       TAXON_ID INT,
+       TAXONNAME_ID INT
+);
+-- 0 +/- SELECT COUNT(*) FROM PUBLIC.INTEXTREFERENCE;
+CREATE CACHED TABLE PUBLIC.INTEXTREFERENCE_AUD(
+    ID INTEGER NOT NULL,
+    REV INTEGER NOT NULL,
+    REVTYPE TINYINT,
+    UUID VARCHAR(36),
+    CREATED TIMESTAMP,
+    UPDATED TIMESTAMP,
+    CREATEDBY_ID INTEGER,
+    UPDATEDBY_ID INTEGER,
+       STARTPOS INT,
+       ENDPOS INT,
+       AGENT_ID INT,
+       ANNOTATION_ID INT,
+       LANGUAGESTRING_ID INT,
+       MEDIA_ID INT,
+       OCCURRENCE_ID INT,
+       REFERENCE_ID INT,
+       TAXON_ID INT,
+       TAXONNAME_ID INT
+);
+-- 0 +/- SELECT COUNT(*) FROM PUBLIC.INTEXTREFERENCE_AUD;
+
 CREATE CACHED TABLE PUBLIC.INDIVIDUALASSOCIATION_LANGUAGESTRING_AUD(
     REV INTEGER NOT NULL,
     DESCRIPTIONELEMENTBASE_ID INTEGER NOT NULL,
index 80a67da2a5883c5b2656a5bab021b123f6776168..7e4d4fe9768faa20662716ac30236ececbde28a0 100644 (file)
 \r
     <context:property-override location="classpath:override.properties"/>\r
 \r
-    <context:component-scan base-package="eu/etaxonomy/cdm/api/service">\r
+   <context:component-scan base-package="eu/etaxonomy/cdm/api/service">\r
     </context:component-scan>\r
+ <!--    <context:component-scan base-package="eu/etaxonomy/cdm/api/validation">\r
+    </context:component-scan>\r
+    --> \r
+\r
 \r
     <import resource="classpath:/eu/etaxonomy/cdm/services.xml"/>\r
 \r