Implemented additional service methods as part of #466. Ported Pager interface and...
authorben.clark <ben.clark@localhost>
Mon, 5 Jan 2009 12:07:21 +0000 (12:07 +0000)
committerben.clark <ben.clark@localhost>
Mon, 5 Jan 2009 12:07:21 +0000 (12:07 +0000)
40 files changed:
.gitattributes
cdmlib-services/pom.xml
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AnnotatableServiceBase.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/CommonServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DatabaseServiceHibernateImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAgentService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.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/IDatabaseService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IIdentifiableEntityService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMediaService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/INameService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IOccurrenceService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IReferenceService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITermService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MediaServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ReferenceServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TermServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UserService.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/Pager.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/AbstractPagerImpl.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/DefaultPagerImpl.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/StringLabelPagerImpl.java [new file with mode: 0644]
cdmlib-services/src/main/resources/eu/etaxonomy/cdm/services.xml [deleted file]
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/NameServiceImplTest2.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TermServiceImplTest.java
cdmlib-services/src/test/resources/dbscripts/001_cdm.ddl [new file with mode: 0644]
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml [new file with mode: 0644]
cdmlib-services/src/test/resources/unitils.properties [new file with mode: 0644]

index 050bc9f97346343f749fb44296c77388be95fb9a..855800b52b83cf759f5025ceb736c5086b713649 100644 (file)
@@ -1216,10 +1216,12 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/eclipse/EclipseRc
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/eclipse/EclipseRcpSaveGenericApplicationContext.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/eclipse/EclipseRcpSavePathMatchingResourcePatternResolver.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AnnotatableServiceBase.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/CommonServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DatabaseServiceHibernateImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAgentService.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ICommonService.java -text
 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
@@ -1239,7 +1241,11 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ReferenceServiceImpl.
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TermServiceImpl.java -text
-cdmlib-services/src/main/resources/eu/etaxonomy/cdm/services.xml -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UserService.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/Pager.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/AbstractPagerImpl.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/DefaultPagerImpl.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/StringLabelPagerImpl.java -text
 cdmlib-services/src/site/site.xml -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/NameServiceImplTest2.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/TaxonServiceImplTest.java -text
@@ -1254,10 +1260,13 @@ cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/integration/TermLoaderIntegr
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/integration/TestTaxonServices.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/suite/CdmTestSuite.java -text
 cdmlib-services/src/test/java/eu/etaxonomy/cdm/test/unit/CdmUnitTestBase.java -text
+cdmlib-services/src/test/resources/dbscripts/001_cdm.ddl -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm.datasources.xml -text
+cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext.xml -text
 cdmlib-services/src/test/resources/eu/etaxonomy/cdm/cdm.datasources.xml -text
 cdmlib-services/src/test/resources/log4j.properties -text
+cdmlib-services/src/test/resources/unitils.properties -text
 eclipse-feature-sources/build.properties -text
 eclipse-feature-sources/feature.xml -text
 eclipse-feature/.classpath -text
index 567846f3b05ebb9ebef7fb0d4254eefcab652675..adece28f59f0261053ae1ac2c652fef5b1264749 100644 (file)
     <developerConnection>scm:svn:https://dev.e-taxonomy.eu/svn/trunk/cdmlib/cdmlib-service/</developerConnection>\r
     <url>http://dev.e-taxonomy.eu/trac/browser/trunk/cdmlib/cdmlib-service/</url>\r
   </scm>\r
-\r
+  <build>\r
+    <plugins>\r
+      <plugin>\r
+        <groupId>org.apache.maven.plugins</groupId>\r
+        <artifactId>maven-surefire-plugin</artifactId>\r
+        <configuration>\r
+          <!--\r
+          \r
+          /**\r
+           *  Added to prevent OutOfMemoryException (s) when running tests that\r
+           *  require CdmApplicationController - this can only really be a \r
+           *  stopgap until the term-loading is refactored\r
+           */\r
+             \r
+           -->\r
+          <forkMode>pertest</forkMode>\r
+        </configuration>\r
+      </plugin>\r
+    </plugins>\r
+  </build>\r
   <dependencies>\r
         <dependency>\r
                <groupId>eu.etaxonomy</groupId>\r
                <artifactId>cdmlib-persistence</artifactId>\r
        </dependency>\r
+       <dependency>\r
+               <groupId>eu.etaxonomy</groupId>\r
+               <artifactId>cdmlib-persistence</artifactId>\r
+               <type>test-jar</type>\r
+               <scope>test</scope>\r
+               <version>${parent.version}</version>\r
+       </dependency>\r
     <dependency>\r
         <groupId>org.unitils</groupId>\r
         <artifactId>unitils</artifactId>\r
                <groupId>org.eclipse</groupId>\r
                <artifactId>osgi</artifactId>\r
        </dependency>\r
-\r
+    <dependency><!-- Required for TestingAuthenticationProvider etc until 2.5.0 [SEC-1010] -->\r
+               <groupId>org.springframework.security</groupId>\r
+       <artifactId>spring-security-core</artifactId>\r
+       <version>2.0.4</version>\r
+               <type>test-jar</type>\r
+               <scope>test</scope>\r
+       </dependency>\r
   </dependencies>\r
 </project>\r
 \r
index 070c102806a2be6be8e305c4809a6f9db814cf87..dd2812212112669adac0ba3a9e94618b9112d2d2 100644 (file)
@@ -9,6 +9,7 @@
 \r
 package eu.etaxonomy.cdm.api.service;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
@@ -19,10 +20,15 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \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.agent.Agent;\r
 import eu.etaxonomy.cdm.model.agent.Institution;\r
+import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
+import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
 import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;\r
-import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
 \r
 \r
 \r
@@ -32,41 +38,35 @@ import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;
  */\r
 @Service\r
 @Transactional\r
-public class AgentServiceImpl<T extends Agent> extends IdentifiableServiceBase<T> implements IAgentService<T> {\r
+public class AgentServiceImpl extends IdentifiableServiceBase<Agent,IAgentDao> implements IAgentService {\r
     @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(AgentServiceImpl.class);\r
+       \r
 \r
-       private IAgentDao agentDao;\r
-       @Autowired\r
-       protected void setDao(IAgentDao dao) {\r
-               this.dao = (ICdmEntityDao)dao;\r
-               this.agentDao = dao;\r
-       }\r
-\r
-       public List<T> findAgentsByTitle(String title) {\r
+       public List<Agent> findAgentsByTitle(String title) {\r
                return super.findCdmObjectsByTitle(title);\r
        }\r
 \r
-       public T getAgentByUuid(UUID uuid) {\r
-               return super.getCdmObjectByUuid(uuid);\r
+       public Agent getAgentByUuid(UUID uuid) {\r
+               return dao.findByUuid(uuid);\r
        }\r
 \r
-       public UUID saveAgent(T agent) {\r
+       public UUID saveAgent(Agent agent) {\r
                return super.saveCdmObject(agent);\r
        }\r
        \r
        @Transactional(readOnly = false)\r
-       public Map<UUID, T> saveAgentAll(Collection<T> agentCollection){\r
+       public Map<UUID, Agent> saveAgentAll(Collection<Agent> agentCollection){\r
                return saveCdmObjectAll(agentCollection);\r
        }\r
 \r
        \r
        public List<? extends Agent> getAllAgents(int limit, int start){\r
-               return agentDao.list(limit, start);\r
+               return dao.list(limit, start);\r
        }\r
        \r
        public List<Institution> searchInstitutionByCode(String code) {\r
-               return agentDao.getInstitutionByCode(code);\r
+               return dao.getInstitutionByCode(code);\r
        }\r
 \r
        public void generateTitleCache() {\r
@@ -74,5 +74,33 @@ public class AgentServiceImpl<T extends Agent> extends IdentifiableServiceBase<T
                \r
        }\r
 \r
+       @Autowired\r
+       protected void setDao(IAgentDao dao) {\r
+               assert dao != null;\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<InstitutionalMembership> getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countInstitutionalMemberships(person);\r
+               \r
+               List<InstitutionalMembership> results = new ArrayList<InstitutionalMembership>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getInstitutionalMemberships(person, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<InstitutionalMembership>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<Person> getMembers(Team team, Integer pageSize, Integer pageNumber) {\r
+               Integer numberOfResults = dao.countMembers(team);\r
+                       \r
+               List<Person> results = new ArrayList<Person>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getMembers(team, pageSize, pageNumber); \r
+               }\r
+                       \r
+               return new DefaultPagerImpl<Person>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
        \r
 }\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AnnotatableServiceBase.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AnnotatableServiceBase.java
new file mode 100644 (file)
index 0000000..a6178ca
--- /dev/null
@@ -0,0 +1,26 @@
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\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.AnnotatableEntity;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.persistence.dao.common.IAnnotatableDao;\r
+\r
+public abstract class AnnotatableServiceBase<T extends AnnotatableEntity,DAO extends IAnnotatableDao<T>> extends ServiceBase<T, DAO>\r
+               implements IAnnotatableService<T> {\r
+       \r
+       public Pager<Annotation> getAnnotations(T annotatedObj, MarkerType status, Integer pageSize, Integer pageNumber) {\r
+               Integer numberOfResults = dao.countAnnotations(annotatedObj, status);\r
+               \r
+               List<Annotation> results = new ArrayList<Annotation>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getAnnotations(annotatedObj, status, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<Annotation>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+}\r
index 8f9b5323895de661e830953904d195af43d363d6..8fdb153e038c5406ddae44d8dcfcc1581226afae 100644 (file)
@@ -13,18 +13,21 @@ import java.util.List;
 \r
 import org.apache.log4j.Logger;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \r
 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.OriginalSource;\r
+import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IOriginalSourceDao;\r
 \r
 \r
 @Service\r
 @Transactional(readOnly = true)\r
-public class CommonServiceImpl extends ServiceBase<CdmBase> implements ICommonService {\r
+public class CommonServiceImpl extends ServiceBase<OriginalSource,IOriginalSourceDao> implements ICommonService {\r
        @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(CommonServiceImpl.class);\r
        \r
@@ -45,5 +48,10 @@ public class CommonServiceImpl extends ServiceBase<CdmBase> implements ICommonSe
                        result = list.get(0);\r
                }return result;\r
        }\r
+\r
+       @Autowired\r
+       protected void setDao(IOriginalSourceDao dao) {\r
+               this.dao = dao;\r
+       }\r
        \r
 }\r
index bd19d497ec2285dc828c070cabc36859f9a52372..bfa49e471f6fadf87682ba4a5289e39f5b8a6b8f 100644 (file)
@@ -11,6 +11,7 @@ package eu.etaxonomy.cdm.api.service;
 \r
 import org.apache.log4j.Logger;\r
 import org.hibernate.SessionFactory;\r
+import org.springframework.beans.BeansException;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.context.ApplicationContext;\r
 import org.springframework.context.ApplicationContextAware;\r
@@ -32,7 +33,7 @@ import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;
  */\r
 @Service\r
 @Transactional\r
-public class DatabaseServiceHibernateImpl extends ServiceBase implements IDatabaseService, ApplicationContextAware {\r
+public class DatabaseServiceHibernateImpl  implements IDatabaseService, ApplicationContextAware {\r
        private static final Logger logger = Logger.getLogger(DatabaseServiceHibernateImpl.class);\r
        \r
        private static final String TMP_DATASOURCE = "tmp"; \r
@@ -42,9 +43,6 @@ public class DatabaseServiceHibernateImpl extends ServiceBase implements IDataba
        \r
        @Autowired\r
        protected ApplicationContext appContext;\r
-//     public void setApplicationContext(ApplicationContext appContext){\r
-//             this.appContext = appContext;\r
-//     }\r
        \r
        private CdmApplicationController application;\r
        public void setApplicationController(CdmApplicationController cdmApplicationController){\r
@@ -152,5 +150,11 @@ public class DatabaseServiceHibernateImpl extends ServiceBase implements IDataba
        }\r
 \r
 \r
+       public void setApplicationContext(ApplicationContext applicationContext)\r
+                       throws BeansException {\r
+               this.appContext = applicationContext;\r
+       }\r
+\r
+\r
 \r
 }\r
index 4ddd8d1a9014db4300ed25edcfc542fe5b4e7929..a16142d96b90e0128d4327dc65a082aa2b857887 100644 (file)
@@ -13,6 +13,7 @@ import java.util.ArrayList;
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -20,15 +21,29 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \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.Annotation;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
 import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.FeatureNode;\r
 import eu.etaxonomy.cdm.model.description.FeatureTree;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.description.Scope;\r
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TaxonNameDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;\r
+import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IFeatureNodeDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IFeatureTreeDao;\r
 import eu.etaxonomy.cdm.persistence.dao.description.IStatisticalMeasurementValueDao;\r
@@ -40,21 +55,16 @@ import eu.etaxonomy.cdm.persistence.dao.description.IStatisticalMeasurementValue
  */\r
 @Service\r
 @Transactional(readOnly = true)\r
-public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionBase> implements IDescriptionService {\r
+public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionBase,IDescriptionDao> implements IDescriptionService {\r
        \r
        private static final Logger logger = Logger.getLogger(DescriptionServiceImpl.class);\r
 \r
+       protected IDescriptionElementDao descriptionElementDao;\r
        protected IFeatureTreeDao featureTreeDao;\r
        protected IFeatureNodeDao featureNodeDao;\r
        protected ITermVocabularyDao vocabularyDao;\r
        protected IStatisticalMeasurementValueDao statisticalMeasurementValueDao;\r
        \r
-       \r
-       @Autowired\r
-       protected void setDao(IDescriptionDao dao) {\r
-               this.dao = dao;\r
-       }\r
-       \r
        @Autowired\r
        protected void setFeatureTreeDao(IFeatureTreeDao featureTreeDao) {\r
                this.featureTreeDao = featureTreeDao;\r
@@ -75,6 +85,11 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
                this.statisticalMeasurementValueDao = statisticalMeasurementValueDao;\r
        }\r
        \r
+       @Autowired\r
+       protected void setDescriptionElementDao(IDescriptionElementDao descriptionElementDao) {\r
+               this.descriptionElementDao = descriptionElementDao;\r
+       }\r
+       \r
        /**\r
         * \r
         */\r
@@ -84,6 +99,7 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.service.IDescriptionService#getDescriptionBaseByUuid(java.util.UUID)\r
+        * FIXME Candidate for harmonization\r
         */\r
        public DescriptionBase getDescriptionBaseByUuid(UUID uuid) {\r
                return super.getCdmObjectByUuid(uuid);\r
@@ -91,6 +107,7 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.service.IDescriptionService#saveDescription(eu.etaxonomy.cdm.model.description.DescriptionBase)\r
+        * FIXME Candidate for harmonization\r
         */\r
        @Transactional(readOnly = false)\r
        public UUID saveDescription(DescriptionBase description) {\r
@@ -171,5 +188,89 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
                return featureNodeDao.list();\r
        }\r
 \r
-       \r
+       @Autowired\r
+       protected void setDao(IDescriptionDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public <TYPE extends DescriptionBase> int countDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText,Set<Feature> feature) {\r
+               return dao.countDescriptions(type, hasImages, hasText, feature);\r
+       }\r
+\r
+       public <TYPE extends DescriptionElementBase> Pager<TYPE> getDescriptionElements(DescriptionBase description, Set<Feature> features,     Class<TYPE> type, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countDescriptionElements(description, features, type);\r
+               \r
+               List<TYPE> results = new ArrayList<TYPE>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getDescriptionElements(description, features, type, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TYPE>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<Media> getMedia(DescriptionElementBase descriptionElement, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = descriptionElementDao.countMedia(descriptionElement);\r
+               \r
+               List<Media> results = new ArrayList<Media>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = descriptionElementDao.getMedia(descriptionElement, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonDescription> getTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countTaxonDescriptions(taxon, scopes, geographicalScope);\r
+               \r
+               List<TaxonDescription> results = new ArrayList<TaxonDescription>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getTaxonDescriptions(taxon, scopes, geographicalScope, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonNameDescription> getTaxonNameDescriptions(TaxonNameBase name, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countTaxonNameDescriptions(name);\r
+               \r
+               List<TaxonNameDescription> results = new ArrayList<TaxonNameDescription>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getTaxonNameDescriptions(name, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonNameDescription>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public <TYPE extends DescriptionBase> Pager<TYPE> listDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText,        Set<Feature> feature, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countDescriptions(type, hasImages, hasText, feature);\r
+               \r
+               List<TYPE> results = new ArrayList<TYPE>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.listDescriptions(type, hasImages, hasText, feature, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TYPE>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase presence,     Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countDescriptionByDistribution(namedAreas, presence);\r
+               \r
+               List<TaxonDescription> results = new ArrayList<TaxonDescription>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.searchDescriptionByDistribution(namedAreas, presence, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TextData> searchTextData(String queryString, Integer pageSize,     Integer pageNumber) {\r
+        Integer numberOfResults = descriptionElementDao.countTextData(queryString);\r
+               \r
+               List<TextData> results = new ArrayList<TextData>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = descriptionElementDao.searchTextData(queryString, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TextData>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index 4aa80fa23597b63d7fd9e7c25af8b3465ef9117b..735e4f78a466f12d4f12f39ffdcc3182669c4904 100644 (file)
@@ -14,22 +14,49 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.UUID;\r
 \r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.model.agent.Agent;\r
 import eu.etaxonomy.cdm.model.agent.Institution;\r
+import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
+import eu.etaxonomy.cdm.model.agent.Team;\r
 \r
-public interface IAgentService<T extends Agent> extends IIdentifiableEntityService<T> {\r
+public interface IAgentService extends IIdentifiableEntityService<Agent> {\r
        \r
-       public abstract T getAgentByUuid(UUID uuid);\r
+       // FIXME Candidate for harmonization\r
+       public abstract Agent getAgentByUuid(UUID uuid);\r
 \r
-       public abstract UUID saveAgent(T agent);\r
+       // FIXME Candidate for harmonization\r
+       public abstract UUID saveAgent(Agent agent);\r
        \r
-       public abstract Map<UUID, T> saveAgentAll(Collection<T> agentCollection);\r
+       // FIXME Candidate for harmonization\r
+       public abstract Map<UUID, Agent> saveAgentAll(Collection<Agent> agentCollection);\r
        \r
-       public abstract List<T> findAgentsByTitle(String title);\r
+       // FIXME Candidate for harmonization\r
+       public abstract List<Agent> findAgentsByTitle(String title);\r
 \r
+       // FIXME Candidate for harmonization\r
        public abstract List<? extends Agent> getAllAgents(int limit, int start);\r
        \r
        public abstract List<Institution> searchInstitutionByCode(String code);\r
-\r
-\r
+       \r
+       /**\r
+        * Return a paged list of the institutional memberships held by a person\r
+        * \r
+        * @param person the person\r
+        * @param pageSize The maximum number of memberships returned (can be null for all memberships)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing InstitutionalMembership  instances\r
+        */\r
+       public Pager<InstitutionalMembership> getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Return a paged list of the members of a team\r
+        * \r
+        * @param team the team\r
+        * @param pageSize The maximum number of members returned (can be null for all members)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing Person  instances\r
+        */\r
+       public Pager<Person> getMembers(Team team, Integer pageSize, Integer pageNumber);\r
 }\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.java
new file mode 100644 (file)
index 0000000..818064d
--- /dev/null
@@ -0,0 +1,21 @@
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+import eu.etaxonomy.cdm.model.common.AnnotatableEntity;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+\r
+public interface IAnnotatableService<T extends AnnotatableEntity> extends IService<T> {\r
+       \r
+       /**\r
+        * Return a Pager containing Annotation entities belonging to the object supplied, optionally\r
+        * filtered by MarkerType\r
+        * \r
+        * @param annotatedObj The object that "owns" the annotations returned\r
+        * @param status Only return annotations which are marked with a Marker of this type (can be null to return all annotations)\r
+        * @param pageSize The maximum number of terms returned (can be null for all annotations)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager of Annotation entities\r
+        */\r
+       public Pager<Annotation> getAnnotations(T annotatedObj, MarkerType status, Integer pageSize, Integer pageNumber);\r
+}\r
index dece03f18520f4e6591fffe21dde3d178fdf2eeb..092a279dce6a2ec982ffdbdd55cd9ca0bff9bd1f 100644 (file)
@@ -9,11 +9,11 @@
 
 package eu.etaxonomy.cdm.api.service;
 
-import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.common.ISourceable;
+import eu.etaxonomy.cdm.model.common.OriginalSource;
 
 
-public interface ICommonService extends IService<CdmBase>{
+public interface ICommonService extends IService<OriginalSource>{
 //     
 //     /** find cdmBase by UUID**/
 //     public abstract CdmBase getCdmBaseByUuid(UUID uuid);
index e3890692ab0275d65e66b50074b9cba998ceae99..6d182f57fdeff07477000bbff1a1062971448fa0 100644 (file)
@@ -18,7 +18,7 @@ import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;
  * @author a.mueller\r
  *\r
  */\r
-public interface IDatabaseService extends IService {\r
+public interface IDatabaseService {\r
 \r
        /**\r
         * Returns the databaseTypeEnum\r
index 117822ac54ee93fa166e71d8018f78d9ef01cf6a..b98488eae6436b08d4345bf00ab995dff7503778 100644 (file)
@@ -12,14 +12,26 @@ package eu.etaxonomy.cdm.api.service;
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
 import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
 import eu.etaxonomy.cdm.model.description.Feature;\r
 import eu.etaxonomy.cdm.model.description.FeatureNode;\r
 import eu.etaxonomy.cdm.model.description.FeatureTree;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.description.Scope;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.description.TaxonNameDescription;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 \r
 public interface IDescriptionService extends IIdentifiableEntityService<DescriptionBase> {\r
 \r
@@ -52,4 +64,95 @@ public interface IDescriptionService extends IIdentifiableEntityService<Descript
        public abstract TermVocabulary<Feature> getDefaultFeatureVocabulary();\r
        public abstract TermVocabulary<Feature> getFeatureVocabulary(UUID uuid);\r
 \r
+       /**\r
+        * List the descriptions of type <TYPE>, filtered using the following parameters\r
+        *  \r
+        * @param type The type of description returned (Taxon, TaxonName, or Specimen)\r
+        * @param hasMedia Restrict the description to those that do (true) or don't (false) contain <i>elements</i> that have one or more media (can be null)\r
+        * @param hasText Restrict the description to those that do (true) or don't (false) contain TextData <i>elements</i> that have some textual content (can be null)\r
+        * @param feature Restrict the description to those <i>elements</i> which are scoped by one of the Features passed (can be null or empty)\r
+        * @param pageSize The maximum number of descriptions returned (can be null for all descriptions)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing DescriptionBase instances\r
+        */\r
+       public <TYPE extends DescriptionBase> Pager<TYPE> listDescriptions(Class<TYPE> type, Boolean hasMedia, Boolean hasText, Set<Feature> feature, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Count the descriptions of type <TYPE>, filtered using the following parameters\r
+        * \r
+        * @param type The type of description returned (Taxon, TaxonName, or Specimen)\r
+        * @param hasMedia Restrict the description to those that do (true) or don't (false) contain <i>elements</i> that have one or more media (can be null)\r
+        * @param hasText Restrict the description to those that do (true) or don't (false) contain TextData <i>elements</i> that have some textual content (can be null)\r
+        * @param feature Restrict the description to those <i>elements</i> which are scoped by one of the Features passed (can be null or empty)\r
+        * @return a count of DescriptionBase instances\r
+        */\r
+       public <TYPE extends DescriptionBase> int countDescriptions(Class<TYPE> type, Boolean hasImages, Boolean hasText, Set<Feature> feature);\r
+       \r
+       /**\r
+        * Returns description elements of type <TYPE>, belonging to a given description, optionally filtered by one or more features\r
+        * \r
+        * @param description The description which these description elements belong to (can be null to count all description elements)\r
+        * @param features Restrict the results to those description elements which are scoped by one of the Features passed (can be null or empty)\r
+        * @param type The type of description\r
+        * @param pageSize The maximum number of description elements returned (can be null for all description elements)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing DescriptionElementBase instances\r
+        */\r
+       public <TYPE extends DescriptionElementBase> Pager<TYPE> getDescriptionElements(DescriptionBase description,Set<Feature> features, Class<TYPE> type, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Returns a List of TaxonDescription instances, optionally filtered by parameters passed to this method\r
+        * \r
+        * @param taxon The taxon which the description refers to (can be null for all TaxonDescription instances)\r
+        * @param scopes Restrict the results to those descriptions which are scoped by one of the Scope instances passed (can be null or empty)\r
+        * @param geographicalScope Restrict the results to those descriptions which have a geographical scope that overlaps with the NamedArea instances passed (can be null or empty)\r
+        * @param pageSize The maximum number of descriptions returned (can be null for all descriptions)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing TaxonDescription instances\r
+        */\r
+       public Pager<TaxonDescription> getTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Returns a List of TaxonNameDescription instances, optionally filtered by the name which they refer to\r
+        * \r
+        * @param name Restrict the results to those descriptions that refer to a specific name (can be null for all TaxonNameDescription instances)\r
+        * @param pageSize The maximum number of descriptions returned (can be null for all descriptions)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing TaxonNameBase instances\r
+        */\r
+       public Pager<TaxonNameDescription> getTaxonNameDescriptions(TaxonNameBase name, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Returns a List of distinct TaxonDescription instances which have Distribution elements that refer to one of the NamedArea instances passed (optionally\r
+        * filtered by a type of PresenceAbsenceTerm e.g. PRESENT / ABSENT / NATIVE / CULTIVATED etc)\r
+        * \r
+        * @param namedAreas The set of NamedArea instances\r
+        * @param presence Restrict the descriptions to those which have Distribution elements are of this status (can be null)\r
+        * @param pageSize The maximum number of descriptions returned (can be null for all descriptions)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing TaxonDescription instances\r
+        */\r
+       public Pager<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase presence, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+     * Returns a List of TextData elements that match a given queryString provided.\r
+        * \r
+        * @param queryString \r
+        * @param pageSize\r
+        * @param pageNumber\r
+        * @return\r
+        * @throws QueryParseException\r
+        */\r
+       public Pager<TextData> searchTextData(String queryString, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+     * Returns a List of Media that are associated with a given description element\r
+     * \r
+        * @param descriptionElement the description element associated with these media\r
+        * @param pageSize The maximum number of media returned (can be null for all related media)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+     * @return a Pager containing media instances\r
+     */\r
+    public Pager<Media> getMedia(DescriptionElementBase descriptionElement, Integer pageSize, Integer pageNumber);\r
+       \r
 }
\ No newline at end of file
index d9bddebb62c5f507934e29d5a7fd988d330cf25e..8fd098866cbf90f5cc33207a1cf882c32f46c4e8 100644 (file)
@@ -9,13 +9,38 @@
 
 package eu.etaxonomy.cdm.api.service;
 
+import eu.etaxonomy.cdm.api.service.pager.Pager;
+import eu.etaxonomy.cdm.model.common.ISourceable;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
+import eu.etaxonomy.cdm.model.common.OriginalSource;
+import eu.etaxonomy.cdm.model.media.Rights;
 
-public interface IIdentifiableEntityService<T extends IdentifiableEntity> extends IService<T> {
+public interface IIdentifiableEntityService<T extends IdentifiableEntity> extends IAnnotatableService<T> {
 
        /**
         * (Re-)generate the title caches for all objects of this concrete IdentifiableEntity class
         */
        public abstract void generateTitleCache();
 
+       /**
+        * Return a Pager of sources belonging to this object
+        * 
+        * @param t The identifiable entity
+        * @param pageSize The maximum number of sources returned (can be null for all sources)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager of OriginalSource entities
+        */
+    public Pager<OriginalSource> getSources(T t, Integer pageSize, Integer pageNumber);
+    
+       /**
+        * Return a Pager of rights belonging to this object
+        * 
+        * @param t The identifiable entity
+        * @param pageSize The maximum number of rights returned (can be null for all rights)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager of Rights entities
+        */
+    public Pager<Rights> getRights(T t, Integer pageSize, Integer pageNumber);
+    
+    public abstract ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace);
 }
index 067367097c94b3b63cfa7bea78287c31309c0e65..b04755c15fd3913df173f3d8f14c82c825880ca5 100644 (file)
@@ -3,23 +3,37 @@ package eu.etaxonomy.cdm.api.service;
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
-import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+import eu.etaxonomy.cdm.model.description.IdentificationKey;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 \r
-public interface IMediaService<T extends VersionableEntity> extends IService<T> {\r
-//public interface IAgentService<T extends Agent> extends IIdentifiableEntityService<T> {\r
-//     public abstract Map<UUID, T> saveAgentAll(Collection<T> agentCollection);\r
-//     public abstract List<? extends Agent> getAllAgents(int limit, int start);\r
+public interface IMediaService extends IAnnotatableService<Media> {\r
 \r
-       public abstract Map<UUID, T> saveMediaAll(Collection<T> mediaCollection);\r
+       // FIXME candidate for harmonization?\r
+       public abstract Map<UUID, Media> saveMediaAll(Collection<Media> mediaCollection);\r
        \r
+       // FIXME candidate for harmonization?\r
        public abstract List<Media> getAllMedia(int limit, int start);\r
 \r
        public abstract List<MediaRepresentation> getAllMediaRepresentations(int limit, int start);\r
 \r
        public abstract List<MediaRepresentationPart> getAllMediaRepresentationParts(int limit, int start);\r
+       \r
+       /**\r
+        * Return a List of IdentificationKeys, optionally filtered by the parameters passed.\r
+        * \r
+        * @param taxonomicScope a Set of Taxon instances that define the taxonomic scope of the key (can be null)\r
+        * @param geoScopes a Set of NamedArea instances that define the geospatial scope of the key (can be null)\r
+        * @param pageSize The maximum number of keys returned (can be null for all keys)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager containing IdentificationKey instances\r
+        */\r
+       public Pager<IdentificationKey> getIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes, Integer pageSize, Integer pageNumber);\r
 }\r
index cfb2e3b2d9646363aab8d84bb19bce9ff4d2805b..89db81554b796dc97b11742804aadc9d81c6fb23 100644 (file)
@@ -14,6 +14,7 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.UUID;\r
 \r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;\r
@@ -23,18 +24,21 @@ import eu.etaxonomy.cdm.model.name.*;
 public interface INameService extends IIdentifiableEntityService<TaxonNameBase> {\r
 \r
        /**\r
+        * FIXME candidate for harmonization?\r
         * @param uuid\r
         * @return\r
         */\r
        public abstract TaxonNameBase getTaxonNameByUuid(UUID uuid);\r
 \r
        /**\r
+        * FIXME candidate for harmonization?\r
         * @param taxonName\r
         * @return\r
         */\r
        public abstract UUID saveTaxonName(TaxonNameBase taxonName);\r
 \r
        /**\r
+        * FIXME candidate for harmonization?\r
         * Saves a collection of  TaxonNames and return its UUID@param taxonCollection\r
         * @return\r
         */\r
@@ -47,6 +51,7 @@ public interface INameService extends IIdentifiableEntityService<TaxonNameBase>
        public Map<UUID, HomotypicalGroup> saveAllHomotypicalGroups(Collection<HomotypicalGroup> homotypicalGroups);\r
        \r
        /**\r
+        * FIXME candidate for harmonization?\r
         * @param limit\r
         * @param start\r
         * @return\r
@@ -71,7 +76,8 @@ public interface INameService extends IIdentifiableEntityService<TaxonNameBase>
        public abstract List getNamesByName(String name, CdmBase sessionObject);\r
        \r
        // TODO: Remove getNamesByName() methods. Use findNamesByTitle() instead.\r
-               \r
+       \r
+       // FIXME candidate for harmonization?\r
        public abstract List findNamesByTitle(String title);\r
        \r
        public abstract List findNamesByTitle(String title, CdmBase sessionObject);\r
@@ -96,4 +102,54 @@ public interface INameService extends IIdentifiableEntityService<TaxonNameBase>
         * @return\r
         */\r
        public abstract TermVocabulary<NameRelationshipType> getNameRelationshipTypeVocabulary();\r
+       \r
+       /**\r
+        * Return a List of relationships related to this name, optionally filtered \r
+        * by relationship type\r
+        * \r
+        * @param name the name\r
+        * @param type the relationship type (or null to return all relationships) \r
+        * @param pageSize The maximum number of relationships returned (can be null for all relationships)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager of NameRelationship instances\r
+        */\r
+       public Pager<NameRelationship> getRelatedNames(TaxonNameBase name,  NameRelationshipType type, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Return a List of hybrids related to this name, optionally filtered \r
+        * by hybrid relationship type\r
+        * \r
+        * @param name the name\r
+        * @param type the hybrid relationship type (or null to return all hybrids) \r
+        * @param pageSize The maximum number of hybrid relationships returned (can be null for all relationships)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager of HybridRelationship instances\r
+        */\r
+       public Pager<HybridRelationship> getHybridNames(BotanicalName name, HybridRelationshipType type, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Return a List of types related to this name, optionally filtered \r
+        * by type designation status\r
+        * \r
+        * @param name the name\r
+        * @param status the type designation status (or null to return all types) \r
+        * @param pageSize The maximum number of types returned (can be null for all types)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager of TypeDesignationBase instances\r
+        */\r
+       public Pager<TypeDesignationBase> getTypeDesignations(TaxonNameBase name, TypeDesignationStatus status, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Returns a List of TaxonNameBase instances that match the properties passed\r
+        * \r
+        * @param uninomial\r
+        * @param infraGenericEpithet\r
+        * @param specificEpithet\r
+        * @param infraspecificEpithet\r
+        * @param rank\r
+        * @param pageSize The maximum number of names returned (can be null for all names)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @return a Pager of TaxonNameBase instances\r
+        */\r
+       public Pager<TaxonNameBase> searchNames(String uninomial, String infraGenericEpithet, String specificEpithet, String infraspecificEpithet, Rank rank, Integer pageSize, Integer pageNumber);\r
 }
\ No newline at end of file
index eb6a156eb0cb67e560845f340676400621076f53..62ec358508dcb0fcf1cd6c3dc7d156020cdfc271 100644 (file)
@@ -10,8 +10,12 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.UUID;\r
 \r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.occurrence.Collection;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
+import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
 \r
 /**\r
@@ -21,6 +25,7 @@ import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
 public interface IOccurrenceService extends IIdentifiableEntityService<SpecimenOrObservationBase> {\r
 \r
        /**\r
+        * FIXME candidate for harmonization?\r
         * Computes all specimen or observation bases.\r
         * @param limit\r
         * @param start\r
@@ -28,13 +33,18 @@ public interface IOccurrenceService extends IIdentifiableEntityService<SpecimenO
         */\r
        public abstract List<SpecimenOrObservationBase> getAllSpecimenOrObservationBases(int limit, int start);\r
 \r
-       /** Saves a collection of specimen or observation bases.\r
+       /**\r
+        * FIXME candidate for harmonization? \r
+        * Saves a collection of specimen or observation bases.\r
         * @return Map with UUID as key and SpecimenOrObservationBase as value.\r
-        **/\r
+        */\r
        public abstract Map<UUID, ? extends SpecimenOrObservationBase> \r
        saveSpecimenOrObservationBaseAll(java.util.Collection<? extends SpecimenOrObservationBase> specimenOrObservationBaseCollection);\r
 \r
-       /** save a specimen or observation and return its UUID**/\r
+       /** \r
+        * FIXME candidate for harmonizaion?\r
+        * save a specimen or observation and return its UUID\r
+        */\r
        public abstract UUID saveSpecimenOrObservationBase (SpecimenOrObservationBase specimenOrObservationBase);\r
        \r
        public WaterbodyOrCountry getCountryByIso(String iso639);\r
@@ -43,4 +53,34 @@ public interface IOccurrenceService extends IIdentifiableEntityService<SpecimenO
        \r
        /** */\r
        public abstract List<Collection> searchCollectionByCode(String code);\r
+       \r
+       /**\r
+     * Returns a List of Media that are associated with a given occurence\r
+     * \r
+        * @param occurence the occurence associated with these media\r
+        * @param pageSize The maximum number of media returned (can be null for all related media)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+     * @return a Pager of media instances\r
+     */\r
+       public Pager<Media> getMedia(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+     * Returns a List of determinations that have been made for a given occurence\r
+     * \r
+        * @param occurence the occurence associated with these determinations\r
+        * @param pageSize The maximum number of determinations returned (can be null for all related determinations)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+     * @return a Pager of determination instances\r
+     */\r
+       public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+     * Returns a list of derivation events that have involved creating new DerivedUnits from this occurence\r
+     * \r
+        * @param occurence the occurence that was a source of these derivation events\r
+        * @param pageSize The maximum number of derivation events returned (can be null for all related derivation events)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+     * @return a Pager of derivation events\r
+     */\r
+       public Pager<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize, Integer pageNumber);\r
 }\r
index fd5d69d7322419035c4b809b3202def0d3351163..bbaf664e860e8295476ae21f9de51d8f4c3ba219 100644 (file)
@@ -17,29 +17,47 @@ import java.util.Map;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 
 
-public interface IReferenceService<T extends ReferenceBase> extends IIdentifiableEntityService<T> {
-//public interface IReferenceService extends IIdentifiableEntityService<ReferenceBase> {
+public interface IReferenceService extends IIdentifiableEntityService<ReferenceBase> {
        
-       /** Finds reference by UUID **/
+       /**
+        * FIXME candidate for harmonization?
+        *  
+        * Finds reference by UUID 
+        */
        public abstract ReferenceBase getReferenceByUuid(UUID uuid);
 
-       /** Finds references by title **/
-       public List<T> getReferencesByTitle(String title);
+       /**
+        * FIXME candidate for harmonization?
+        * Finds references by title 
+        */
+       public List<ReferenceBase> getReferencesByTitle(String title);
                
-       /** Finds references of a certain kind by title **/
-       public List<T> getReferencesByTitle(String title, Class<T> clazz);
+       /**
+        * FIXME candidate for harmonization?
+        * Finds references of a certain kind by title 
+        */
+       public List<ReferenceBase> getReferencesByTitle(String title, Class<ReferenceBase> clazz);
        
-       /** Gets all references **/
+       /**
+        * FIXME candidate for harmonization? 
+        * Gets all references 
+        */
        public abstract List<ReferenceBase> getAllReferences(int limit, int start);
 
 //     public abstract UUID saveReference(ReferenceBase reference);
 
-       /** Saves a reference and return its UUID **/
-       public abstract UUID saveReference(T reference);
+       /** 
+        * FIXME candidate for harmonization?
+        * Saves a reference and return its UUID 
+        */
+       public abstract UUID saveReference(ReferenceBase reference);
 
 //     public abstract Map<UUID, ReferenceBase> saveReferenceAll(Collection<ReferenceBase> referenceCollection);
        
-       /** Saves a collection of references **/
-       public abstract Map<UUID, T> saveReferenceAll(Collection<T> referenceCollection);
+       /**
+        * FIXME candidate for harmonization? 
+        * Saves a collection of references
+        */
+       public abstract Map<UUID, ReferenceBase> saveReferenceAll(Collection<ReferenceBase> referenceCollection);
        
 }
index 852fe910e8cee48fddea1286c3edff20b575aadb..62f0583b4b08eb2f87594a604547115c4649267f 100644 (file)
 package eu.etaxonomy.cdm.api.service;\r
 \r
 \r
+import java.util.Collection;\r
 import java.util.List;\r
+import java.util.Map;\r
+import java.util.UUID;\r
 \r
 import org.springframework.transaction.annotation.Propagation;\r
 import org.springframework.transaction.annotation.Transactional;\r
@@ -25,10 +28,101 @@ import eu.etaxonomy.cdm.model.common.CdmBase;
 @Transactional(propagation=Propagation.SUPPORTS)\r
 public interface IService<T extends CdmBase>{\r
 \r
-       public abstract int count(Class<T> clazz);\r
+       /**\r
+        * Returns a count of all entities of type <T>\r
+        * @return a count of all entities\r
+        */\r
+       public int count();\r
+\r
+       /**\r
+        * Returns a count of all entities of type <TYPE> that extend <T>\r
+        * @param clazz the class of entities to be counted\r
+        * @return a count of entities\r
+        */\r
+       public <TYPE extends T> int count(Class<TYPE> clazz);\r
+       \r
+       /**\r
+        * Returns a List of entities of type <T>\r
+        * TODO would like to substitute List with Pager, but we need\r
+        * to agree on how to implement paging first\r
+        * \r
+        * @param limit The maximum number of entities returned\r
+        * @param start The offset from the start of the dataset\r
+        * @return a List of entities\r
+        */\r
+       public List<T> list(int limit, int start);\r
+       \r
+       /**\r
+        * Returns a List of entities of type <TYPE> which must extend \r
+        * <T>\r
+        * TODO would like to substitute List with Pager, but we need\r
+        * to agree on how to implement paging first\r
+        * \r
+        * @param type  The type of entities to return\r
+        * @param limit The maximum number of entities returned\r
+        * @param start The offset from the start of the dataset\r
+        * @return a List of entities\r
+        */\r
+       public <TYPE extends T> List<TYPE> list(Class<TYPE> type, int limit, int start);\r
+       \r
+       public List<T> rows(String tableName, int limit, int start);\r
+       \r
+       /**\r
+        * Save a new entity (persists the entity)\r
+        * @param newInstance the new entity to be persisted\r
+        * @return A generated UUID for the new persistent entity\r
+        */\r
+       public UUID save(T newInstance);\r
+       \r
+       /**\r
+        * Save a new entity or update the persistent state of an existing \r
+        * transient entity that has been persisted previously\r
+        * \r
+        * @param transientObject the entity to be persisted\r
+        * @return The unique identifier of the persisted entity\r
+        */\r
+       public UUID saveOrUpdate(T transientObject);\r
+       \r
+       /**\r
+        * Update the persistent state of an existing transient entity \r
+        * that has been persisted previously\r
+        * \r
+        * @param transientObject the entity to be persisted\r
+        * @return The unique identifier of the persisted entity\r
+        */\r
+       public UUID update(T transientObject);\r
+       \r
+       /**\r
+        * Save a collection containing new entities (persists the entities)\r
+        * @param newInstances the new entities to be persisted\r
+        * @return A Map containing the new entities, keyed using the generated UUID's\r
+        *         of those entities\r
+        */\r
+       public Map<UUID,T> saveAll(Collection<T> newInstances);\r
        \r
-       public abstract List<T> list(int limit, int start);\r
+       /**\r
+        * Delete an existing persistent object\r
+        * \r
+        * @param persistentObject the object to be deleted\r
+        * @return the unique identifier of the deleted entity\r
+        */\r
+       public UUID delete(T persistentObject);\r
        \r
-       public abstract List<T> rows(String tableName, int limit, int start);\r
+       /**\r
+        * Return a persisted entity that matches the unique identifier\r
+        * supplied as an argument, or null if the entity does not exist\r
+        * \r
+        * @param uuid the unique identifier of the entity required\r
+        * @return an entity of type <T>, or null if the entity does not exist\r
+        */\r
+       public T findByUuid(UUID uuid);\r
        \r
+       /**\r
+        * Returns true if an entity of type <T> with a unique identifier matching the \r
+        * identifier supplied exists in the database, or false if no such entity can be \r
+        * found. \r
+        * @param uuid the unique identifier of the entity required\r
+        * @return an entity of type <T> matching the uuid, or null if that entity does not exist\r
+        */\r
+       public boolean exists(UUID uuid);\r
 }
\ No newline at end of file
index 52ead361652b8324582ec99fef7f374c4bd95925..73d38fc146f622b8a6cf3cb8896e969590272f84 100644 (file)
@@ -16,35 +16,55 @@ import java.util.UUID;
 
 //import org.springframework.transaction.TransactionStatus;
 
+import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.model.common.RelationshipBase;
+import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;
 
 
 public interface ITaxonService extends IIdentifiableEntityService<TaxonBase>{
        
-       /** */
+       /**
+        * FIXME candidate for harmonization? 
+        */
        public abstract TaxonBase getTaxonByUuid(UUID uuid);
 
-       /** save a taxon and return its UUID**/
+       /**
+        * FIXME candidate for harmonization? 
+        * save a taxon and return its UUID
+        */
        public abstract UUID saveTaxon(TaxonBase taxon);
 
-       /** save a taxon and return its UUID**/
+       /**
+        * FIXME candidate for harmonization?
+        *  save a taxon and return its UUID
+        */
        //public abstract UUID saveTaxon(TaxonBase taxon, TransactionStatus txStatus);
        
-       /** save a collection of taxa and return its UUID**/
+       /**
+        * FIXME candidate for harmonization?
+        * save a collection of taxa and return its UUID
+        */
        public abstract Map<UUID, ? extends TaxonBase> saveTaxonAll(Collection<? extends TaxonBase> taxonCollection);
 
        
-       /** delete a taxon and return its UUID**/
+       /**
+        * FIXME candidate for harmonization?
+        * delete a taxon and return its UUID
+        */
        public abstract UUID removeTaxon(TaxonBase taxon);
        
        /**
         * Computes all taxon bases.
+        * FIXME could substitute with list(Synonym.class, limit, start)
         * @param limit
         * @param start
         * @return
@@ -53,6 +73,7 @@ public interface ITaxonService extends IIdentifiableEntityService<TaxonBase>{
        
        /**
         * Computes all taxon bases.
+        * FIXME could substitute with list(Taxon.class, limit,start)
         * @param limit
         * @param start
         * @return
@@ -61,6 +82,7 @@ public interface ITaxonService extends IIdentifiableEntityService<TaxonBase>{
        
        /**
         * Computes all taxon bases.
+        * FIXME could substitute with list(limit,start) from superclass
         * @param limit
         * @param start
         * @return
@@ -107,4 +129,56 @@ public interface ITaxonService extends IIdentifiableEntityService<TaxonBase>{
                
        public Synonym makeTaxonSynonym (Taxon oldTaxon, Taxon newAcceptedTaxon, SynonymRelationshipType synonymType, ReferenceBase citation, String citationMicroReference);
        
+       /**
+        * Returns the TaxonRelationships (of where relationship.type == type, if this arguement is supplied) 
+        * where the supplied taxon is relatedTo.
+        * 
+        * @param taxon The taxon that is relatedTo
+        * @param type The type of TaxonRelationship (can be null)
+        * @param pageSize The maximum number of relationships returned (can be null for all relationships)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager of TaxonRelationship instances
+        */
+       public Pager<TaxonRelationship> getRelatedTaxa(Taxon taxon, TaxonRelationshipType type, Integer pageSize, Integer pageNumber);
+       
+       /**
+        * Returns the SynonymRelationships (of where relationship.type == type, if this arguement is supplied) 
+        * where the supplied taxon is relatedTo.
+        * 
+        * @param taxon The taxon that is relatedTo
+        * @param type The type of SynonymRelationship (can be null)
+        * @param pageSize The maximum number of relationships returned (can be null for all relationships)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager of SynonymRelationship instances
+        */
+       public Pager<SynonymRelationship> getSynonyms(Taxon taxon, SynonymRelationshipType type, Integer pageSize, Integer pageNumber);
+       
+       /**
+        * Returns a List of TaxonBase instances (or Taxon instances, if accepted == true, or Synonym instance, if accepted == false) where the 
+        * taxonBase.name.nameCache property matches the String queryString (as interpreted by the Lucene QueryParser)
+        * 
+        * @param queryString
+        * @param accepted
+        * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager Taxon instances
+        * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>
+        */
+       public Pager<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber);
+       
+       /**
+        * Returns a list of TaxonBase instances (or Taxon instances, if accepted == true, or Synonym instance, if accepted == false) where the
+        * taxon.name properties match the parameters passed.
+        * 
+        * @param accepted Whether the taxon is accepted (true) a synonym (false), or either (null)
+        * @param uninomial 
+        * @param infragenericEpithet
+        * @param specificEpithet
+        * @param infraspecificEpithet
+        * @param rank
+        * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @return a Pager of TaxonBase instances
+        */
+       public Pager<TaxonBase> findTaxaByName(Boolean accepted, String uninomial, String infragenericEpithet, String specificEpithet, String infraspecificEpithet, Rank rank, Integer pageSize, Integer pageNumber);
 }
index f0b450a88f42a653db64b8facf470dca6a2e7fe7..34e14c989cfa7280af23e4e64ec4cd2475d59c16 100644 (file)
@@ -29,9 +29,11 @@ public interface ITermService extends IService<DefinedTermBase> {
 
        public abstract DefinedTermBase getTermByUri(String uri);
 
+       // FIXME candidate for harmonization?
        public abstract DefinedTermBase getTermByUuid(UUID uuid);
 
        /**
+        * FIXME candidate for harmonization?
         * @param limit
         * @param start
         * @return
@@ -44,11 +46,17 @@ public interface ITermService extends IService<DefinedTermBase> {
 
 
        /**
+        * FIXME candidate for harmonization?
         * @param termBase
         * @return
         */
        public abstract UUID saveTerm(DefinedTermBase termBase);
 
+       /**
+        * FIXME candidate for harmonization?
+        * @param termBaseCollection
+        * @return
+        */
        public Map<UUID, DefinedTermBase> saveTermsAll(Collection<? extends DefinedTermBase> termBaseCollection);
 
        public List<TermVocabulary<DefinedTermBase>> getAllTermVocabularies(int limit, int start);
index 5c38c7eaad5d7740673a0e1320f6d8d0db45d8ee..292833a72c97720bbb5efaaf7a5be3961263e24d 100644 (file)
@@ -9,24 +9,47 @@
 
 package eu.etaxonomy.cdm.api.service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
 
+import eu.etaxonomy.cdm.api.service.pager.Pager;
+import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.ISourceable;
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
-import eu.etaxonomy.cdm.model.name.TaxonNameBase;
+import eu.etaxonomy.cdm.model.common.OriginalSource;
+import eu.etaxonomy.cdm.model.media.Rights;
 import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao;
 
-public abstract class IdentifiableServiceBase<T extends IdentifiableEntity> extends ServiceBase<T
+public abstract class IdentifiableServiceBase<T extends IdentifiableEntity,DAO extends IIdentifiableDao<T>> extends AnnotatableServiceBase<T,DAO
                                                implements IIdentifiableEntityService<T>{
        @SuppressWarnings("unused")
        private static final  Logger logger = Logger.getLogger(IdentifiableServiceBase.class);
-//     protected IIdentifiableDao<T> dao;
-//
-//     protected void setEntityDao(IIdentifiableDao<T> dao){
-//             this.dao=dao;
-//     }
+
+       
+       public Pager<Rights> getRights(T t, Integer pageSize, Integer pageNumber) {
+        Integer numberOfResults = dao.countRights(t);
+               
+               List<Rights> results = new ArrayList<Rights>();
+               if(numberOfResults > 0) { // no point checking again
+                       results = dao.getRights(t, pageSize, pageNumber); 
+               }
+               
+               return new DefaultPagerImpl<Rights>(pageNumber, numberOfResults, pageSize, results);
+       }
+
+       public Pager<OriginalSource> getSources(T t, Integer pageSize, Integer pageNumber) {
+                Integer numberOfResults = dao.countSources(t);
+                       
+                       List<OriginalSource> results = new ArrayList<OriginalSource>();
+                       if(numberOfResults > 0) { // no point checking again
+                               results = dao.getSources(t, pageSize, pageNumber); 
+                       }
+                       
+                       return new DefaultPagerImpl<OriginalSource>(pageNumber, numberOfResults, pageSize, results);
+       }
 
        protected List<T> findCdmObjectsByTitle(String title){
                return ((IIdentifiableDao)dao).findByTitle(title);
@@ -39,4 +62,18 @@ public abstract class IdentifiableServiceBase<T extends IdentifiableEntity> exte
                return ((IIdentifiableDao)dao).findByTitle(title, sessionObject);
        }
        
+       /*
+        * TODO - Migrated from CommonServiceBase
+        *  (non-Javadoc)
+        * @see eu.etaxonomy.cdm.api.service.ICommonService#getSourcedObjectById(java.lang.String, java.lang.String)
+        */
+       public ISourceable getSourcedObjectByIdInSource(Class clazz, String idInSource, String idNamespace) {
+               ISourceable result = null;
+
+               List<T> list = dao.findOriginalSourceByIdInSource(idInSource, idNamespace);
+               if (! list.isEmpty()){
+                       result = list.get(0);
+               }
+               return result;
+       }
 }
index 1609caec4e85563f3ef9a42af7bb2eecac3ab52a..1dec164e60661ea4801c847028e9fc72e69983f3 100644 (file)
@@ -1,49 +1,48 @@
 package eu.etaxonomy.cdm.api.service;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Set;\r
 import java.util.UUID;\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.VersionableEntity;\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.Annotation;\r
+import eu.etaxonomy.cdm.model.description.IdentificationKey;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
 import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;\r
-import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaDao;\r
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaRepresentationDao;\r
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaRepresentationPartDao;\r
 \r
 @Service\r
 @Transactional\r
-public class MediaServiceImpl<T extends VersionableEntity>\r
-extends ServiceBase<T> implements IMediaService<T> {\r
+public class MediaServiceImpl extends AnnotatableServiceBase<Media,IMediaDao> implements IMediaService {\r
        \r
-       private IMediaDao mediaDao;\r
        @Autowired\r
        private IMediaRepresentationDao mediaRepresentationDao;\r
-       @Autowired\r
-       private IMediaRepresentationPartDao mediaRepresentationPartDao;\r
        \r
        @Autowired\r
-       protected void setDao(IMediaDao dao) {\r
-               this.dao = (ICdmEntityDao)dao;\r
-               this.mediaDao = dao;\r
-       }\r
+       private IMediaRepresentationPartDao mediaRepresentationPartDao; \r
        \r
        @Transactional(readOnly = false)\r
-       public Map<UUID, T> saveMediaAll(Collection<T> mediaCollection){\r
+       public Map<UUID, Media> saveMediaAll(Collection<Media> mediaCollection){\r
                return saveCdmObjectAll(mediaCollection);\r
            //TODO: Fix saveAll() types\r
 //             return mediaDao.saveAll(mediaCollection);\r
        }\r
 \r
        public List<Media> getAllMedia(int limit, int start){\r
-               return mediaDao.list(limit, start);\r
+               return dao.list(limit, start);\r
        }\r
 \r
        public List<MediaRepresentation> getAllMediaRepresentations(int limit, int start){\r
@@ -53,4 +52,20 @@ extends ServiceBase<T> implements IMediaService<T> {
        public List<MediaRepresentationPart> getAllMediaRepresentationParts(int limit, int start){\r
                return mediaRepresentationPartDao.list(limit, start);\r
        }\r
+\r
+       @Autowired\r
+       protected void setDao(IMediaDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<IdentificationKey> getIdentificationKeys(Set<Taxon> taxonomicScope, Set<NamedArea> geoScopes,      Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countIdentificationKeys(taxonomicScope, geoScopes);\r
+               \r
+               List<IdentificationKey> results = new ArrayList<IdentificationKey>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getIdentificationKeys(taxonomicScope, geoScopes, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<IdentificationKey>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index fbc38ec89ceb20a6ab8389a0ae3d70b9aa83048e..201e6c07f3d19ec94919e27232673bee9e4a94d9 100644 (file)
@@ -9,6 +9,7 @@
 \r
 package eu.etaxonomy.cdm.api.service;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.List;\r
 import java.util.Map;\r
@@ -20,17 +21,25 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \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.Annotation;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.ReferencedEntityBase;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.name.HybridRelationship;\r
+import eu.etaxonomy.cdm.model.name.HybridRelationshipType;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
 import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.name.TypeDesignationBase;\r
+import eu.etaxonomy.cdm.model.name.TypeDesignationStatus;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IOrderedTermVocabularyDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IReferencedEntityDao;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;\r
@@ -42,33 +51,23 @@ import eu.etaxonomy.cdm.persistence.dao.name.ITypeDesignationDao;
 \r
 @Service\r
 @Transactional(readOnly = true)\r
-public class NameServiceImpl extends IdentifiableServiceBase<TaxonNameBase> implements INameService {\r
+public class NameServiceImpl extends IdentifiableServiceBase<TaxonNameBase,ITaxonNameDao> implements INameService {\r
        static private final Logger logger = Logger.getLogger(NameServiceImpl.class);\r
        \r
-       private ITaxonNameDao nameDao;\r
-       @Autowired\r
+//     @Autowired\r
        protected ITermVocabularyDao vocabularyDao;\r
-       @Autowired\r
+//     @Autowired\r
        protected IOrderedTermVocabularyDao orderedVocabularyDao;\r
-       @Autowired\r
+//     @Autowired\r
        @Qualifier("refEntDao")\r
     protected IReferencedEntityDao<ReferencedEntityBase> referencedEntityDao;\r
-       @Autowired\r
+//     @Autowired\r
        private INomenclaturalStatusDao nomStatusDao;\r
-       @Autowired\r
+//     @Autowired\r
        private ITypeDesignationDao typeDesignationDao;\r
-       @Autowired\r
+//     @Autowired\r
        private IHomotypicalGroupDao homotypicalGroupDao;\r
 \r
-       \r
-       @Autowired\r
-       protected void setDao(ITaxonNameDao dao) {\r
-               //set the base class dao\r
-               super.dao = dao;\r
-               this.nameDao = dao;\r
-       }\r
-\r
-\r
        /**\r
         * Constructor\r
         */\r
@@ -129,7 +128,7 @@ public class NameServiceImpl extends IdentifiableServiceBase<TaxonNameBase> impl
        }\r
 \r
        public List<TaxonNameBase> getAllNames(int limit, int start){\r
-               return nameDao.list(limit, start);\r
+               return dao.list(limit, start);\r
        }\r
 \r
        public List<NomenclaturalStatus> getAllNomenclaturalStatus(int limit, int start){\r
@@ -177,4 +176,53 @@ public class NameServiceImpl extends IdentifiableServiceBase<TaxonNameBase> impl
                // TODO Auto-generated method stub\r
        }\r
 \r
+       @Autowired\r
+       protected void setDao(ITaxonNameDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<HybridRelationship> getHybridNames(BotanicalName name,     HybridRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countHybridNames(name, type);\r
+               \r
+               List<HybridRelationship> results = new ArrayList<HybridRelationship>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getHybridNames(name, type, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<HybridRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<NameRelationship> getRelatedNames(TaxonNameBase name,NameRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countRelatedNames(name, type);\r
+               \r
+               List<NameRelationship> results = new ArrayList<NameRelationship>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getRelatedNames(name, type, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<NameRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TypeDesignationBase> getTypeDesignations(TaxonNameBase name,TypeDesignationStatus status, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countTypeDesignations(name, status);\r
+               \r
+               List<TypeDesignationBase> results = new ArrayList<TypeDesignationBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getTypeDesignations(name, status, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TypeDesignationBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonNameBase> searchNames(String uninomial,String infraGenericEpithet, String specificEpithet, String infraspecificEpithet, Rank rank, Integer pageSize,  Integer pageNumber) {\r
+        Integer numberOfResults = dao.countNames(uninomial, infraGenericEpithet, specificEpithet, infraspecificEpithet, rank);\r
+               \r
+               List<TaxonNameBase> results = new ArrayList<TaxonNameBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.searchNames(uninomial, infraGenericEpithet, specificEpithet, infraspecificEpithet, rank, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonNameBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
 }\r
index ac5205baf0ac00c0e0df1c167e0048b7449a4873..9757ece096e15e7c4e69345828a437f8c6986cf5 100644 (file)
@@ -17,8 +17,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \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.Annotation;\r
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
+import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;\r
 import eu.etaxonomy.cdm.persistence.dao.occurrence.ICollectionDao;\r
@@ -30,14 +36,9 @@ import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;
  */\r
 @Service\r
 @Transactional(readOnly = true)\r
-public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObservationBase> implements IOccurrenceService {\r
+public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObservationBase,IOccurrenceDao> implements IOccurrenceService {\r
 \r
        static private final Logger logger = Logger.getLogger(OccurrenceServiceImpl.class);\r
-\r
-       @Autowired\r
-       protected void setDao(IOccurrenceDao dao) {\r
-               this.dao = dao;\r
-       }\r
        \r
        @Autowired\r
        private IDefinedTermDao definedTermDao;\r
@@ -102,5 +103,43 @@ public class OccurrenceServiceImpl extends IdentifiableServiceBase<SpecimenOrObs
        public List<eu.etaxonomy.cdm.model.occurrence.Collection> searchCollectionByCode(String code) {\r
                return this.collectionDao.getCollectionByCode(code);\r
        }\r
+\r
+       @Autowired\r
+       protected void setDao(IOccurrenceDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<DerivationEvent> getDerivationEvents(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber) {\r
+        Integer numberOfResults = dao.countDerivationEvents(occurence);\r
+               \r
+               List<DerivationEvent> results = new ArrayList<DerivationEvent>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getDerivationEvents(occurence, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<DerivationEvent>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurence, Integer pageSize,Integer pageNumber) {\r
+        Integer numberOfResults = dao.countDeterminations(occurence);\r
+               \r
+               List<DeterminationEvent> results = new ArrayList<DeterminationEvent>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getDeterminations(occurence, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<DeterminationEvent>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<Media> getMedia(SpecimenOrObservationBase occurence,Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countMedia(occurence);\r
+               \r
+               List<Media> results = new ArrayList<Media>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getMedia(occurence, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
        \r
 }\r
index 43cacb6d43dc293e95a246b4b66b5b2f7dfba21d..035b5de40f861578240155465b94e4b471e49db8 100644 (file)
@@ -20,48 +20,39 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;\r
 \r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
 import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;\r
 \r
 \r
 @Service\r
 @Transactional(readOnly = true)\r
-public class ReferenceServiceImpl<T extends ReferenceBase> extends IdentifiableServiceBase<T> implements IReferenceService<T> {\r
-//public class ReferenceServiceImpl extends ServiceBase<ReferenceBase> implements IReferenceService {\r
-       static Logger logger = Logger.getLogger(ReferenceServiceImpl.class);\r
-       \r
-       private IReferenceDao referenceDao;\r
+public class ReferenceServiceImpl extends IdentifiableServiceBase<ReferenceBase,IReferenceDao> implements IReferenceService {\r
        \r
-       @Autowired\r
-       protected void setDao(IReferenceDao dao) {\r
-               this.dao = (ICdmEntityDao)dao;\r
-               this.referenceDao = dao;\r
-       }\r
+       static Logger logger = Logger.getLogger(ReferenceServiceImpl.class);\r
 \r
        public ReferenceBase getReferenceByUuid(UUID uuid) {\r
                return super.getCdmObjectByUuid(uuid); \r
        }\r
 \r
-       public List<T> getReferencesByTitle(String title) {\r
+       public List<ReferenceBase> getReferencesByTitle(String title) {\r
                return super.findCdmObjectsByTitle(title);\r
        }\r
        \r
-       public List<T> getReferencesByTitle(String title, Class<T> clazz) {\r
+       public List<ReferenceBase> getReferencesByTitle(String title, Class<ReferenceBase> clazz) {\r
                return super.findCdmObjectsByTitle(title, clazz);\r
        }\r
        \r
        @Transactional(readOnly = false)\r
-       public UUID saveReference(T reference) {\r
+       public UUID saveReference(ReferenceBase reference) {\r
                return super.saveCdmObject(reference);\r
        }\r
 \r
        @Transactional(readOnly = false)\r
-       public Map<UUID, T> saveReferenceAll(Collection<T> referenceCollection){\r
+       public Map<UUID, ReferenceBase> saveReferenceAll(Collection<ReferenceBase> referenceCollection){\r
                return saveCdmObjectAll(referenceCollection);\r
        }\r
 \r
        public List<ReferenceBase> getAllReferences(int limit, int start){\r
-                       return referenceDao.list(limit, start);\r
+                       return dao.list(limit, start);\r
        }\r
 \r
 \r
@@ -71,5 +62,10 @@ public class ReferenceServiceImpl<T extends ReferenceBase> extends IdentifiableS
                \r
        }\r
 \r
+       @Autowired\r
+       protected void setDao(IReferenceDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
 \r
 }\r
index c819ec8b8104005df511828138f2deac6ca4f9d5..0650fa4cc37258366a2379f228775ea8f83f0345 100644 (file)
@@ -17,8 +17,6 @@ import java.util.Map;
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.context.ApplicationContext;\r
 import org.springframework.context.ApplicationContextAware;\r
 import org.springframework.transaction.TransactionStatus;\r
@@ -27,21 +25,16 @@ import org.springframework.transaction.annotation.Transactional;
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
 \r
-\r
-public abstract class ServiceBase<T extends CdmBase> implements IService<T>, ApplicationContextAware {\r
+public abstract class ServiceBase<T extends CdmBase, DAO extends ICdmEntityDao<T>> implements IService<T>, ApplicationContextAware {\r
        private static final Logger logger = Logger.getLogger(ServiceBase.class);\r
        \r
        //flush after saving this number of objects\r
        int flushAfterNo = 2000;\r
        protected ApplicationContext appContext;\r
 \r
-       @Autowired\r
-       @Qualifier("cdmDao")\r
-       protected ICdmEntityDao<T> dao;\r
-       \r
-       protected void setEntityDao(ICdmEntityDao<T> dao){\r
-               this.dao=dao;\r
-       }\r
+       protected DAO dao;\r
+\r
+       protected abstract void setDao(DAO dao);\r
        \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.service.Iyyy#setApplicationContext(org.springframework.context.ApplicationContext)\r
@@ -50,21 +43,37 @@ public abstract class ServiceBase<T extends CdmBase> implements IService<T>, App
                this.appContext = appContext;\r
        }\r
 \r
-       protected T getCdmObjectByUuid(UUID uuid){\r
+       public T getCdmObjectByUuid(UUID uuid) {\r
                return dao.findByUuid(uuid);\r
        }\r
        \r
-\r
-       public int count(Class<T> clazz) {\r
+       @Transactional(readOnly = true)\r
+       public <TYPE extends T> int count(Class<TYPE> clazz) {\r
                return dao.count(clazz);\r
        }\r
+       \r
+       @Transactional(readOnly = true)\r
+       public int count() {\r
+               return dao.count();\r
+       }\r
 \r
+       /**\r
+        * FIXME harmonise with saveOrUpdate\r
+        * @param cdmObj\r
+        * @return\r
+        */\r
        @Transactional(readOnly = false)\r
        protected UUID saveCdmObject(T cdmObj){\r
                if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
                return dao.saveOrUpdate(cdmObj);\r
        }\r
+       \r
 \r
+       /**\r
+        * FIXME harmonise with saveOrUpdate\r
+        * @param cdmObj\r
+        * @return\r
+        */\r
        @Transactional(readOnly = false)\r
        protected UUID saveCdmObject(T cdmObj, TransactionStatus txStatus){\r
                // TODO: Implement with considering txStatus\r
@@ -72,6 +81,12 @@ public abstract class ServiceBase<T extends CdmBase> implements IService<T>, App
                return dao.saveOrUpdate(cdmObj);\r
        }\r
        \r
+       /**\r
+        * FIXME harmonise with saveAll\r
+        * @param <S>\r
+        * @param cdmObjCollection\r
+        * @return\r
+        */\r
        @Transactional(readOnly = false)\r
        protected <S extends T> Map<UUID, S> saveCdmObjectAll(Collection<? extends S> cdmObjCollection){\r
                int types = cdmObjCollection.getClass().getTypeParameters().length;\r
@@ -103,17 +118,64 @@ public abstract class ServiceBase<T extends CdmBase> implements IService<T>, App
                if ( logger.isInfoEnabled() ){logger.info("Saved " + i + " objects" );}\r
                return resultMap;\r
        }\r
+\r
+       @Transactional(readOnly = false)\r
+       public UUID delete(T persistentObject) {\r
+               return dao.delete(persistentObject);\r
+       }\r
+\r
+       @Transactional(readOnly = true)\r
+       public boolean exists(UUID uuid) {\r
+               return dao.exists(uuid);\r
+       }\r
+\r
+       @Transactional(readOnly = true)\r
+       public T findByUuid(UUID uuid) {\r
+               return dao.findByUuid(uuid);\r
+       }\r
+\r
+       @Transactional(readOnly = true)\r
+       public <TYPE extends T> List<TYPE> list(Class<TYPE> type, int limit,int start) {\r
+               return dao.list(type, limit, start);\r
+       }\r
+\r
+       @Transactional(readOnly = false)\r
+       public UUID save(T newInstance) {\r
+               return dao.save(newInstance);\r
+       }\r
        \r
+       @Transactional(readOnly = false)\r
+       public Map<UUID, T> saveAll(Collection<T> newInstances) {\r
+               return dao.saveAll(newInstances);\r
+       }\r
+\r
+       @Transactional(readOnly = false)\r
+       public UUID saveOrUpdate(T transientObject) {\r
+               return dao.saveOrUpdate(transientObject);\r
+       }\r
+\r
+       @Transactional(readOnly = false)\r
+       public UUID update(T transientObject) {\r
+               return dao.update(transientObject);\r
+       }\r
+\r
+       /**\r
+        * FIXME harmonise with delete()\r
+        * @param cdmObj\r
+        * @return\r
+        */\r
        @Transactional(readOnly = false)\r
        protected UUID removeCdmObject(T cdmObj){\r
                if (logger.isDebugEnabled()){logger.debug("Save cdmObj: " + (cdmObj == null? null: cdmObj.toString()));}\r
                return dao.delete(cdmObj);\r
        }\r
        \r
+       @Transactional(readOnly = true)\r
        public List<T> list(int limit, int start) {\r
                return dao.list(limit, start);\r
        }\r
 \r
+       @Transactional(readOnly = true)\r
        public List<T> rows(String tableName, int limit, int start) {\r
                return dao.rows(tableName, limit, start);\r
        }\r
index c31c8b73c58dae090df4cf8128b8cd7ec759f5af..bc83d40892ce7391cb86ec5e765ee4ee89b05fb6 100644 (file)
@@ -9,14 +9,26 @@
 \r
 package eu.etaxonomy.cdm.api.service;\r
 \r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.UUID;\r
+\r
 import org.apache.log4j.Logger;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.TransactionStatus;\r
 import org.springframework.transaction.annotation.Transactional;\r
 \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.Annotation;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
@@ -29,26 +41,11 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
 import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;\r
 \r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-\r
 \r
 @Service\r
 @Transactional(readOnly = true)\r
-public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonService {\r
+public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDao> implements ITaxonService {\r
        private static final Logger logger = Logger.getLogger(TaxonServiceImpl.class);\r
-       \r
-       private ITaxonDao taxonDao;\r
-       \r
-       @Autowired\r
-       protected void setDao(ITaxonDao dao) {\r
-               this.dao = dao;\r
-               this.taxonDao = dao;\r
-       }\r
 \r
        public TaxonBase getTaxonByUuid(UUID uuid) {\r
                return super.getCdmObjectByUuid(uuid); \r
@@ -78,19 +75,19 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
        }\r
 \r
        public List<TaxonBase> searchTaxaByName(String name, ReferenceBase sec) {\r
-               return taxonDao.getTaxaByName(name, sec);\r
+               return dao.getTaxaByName(name, sec);\r
        }\r
 \r
        public List<TaxonBase> getAllTaxonBases(int limit, int start){\r
-               return taxonDao.list(limit, start);\r
+               return dao.list(limit, start);\r
        }\r
 \r
        public List<Taxon> getAllTaxa(int limit, int start){\r
-               return taxonDao.getAllTaxa(limit, start);\r
+               return dao.getAllTaxa(limit, start);\r
        }\r
        \r
        public List<Synonym> getAllSynonyms(int limit, int start) {\r
-               return taxonDao.getAllSynonyms(limit, start);\r
+               return dao.getAllSynonyms(limit, start);\r
        }\r
        \r
        /* (non-Javadoc)\r
@@ -107,7 +104,7 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
                if (cdmFetch == null){\r
                        cdmFetch = CdmFetch.NO_FETCH();\r
                }\r
-               return taxonDao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
+               return dao.getRootTaxa(sec, cdmFetch, onlyWithChildren, false);\r
        }\r
 \r
        \r
@@ -116,11 +113,11 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
         */\r
        public List<Taxon> getRootTaxa(ReferenceBase sec, boolean onlyWithChildren,\r
                        boolean withMisapplications) {\r
-               return taxonDao.getRootTaxa(sec, null, onlyWithChildren, withMisapplications);\r
+               return dao.getRootTaxa(sec, null, onlyWithChildren, withMisapplications);\r
        }\r
 \r
        public List<RelationshipBase> getAllRelationships(int limit, int start){\r
-               return taxonDao.getAllRelationships(limit, start);\r
+               return dao.getAllRelationships(limit, start);\r
        }\r
        \r
        /* (non-Javadoc)\r
@@ -230,4 +227,53 @@ public class TaxonServiceImpl extends ServiceBase<TaxonBase> implements ITaxonSe
 //             }\r
                \r
        }\r
+\r
+       @Autowired\r
+       protected void setDao(ITaxonDao dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<TaxonBase> findTaxaByName(Boolean accepted, String uninomial,      String infragenericEpithet, String specificEpithet,     String infraspecificEpithet, Rank rank, Integer pageSize,Integer pageNumber) {\r
+        Integer numberOfResults = dao.countTaxaByName(accepted, uninomial, infragenericEpithet, specificEpithet, infraspecificEpithet, rank);\r
+               \r
+               List<TaxonBase> results = new ArrayList<TaxonBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.findTaxaByName(accepted, uninomial, infragenericEpithet, specificEpithet, infraspecificEpithet, rank, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonRelationship> getRelatedTaxa(Taxon taxon,     TaxonRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countRelatedTaxa(taxon, type);\r
+               \r
+               List<TaxonRelationship> results = new ArrayList<TaxonRelationship>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getRelatedTaxa(taxon, type, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<SynonymRelationship> getSynonyms(Taxon taxon,      SynonymRelationshipType type, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countSynonyms(taxon, type);\r
+               \r
+               List<SynonymRelationship> results = new ArrayList<SynonymRelationship>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getSynonyms(taxon, type, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<SynonymRelationship>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+       public Pager<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber) {\r
+        Integer numberOfResults = dao.countTaxa(queryString, accepted);\r
+               \r
+               List<TaxonBase> results = new ArrayList<TaxonBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.searchTaxa(queryString, accepted, pageSize, pageNumber); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index fa5b32d7015ab844398673bff222f9764fc67487..6120fc97a3e583ffadbb3da0da23828b97db12f7 100644 (file)
@@ -36,7 +36,7 @@ import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;
 
 @Service
 @Transactional(readOnly = true)
-public class TermServiceImpl extends ServiceBase<DefinedTermBase> implements ITermService{
+public class TermServiceImpl extends ServiceBase<DefinedTermBase,IDefinedTermDao> implements ITermService{
        static Logger logger = Logger.getLogger(TermServiceImpl.class);
        
        protected ITermVocabularyDao vocabularyDao;
@@ -47,20 +47,12 @@ public class TermServiceImpl extends ServiceBase<DefinedTermBase> implements ITe
        private IRepresentationDao representationDao;
        @Autowired
        private ILanguageStringDao languageStringDao;
-       @Autowired
-       private IDefinedTermDao definedTermDao;
        
        @Autowired
        protected void setVocabularyDao(ITermVocabularyDao vocabularyDao) {
                this.vocabularyDao = vocabularyDao;
        }
        
-       @Autowired
-       protected void setDao(IDefinedTermDao dao) {
-               this.dao = dao;
-               this.definedTermDao = dao;
-       }
-       
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.api.service.ITermService#getTermByUri(java.lang.String)
         */
@@ -144,7 +136,7 @@ public class TermServiceImpl extends ServiceBase<DefinedTermBase> implements ITe
        }
        
        public Language getLanguageByIso(String iso639) {
-               return definedTermDao.getLanguageByIso(iso639);
+               return dao.getLanguageByIso(iso639);
        }
        
        @Transactional(readOnly = false)
@@ -152,5 +144,10 @@ public class TermServiceImpl extends ServiceBase<DefinedTermBase> implements ITe
                        LanguageStringBase languageData) {
                        return languageStringBaseDao.save(languageData);
        }
+
+       @Autowired
+       protected void setDao(IDefinedTermDao dao) {
+               this.dao = dao;
+       }
        
 }
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UserService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UserService.java
new file mode 100644 (file)
index 0000000..27eb588
--- /dev/null
@@ -0,0 +1,261 @@
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.List;\r
+\r
+import org.hibernate.NonUniqueResultException;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.dao.DataAccessException;\r
+import org.springframework.dao.IncorrectResultSizeDataAccessException;\r
+import org.springframework.security.AccessDeniedException;\r
+import org.springframework.security.Authentication;\r
+import org.springframework.security.AuthenticationManager;\r
+import org.springframework.security.GrantedAuthority;\r
+import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.providers.UsernamePasswordAuthenticationToken;\r
+import org.springframework.security.providers.dao.SaltSource;\r
+import org.springframework.security.providers.dao.UserCache;\r
+import org.springframework.security.providers.dao.cache.NullUserCache;\r
+import org.springframework.security.providers.encoding.PasswordEncoder;\r
+import org.springframework.security.userdetails.GroupManager;\r
+import org.springframework.security.userdetails.UserDetails;\r
+import org.springframework.security.userdetails.UserDetailsManager;\r
+import org.springframework.security.userdetails.UsernameNotFoundException;\r
+import org.springframework.stereotype.Service;\r
+import org.springframework.transaction.annotation.Transactional;\r
+import org.springframework.util.Assert;\r
+\r
+import eu.etaxonomy.cdm.model.common.Group;\r
+import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.persistence.dao.common.IGroupDao;\r
+import eu.etaxonomy.cdm.persistence.dao.common.IUserDao;\r
+\r
+@Service\r
+@Transactional\r
+public class UserService implements UserDetailsManager, GroupManager {\r
+\r
+       protected IUserDao userDao;\r
+       \r
+       protected IGroupDao groupDao;\r
+       \r
+       private SaltSource saltSource;\r
+       \r
+       private PasswordEncoder passwordEncoder;\r
+       \r
+       private AuthenticationManager authenticationManager;\r
+       \r
+       private UserCache userCache = new NullUserCache();\r
+       \r
+       @Autowired(required = false)\r
+       public void setUserCache(UserCache userCache) {\r
+               Assert.notNull(userCache, "userCache cannot be null");\r
+               this.userCache = userCache;\r
+       }\r
+       \r
+       @Autowired\r
+       public void setPasswordEncoder(PasswordEncoder passwordEncoder) {\r
+               this.passwordEncoder = passwordEncoder;\r
+       }\r
+\r
+       @Autowired\r
+       public void setSaltSource(SaltSource saltSource) {\r
+               this.saltSource = saltSource;\r
+       }\r
+       \r
+       @Autowired\r
+       public void setAuthenticationManager(AuthenticationManager authenticationManager) {\r
+               this.authenticationManager = authenticationManager;\r
+       }\r
+       \r
+       @Autowired\r
+       public void setUserDao(IUserDao userDao) {\r
+               this.userDao = userDao;\r
+       }\r
+       \r
+       @Autowired\r
+       public void setGroupDao(IGroupDao groupDao) {\r
+               this.groupDao = groupDao;\r
+       }\r
+       \r
+       protected Authentication createNewAuthentication(Authentication currentAuth, String newPassword) {\r
+               UserDetails user = loadUserByUsername(currentAuth.getName());\r
+                       \r
+               UsernamePasswordAuthenticationToken newAuthentication = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());\r
+               newAuthentication.setDetails(currentAuth.getDetails());\r
+                       \r
+               return newAuthentication;\r
+       }\r
+       \r
+       public void changePassword(String oldPassword, String newPassword) {\r
+               Assert.hasText(oldPassword);\r
+               Assert.hasText(newPassword);\r
+               Authentication authentication = SecurityContextHolder.getContext().getAuthentication();\r
+               if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User) {\r
+                       User user = (User)authentication.getPrincipal();\r
+                       \r
+                       authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), oldPassword));\r
+                       \r
+                       Object salt = this.saltSource.getSalt(user);\r
+                       \r
+                       String password = passwordEncoder.encodePassword(newPassword, salt);\r
+                       ((User)user).setPassword(password);\r
+                       \r
+                       userDao.update((User)user);\r
+                       SecurityContextHolder.getContext().setAuthentication(createNewAuthentication(authentication, newPassword));\r
+                       userCache.removeUserFromCache(user.getUsername());\r
+               } else {\r
+                       throw new AccessDeniedException("Can't change password as no Authentication object found in context for current user.");\r
+               }               \r
+       }\r
+\r
+       public void createUser(UserDetails user) {\r
+               Assert.isInstanceOf(User.class, user);\r
+               \r
+               String rawPassword = user.getPassword();\r
+               Object salt = this.saltSource.getSalt(user);\r
+               \r
+               String password = passwordEncoder.encodePassword(rawPassword, salt);\r
+               ((User)user).setPassword(password);\r
+               \r
+               userDao.save((User)user);\r
+       }\r
+\r
+       public void deleteUser(String username) {\r
+               Assert.hasLength(username);\r
+               \r
+               User user = userDao.findUserByUsername(username); \r
+        if(user != null) {             \r
+                   userDao.delete((User)user);\r
+        }\r
+        \r
+        userCache.removeUserFromCache(username);\r
+       }\r
+\r
+       public void updateUser(UserDetails user) {\r
+               Assert.isInstanceOf(User.class, user);\r
+               \r
+               userDao.update((User)user);\r
+               userCache.removeUserFromCache(user.getUsername());\r
+       }\r
+\r
+       public boolean userExists(String username) {\r
+               Assert.hasText(username);\r
+               \r
+               User user = userDao.findUserByUsername(username);\r
+               return user != null;\r
+       }\r
+\r
+       public UserDetails loadUserByUsername(String username)\r
+                       throws UsernameNotFoundException, DataAccessException {\r
+               Assert.hasText(username);\r
+               try {\r
+                   User user = userDao.findUserByUsername(username);\r
+                   if(user == null) {\r
+                               throw new UsernameNotFoundException(username);\r
+                       }\r
+                   return user;\r
+               } catch(NonUniqueResultException nure) {\r
+                       throw new IncorrectResultSizeDataAccessException("More than one user found with name '" + username + "'", 1);\r
+               }\r
+       }\r
+\r
+       public void addGroupAuthority(String groupName, GrantedAuthority authority) {\r
+               Assert.hasText(groupName);\r
+               Assert.notNull(authority);\r
+               \r
+               Group group = groupDao.findGroupByName(groupName);\r
+               if(group.getGrantedAuthorities().add(authority)) {\r
+                       groupDao.update(group);\r
+               }\r
+       }\r
+\r
+       public void addUserToGroup(String username, String groupName) {\r
+               Assert.hasText(username);\r
+               Assert.hasText(groupName);\r
+               \r
+               Group group = groupDao.findGroupByName(groupName);\r
+               User user = userDao.findUserByUsername(username);\r
+               \r
+               if(group.addMember(user)) {\r
+                       groupDao.update(group);\r
+                       userCache.removeUserFromCache(user.getUsername());\r
+               }               \r
+       }\r
+\r
+       public void createGroup(String groupName, GrantedAuthority[] authorities) {\r
+               Assert.hasText(groupName);\r
+               Assert.notNull(authorities);\r
+               \r
+               Group group = new Group();\r
+               group.setName(groupName);\r
+               \r
+               for(GrantedAuthority authority : authorities) {\r
+                       group.getGrantedAuthorities().add(authority);\r
+               }\r
+               \r
+               groupDao.save(group);\r
+       }\r
+\r
+       public void deleteGroup(String groupName) {\r
+               Assert.hasText(groupName);\r
+               \r
+               Group group = groupDao.findGroupByName(groupName);\r
+               groupDao.delete(group);\r
+       }\r
+\r
+       public String[] findAllGroups() {\r
+               List<String> names = groupDao.listNames(null,null);\r
+               return names.toArray(new String[names.size()]);\r
+       }\r
+\r
+       public GrantedAuthority[] findGroupAuthorities(String groupName) {\r
+               Assert.hasText(groupName);\r
+               Group group = groupDao.findGroupByName(groupName);\r
+               \r
+               return group.getGrantedAuthorities().toArray(new GrantedAuthority[group.getGrantedAuthorities().size()]);\r
+       }\r
+\r
+       public String[] findUsersInGroup(String groupName) {\r
+               Assert.hasText(groupName);\r
+               Group group = groupDao.findGroupByName(groupName);\r
+               \r
+               List<String> users = groupDao.listMembers(group, null, null);\r
+               \r
+               return users.toArray(new String[users.size()]);\r
+       }\r
+\r
+       public void removeGroupAuthority(String groupName,      GrantedAuthority authority) {\r
+               Assert.hasText(groupName);\r
+               Assert.notNull(authority);\r
+               \r
+               Group group = groupDao.findGroupByName(groupName);\r
+               \r
+               if(group.getGrantedAuthorities().remove(authority)) {\r
+                       groupDao.update(group);\r
+               }\r
+               \r
+       }\r
+\r
+       public void removeUserFromGroup(String username, String groupName) {\r
+               Assert.hasText(username);\r
+               Assert.hasText(groupName);\r
+               \r
+               Group group = groupDao.findGroupByName(groupName);\r
+               User user = userDao.findUserByUsername(username);\r
+               \r
+               if(group.removeMember(user)) {\r
+                       groupDao.update(group);\r
+                       userCache.removeUserFromCache(user.getUsername());\r
+               }\r
+       }\r
+\r
+       public void renameGroup(String oldName, String newName) {\r
+               Assert.hasText(oldName);\r
+               Assert.hasText(newName);\r
+               \r
+               Group group = groupDao.findGroupByName(oldName);\r
+               \r
+               group.setName(newName);\r
+               groupDao.update(group);\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/Pager.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/Pager.java
new file mode 100644 (file)
index 0000000..c7f80c5
--- /dev/null
@@ -0,0 +1,28 @@
+package eu.etaxonomy.cdm.api.service.pager;\r
+\r
+import java.util.List;\r
+\r
+public interface Pager<T> {\r
+    public Integer getPagesAvailable();\r
+       \r
+       public Integer getNextIndex();\r
+       \r
+       public Integer getPrevIndex();\r
+       \r
+       public Integer getCurrentIndex();\r
+       \r
+       public String getPageNumber(int index);\r
+\r
+       public List<Integer> getIndices();\r
+       \r
+       public Integer getCount();\r
+\r
+       public Integer getFirstRecord();\r
+\r
+       public Integer getLastRecord();\r
+       \r
+       public List<T> getRecords();\r
+       \r
+       public String getSuggestion();\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/AbstractPagerImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/AbstractPagerImpl.java
new file mode 100644 (file)
index 0000000..105d5a2
--- /dev/null
@@ -0,0 +1,179 @@
+package eu.etaxonomy.cdm.api.service.pager.impl;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+\r
+public abstract class AbstractPagerImpl<T> implements Pager<T> {\r
+\r
+       protected static Integer MAX_PAGE_LABELS = 3;\r
+       protected static String LABEL_DIVIDER = " - ";\r
+       private static Log log = LogFactory.getLog(DefaultPagerImpl.class);\r
+       protected Integer pagesAvailable;\r
+       protected Integer prevIndex;\r
+       protected Integer nextIndex;\r
+       protected Integer currentIndex;\r
+       protected Map<Integer,String> pageNumbers;\r
+       protected Integer firstRecord;\r
+       protected Integer lastRecord;\r
+       protected Integer count;\r
+       protected List<T> records;\r
+       protected String suggestion;\r
+       protected ArrayList<Integer> indices;\r
+\r
+       public AbstractPagerImpl(Integer currentIndex, Integer count, Integer pageSize, List<T> records, String suggestion) {\r
+               this(currentIndex,count,pageSize,records);\r
+               this.suggestion = suggestion;\r
+       }\r
+       \r
+       public AbstractPagerImpl(Integer currentIndex, Integer count, Integer pageSize, List<T> records) {\r
+        if(currentIndex != null) {\r
+                   this.currentIndex = currentIndex;\r
+        } else {\r
+               this.currentIndex = 0;\r
+        }\r
+               \r
+               pageNumbers = new HashMap<Integer,String>();\r
+               indices = new ArrayList<Integer>();\r
+               if(count == 0) {\r
+                       pagesAvailable = 1;\r
+               } else if(pageSize != null) {\r
+                        if( 0 == count % pageSize) {\r
+                               pagesAvailable = count / pageSize;\r
+\r
+                Integer labelsStart = 0;\r
+                if(this.currentIndex > DefaultPagerImpl.MAX_PAGE_LABELS) {\r
+                    labelsStart = this.currentIndex - DefaultPagerImpl.MAX_PAGE_LABELS ;\r
+                }\r
+\r
+                Integer labelsEnd = pagesAvailable.intValue();\r
+                               if((pagesAvailable - this.currentIndex) > DefaultPagerImpl.MAX_PAGE_LABELS) {\r
+                                       labelsEnd = this.currentIndex + DefaultPagerImpl.MAX_PAGE_LABELS;\r
+                               }\r
+\r
+                               for(int index = labelsStart; index < labelsEnd; index++) {\r
+                                       indices.add(index);\r
+                                       String startLabel = getLabel(index * pageSize);\r
+                                       String endLabel = getLabel(((index + 1) * pageSize) - 1);\r
+                                       pageNumbers.put(index,createLabel(startLabel,endLabel));\r
+                               }\r
+                       } else {\r
+                               pagesAvailable = (count / pageSize) + 1; //12\r
+                               \r
+                               Integer labelsStart = 0;\r
+                if(this.currentIndex > DefaultPagerImpl.MAX_PAGE_LABELS) {\r
+                    labelsStart = this.currentIndex - DefaultPagerImpl.MAX_PAGE_LABELS;\r
+                }\r
+\r
+                Integer labelsEnd = pagesAvailable.intValue();\r
+                               if((pagesAvailable - this.currentIndex) > DefaultPagerImpl.MAX_PAGE_LABELS ) {\r
+                                       labelsEnd = this.currentIndex + DefaultPagerImpl.MAX_PAGE_LABELS;\r
+                                       for(int index = labelsStart; index < labelsEnd; index++) {\r
+                                               indices.add(index);\r
+                                               \r
+                                               String startLabel = getLabel(index * pageSize);\r
+                                               String endLabel = getLabel(((index + 1) * pageSize) - 1);\r
+                                               pageNumbers.put(index,createLabel(startLabel,endLabel));\r
+                                       }\r
+                                       \r
+                                       \r
+                               } else {\r
+                                       for(int index = labelsStart; index < (labelsEnd -1); index++) {\r
+                                               indices.add(index);\r
+                                               String startLabel = getLabel(index * pageSize);\r
+                                               String endLabel = getLabel(((index + 1) * pageSize) - 1);\r
+                                               pageNumbers.put(index,createLabel(startLabel,endLabel));\r
+                                       }\r
+                                       indices.add(pagesAvailable.intValue() - 1);\r
+                                       String startLabel = getLabel((pagesAvailable.intValue() - 1) * pageSize);\r
+                                       String endLabel = getLabel(count.intValue() - 1);\r
+                                       pageNumbers.put(pagesAvailable.intValue() - 1,createLabel(startLabel,endLabel));\r
+                               }\r
+\r
+                               \r
+                       }\r
+               } else {\r
+                       pagesAvailable = 1;\r
+               }\r
+               \r
+               if(pagesAvailable == 1) {\r
+                       nextIndex = null;\r
+                       prevIndex = null;\r
+               } else {\r
+                       if(0 < this.currentIndex) {\r
+                               prevIndex = this.currentIndex - 1;\r
+                       }\r
+                       if(this.currentIndex < (pagesAvailable - 1)) {\r
+                               nextIndex = this.currentIndex + 1;\r
+                       }\r
+               }\r
+               if(pageSize == null) {\r
+                       this.firstRecord = 1;\r
+               this.lastRecord = records.size();\r
+               } else {\r
+               this.firstRecord = (this.currentIndex * pageSize) + 1;\r
+               this.lastRecord = (this.currentIndex * pageSize) + records.size();\r
+               }\r
+               \r
+               this.count = count; \r
+               this.records = records;\r
+       }\r
+\r
+       protected abstract String createLabel(String startLabel, String endLabel); \r
+       \r
+       protected String getLabel(Integer i) {\r
+               Integer label = new Integer(i + 1);\r
+               return label.toString();\r
+       }\r
+\r
+       public Integer getPagesAvailable() {\r
+               return pagesAvailable;\r
+       }\r
+\r
+       public Integer getNextIndex() {\r
+               return nextIndex;\r
+       }\r
+\r
+       public Integer getPrevIndex() {\r
+               return prevIndex;\r
+       }\r
+\r
+       public Integer getCurrentIndex() {\r
+               return currentIndex;\r
+       }\r
+\r
+       public String getPageNumber(int index) {\r
+               return pageNumbers.get(index);\r
+       }\r
+\r
+       public List<Integer> getIndices() {\r
+               return indices;\r
+       }\r
+\r
+       public Integer getCount() {\r
+               return count;\r
+       }\r
+\r
+       public Integer getFirstRecord() {\r
+               return firstRecord;\r
+       }\r
+\r
+       public Integer getLastRecord() {\r
+               return lastRecord;\r
+       }\r
+\r
+       public List<T> getRecords() {\r
+               return records;\r
+       }\r
+\r
+       public String getSuggestion() {\r
+               return suggestion;\r
+       }\r
+\r
+}
\ No newline at end of file
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/DefaultPagerImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/DefaultPagerImpl.java
new file mode 100644 (file)
index 0000000..32e73ec
--- /dev/null
@@ -0,0 +1,20 @@
+package eu.etaxonomy.cdm.api.service.pager.impl;\r
+\r
+import java.util.List;\r
+\r
+public class DefaultPagerImpl<T> extends AbstractPagerImpl<T> {\r
+       \r
+\r
+\r
+    public DefaultPagerImpl(Integer currentIndex, Integer count, Integer pageSize,     List<T> records) {\r
+               super(currentIndex, count, pageSize, records);\r
+       }\r
+    \r
+    public DefaultPagerImpl(Integer currentIndex, Integer count, Integer pageSize,     List<T> records, String suggestion) {\r
+               super(currentIndex, count, pageSize, records,suggestion);\r
+       }\r
+\r
+       protected String createLabel(String s1, String s2) {\r
+        return s1 + DefaultPagerImpl.LABEL_DIVIDER + s2;\r
+    }\r
+}\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/StringLabelPagerImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/pager/impl/StringLabelPagerImpl.java
new file mode 100644 (file)
index 0000000..4a1acf9
--- /dev/null
@@ -0,0 +1,26 @@
+package eu.etaxonomy.cdm.api.service.pager.impl;\r
+\r
+import java.util.List;\r
+\r
+public class StringLabelPagerImpl<T> extends DefaultPagerImpl<T> {\r
+\r
+       public StringLabelPagerImpl(Integer currentIndex, Integer count,Integer pageSize, List<T> records) {\r
+               super(currentIndex, count, pageSize, records);\r
+       }\r
+       \r
+       public StringLabelPagerImpl(Integer currentIndex, Integer count,Integer pageSize, List<T> records,String suggestion) {\r
+               super(currentIndex, count, pageSize, records,suggestion);\r
+       }\r
+       \r
+       @Override\r
+       protected String createLabel(String s1, String s2) {\r
+        for(int i = 0; i < Math.min(s1.length(),s2.length()); i++) {\r
+          if(!s1.substring(0,i).equals(s2.substring(0,i))) {\r
+            return super.createLabel(s1.substring(0,i), s2.substring(0,i));\r
+          }\r
+        }\r
+\r
+        return super.createLabel(s1, s2);\r
+    }\r
+\r
+}\r
diff --git a/cdmlib-services/src/main/resources/eu/etaxonomy/cdm/services.xml b/cdmlib-services/src/main/resources/eu/etaxonomy/cdm/services.xml
deleted file mode 100644 (file)
index efcc3f6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:tx="http://www.springframework.org/schema/tx"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans 
-    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
-    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
-    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
-    ">
-    
-    <import resource="classpath:/eu/etaxonomy/cdm/persistence.xml" />
-    <context:component-scan base-package="eu/etaxonomy/cdm"/>
-    
-    </beans>
index 271c5558a458c230501976bdcad26ac4490d5a6b..a9c7836cdc523ede2a375b778494f7de16ac5872 100644 (file)
@@ -3,63 +3,28 @@
  */\r
 package eu.etaxonomy.cdm.api.service;\r
 \r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertSame;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.junit.After;\r
-import org.junit.AfterClass;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
 import org.junit.Ignore;\r
 import org.junit.Test;\r
+import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
-import eu.etaxonomy.cdm.database.CdmPersistentDataSource;\r
-import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
-public class NameServiceImplTest2 {\r
+public class NameServiceImplTest2 extends CdmIntegrationTest {\r
        private static final Logger logger = Logger.getLogger(NameServiceImplTest2.class);\r
 \r
-       //@Autowired\r
-       static INameService service;\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @BeforeClass\r
-       public static void setUpBeforeClass() throws Exception {\r
-               CdmPersistentDataSource defaultSource = CdmPersistentDataSource.NewDefaultInstance();\r
-               CdmApplicationController app = CdmApplicationController.NewInstance(defaultSource, DbSchemaValidation.CREATE);\r
-               service = app.getNameService();\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @AfterClass\r
-       public static void tearDownAfterClass() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @Before\r
-       public void setUp() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @After\r
-       public void tearDown() throws Exception {\r
-       }\r
-\r
+       @SpringBeanByType\r
+       private INameService service;\r
        \r
 /* ******************** TESTS ********************************************/\r
        \r
index e2baffa9da748d0a6ee8102ff0bbed5bb8decef1..77abda24363c45a4fcb95d1207c836d1269b513f 100644 (file)
@@ -3,68 +3,30 @@
  */\r
 package eu.etaxonomy.cdm.api.service;\r
 \r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNull;\r
 \r
 import java.util.UUID;\r
 \r
-import javax.persistence.Entity;\r
-\r
 import org.apache.log4j.Logger;\r
-import org.junit.After;\r
-import org.junit.AfterClass;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
 import org.junit.Test;\r
+import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
-import eu.etaxonomy.cdm.database.CdmPersistentDataSource;\r
-import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
-@Entity\r
-public class TaxonServiceImplTest {\r
+public class TaxonServiceImplTest extends CdmIntegrationTest {\r
        private static final Logger logger = Logger.getLogger(TaxonServiceImplTest.class);\r
        \r
-       //@Autowired\r
-       static ITaxonService service;\r
+       @SpringBeanByType\r
+       private ITaxonService service;\r
        \r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @BeforeClass\r
-       public static void setUpBeforeClass() throws Exception {\r
-               CdmPersistentDataSource defaultSource = CdmPersistentDataSource.NewDefaultInstance();\r
-               CdmApplicationController app = CdmApplicationController.NewInstance(defaultSource, DbSchemaValidation.CREATE);\r
-               service = app.getTaxonService();\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @AfterClass\r
-       public static void tearDownAfterClass() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @Before\r
-       public void setUp() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @After\r
-       public void tearDown() throws Exception {\r
-       }\r
-\r
 /****************** TESTS *****************************/\r
        \r
        /**\r
index b97c600c2bf961dfab3f098a0aab2818ec21c1fd..ac100ef092dcb650fc05d7713865af47700c99e0 100644 (file)
@@ -9,68 +9,32 @@
 \r
 package eu.etaxonomy.cdm.api.service;\r
 \r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertNull;\r
 \r
 import java.util.UUID;\r
 \r
 import org.apache.log4j.Logger;\r
-import org.junit.After;\r
-import org.junit.AfterClass;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
 import org.junit.Ignore;\r
 import org.junit.Test;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.transaction.annotation.Transactional;\r
+import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
-import eu.etaxonomy.cdm.api.application.CdmApplicationController;\r
-import eu.etaxonomy.cdm.database.CdmPersistentDataSource;\r
-import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
 import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
 import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.test.integration.CdmIntegrationTest;\r
 \r
 /**\r
  * @author a.mueller\r
  * @created 27.05.2008\r
  * @version 1.0\r
  */\r
-public class TermServiceImplTest {\r
+public class TermServiceImplTest extends CdmIntegrationTest {\r
        private static final Logger logger = Logger.getLogger(TermServiceImplTest.class);\r
 \r
-       //@Autowired\r
-       static ITermService service;\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @BeforeClass\r
-       public static void setUpBeforeClass() throws Exception {\r
-               CdmPersistentDataSource defaultSource = CdmPersistentDataSource.NewDefaultInstance();\r
-               CdmApplicationController app = CdmApplicationController.NewInstance(defaultSource, DbSchemaValidation.CREATE);\r
-               service = app.getTermService();\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @AfterClass\r
-       public static void tearDownAfterClass() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @Before\r
-       public void setUp() throws Exception {\r
-       }\r
-\r
-       /**\r
-        * @throws java.lang.Exception\r
-        */\r
-       @After\r
-       public void tearDown() throws Exception {\r
-       }\r
+       @SpringBeanByType\r
+       private ITermService service;\r
 \r
 /* ************************* TESTS *************************************************/\r
        \r
@@ -121,7 +85,6 @@ public class TermServiceImplTest {
         * Test method for {@link eu.etaxonomy.cdm.api.service.TermServiceImpl#listTerms(java.util.UUID)}.\r
         */\r
        @Ignore\r
-       @Transactional\r
        @Test\r
        public void testGetVocabularyUUID() {\r
                //Rank\r
diff --git a/cdmlib-services/src/test/resources/dbscripts/001_cdm.ddl b/cdmlib-services/src/test/resources/dbscripts/001_cdm.ddl
new file mode 100644 (file)
index 0000000..1925e21
--- /dev/null
@@ -0,0 +1,605 @@
+create table Address (id integer not null, created timestamp, uuid varchar(255), updated timestamp, locality varchar(255), location_errorradius integer, location_latitude double, location_longitude double, pobox varchar(255), postcode varchar(255), region varchar(255), street varchar(255), createdby_id integer, updatedby_id integer, contact_id integer, country_id integer, location_referencesystem_id integer, primary key (id));
+create table Agent (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, code varchar(255), name varchar(255), nomenclaturaltitle varchar(255), firstname varchar(255), lastname varchar(255), lifespan_end varchar(255), lifespan_start varchar(255), prefix varchar(255), suffix varchar(255), createdby_id integer, updatedby_id integer, contact_id integer, ispartof_id integer, primary key (id));
+create table Agent_Agent (Agent_id integer not null, teammembers_id integer not null);
+create table Agent_Annotation (Agent_id integer not null, annotations_id integer not null, primary key (Agent_id, annotations_id), unique (annotations_id));
+create table Agent_DefinedTermBase (Agent_id integer not null, types_id integer not null, primary key (Agent_id, types_id));
+create table Agent_Extension (Agent_id integer not null, extensions_id integer not null, primary key (Agent_id, extensions_id), unique (extensions_id));
+create table Agent_Marker (Agent_id integer not null, markers_id integer not null, primary key (Agent_id, markers_id), unique (markers_id));
+create table Agent_Media (Agent_id integer not null, media_id integer not null, primary key (Agent_id, media_id), unique (media_id));
+create table Agent_OriginalSource (Agent_id integer not null, sources_id integer not null, primary key (Agent_id, sources_id), unique (sources_id));
+create table Agent_Rights (Agent_id integer not null, rights_id integer not null, primary key (Agent_id, rights_id));
+create table Annotation (id integer not null, created timestamp, uuid varchar(255), updated timestamp, text varchar(4096), annotatedObj_type varchar(255), annotatedObj_id integer not null, linkbackurlstr varchar(255), createdby_id integer, updatedby_id integer, language_id integer, commentator_id integer, primary key (id));
+create table Annotation_Annotation (Annotation_id integer not null, annotations_id integer not null, primary key (Annotation_id, annotations_id), unique (annotations_id));
+create table Annotation_Marker (Annotation_id integer not null, markers_id integer not null, primary key (Annotation_id, markers_id), unique (markers_id));
+create table CDM_VIEW (id integer not null, created timestamp, uuid varchar(255), description varchar(255), name varchar(255), reference varbinary(255), createdby_id integer, primary key (id));
+create table CDM_VIEW_CDM_VIEW (CDM_VIEW_id integer not null, superviews_id integer not null, primary key (CDM_VIEW_id, superviews_id), unique (superviews_id));
+create table Collection (id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, code varchar(255), codestandard varchar(255), name varchar(255), townorlocation varchar(255), createdby_id integer, updatedby_id integer, institute_id integer, supercollection_id integer, primary key (id));
+create table Collection_Annotation (Collection_id integer not null, annotations_id integer not null, primary key (Collection_id, annotations_id), unique (annotations_id));
+create table Collection_Extension (Collection_id integer not null, extensions_id integer not null, primary key (Collection_id, extensions_id), unique (extensions_id));
+create table Collection_Marker (Collection_id integer not null, markers_id integer not null, primary key (Collection_id, markers_id), unique (markers_id));
+create table Collection_Media (Collection_id integer not null, media_id integer not null, primary key (Collection_id, media_id), unique (media_id));
+create table Collection_OriginalSource (Collection_id integer not null, sources_id integer not null, primary key (Collection_id, sources_id), unique (sources_id));
+create table Collection_Rights (Collection_id integer not null, rights_id integer not null, primary key (Collection_id, rights_id));
+create table Contact (id integer not null, created timestamp, uuid varchar(255), updated timestamp, email varchar(255), fax varchar(255), phone varchar(255), url varchar(255), createdby_id integer, updatedby_id integer, primary key (id));
+create table DefinedTermBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, uri varchar(255), orderindex integer, iso639_1 varchar(2), iso639_2 varchar(3), defaultcolor varchar(255), supportscommontaxonname boolean, supportsdistribution boolean, supportsindividualassociation boolean, supportsquantitativedata boolean, supportstaxoninteraction boolean, supportstextdata boolean, pointapproximation_errorradius integer, pointapproximation_latitude double, pointapproximation_longitude double, validperiod_end varchar(255), validperiod_start varchar(255), iso3166_a2 varchar(2), symmetric boolean, transitive boolean, createdby_id integer, updatedby_id integer, kindof_id integer, partof_id integer, persistentvocabulary_id integer, level_id integer, pointapproximation_referencesystem_id integer, shape_id integer, type_id integer, primary key (id));
+create table DefinedTermBase_Continent (DefinedTermBase_id integer not null, continents_id integer not null, primary key (DefinedTermBase_id, continents_id));
+create table DefinedTermBase_Media (DefinedTermBase_id integer not null, media_id integer not null, primary key (DefinedTermBase_id, media_id), unique (media_id));
+create table DefinedTermBase_RecommendedModifierEnumeration (DefinedTermBase_id integer not null, recommendedmodifierenumeration_id integer not null, primary key (DefinedTermBase_id, recommendedmodifierenumeration_id), unique (recommendedmodifierenumeration_id));
+create table DefinedTermBase_Representation (DefinedTermBase_id integer not null, representations_id integer not null, primary key (DefinedTermBase_id, representations_id), unique (representations_id));
+create table DefinedTermBase_StatisticalMeasure (DefinedTermBase_id integer not null, recommendedstatisticalmeasures_id integer not null, primary key (DefinedTermBase_id, recommendedstatisticalmeasures_id));
+create table DefinedTermBase_SupportedCategoricalEnumeration (DefinedTermBase_id integer not null, supportedcategoricalenumerations_id integer not null, primary key (DefinedTermBase_id, supportedcategoricalenumerations_id), unique (supportedcategoricalenumerations_id));
+create table DefinedTermBase_WaterbodyOrCountry (DefinedTermBase_id integer not null, waterbodiesorcountries_id integer not null, primary key (DefinedTermBase_id, waterbodiesorcountries_id));
+create table DerivationEvent (id integer not null, created timestamp, uuid varchar(255), updated timestamp, description varchar(255), timeperiod_end varchar(255), timeperiod_start varchar(255), createdby_id integer, updatedby_id integer, actor_id integer, type_id integer, primary key (id));
+create table DerivationEvent_Annotation (DerivationEvent_id integer not null, annotations_id integer not null, primary key (DerivationEvent_id, annotations_id), unique (annotations_id));
+create table DerivationEvent_Marker (DerivationEvent_id integer not null, markers_id integer not null, primary key (DerivationEvent_id, markers_id), unique (markers_id));
+create table DescriptionBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, createdby_id integer, updatedby_id integer, taxon_fk integer, taxonName_fk integer, primary key (id));
+create table DescriptionBase_Annotation (DescriptionBase_id integer not null, annotations_id integer not null, primary key (DescriptionBase_id, annotations_id), unique (annotations_id));
+create table DescriptionBase_Extension (DescriptionBase_id integer not null, extensions_id integer not null, primary key (DescriptionBase_id, extensions_id), unique (extensions_id));
+create table DescriptionBase_GeoScope (DescriptionBase_id integer not null, geoscopes_id integer not null, primary key (DescriptionBase_id, geoscopes_id), unique (geoscopes_id));
+create table DescriptionBase_Marker (DescriptionBase_id integer not null, markers_id integer not null, primary key (DescriptionBase_id, markers_id), unique (markers_id));
+create table DescriptionBase_OriginalSource (DescriptionBase_id integer not null, sources_id integer not null, primary key (DescriptionBase_id, sources_id), unique (sources_id));
+create table DescriptionBase_ReferenceBase (DescriptionBase_id integer not null, descriptionsources_id integer not null, primary key (DescriptionBase_id, descriptionsources_id));
+create table DescriptionBase_Rights (DescriptionBase_id integer not null, rights_id integer not null, primary key (DescriptionBase_id, rights_id));
+create table DescriptionBase_Scope (DescriptionBase_id integer not null, scopes_id integer not null, primary key (DescriptionBase_id, scopes_id), unique (scopes_id));
+create table DescriptionElementBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), modifyingtext varbinary(255), orderrelevant boolean, name varchar(255), description varbinary(255), createdby_id integer, updatedby_id integer, citation_id integer, feature_id integer, indescription_id integer, language_id integer, area_id integer, status_id integer, associatedspecimenorobservation_id integer, unit_id integer, taxon2_id integer, format_id integer, primary key (id));
+create table DescriptionElementBase_Annotation (DescriptionElementBase_id integer not null, annotations_id integer not null, primary key (DescriptionElementBase_id, annotations_id), unique (annotations_id));
+create table DescriptionElementBase_LanguageString (DescriptionElementBase_id integer not null, multilanguagetext_id integer not null, primary key (DescriptionElementBase_id, multilanguagetext_id), unique (multilanguagetext_id));
+create table DescriptionElementBase_Marker (DescriptionElementBase_id integer not null, markers_id integer not null, primary key (DescriptionElementBase_id, markers_id), unique (markers_id));
+create table DescriptionElementBase_Media (DescriptionElementBase_id integer not null, media_id integer not null, primary key (DescriptionElementBase_id, media_id), unique (media_id));
+create table DescriptionElementBase_Modifier (DescriptionElementBase_id integer not null, modifiers_id integer not null, primary key (DescriptionElementBase_id, modifiers_id), unique (modifiers_id));
+create table DescriptionElementBase_StateData (DescriptionElementBase_id integer not null, states_id integer not null);
+create table DescriptionElementBase_StatisticalMeasurementValue (DescriptionElementBase_id integer not null, statisticalvalues_id integer not null, primary key (DescriptionElementBase_id, statisticalvalues_id), unique (statisticalvalues_id));
+create table DeterminationEvent (id integer not null, created timestamp, uuid varchar(255), updated timestamp, description varchar(255), timeperiod_end varchar(255), timeperiod_start varchar(255), preferredflag boolean not null, createdby_id integer, updatedby_id integer, actor_id integer, identifiedunit_id integer, modifier_id integer, taxon_id integer, primary key (id));
+create table DeterminationEvent_Annotation (DeterminationEvent_id integer not null, annotations_id integer not null, primary key (DeterminationEvent_id, annotations_id), unique (annotations_id));
+create table DeterminationEvent_Marker (DeterminationEvent_id integer not null, markers_id integer not null, primary key (DeterminationEvent_id, markers_id), unique (markers_id));
+create table DeterminationEvent_ReferenceBase (DeterminationEvent_id integer not null, references_id integer not null, primary key (DeterminationEvent_id, references_id));
+create table Extension (id integer not null, created timestamp, uuid varchar(255), updated timestamp, value varchar(255), createdby_id integer, updatedby_id integer, type_id integer, primary key (id));
+create table FeatureNode (id integer not null, created timestamp, uuid varchar(255), updated timestamp, createdby_id integer, updatedby_id integer, feature_id integer, parent_fk integer, primary key (id));
+create table FeatureTree (id integer not null, created timestamp, uuid varchar(255), updated timestamp, uri varchar(255), descriptionseparated boolean not null, createdby_id integer, updatedby_id integer, root_id integer, primary key (id));
+create table FeatureTree_Representation (FeatureTree_id integer not null, representations_id integer not null, primary key (FeatureTree_id, representations_id), unique (representations_id));
+create table GatheringEvent (id integer not null, created timestamp, uuid varchar(255), updated timestamp, description varchar(255), timeperiod_end varchar(255), timeperiod_start varchar(255), absoluteelevation integer, absoluteelevationerror integer, collectingmethod varchar(255), distancetoground integer, distancetowatersurface integer, exactlocation_errorradius integer, exactlocation_latitude double, exactlocation_longitude double, createdby_id integer, updatedby_id integer, actor_id integer, exactlocation_referencesystem_id integer, locality_id integer, primary key (id));
+create table GatheringEvent_Annotation (GatheringEvent_id integer not null, annotations_id integer not null, primary key (GatheringEvent_id, annotations_id), unique (annotations_id));
+create table GatheringEvent_DefinedTermBase (GatheringEvent_id integer not null, collectingareas_id integer not null, primary key (GatheringEvent_id, collectingareas_id));
+create table GatheringEvent_Marker (GatheringEvent_id integer not null, markers_id integer not null, primary key (GatheringEvent_id, markers_id), unique (markers_id));
+create table GenBankAccession (id integer not null, created timestamp, uuid varchar(255), updated timestamp, accessionnumber varchar(255), uri varchar(255), createdby_id integer, updatedby_id integer, primary key (id));
+create table GrantedAuthorityImpl (id integer not null, created timestamp, uuid varchar(255), authority varchar(255), createdby_id integer, primary key (id), unique (authority));
+create table HomotypicalGroup (id integer not null, created timestamp, uuid varchar(255), updated timestamp, createdby_id integer, updatedby_id integer, primary key (id));
+create table HomotypicalGroup_Annotation (HomotypicalGroup_id integer not null, annotations_id integer not null, primary key (HomotypicalGroup_id, annotations_id), unique (annotations_id));
+create table HomotypicalGroup_Marker (HomotypicalGroup_id integer not null, markers_id integer not null, primary key (HomotypicalGroup_id, markers_id), unique (markers_id));
+create table HybridRelationship (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), doubtful boolean not null, ruleconsidered varchar(255), createdby_id integer, updatedby_id integer, citation_id integer, relatedfrom_id integer, relatedto_id integer, type_id integer, primary key (id));
+create table HybridRelationship_Annotation (HybridRelationship_id integer not null, annotations_id integer not null, primary key (HybridRelationship_id, annotations_id), unique (annotations_id));
+create table HybridRelationship_Marker (HybridRelationship_id integer not null, markers_id integer not null, primary key (HybridRelationship_id, markers_id), unique (markers_id));
+create table IdentificationKey_Taxon (identificationKey_fk integer not null, taxon_fk integer not null, primary key (identificationKey_fk, taxon_fk));
+create table InstitutionalMembership (id integer not null, created timestamp, uuid varchar(255), updated timestamp, department varchar(255), period_end varchar(255), period_start varchar(255), role varchar(255), createdby_id integer, updatedby_id integer, institute_id integer, person_id integer, primary key (id));
+create table LanguageString (id integer not null, created timestamp, uuid varchar(255), updated timestamp, text varchar(4096), createdby_id integer, updatedby_id integer, language_id integer, primary key (id));
+create table LanguageString_Annotation (LanguageString_id integer not null, annotations_id integer not null, primary key (LanguageString_id, annotations_id), unique (annotations_id));
+create table LanguageString_Marker (LanguageString_id integer not null, markers_id integer not null, primary key (LanguageString_id, markers_id), unique (markers_id));
+create table Locus (id integer not null, created timestamp, uuid varchar(255), updated timestamp, description varchar(255), name varchar(255), createdby_id integer, updatedby_id integer, primary key (id));
+create table Marker (id integer not null, created timestamp, uuid varchar(255), updated timestamp, flag boolean not null, markedObj_type varchar(255), markedObj_id integer not null, createdby_id integer, updatedby_id integer, markertype_id integer, primary key (id));
+create table Media (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, description varbinary(255), mediacreated date, title varbinary(255), citationmicroreference varchar(255), createdby_id integer, updatedby_id integer, artist_id integer, citation_id integer, primary key (id));
+create table MediaRepresentation (id integer not null, created timestamp, uuid varchar(255), updated timestamp, mimetype varchar(255), suffix varchar(255), createdby_id integer, updatedby_id integer, media_id integer, primary key (id));
+create table MediaRepresentationPart (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, size integer, uri varchar(255), duration integer, height integer, width integer, createdby_id integer, updatedby_id integer, representation_id integer not null, sortIndex integer, primary key (id));
+create table Media_Annotation (Media_id integer not null, annotations_id integer not null, primary key (Media_id, annotations_id), unique (annotations_id));
+create table Media_DefinedTermBase (Media_id integer not null, geoscopes_id integer not null, primary key (Media_id, geoscopes_id));
+create table Media_Marker (Media_id integer not null, markers_id integer not null, primary key (Media_id, markers_id), unique (markers_id));
+create table Media_Rights (Media_id integer not null, rights_id integer not null, primary key (Media_id, rights_id));
+create table Media_Sequence (Media_id integer not null, usedsequences_id integer not null, primary key (Media_id, usedsequences_id), unique (usedsequences_id));
+create table Media_TaxonBase (Media_id integer not null, coveredtaxa_id integer not null, primary key (Media_id, coveredtaxa_id), unique (coveredtaxa_id));
+create table NameRelationship (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), doubtful boolean not null, ruleconsidered varchar(255), createdby_id integer, updatedby_id integer, citation_id integer, relatedfrom_id integer, relatedto_id integer, type_id integer, primary key (id));
+create table NameRelationship_Annotation (NameRelationship_id integer not null, annotations_id integer not null, primary key (NameRelationship_id, annotations_id), unique (annotations_id));
+create table NameRelationship_Marker (NameRelationship_id integer not null, markers_id integer not null, primary key (NameRelationship_id, markers_id), unique (markers_id));
+create table NomenclaturalStatus (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), ruleconsidered varchar(255), createdby_id integer, updatedby_id integer, citation_id integer, type_id integer, primary key (id));
+create table NomenclaturalStatus_Annotation (NomenclaturalStatus_id integer not null, annotations_id integer not null, primary key (NomenclaturalStatus_id, annotations_id), unique (annotations_id));
+create table NomenclaturalStatus_Marker (NomenclaturalStatus_id integer not null, markers_id integer not null, primary key (NomenclaturalStatus_id, markers_id), unique (markers_id));
+create table OriginalSource (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), idinsource varchar(255), idnamespace varchar(255), sourcedObj_type varchar(255), sourcedObj_id integer not null, createdby_id integer, updatedby_id integer, citation_id integer, primary key (id));
+create table OriginalSource_Annotation (OriginalSource_id integer not null, annotations_id integer not null, primary key (OriginalSource_id, annotations_id), unique (annotations_id));
+create table OriginalSource_Marker (OriginalSource_id integer not null, markers_id integer not null, primary key (OriginalSource_id, markers_id), unique (markers_id));
+create table PermissionGroup (id integer not null, created timestamp, uuid varchar(255), name varchar(255), createdby_id integer, primary key (id));
+create table PermissionGroup_GrantedAuthorityImpl (PermissionGroup_id integer not null, grantedauthorities_id integer not null, primary key (PermissionGroup_id, grantedauthorities_id));
+create table Person_Keyword (person_fk integer not null, keyword_fk integer not null, primary key (person_fk, keyword_fk));
+create table ReferenceBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, hasproblem boolean not null, nomenclaturallyrelevant boolean not null, problemends integer not null, problemstarts integer not null, uri varchar(255), datepublished_end varchar(255), datepublished_start varchar(255), title varchar(255), pages varchar(255), series varchar(255), volume varchar(255), address varchar(255), annote varchar(255), booktitle varchar(255), chapter varchar(255), edition varchar(255), editor varchar(255), eprint varchar(255), howpublished varchar(255), institution varchar(255), journal varchar(255), month varchar(255), note varchar(255), number varchar(255), organization varchar(255), publisher varchar(255), reporttype varchar(255), school varchar(255), year varchar(255), placepublished varchar(255), seriespart varchar(255), isbn varchar(255), issn varchar(255), createdby_id integer, updatedby_id integer, authorteam_id integer, injournal_id integer, crossref_id integer, type_id integer, inseries_id integer, inbook_id integer, inproceedings_id integer, institution_id integer, school_id integer, primary key (id));
+create table ReferenceBase_Annotation (ReferenceBase_id integer not null, annotations_id integer not null, primary key (ReferenceBase_id, annotations_id), unique (annotations_id));
+create table ReferenceBase_Extension (ReferenceBase_id integer not null, extensions_id integer not null, primary key (ReferenceBase_id, extensions_id), unique (extensions_id));
+create table ReferenceBase_Marker (ReferenceBase_id integer not null, markers_id integer not null, primary key (ReferenceBase_id, markers_id), unique (markers_id));
+create table ReferenceBase_Media (ReferenceBase_id integer not null, media_id integer not null, primary key (ReferenceBase_id, media_id), unique (media_id));
+create table ReferenceBase_OriginalSource (ReferenceBase_id integer not null, sources_id integer not null, primary key (ReferenceBase_id, sources_id), unique (sources_id));
+create table ReferenceBase_Rights (ReferenceBase_id integer not null, rights_id integer not null, primary key (ReferenceBase_id, rights_id));
+create table RelationshipTermBase_inverseRepresentation (DefinedTermBase_id integer not null, inverserepresentations_id integer not null, primary key (DefinedTermBase_id, inverserepresentations_id), unique (inverserepresentations_id));
+create table Representation (id integer not null, created timestamp, uuid varchar(255), updated timestamp, text varchar(4096), abbreviatedlabel varchar(255), label varchar(255), createdby_id integer, updatedby_id integer, language_id integer, primary key (id));
+create table Representation_Annotation (Representation_id integer not null, annotations_id integer not null, primary key (Representation_id, annotations_id), unique (annotations_id));
+create table Representation_Marker (Representation_id integer not null, markers_id integer not null, primary key (Representation_id, markers_id), unique (markers_id));
+create table Rights (id integer not null, created timestamp, uuid varchar(255), updated timestamp, text varchar(4096), abbreviatedtext varchar(255), uri varchar(255), createdby_id integer, updatedby_id integer, language_id integer, agent_id integer, type_id integer, primary key (id));
+create table Rights_Annotation (Rights_id integer not null, annotations_id integer not null, primary key (Rights_id, annotations_id), unique (annotations_id));
+create table Rights_Marker (Rights_id integer not null, markers_id integer not null, primary key (Rights_id, markers_id), unique (markers_id));
+create table Sequence (id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, barcode boolean not null, citationmicroreference varchar(255), datesequenced date, length integer, sequence varchar(255), createdby_id integer, updatedby_id integer, locus_id integer, publishedin_id integer, primary key (id));
+create table Sequence_Annotation (Sequence_id integer not null, annotations_id integer not null, primary key (Sequence_id, annotations_id), unique (annotations_id));
+create table Sequence_Extension (Sequence_id integer not null, extensions_id integer not null, primary key (Sequence_id, extensions_id), unique (extensions_id));
+create table Sequence_GenBankAccession (Sequence_id integer not null, genbankaccession_id integer not null, primary key (Sequence_id, genbankaccession_id), unique (genbankaccession_id));
+create table Sequence_Marker (Sequence_id integer not null, markers_id integer not null, primary key (Sequence_id, markers_id), unique (markers_id));
+create table Sequence_Media (Sequence_id integer not null, chromatograms_id integer not null, primary key (Sequence_id, chromatograms_id), unique (chromatograms_id));
+create table Sequence_OriginalSource (Sequence_id integer not null, sources_id integer not null, primary key (Sequence_id, sources_id), unique (sources_id));
+create table Sequence_ReferenceBase (Sequence_id integer not null, citations_id integer not null, primary key (Sequence_id, citations_id), unique (citations_id));
+create table Sequence_Rights (Sequence_id integer not null, rights_id integer not null, primary key (Sequence_id, rights_id));
+create table SpecimenOrObservationBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, definition varbinary(255), individualcount integer, accessionnumber varchar(255), catalognumber varchar(255), collectorsnumber varchar(255), fieldnotes varchar(255), fieldnumber varchar(255), createdby_id integer, updatedby_id integer, lifestage_id integer, sex_id integer, collection_id integer, derivationevent_id integer, storedunder_id integer, preservation_id integer, gatheringevent_id integer, primary key (id));
+create table SpecimenOrObservationBase_Annotation (SpecimenOrObservationBase_id integer not null, annotations_id integer not null, primary key (SpecimenOrObservationBase_id, annotations_id), unique (annotations_id));
+create table SpecimenOrObservationBase_DerivationEvent (originals_id integer not null, derivationevents_id integer not null, primary key (originals_id, derivationevents_id));
+create table SpecimenOrObservationBase_Extension (SpecimenOrObservationBase_id integer not null, extensions_id integer not null, primary key (SpecimenOrObservationBase_id, extensions_id), unique (extensions_id));
+create table SpecimenOrObservationBase_Marker (SpecimenOrObservationBase_id integer not null, markers_id integer not null, primary key (SpecimenOrObservationBase_id, markers_id), unique (markers_id));
+create table SpecimenOrObservationBase_Media (SpecimenOrObservationBase_id integer not null, media_id integer not null, primary key (SpecimenOrObservationBase_id, media_id), unique (media_id));
+create table SpecimenOrObservationBase_OriginalSource (SpecimenOrObservationBase_id integer not null, sources_id integer not null, primary key (SpecimenOrObservationBase_id, sources_id), unique (sources_id));
+create table SpecimenOrObservationBase_Rights (SpecimenOrObservationBase_id integer not null, rights_id integer not null, primary key (SpecimenOrObservationBase_id, rights_id));
+create table SpecimenOrObservationBase_Sequence (SpecimenOrObservationBase_id integer not null, sequences_id integer not null, primary key (SpecimenOrObservationBase_id, sequences_id), unique (sequences_id));
+create table StateData (id integer not null, created timestamp, uuid varchar(255), updated timestamp, modifyingtext varbinary(255), createdby_id integer, updatedby_id integer, state_id integer, primary key (id));
+create table StateData_DefinedTermBase (StateData_id integer not null, modifiers_id integer not null, primary key (StateData_id, modifiers_id), unique (modifiers_id));
+create table StatisticalMeasurementValue (id integer not null, created timestamp, uuid varchar(255), updated timestamp, value double not null, createdby_id integer, updatedby_id integer, type_id integer, primary key (id));
+create table StatisticalMeasurementValue_DefinedTermBase (StatisticalMeasurementValue_id integer not null, modifiers_id integer not null, primary key (StatisticalMeasurementValue_id, modifiers_id), unique (modifiers_id));
+create table SynonymRelationship (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), doubtful boolean not null, partial boolean not null, proparte boolean not null, createdby_id integer, updatedby_id integer, citation_id integer, relatedfrom_id integer, relatedto_id integer, type_id integer, primary key (id));
+create table SynonymRelationship_Annotation (SynonymRelationship_id integer not null, annotations_id integer not null, primary key (SynonymRelationship_id, annotations_id), unique (annotations_id));
+create table SynonymRelationship_Marker (SynonymRelationship_id integer not null, markers_id integer not null, primary key (SynonymRelationship_id, markers_id), unique (markers_id));
+create table TaxonBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, doubtful boolean not null, taxonomicchildrencount integer, createdby_id integer, updatedby_id integer, taxonName_fk integer, sec_id integer, taxonomicparentcache_id integer, primary key (id));
+create table TaxonBase_Annotation (TaxonBase_id integer not null, annotations_id integer not null, primary key (TaxonBase_id, annotations_id), unique (annotations_id));
+create table TaxonBase_Extension (TaxonBase_id integer not null, extensions_id integer not null, primary key (TaxonBase_id, extensions_id), unique (extensions_id));
+create table TaxonBase_Marker (TaxonBase_id integer not null, markers_id integer not null, primary key (TaxonBase_id, markers_id), unique (markers_id));
+create table TaxonBase_OriginalSource (TaxonBase_id integer not null, sources_id integer not null, primary key (TaxonBase_id, sources_id), unique (sources_id));
+create table TaxonBase_Rights (TaxonBase_id integer not null, rights_id integer not null, primary key (TaxonBase_id, rights_id));
+create table TaxonNameBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, lsid varchar(255), titleCache varchar(255), protectedtitlecache boolean not null, appendedphrase varchar(255), hasproblem boolean not null, nomenclaturalmicroreference varchar(255), fullTitleCache varchar(330), problemends integer not null, problemstarts integer not null, protectedfulltitlecache boolean not null, authorshipcache varchar(255), genusoruninomial varchar(255), infragenericepithet varchar(255), infraspecificepithet varchar(255), namecache varchar(255), protectedauthorshipcache boolean, protectednamecache boolean, specificepithet varchar(255), nameapprobation varchar(255), subgenusauthorship varchar(255), anamorphic boolean, binomhybrid boolean, hybridformula boolean, monomhybrid boolean, trinomhybrid boolean, cultivarname varchar(255), acronym varchar(255), breed varchar(255), originalpublicationyear integer, publicationyear integer, createdby_id integer, updatedby_id integer, homotypicalgroup_id integer, nomenclaturalreference_id integer, rank_id integer, basionymauthorteam_id integer, combinationauthorteam_id integer, exbasionymauthorteam_id integer, excombinationauthorteam_id integer, primary key (id));
+create table TaxonNameBase_Annotation (TaxonNameBase_id integer not null, annotations_id integer not null, primary key (TaxonNameBase_id, annotations_id), unique (annotations_id));
+create table TaxonNameBase_Extension (TaxonNameBase_id integer not null, extensions_id integer not null, primary key (TaxonNameBase_id, extensions_id), unique (extensions_id));
+create table TaxonNameBase_HybridRelationship (TaxonNameBase_id integer not null, hybridrelationships_id integer not null, primary key (TaxonNameBase_id, hybridrelationships_id), unique (hybridrelationships_id));
+create table TaxonNameBase_Marker (TaxonNameBase_id integer not null, markers_id integer not null, primary key (TaxonNameBase_id, markers_id), unique (markers_id));
+create table TaxonNameBase_NomenclaturalStatus (TaxonNameBase_id integer not null, status_id integer not null, primary key (TaxonNameBase_id, status_id), unique (status_id));
+create table TaxonNameBase_OriginalSource (TaxonNameBase_id integer not null, sources_id integer not null, primary key (TaxonNameBase_id, sources_id), unique (sources_id));
+create table TaxonNameBase_Rights (TaxonNameBase_id integer not null, rights_id integer not null, primary key (TaxonNameBase_id, rights_id));
+create table TaxonNameBase_TypeDesignationBase (TaxonNameBase_id integer not null, typedesignations_id integer not null, primary key (TaxonNameBase_id, typedesignations_id));
+create table TaxonRelationship (id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), doubtful boolean not null, createdby_id integer, updatedby_id integer, citation_id integer, relatedfrom_id integer, relatedto_id integer, type_id integer, primary key (id));
+create table TaxonRelationship_Annotation (TaxonRelationship_id integer not null, annotations_id integer not null, primary key (TaxonRelationship_id, annotations_id), unique (annotations_id));
+create table TaxonRelationship_Marker (TaxonRelationship_id integer not null, markers_id integer not null, primary key (TaxonRelationship_id, markers_id), unique (markers_id));
+create table TermVocabulary (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, uri varchar(255), termclass varchar(255), termsourceuri varchar(255), createdby_id integer, updatedby_id integer, primary key (id));
+create table TermVocabulary_Representation (TermVocabulary_id integer not null, representations_id integer not null, primary key (TermVocabulary_id, representations_id), unique (representations_id));
+create table TypeDesignationBase (DTYPE varchar(31) not null, id integer not null, created timestamp, uuid varchar(255), updated timestamp, citationmicroreference varchar(255), originalnamestring varchar(255), notdesignated boolean not null, conservedtype boolean, lectotype boolean, rejectedtype boolean, createdby_id integer, updatedby_id integer, citation_id integer, homotypicalgroup_id integer, typename_id integer, typespecimen_id integer, typestatus_id integer, primary key (id));
+create table TypeDesignationBase_Annotation (TypeDesignationBase_id integer not null, annotations_id integer not null, primary key (TypeDesignationBase_id, annotations_id), unique (annotations_id));
+create table TypeDesignationBase_Marker (TypeDesignationBase_id integer not null, markers_id integer not null, primary key (TypeDesignationBase_id, markers_id), unique (markers_id));
+create table TypeDesignationBase_TaxonNameBase (TypeDesignationBase_id integer not null, typifiednames_id integer not null, primary key (TypeDesignationBase_id, typifiednames_id));
+create table User (id integer not null, created timestamp, uuid varchar(255), accountnonexpired boolean not null, accountnonlocked boolean not null, credentialsnonexpired boolean not null, emailaddress varchar(255), enabled boolean not null, password varchar(255), username varchar(255), createdby_id integer, primary key (id), unique (username));
+create table User_GrantedAuthorityImpl (User_id integer not null, grantedauthorities_id integer not null, primary key (User_id, grantedauthorities_id));
+create table User_PermissionGroup (members_id integer not null, groups_id integer not null, primary key (members_id, groups_id));
+alter table Address add constraint FK1ED033D4EF7921F6 foreign key (createdby_id) references Agent;
+alter table Address add constraint FK1ED033D4132A2FE8 foreign key (location_referencesystem_id) references DefinedTermBase;
+alter table Address add constraint FK1ED033D4EE7A4BF4 foreign key (contact_id) references Contact;
+alter table Address add constraint FK1ED033D42687715A foreign key (country_id) references DefinedTermBase;
+alter table Address add constraint FK1ED033D45BE3EC03 foreign key (updatedby_id) references Agent;
+create index agentTitleCacheIndex on Agent (titleCache);
+alter table Agent add constraint FK3C452E5EF7921F6 foreign key (createdby_id) references Agent;
+alter table Agent add constraint FK3C452E5EE7A4BF4 foreign key (contact_id) references Contact;
+alter table Agent add constraint FK3C452E5A830578 foreign key (ispartof_id) references Agent;
+alter table Agent add constraint FK3C452E55BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Agent_Agent add constraint FKD792890B8CB642F8 foreign key (Agent_id) references Agent;
+alter table Agent_Agent add constraint FKD792890BE9E535F9 foreign key (teammembers_id) references Agent;
+alter table Agent_Annotation add constraint FKDD9D78E9C5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_Annotation add constraint FKDD9D78E91E403E0B foreign key (annotations_id) references Annotation;
+alter table Agent_DefinedTermBase add constraint FK7029490C9A161BED foreign key (types_id) references DefinedTermBase;
+alter table Agent_DefinedTermBase add constraint FK7029490CFE425B87 foreign key (Agent_id) references Agent;
+alter table Agent_Extension add constraint FK8AC9EF45927DE9DF foreign key (extensions_id) references Extension;
+alter table Agent_Extension add constraint FK8AC9EF45C5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_Marker add constraint FK2EEA0EF4777265A1 foreign key (markers_id) references Marker;
+alter table Agent_Marker add constraint FK2EEA0EF4C5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_Media add constraint FKD83AB5EAC5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_Media add constraint FKD83AB5EAC2C29593 foreign key (media_id) references Media;
+alter table Agent_OriginalSource add constraint FK774F9E06C5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_OriginalSource add constraint FK774F9E063BAB2414 foreign key (sources_id) references OriginalSource;
+alter table Agent_Rights add constraint FK37DDFC91C5F7EC54 foreign key (Agent_id) references Agent;
+alter table Agent_Rights add constraint FK37DDFC91C13F7B21 foreign key (rights_id) references Rights;
+alter table Annotation add constraint FK1A21C74FEF7921F6 foreign key (createdby_id) references Agent;
+alter table Annotation add constraint FK1A21C74FE7692740 foreign key (commentator_id) references Agent;
+alter table Annotation add constraint FK1A21C74FE8D36B00 foreign key (language_id) references DefinedTermBase;
+alter table Annotation add constraint FK1A21C74F5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Annotation_Annotation add constraint FKC99DFE3F994CCE20 foreign key (Annotation_id) references Annotation;
+alter table Annotation_Annotation add constraint FKC99DFE3F1E403E0B foreign key (annotations_id) references Annotation;
+alter table Annotation_Marker add constraint FKB17EAF4A777265A1 foreign key (markers_id) references Marker;
+alter table Annotation_Marker add constraint FKB17EAF4A994CCE20 foreign key (Annotation_id) references Annotation;
+alter table CDM_VIEW add constraint FKC5DE8EF8EF7921F6 foreign key (createdby_id) references Agent;
+alter table CDM_VIEW_CDM_VIEW add constraint FK230A885F7208BB38 foreign key (superviews_id) references CDM_VIEW;
+alter table CDM_VIEW_CDM_VIEW add constraint FK230A885FC00D1213 foreign key (CDM_VIEW_id) references CDM_VIEW;
+create index collectionTitleCacheIndex on Collection (titleCache);
+alter table Collection add constraint FKF078ABEEF7921F6 foreign key (createdby_id) references Agent;
+alter table Collection add constraint FKF078ABE16B9CA77 foreign key (institute_id) references Agent;
+alter table Collection add constraint FKF078ABECEB38EFF foreign key (supercollection_id) references Collection;
+alter table Collection add constraint FKF078ABE5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Collection_Annotation add constraint FKEA970F70EB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_Annotation add constraint FKEA970F701E403E0B foreign key (annotations_id) references Annotation;
+alter table Collection_Extension add constraint FKF68FEBDEEB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_Extension add constraint FKF68FEBDE927DE9DF foreign key (extensions_id) references Extension;
+alter table Collection_Marker add constraint FKF0CA00FBEB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_Marker add constraint FKF0CA00FB777265A1 foreign key (markers_id) references Marker;
+alter table Collection_Media add constraint FK7320E703EB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_Media add constraint FK7320E703C2C29593 foreign key (media_id) references Media;
+alter table Collection_OriginalSource add constraint FKA8FC990DEB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_OriginalSource add constraint FKA8FC990D3BAB2414 foreign key (sources_id) references OriginalSource;
+alter table Collection_Rights add constraint FKF9BDEE98EB62BE9A foreign key (Collection_id) references Collection;
+alter table Collection_Rights add constraint FKF9BDEE98C13F7B21 foreign key (rights_id) references Rights;
+alter table Contact add constraint FK9BEFBC00EF7921F6 foreign key (createdby_id) references Agent;
+alter table Contact add constraint FK9BEFBC005BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DefinedTermBase add constraint FK2E340A66EF7921F6 foreign key (createdby_id) references Agent;
+alter table DefinedTermBase add constraint FK2E340A66D040DBF0 foreign key (partof_id) references DefinedTermBase;
+alter table DefinedTermBase add constraint FK2E340A66CC0240B6 foreign key (shape_id) references Media;
+alter table DefinedTermBase add constraint FK2E340A66A2ACB415 foreign key (persistentvocabulary_id) references TermVocabulary;
+alter table DefinedTermBase add constraint FK2E340A6624AF3F70 foreign key (level_id) references DefinedTermBase;
+alter table DefinedTermBase add constraint FK2E340A6688206484 foreign key (type_id) references DefinedTermBase;
+alter table DefinedTermBase add constraint FK2E340A6636C6F6F6 foreign key (pointapproximation_referencesystem_id) references DefinedTermBase;
+alter table DefinedTermBase add constraint FK2E340A663B0DA0EF foreign key (kindof_id) references DefinedTermBase;
+alter table DefinedTermBase add constraint FK2E340A665BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DefinedTermBase_Continent add constraint FK45F60AFB3927C853 foreign key (continents_id) references DefinedTermBase;
+alter table DefinedTermBase_Continent add constraint FK45F60AFBE8CE10AA foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_Media add constraint FK6FC908ABC0DB4934 foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_Media add constraint FK6FC908ABC2C29593 foreign key (media_id) references Media;
+alter table DefinedTermBase_RecommendedModifierEnumeration add constraint FKA72FB5AED0BDAE9B foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_RecommendedModifierEnumeration add constraint FKA72FB5AE5255EAFD foreign key (recommendedmodifierenumeration_id) references TermVocabulary;
+alter table DefinedTermBase_Representation add constraint FKAAC8AFE6B31C4747 foreign key (representations_id) references Representation;
+alter table DefinedTermBase_Representation add constraint FKAAC8AFE6C0DB4934 foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_StatisticalMeasure add constraint FK6FF15DFCD0BDAE9B foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_StatisticalMeasure add constraint FK6FF15DFCC9CD5B57 foreign key (recommendedstatisticalmeasures_id) references DefinedTermBase;
+alter table DefinedTermBase_SupportedCategoricalEnumeration add constraint FK2170B25CD0BDAE9B foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DefinedTermBase_SupportedCategoricalEnumeration add constraint FK2170B25C5AF2C74 foreign key (supportedcategoricalenumerations_id) references TermVocabulary;
+alter table DefinedTermBase_WaterbodyOrCountry add constraint FKCAF43931603B036 foreign key (waterbodiesorcountries_id) references DefinedTermBase;
+alter table DefinedTermBase_WaterbodyOrCountry add constraint FKCAF4393CE5C0F9E foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table DerivationEvent add constraint FK426BC03EF7921F6 foreign key (createdby_id) references Agent;
+alter table DerivationEvent add constraint FK426BC03C04DF64 foreign key (actor_id) references Agent;
+alter table DerivationEvent add constraint FK426BC038524B89D foreign key (type_id) references DefinedTermBase;
+alter table DerivationEvent add constraint FK426BC035BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DerivationEvent_Annotation add constraint FKEFA0D10B4AAB411A foreign key (DerivationEvent_id) references DerivationEvent;
+alter table DerivationEvent_Annotation add constraint FKEFA0D10B1E403E0B foreign key (annotations_id) references Annotation;
+alter table DerivationEvent_Marker add constraint FKE412C816777265A1 foreign key (markers_id) references Marker;
+alter table DerivationEvent_Marker add constraint FKE412C8164AAB411A foreign key (DerivationEvent_id) references DerivationEvent;
+alter table DescriptionBase add constraint FKFF4D58CDEF7921F6 foreign key (createdby_id) references Agent;
+alter table DescriptionBase add constraint FKFF4D58CDDE9A3DE3 foreign key (taxon_fk) references TaxonBase;
+alter table DescriptionBase add constraint FKFF4D58CDDA93512F foreign key (taxonName_fk) references TaxonNameBase;
+alter table DescriptionBase add constraint FKFF4D58CD5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DescriptionBase_Annotation add constraint FKF3AD3201F1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_Annotation add constraint FKF3AD32011E403E0B foreign key (annotations_id) references Annotation;
+alter table DescriptionBase_Extension add constraint FKD5D2B32DF1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_Extension add constraint FKD5D2B32D927DE9DF foreign key (extensions_id) references Extension;
+alter table DescriptionBase_GeoScope add constraint FK3ADD7CD586D04E74 foreign key (geoscopes_id) references DefinedTermBase;
+alter table DescriptionBase_GeoScope add constraint FK3ADD7CD5D86445CE foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_Marker add constraint FK6132140C777265A1 foreign key (markers_id) references Marker;
+alter table DescriptionBase_Marker add constraint FK6132140CF1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_OriginalSource add constraint FK1E2D0B1EF1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_OriginalSource add constraint FK1E2D0B1E3BAB2414 foreign key (sources_id) references OriginalSource;
+alter table DescriptionBase_ReferenceBase add constraint FK76188CAAF1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_ReferenceBase add constraint FK76188CAA45AB7BBA foreign key (descriptionsources_id) references ReferenceBase;
+alter table DescriptionBase_Rights add constraint FK6A2601A9F1DDBFAB foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionBase_Rights add constraint FK6A2601A9C13F7B21 foreign key (rights_id) references Rights;
+alter table DescriptionBase_Scope add constraint FKB9257C42951A5D40 foreign key (scopes_id) references DefinedTermBase;
+alter table DescriptionBase_Scope add constraint FKB9257C42D86445CE foreign key (DescriptionBase_id) references DescriptionBase;
+alter table DescriptionElementBase add constraint FK38FE76711C3C3FF7 foreign key (area_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE7671EF7921F6 foreign key (createdby_id) references Agent;
+alter table DescriptionElementBase add constraint FK38FE76719803512F foreign key (citation_id) references ReferenceBase;
+alter table DescriptionElementBase add constraint FK38FE76716D0D7A56 foreign key (format_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE76714220AFEB foreign key (feature_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE76719108D9B foreign key (taxon2_id) references TaxonBase;
+alter table DescriptionElementBase add constraint FK38FE76715E9914B8 foreign key (status_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE767110A80E07 foreign key (unit_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE76716561D9B1 foreign key (associatedspecimenorobservation_id) references SpecimenOrObservationBase;
+alter table DescriptionElementBase add constraint FK38FE767134AF0E81 foreign key (indescription_id) references DescriptionBase;
+alter table DescriptionElementBase add constraint FK38FE7671E8D36B00 foreign key (language_id) references DefinedTermBase;
+alter table DescriptionElementBase add constraint FK38FE76715BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DescriptionElementBase_Annotation add constraint FK7EE5E5DD3B8BB609 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_Annotation add constraint FK7EE5E5DD1E403E0B foreign key (annotations_id) references Annotation;
+alter table DescriptionElementBase_LanguageString add constraint FKC753F137C086B46F foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_LanguageString add constraint FKC753F137ACF5F60B foreign key (multilanguagetext_id) references LanguageString;
+alter table DescriptionElementBase_Marker add constraint FK1CB715E8777265A1 foreign key (markers_id) references Marker;
+alter table DescriptionElementBase_Marker add constraint FK1CB715E83B8BB609 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_Media add constraint FK21F700763B8BB609 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_Media add constraint FK21F70076C2C29593 foreign key (media_id) references Media;
+alter table DescriptionElementBase_Modifier add constraint FK97E0D1053B8BB609 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_Modifier add constraint FK97E0D105E0960EC4 foreign key (modifiers_id) references DefinedTermBase;
+alter table DescriptionElementBase_StateData add constraint FK592D6F6D15153604 foreign key (states_id) references StateData;
+alter table DescriptionElementBase_StateData add constraint FK592D6F6D987CC6A4 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_StatisticalMeasurementValue add constraint FK8AF511C28F213219 foreign key (DescriptionElementBase_id) references DescriptionElementBase;
+alter table DescriptionElementBase_StatisticalMeasurementValue add constraint FK8AF511C2D883945E foreign key (statisticalvalues_id) references StatisticalMeasurementValue;
+alter table DeterminationEvent add constraint FK1DB2497EF7921F6 foreign key (createdby_id) references Agent;
+alter table DeterminationEvent add constraint FK1DB2497C04DF64 foreign key (actor_id) references Agent;
+alter table DeterminationEvent add constraint FK1DB2497DE9A3E39 foreign key (taxon_id) references TaxonBase;
+alter table DeterminationEvent add constraint FK1DB24974B251DAD foreign key (identifiedunit_id) references SpecimenOrObservationBase;
+alter table DeterminationEvent add constraint FK1DB2497378D1BD foreign key (modifier_id) references DefinedTermBase;
+alter table DeterminationEvent add constraint FK1DB24975BE3EC03 foreign key (updatedby_id) references Agent;
+alter table DeterminationEvent_Annotation add constraint FKB74F03F76BE0BFDA foreign key (DeterminationEvent_id) references DeterminationEvent;
+alter table DeterminationEvent_Annotation add constraint FKB74F03F71E403E0B foreign key (annotations_id) references Annotation;
+alter table DeterminationEvent_Marker add constraint FK5C475102777265A1 foreign key (markers_id) references Marker;
+alter table DeterminationEvent_Marker add constraint FK5C4751026BE0BFDA foreign key (DeterminationEvent_id) references DeterminationEvent;
+alter table DeterminationEvent_ReferenceBase add constraint FK6248EEF4F3C981EE foreign key (references_id) references ReferenceBase;
+alter table DeterminationEvent_ReferenceBase add constraint FK6248EEF46BE0BFDA foreign key (DeterminationEvent_id) references DeterminationEvent;
+alter table Extension add constraint FK52EF3C1FEF7921F6 foreign key (createdby_id) references Agent;
+alter table Extension add constraint FK52EF3C1FAD392BD3 foreign key (type_id) references DefinedTermBase;
+alter table Extension add constraint FK52EF3C1F5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table FeatureNode add constraint FK4CEED9F8EF7921F6 foreign key (createdby_id) references Agent;
+alter table FeatureNode add constraint FK4CEED9F8E0AD2C03 foreign key (parent_fk) references FeatureNode;
+alter table FeatureNode add constraint FK4CEED9F84220AFEB foreign key (feature_id) references DefinedTermBase;
+alter table FeatureNode add constraint FK4CEED9F85BE3EC03 foreign key (updatedby_id) references Agent;
+alter table FeatureTree add constraint FK4CF19F94EF7921F6 foreign key (createdby_id) references Agent;
+alter table FeatureTree add constraint FK4CF19F94B7892921 foreign key (root_id) references FeatureNode;
+alter table FeatureTree add constraint FK4CF19F945BE3EC03 foreign key (updatedby_id) references Agent;
+alter table FeatureTree_Representation add constraint FK8C458F8B31C4747 foreign key (representations_id) references Representation;
+alter table FeatureTree_Representation add constraint FK8C458F847C496CB foreign key (FeatureTree_id) references FeatureTree;
+alter table GatheringEvent add constraint FK6F1286F38B455EC6 foreign key (locality_id) references LanguageString;
+alter table GatheringEvent add constraint FK6F1286F3EF7921F6 foreign key (createdby_id) references Agent;
+alter table GatheringEvent add constraint FK6F1286F3C04DF64 foreign key (actor_id) references Agent;
+alter table GatheringEvent add constraint FK6F1286F3F55AFD89 foreign key (exactlocation_referencesystem_id) references DefinedTermBase;
+alter table GatheringEvent add constraint FK6F1286F35BE3EC03 foreign key (updatedby_id) references Agent;
+alter table GatheringEvent_Annotation add constraint FK76DDD01BF95F225A foreign key (GatheringEvent_id) references GatheringEvent;
+alter table GatheringEvent_Annotation add constraint FK76DDD01B1E403E0B foreign key (annotations_id) references Annotation;
+alter table GatheringEvent_DefinedTermBase add constraint FK69D9A11A7C34B6D6 foreign key (collectingareas_id) references DefinedTermBase;
+alter table GatheringEvent_DefinedTermBase add constraint FK69D9A11AF95F225A foreign key (GatheringEvent_id) references GatheringEvent;
+alter table GatheringEvent_Marker add constraint FK7B49CF26777265A1 foreign key (markers_id) references Marker;
+alter table GatheringEvent_Marker add constraint FK7B49CF26F95F225A foreign key (GatheringEvent_id) references GatheringEvent;
+alter table GenBankAccession add constraint FK86C1DBF8EF7921F6 foreign key (createdby_id) references Agent;
+alter table GenBankAccession add constraint FK86C1DBF85BE3EC03 foreign key (updatedby_id) references Agent;
+alter table GrantedAuthorityImpl add constraint FKB05CF928EF7921F6 foreign key (createdby_id) references Agent;
+alter table HomotypicalGroup add constraint FK7DECCC18EF7921F6 foreign key (createdby_id) references Agent;
+alter table HomotypicalGroup add constraint FK7DECCC185BE3EC03 foreign key (updatedby_id) references Agent;
+alter table HomotypicalGroup_Annotation add constraint FK7A0351D6BFEAE500 foreign key (HomotypicalGroup_id) references HomotypicalGroup;
+alter table HomotypicalGroup_Annotation add constraint FK7A0351D61E403E0B foreign key (annotations_id) references Annotation;
+alter table HomotypicalGroup_Marker add constraint FK97D36661777265A1 foreign key (markers_id) references Marker;
+alter table HomotypicalGroup_Marker add constraint FK97D36661BFEAE500 foreign key (HomotypicalGroup_id) references HomotypicalGroup;
+alter table HybridRelationship add constraint FK9033CE74EF7921F6 foreign key (createdby_id) references Agent;
+alter table HybridRelationship add constraint FK9033CE749803512F foreign key (citation_id) references ReferenceBase;
+alter table HybridRelationship add constraint FK9033CE745831BDC3 foreign key (relatedfrom_id) references TaxonNameBase;
+alter table HybridRelationship add constraint FK9033CE7455F241D4 foreign key (type_id) references DefinedTermBase;
+alter table HybridRelationship add constraint FK9033CE7469ABE292 foreign key (relatedto_id) references TaxonNameBase;
+alter table HybridRelationship add constraint FK9033CE745BE3EC03 foreign key (updatedby_id) references Agent;
+alter table HybridRelationship_Annotation add constraint FK2C7E7DFA59832240 foreign key (HybridRelationship_id) references HybridRelationship;
+alter table HybridRelationship_Annotation add constraint FK2C7E7DFA1E403E0B foreign key (annotations_id) references Annotation;
+alter table HybridRelationship_Marker add constraint FKCEF24485777265A1 foreign key (markers_id) references Marker;
+alter table HybridRelationship_Marker add constraint FKCEF2448559832240 foreign key (HybridRelationship_id) references HybridRelationship;
+alter table IdentificationKey_Taxon add constraint FKD847ADDCDE9A3DE3 foreign key (taxon_fk) references TaxonBase;
+alter table IdentificationKey_Taxon add constraint FKD847ADDC996CD055 foreign key (identificationKey_fk) references Media;
+alter table InstitutionalMembership add constraint FK3C8E1FF9EF7921F6 foreign key (createdby_id) references Agent;
+alter table InstitutionalMembership add constraint FK3C8E1FF9AAC1B820 foreign key (person_id) references Agent;
+alter table InstitutionalMembership add constraint FK3C8E1FF916B9CA77 foreign key (institute_id) references Agent;
+alter table InstitutionalMembership add constraint FK3C8E1FF95BE3EC03 foreign key (updatedby_id) references Agent;
+alter table LanguageString add constraint FKB5FDC9A9EF7921F6 foreign key (createdby_id) references Agent;
+alter table LanguageString add constraint FKB5FDC9A9E8D36B00 foreign key (language_id) references DefinedTermBase;
+alter table LanguageString add constraint FKB5FDC9A95BE3EC03 foreign key (updatedby_id) references Agent;
+alter table LanguageString_Annotation add constraint FK8400DFA537998500 foreign key (LanguageString_id) references LanguageString;
+alter table LanguageString_Annotation add constraint FK8400DFA51E403E0B foreign key (annotations_id) references Annotation;
+alter table LanguageString_Marker add constraint FK8DA633B0777265A1 foreign key (markers_id) references Marker;
+alter table LanguageString_Marker add constraint FK8DA633B037998500 foreign key (LanguageString_id) references LanguageString;
+alter table Locus add constraint FK462F1BEEF7921F6 foreign key (createdby_id) references Agent;
+alter table Locus add constraint FK462F1BE5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Marker add constraint FK88F1805AEF7921F6 foreign key (createdby_id) references Agent;
+alter table Marker add constraint FK88F1805AD64DC020 foreign key (markertype_id) references DefinedTermBase;
+alter table Marker add constraint FK88F1805A5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Media add constraint FK46C7FC4EF7921F6 foreign key (createdby_id) references Agent;
+alter table Media add constraint FK46C7FC49803512F foreign key (citation_id) references ReferenceBase;
+alter table Media add constraint FK46C7FC490A4D0D2 foreign key (artist_id) references Agent;
+alter table Media add constraint FK46C7FC45BE3EC03 foreign key (updatedby_id) references Agent;
+alter table MediaRepresentation add constraint FK1966BDB1EF7921F6 foreign key (createdby_id) references Agent;
+alter table MediaRepresentation add constraint FK1966BDB1C2C29593 foreign key (media_id) references Media;
+alter table MediaRepresentation add constraint FK1966BDB15BE3EC03 foreign key (updatedby_id) references Agent;
+alter table MediaRepresentationPart add constraint FK67A45544EF7921F6 foreign key (createdby_id) references Agent;
+alter table MediaRepresentationPart add constraint FK67A45544E3818E37 foreign key (representation_id) references MediaRepresentation;
+alter table MediaRepresentationPart add constraint FK67A455445BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Media_Annotation add constraint FKA020DAAAC2C29593 foreign key (Media_id) references Media;
+alter table Media_Annotation add constraint FKA020DAAA1E403E0B foreign key (annotations_id) references Annotation;
+alter table Media_DefinedTermBase add constraint FK96F1D7EB86D04E74 foreign key (geoscopes_id) references DefinedTermBase;
+alter table Media_DefinedTermBase add constraint FK96F1D7EB8A6C9D18 foreign key (Media_id) references Media;
+alter table Media_Marker add constraint FKD21E7935777265A1 foreign key (markers_id) references Marker;
+alter table Media_Marker add constraint FKD21E7935C2C29593 foreign key (Media_id) references Media;
+alter table Media_Rights add constraint FKDB1266D2C13F7B21 foreign key (rights_id) references Rights;
+alter table Media_Rights add constraint FKDB1266D2C2C29593 foreign key (Media_id) references Media;
+alter table Media_Sequence add constraint FK61D09FCF29B4761 foreign key (usedsequences_id) references Sequence;
+alter table Media_Sequence add constraint FK61D09FC3282B64 foreign key (Media_id) references Media;
+alter table Media_TaxonBase add constraint FK1ABD49E08A6C9D18 foreign key (Media_id) references Media;
+alter table Media_TaxonBase add constraint FK1ABD49E07C3D0017 foreign key (coveredtaxa_id) references TaxonBase;
+alter table NameRelationship add constraint FK5E51083EF7921F6 foreign key (createdby_id) references Agent;
+alter table NameRelationship add constraint FK5E510839803512F foreign key (citation_id) references ReferenceBase;
+alter table NameRelationship add constraint FK5E5108316CDFF85 foreign key (relatedfrom_id) references TaxonNameBase;
+alter table NameRelationship add constraint FK5E51083AF619DE3 foreign key (type_id) references DefinedTermBase;
+alter table NameRelationship add constraint FK5E5108328482454 foreign key (relatedto_id) references TaxonNameBase;
+alter table NameRelationship add constraint FK5E510835BE3EC03 foreign key (updatedby_id) references Agent;
+alter table NameRelationship_Annotation add constraint FK2E38AC8B7B4CB560 foreign key (NameRelationship_id) references NameRelationship;
+alter table NameRelationship_Annotation add constraint FK2E38AC8B1E403E0B foreign key (annotations_id) references Annotation;
+alter table NameRelationship_Marker add constraint FKE3E46396777265A1 foreign key (markers_id) references Marker;
+alter table NameRelationship_Marker add constraint FKE3E463967B4CB560 foreign key (NameRelationship_id) references NameRelationship;
+alter table NomenclaturalStatus add constraint FK1FFEC88BEF7921F6 foreign key (createdby_id) references Agent;
+alter table NomenclaturalStatus add constraint FK1FFEC88B9803512F foreign key (citation_id) references ReferenceBase;
+alter table NomenclaturalStatus add constraint FK1FFEC88B7029BD9F foreign key (type_id) references DefinedTermBase;
+alter table NomenclaturalStatus add constraint FK1FFEC88B5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table NomenclaturalStatus_Annotation add constraint FKE6E91F838D2CB1D4 foreign key (NomenclaturalStatus_id) references NomenclaturalStatus;
+alter table NomenclaturalStatus_Annotation add constraint FKE6E91F831E403E0B foreign key (annotations_id) references Annotation;
+alter table NomenclaturalStatus_Marker add constraint FK2F5128E777265A1 foreign key (markers_id) references Marker;
+alter table NomenclaturalStatus_Marker add constraint FK2F5128E8D2CB1D4 foreign key (NomenclaturalStatus_id) references NomenclaturalStatus;
+alter table OriginalSource add constraint FK229A496CEF7921F6 foreign key (createdby_id) references Agent;
+alter table OriginalSource add constraint FK229A496C9803512F foreign key (citation_id) references ReferenceBase;
+alter table OriginalSource add constraint FK229A496C5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table OriginalSource_Annotation add constraint FK5B3FF802DC2DCA20 foreign key (OriginalSource_id) references OriginalSource;
+alter table OriginalSource_Annotation add constraint FK5B3FF8021E403E0B foreign key (annotations_id) references Annotation;
+alter table OriginalSource_Marker add constraint FKCF52028DDC2DCA20 foreign key (OriginalSource_id) references OriginalSource;
+alter table OriginalSource_Marker add constraint FKCF52028D777265A1 foreign key (markers_id) references Marker;
+alter table PermissionGroup add constraint FK629941D0EF7921F6 foreign key (createdby_id) references Agent;
+alter table PermissionGroup_GrantedAuthorityImpl add constraint FK5311437CA0971A3 foreign key (PermissionGroup_id) references PermissionGroup;
+alter table PermissionGroup_GrantedAuthorityImpl add constraint FK53114371857F6C2 foreign key (grantedauthorities_id) references GrantedAuthorityImpl;
+alter table Person_Keyword add constraint FK5F559EFF13A443BE foreign key (keyword_fk) references DefinedTermBase;
+alter table Person_Keyword add constraint FK5F559EFFAAC1B7CA foreign key (person_fk) references Agent;
+create index ReferenceBaseTitleCacheIndex on ReferenceBase (titleCache);
+alter table ReferenceBase add constraint FK8F034C9CEF7921F6 foreign key (createdby_id) references Agent;
+alter table ReferenceBase add constraint FK8F034C9CE019003F foreign key (injournal_id) references ReferenceBase;
+alter table ReferenceBase add constraint FK8F034C9C1A488155 foreign key (inbook_id) references ReferenceBase;
+alter table ReferenceBase add constraint FK8F034C9C403E17F4 foreign key (institution_id) references Agent;
+alter table ReferenceBase add constraint FK8F034C9CCCE9AAE2 foreign key (inseries_id) references ReferenceBase;
+alter table ReferenceBase add constraint FK8F034C9CAEC3B8B8 foreign key (school_id) references Agent;
+alter table ReferenceBase add constraint FK8F034C9CE3A02620 foreign key (type_id) references DefinedTermBase;
+alter table ReferenceBase add constraint FK8F034C9C697665E foreign key (authorteam_id) references Agent;
+alter table ReferenceBase add constraint FK8F034C9CE87E60BF foreign key (inproceedings_id) references ReferenceBase;
+alter table ReferenceBase add constraint FK8F034C9CD893F6E6 foreign key (crossref_id) references ReferenceBase;
+alter table ReferenceBase add constraint FK8F034C9C5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table ReferenceBase_Annotation add constraint FKC97616D2F443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_Annotation add constraint FKC97616D21E403E0B foreign key (annotations_id) references Annotation;
+alter table ReferenceBase_Extension add constraint FK81E1703C927DE9DF foreign key (extensions_id) references Extension;
+alter table ReferenceBase_Extension add constraint FK81E1703CF443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_Marker add constraint FK6888095D777265A1 foreign key (markers_id) references Marker;
+alter table ReferenceBase_Marker add constraint FK6888095DF443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_Media add constraint FK3D2F4A61F443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_Media add constraint FK3D2F4A61C2C29593 foreign key (media_id) references Media;
+alter table ReferenceBase_OriginalSource add constraint FK68651F6FF443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_OriginalSource add constraint FK68651F6F3BAB2414 foreign key (sources_id) references OriginalSource;
+alter table ReferenceBase_Rights add constraint FK717BF6FAF443DB5A foreign key (ReferenceBase_id) references ReferenceBase;
+alter table ReferenceBase_Rights add constraint FK717BF6FAC13F7B21 foreign key (rights_id) references Rights;
+alter table RelationshipTermBase_inverseRepresentation add constraint FK98592F33ECEEF4AF foreign key (DefinedTermBase_id) references DefinedTermBase;
+alter table RelationshipTermBase_inverseRepresentation add constraint FK98592F33473FB677 foreign key (inverserepresentations_id) references Representation;
+alter table Representation add constraint FK9C4724EDEF7921F6 foreign key (createdby_id) references Agent;
+alter table Representation add constraint FK9C4724EDE8D36B00 foreign key (language_id) references DefinedTermBase;
+alter table Representation add constraint FK9C4724ED5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Representation_Annotation add constraint FK371091E147E8AE60 foreign key (Representation_id) references Representation;
+alter table Representation_Annotation add constraint FK371091E11E403E0B foreign key (annotations_id) references Annotation;
+alter table Representation_Marker add constraint FK560063EC777265A1 foreign key (markers_id) references Marker;
+alter table Representation_Marker add constraint FK560063EC47E8AE60 foreign key (Representation_id) references Representation;
+alter table Rights add constraint FK91E56DF7EF7921F6 foreign key (createdby_id) references Agent;
+alter table Rights add constraint FK91E56DF7C5F7EC54 foreign key (agent_id) references Agent;
+alter table Rights add constraint FK91E56DF7E6D2886A foreign key (type_id) references DefinedTermBase;
+alter table Rights add constraint FK91E56DF7E8D36B00 foreign key (language_id) references DefinedTermBase;
+alter table Rights add constraint FK91E56DF75BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Rights_Annotation add constraint FK27CB1E97C13F7B21 foreign key (Rights_id) references Rights;
+alter table Rights_Annotation add constraint FK27CB1E971E403E0B foreign key (annotations_id) references Annotation;
+alter table Rights_Marker add constraint FKB739BBA2777265A1 foreign key (markers_id) references Marker;
+alter table Rights_Marker add constraint FKB739BBA2C13F7B21 foreign key (Rights_id) references Rights;
+create index sequenceTitleCacheIndex on Sequence (titleCache);
+alter table Sequence add constraint FK544ADBE1EF7921F6 foreign key (createdby_id) references Agent;
+alter table Sequence add constraint FK544ADBE1B982A103 foreign key (publishedin_id) references ReferenceBase;
+alter table Sequence add constraint FK544ADBE12DBE1F1F foreign key (locus_id) references Locus;
+alter table Sequence add constraint FK544ADBE15BE3EC03 foreign key (updatedby_id) references Agent;
+alter table Sequence_Annotation add constraint FK1010BA6DD57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_Annotation add constraint FK1010BA6D1E403E0B foreign key (annotations_id) references Annotation;
+alter table Sequence_Extension add constraint FK7BE66D41927DE9DF foreign key (extensions_id) references Extension;
+alter table Sequence_Extension add constraint FK7BE66D41D57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_GenBankAccession add constraint FK8F698096D57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_GenBankAccession add constraint FK8F69809615C4EF35 foreign key (genbankaccession_id) references GenBankAccession;
+alter table Sequence_Marker add constraint FK3D22B278777265A1 foreign key (markers_id) references Marker;
+alter table Sequence_Marker add constraint FK3D22B278D57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_Media add constraint FK8E5D91E666ACA7EC foreign key (chromatograms_id) references Media;
+alter table Sequence_Media add constraint FK8E5D91E6D57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_OriginalSource add constraint FKD37E7D8AD57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_OriginalSource add constraint FKD37E7D8A3BAB2414 foreign key (sources_id) references OriginalSource;
+alter table Sequence_ReferenceBase add constraint FK18D91CBE7291F8A foreign key (citations_id) references ReferenceBase;
+alter table Sequence_ReferenceBase add constraint FK18D91CBED57FFDD5 foreign key (Sequence_id) references Sequence;
+alter table Sequence_Rights add constraint FK4616A015C13F7B21 foreign key (rights_id) references Rights;
+alter table Sequence_Rights add constraint FK4616A015D57FFDD5 foreign key (Sequence_id) references Sequence;
+create index specimenOrObservationBaseTitleCacheIndex on SpecimenOrObservationBase (titleCache);
+alter table SpecimenOrObservationBase add constraint FK21CA32727CC340C5 foreign key (storedunder_id) references TaxonNameBase;
+alter table SpecimenOrObservationBase add constraint FK21CA32728C750E27 foreign key (lifestage_id) references DefinedTermBase;
+alter table SpecimenOrObservationBase add constraint FK21CA3272EF7921F6 foreign key (createdby_id) references Agent;
+alter table SpecimenOrObservationBase add constraint FK21CA3272EB62BE9A foreign key (collection_id) references Collection;
+alter table SpecimenOrObservationBase add constraint FK21CA3272E17C9A6B foreign key (sex_id) references DefinedTermBase;
+alter table SpecimenOrObservationBase add constraint FK21CA3272C8505DB foreign key (preservation_id) references DefinedTermBase;
+alter table SpecimenOrObservationBase add constraint FK21CA32724AAB411A foreign key (derivationevent_id) references DerivationEvent;
+alter table SpecimenOrObservationBase add constraint FK21CA3272F95F225A foreign key (gatheringevent_id) references GatheringEvent;
+alter table SpecimenOrObservationBase add constraint FK21CA32725BE3EC03 foreign key (updatedby_id) references Agent;
+alter table SpecimenOrObservationBase_Annotation add constraint FK365E4F3C3B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_Annotation add constraint FK365E4F3C1E403E0B foreign key (annotations_id) references Annotation;
+alter table SpecimenOrObservationBase_DerivationEvent add constraint FK20132036BD59A1AD foreign key (derivationevents_id) references DerivationEvent;
+alter table SpecimenOrObservationBase_DerivationEvent add constraint FK2013203654C216AA foreign key (originals_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_Extension add constraint FKE03B8292927DE9DF foreign key (extensions_id) references Extension;
+alter table SpecimenOrObservationBase_Extension add constraint FKE03B82923B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_Marker add constraint FK8E6106C7777265A1 foreign key (markers_id) references Marker;
+alter table SpecimenOrObservationBase_Marker add constraint FK8E6106C73B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_Media add constraint FK4EEBF7B7C2C29593 foreign key (media_id) references Media;
+alter table SpecimenOrObservationBase_Media add constraint FK4EEBF7B73B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_OriginalSource add constraint FK3C4712D93B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_OriginalSource add constraint FK3C4712D93BAB2414 foreign key (sources_id) references OriginalSource;
+alter table SpecimenOrObservationBase_Rights add constraint FK9754F464C13F7B21 foreign key (rights_id) references Rights;
+alter table SpecimenOrObservationBase_Rights add constraint FK9754F4643B8A5ABA foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table SpecimenOrObservationBase_Sequence add constraint FKBBF27B0E35B10F24 foreign key (sequences_id) references Sequence;
+alter table SpecimenOrObservationBase_Sequence add constraint FKBBF27B0E7EE2770E foreign key (SpecimenOrObservationBase_id) references SpecimenOrObservationBase;
+alter table StateData add constraint FKFB1697BBEF7921F6 foreign key (createdby_id) references Agent;
+alter table StateData add constraint FKFB1697BB682A4E4B foreign key (state_id) references DefinedTermBase;
+alter table StateData add constraint FKFB1697BB5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table StateData_DefinedTermBase add constraint FK107321E28E7BF9AB foreign key (StateData_id) references StateData;
+alter table StateData_DefinedTermBase add constraint FK107321E2E0960EC4 foreign key (modifiers_id) references DefinedTermBase;
+alter table StatisticalMeasurementValue add constraint FK2DCE0290EF7921F6 foreign key (createdby_id) references Agent;
+alter table StatisticalMeasurementValue add constraint FK2DCE02904C428112 foreign key (type_id) references DefinedTermBase;
+alter table StatisticalMeasurementValue add constraint FK2DCE02905BE3EC03 foreign key (updatedby_id) references Agent;
+alter table StatisticalMeasurementValue_DefinedTermBase add constraint FK686C42B7E0960EC4 foreign key (modifiers_id) references DefinedTermBase;
+alter table StatisticalMeasurementValue_DefinedTermBase add constraint FK686C42B75C9F4F2B foreign key (StatisticalMeasurementValue_id) references StatisticalMeasurementValue;
+alter table SynonymRelationship add constraint FKF483ADB3EF7921F6 foreign key (createdby_id) references Agent;
+alter table SynonymRelationship add constraint FKF483ADB39803512F foreign key (citation_id) references ReferenceBase;
+alter table SynonymRelationship add constraint FKF483ADB34BAC703F foreign key (relatedfrom_id) references TaxonBase;
+alter table SynonymRelationship add constraint FKF483ADB380924EEC foreign key (type_id) references DefinedTermBase;
+alter table SynonymRelationship add constraint FKF483ADB3F8991B9D foreign key (relatedto_id) references TaxonBase;
+alter table SynonymRelationship add constraint FKF483ADB35BE3EC03 foreign key (updatedby_id) references Agent;
+alter table SynonymRelationship_Annotation add constraint FKF494F15B260A8379 foreign key (SynonymRelationship_id) references SynonymRelationship;
+alter table SynonymRelationship_Annotation add constraint FKF494F15B1E403E0B foreign key (annotations_id) references Annotation;
+alter table SynonymRelationship_Marker add constraint FK7A439066777265A1 foreign key (markers_id) references Marker;
+alter table SynonymRelationship_Marker add constraint FK7A439066260A8379 foreign key (SynonymRelationship_id) references SynonymRelationship;
+create index taxonBaseTitleCacheIndex on TaxonBase (titleCache);
+alter table TaxonBase add constraint FK9249B49BEF7921F6 foreign key (createdby_id) references Agent;
+alter table TaxonBase add constraint FK9249B49B5E4A2F85 foreign key (sec_id) references ReferenceBase;
+alter table TaxonBase add constraint FK9249B49B7C7B5AED foreign key (taxonomicparentcache_id) references TaxonBase;
+alter table TaxonBase add constraint FK9249B49BDA93512F foreign key (taxonName_fk) references TaxonNameBase;
+alter table TaxonBase add constraint FK9249B49B5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table TaxonBase_Annotation add constraint FK41ED09739C9D39 foreign key (TaxonBase_id) references TaxonBase;
+alter table TaxonBase_Annotation add constraint FK41ED09731E403E0B foreign key (annotations_id) references Annotation;
+alter table TaxonBase_Extension add constraint FKF961257B927DE9DF foreign key (extensions_id) references Extension;
+alter table TaxonBase_Extension add constraint FKF961257B9C9D39 foreign key (TaxonBase_id) references TaxonBase;
+alter table TaxonBase_Marker add constraint FK5CDB747E777265A1 foreign key (markers_id) references Marker;
+alter table TaxonBase_Marker add constraint FK5CDB747E9C9D39 foreign key (TaxonBase_id) references TaxonBase;
+alter table TaxonBase_OriginalSource add constraint FK10EFD9909C9D39 foreign key (TaxonBase_id) references TaxonBase;
+alter table TaxonBase_OriginalSource add constraint FK10EFD9903BAB2414 foreign key (sources_id) references OriginalSource;
+alter table TaxonBase_Rights add constraint FK65CF621B9C9D39 foreign key (TaxonBase_id) references TaxonBase;
+alter table TaxonBase_Rights add constraint FK65CF621BC13F7B21 foreign key (rights_id) references Rights;
+create index taxonNameBaseTitleCacheIndex on TaxonNameBase (titleCache);
+alter table TaxonNameBase add constraint FKB4870C6EF7921F6 foreign key (createdby_id) references Agent;
+alter table TaxonNameBase add constraint FKB4870C662AD57A2 foreign key (excombinationauthorteam_id) references Agent;
+alter table TaxonNameBase add constraint FKB4870C6BFEAE500 foreign key (homotypicalgroup_id) references HomotypicalGroup;
+alter table TaxonNameBase add constraint FKB4870C6D7BE55A0 foreign key (rank_id) references DefinedTermBase;
+alter table TaxonNameBase add constraint FKB4870C67F90DF03 foreign key (exbasionymauthorteam_id) references Agent;
+alter table TaxonNameBase add constraint FKB4870C62B4FEDD6 foreign key (basionymauthorteam_id) references Agent;
+alter table TaxonNameBase add constraint FKB4870C64AC9C024 foreign key (nomenclaturalreference_id) references ReferenceBase;
+alter table TaxonNameBase add constraint FKB4870C6B14B73EF foreign key (combinationauthorteam_id) references Agent;
+alter table TaxonNameBase add constraint FKB4870C65BE3EC03 foreign key (updatedby_id) references Agent;
+alter table TaxonNameBase_Annotation add constraint FK9E7794688C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_Annotation add constraint FK9E7794681E403E0B foreign key (annotations_id) references Annotation;
+alter table TaxonNameBase_Extension add constraint FKC28EE7E68C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_Extension add constraint FKC28EE7E6927DE9DF foreign key (extensions_id) references Extension;
+alter table TaxonNameBase_HybridRelationship add constraint FK371B728DCDE98DD2 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_HybridRelationship add constraint FK371B728D2D57C7D5 foreign key (hybridrelationships_id) references HybridRelationship;
+alter table TaxonNameBase_Marker add constraint FK39E3C1F3777265A1 foreign key (markers_id) references Marker;
+alter table TaxonNameBase_Marker add constraint FK39E3C1F38C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_NomenclaturalStatus add constraint FK560BA7928C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_NomenclaturalStatus add constraint FK560BA7926615E90D foreign key (status_id) references NomenclaturalStatus;
+alter table TaxonNameBase_OriginalSource add constraint FKBEA1E2058C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_OriginalSource add constraint FKBEA1E2053BAB2414 foreign key (sources_id) references OriginalSource;
+alter table TaxonNameBase_Rights add constraint FK42D7AF908C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_Rights add constraint FK42D7AF90C13F7B21 foreign key (rights_id) references Rights;
+alter table TaxonNameBase_TypeDesignationBase add constraint FKC0D6BBB58C85CF94 foreign key (TaxonNameBase_id) references TaxonNameBase;
+alter table TaxonNameBase_TypeDesignationBase add constraint FKC0D6BBB5C7DF530C foreign key (typedesignations_id) references TypeDesignationBase;
+alter table TaxonRelationship add constraint FK7482BA02EF7921F6 foreign key (createdby_id) references Agent;
+alter table TaxonRelationship add constraint FK7482BA029803512F foreign key (citation_id) references ReferenceBase;
+alter table TaxonRelationship add constraint FK7482BA02E71EF6CE foreign key (relatedfrom_id) references TaxonBase;
+alter table TaxonRelationship add constraint FK7482BA02F11BD77B foreign key (type_id) references DefinedTermBase;
+alter table TaxonRelationship add constraint FK7482BA02F8991B9D foreign key (relatedto_id) references TaxonBase;
+alter table TaxonRelationship add constraint FK7482BA025BE3EC03 foreign key (updatedby_id) references Agent;
+alter table TaxonRelationship_Annotation add constraint FK82C86DAC2BD180D9 foreign key (TaxonRelationship_id) references TaxonRelationship;
+alter table TaxonRelationship_Annotation add constraint FK82C86DAC1E403E0B foreign key (annotations_id) references Annotation;
+alter table TaxonRelationship_Marker add constraint FK69FBDD37777265A1 foreign key (markers_id) references Marker;
+alter table TaxonRelationship_Marker add constraint FK69FBDD372BD180D9 foreign key (TaxonRelationship_id) references TaxonRelationship;
+alter table TermVocabulary add constraint FK487AA692EF7921F6 foreign key (createdby_id) references Agent;
+alter table TermVocabulary add constraint FK487AA6925BE3EC03 foreign key (updatedby_id) references Agent;
+alter table TermVocabulary_Representation add constraint FKA408B63A258E060 foreign key (TermVocabulary_id) references TermVocabulary;
+alter table TermVocabulary_Representation add constraint FKA408B63AB31C4747 foreign key (representations_id) references Representation;
+alter table TypeDesignationBase add constraint FK8AC9DCAEEF7921F6 foreign key (createdby_id) references Agent;
+alter table TypeDesignationBase add constraint FK8AC9DCAE9803512F foreign key (citation_id) references ReferenceBase;
+alter table TypeDesignationBase add constraint FK8AC9DCAEBFEAE500 foreign key (homotypicalgroup_id) references HomotypicalGroup;
+alter table TypeDesignationBase add constraint FK8AC9DCAE94DB044A foreign key (typespecimen_id) references SpecimenOrObservationBase;
+alter table TypeDesignationBase add constraint FK8AC9DCAE2FB99E97 foreign key (typestatus_id) references DefinedTermBase;
+alter table TypeDesignationBase add constraint FK8AC9DCAE4CB0F315 foreign key (typename_id) references TaxonNameBase;
+alter table TypeDesignationBase add constraint FK8AC9DCAE5BE3EC03 foreign key (updatedby_id) references Agent;
+alter table TypeDesignationBase_Annotation add constraint FK4D73278044E9E6D4 foreign key (TypeDesignationBase_id) references TypeDesignationBase;
+alter table TypeDesignationBase_Annotation add constraint FK4D7327801E403E0B foreign key (annotations_id) references Annotation;
+alter table TypeDesignationBase_Marker add constraint FKB914A10B777265A1 foreign key (markers_id) references Marker;
+alter table TypeDesignationBase_Marker add constraint FKB914A10B44E9E6D4 foreign key (TypeDesignationBase_id) references TypeDesignationBase;
+alter table TypeDesignationBase_TaxonNameBase add constraint FKF61156F54D901A92 foreign key (typifiednames_id) references TaxonNameBase;
+alter table TypeDesignationBase_TaxonNameBase add constraint FKF61156F544E9E6D4 foreign key (TypeDesignationBase_id) references TypeDesignationBase;
+alter table User add constraint FK285FEBEF7921F6 foreign key (createdby_id) references Agent;
+alter table User_GrantedAuthorityImpl add constraint FKA2FB64FC1857F6C2 foreign key (grantedauthorities_id) references GrantedAuthorityImpl;
+alter table User_GrantedAuthorityImpl add constraint FKA2FB64FCCF9BC520 foreign key (User_id) references User;
+alter table User_PermissionGroup add constraint FKDD33C17C887E3D12 foreign key (members_id) references User;
+alter table User_PermissionGroup add constraint FKDD33C17CDA9DCB5F foreign key (groups_id) references PermissionGroup;
diff --git a/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml b/cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml
new file mode 100644 (file)
index 0000000..043537a
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<beans xmlns="http://www.springframework.org/schema/beans"\r
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+       xmlns:context="http://www.springframework.org/schema/context"\r
+       xsi:schemaLocation="http://www.springframework.org/schema/beans 
+    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+    http://www.springframework.org/schema/context
+    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+\r
+    <import resource="classpath:/eu/etaxonomy/cdm/persistence.xml"/> \r
+
+    <bean id="dataSource" class="org.unitils.database.UnitilsDataSourceFactoryBean"/>\r
+    \r
+    <bean id="hibernateProperties" \r
+        class="org.springframework.beans.factory.config.PropertiesFactoryBean">\r
+        <property name="properties">\r
+            <props>\r
+                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLCorrectedDialect</prop>\r
+                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>\r
+                <prop key="hibernate.show_sql">false</prop>\r
+                <prop key="hibernate.format_sql">false</prop>\r
+            </props>\r
+        </property>\r
+    </bean> \r
+    \r
+    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">\r
+        <property name="providers">\r
+            <list>\r
+                <bean class="org.springframework.security.providers.TestingAuthenticationProvider"/>\r
+            </list>\r
+        </property>\r
+    </bean>\r
+    \r
+    <bean id="passwordEncoder" class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>\r
+    \r
+    <bean id="saltSource" class="org.springframework.security.providers.dao.salt.ReflectionSaltSource">\r
+        <property name="userPropertyToUse" value="getUsername"/>\r
+    </bean>
+    
+</beans>
\ No newline at end of file
diff --git a/cdmlib-services/src/test/resources/unitils.properties b/cdmlib-services/src/test/resources/unitils.properties
new file mode 100644 (file)
index 0000000..02898ad
--- /dev/null
@@ -0,0 +1,18 @@
+unitils.modules=database,dbunit,hibernate,inject,spring\r
+unitils.module.easymock.enabled=false\r
+\r
+database.driverClassName=org.hsqldb.jdbcDriver\r
+database.url=jdbc:hsqldb:mem:cdm\r
+database.userName=sa\r
+database.password=\r
+database.dialect=hsqldb\r
+database.schemaNames=PUBLIC\r
+org.dbunit.dataset.datatype.IDataTypeFactory.implClassName.hsqldb=eu.etaxonomy.cdm.test.integration.HsqldbDataTypeFactory\r
+dbMaintainer.fileScriptSource.scripts.locations=src/test/resources/dbscripts\r
+\r
+DatabaseModule.Transactional.value.default=commit\r
+transactionManager.type=spring\r
+updateDataBaseSchema.enabled=true\r
+\r
+dataSetStructureGenerator.xsd.dirName=src/test/resources/eu/etaxonomy/cdm/persistence/dao/hibernate/\r
+dbMaintainer.dbVersionSource.autoCreateVersionTable=true
\ No newline at end of file