merge cate-development2 branch with trunk
authorKatja Luther <k.luther@bgbm.org>
Wed, 10 Mar 2010 11:00:44 +0000 (11:00 +0000)
committerKatja Luther <k.luther@bgbm.org>
Wed, 10 Mar 2010 11:00:44 +0000 (11:00 +0000)
113 files changed:
.gitattributes
cdmlib-ext/src/main/java/eu/etaxonomy/cdm/ext/EditGeoServiceUtilities.java
cdmlib-ext/src/test/java/eu/etaxonomy/cdm/ext/EditGeoServiceTest.java
cdmlib-io/pom.xml
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmIDResolver.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/DataSet.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/Error.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/JaxbExport.java
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/JaxbImport.java
cdmlib-io/src/main/resources/schema/cdm/agent.xsd
cdmlib-io/src/main/resources/schema/cdm/cdm.xsd
cdmlib-io/src/main/resources/schema/cdm/common.xsd
cdmlib-io/src/main/resources/schema/cdm/description.xsd
cdmlib-io/src/main/resources/schema/cdm/media.xsd
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/io/jaxb/FeatureTest.xml
cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/DateTimeBridge.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessor.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessorFactoryImpl.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Contact.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Institution.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Person.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/Team.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/agent/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/AnnotatableEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Annotation.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/GrantedAuthorityImpl.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Group.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/IdentifiableEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/LanguageStringBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/Marker.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/User.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/VersionableEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/DescriptionElementBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/FeatureTree.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/location/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/media/IdentifiableMediaEntity.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/media/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/molecular/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NameRelationship.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/NonViralName.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/TaxonNameBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/name/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/occurrence/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/reference/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/SynonymRelationship.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/Taxon.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonBase.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonRelationship.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/TaxonomicTree.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/taxon/package-info.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/match/DefaultMatchStrategy.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/merge/DefaultMergeStrategy.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/BasionymsMustShareEpithetsAndAuthors.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustBeLowerRankThanParent.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustDeriveNameFromParent.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/HomotypicSynonymsShouldBelongToGroup.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NamesWithHomotypicRelationshipsMustBelongToSameGroup.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/BasionymsMustShareEpithetsAndAuthorsValidator.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustBeLowerRankThanParentValidator.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustDeriveNameFromParentValidator.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/HomotypicSynonymsShouldBelongToGroupValidator.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/MustHaveAuthorityValidator.java
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator.java [new file with mode: 0644]
cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/TaxonNameCannotBeAcceptedAndSynonymValidator.java
cdmlib-model/src/main/resources/ValidationMessages.properties
cdmlib-persistence/pom.xml
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IAnnotatableDao.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/common/IMarkerDao.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/AnnotatableDaoImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/DaoBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/IdentifiableDaoBase.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/MarkerDaoImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/occurrence/CollectionDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonAlternativeSpellingSuggestionParser.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/taxon/TaxonDaoHibernateImpl.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/CacheStrategyGenerator.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListener.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveEntityListener.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveOrUpdateEntityListener.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/UpdateEntityListener.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/query/OrderHint.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/CdmEntityDaoBaseTest.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/dao/hibernate/common/UserDaoHibernateImplTest.java
cdmlib-persistence/src/test/java/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.java
cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml
cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/dao/hibernate/name/TaxonNameDaoHibernateImplTest.xml
cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.testOnDelete-result.xml
cdmlib-persistence/src/test/resources/eu/etaxonomy/cdm/persistence/hibernate/CdmDeleteListenerTest.xml
cdmlib-remote/dist/cdmserver_1-1_all.deb [new file with mode: 0644]
cdmlib-remote/pom.xml
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/controller/TermListController.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/dto/assembler/converter/HibernateProxyNullSafeDeepConverter.java
cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/XmlView.java [new file with mode: 0644]
cdmlib-remote/src/main/resources/eu/etaxonomy/cdm/remote/dto/tdwg/mappings.xml
cdmlib-services/pom.xml
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationController.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationDefaultConfiguration.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/application/ICdmApplicationConfiguration.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AnnotatableServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAnnotatableService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMarkerService.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IUserService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MarkerServiceImpl.java [new file with mode: 0644]
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/UserService.java
cdmlib-services/src/main/resources/eu/etaxonomy/cdm/defaultSecurityContext.xml
cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/UserServiceImplTest.java
cdmlib-services/src/test/java/eu/etaxonomy/cdm/validation/TaxonNameCannotBeAcceptedAndSynonymTest.java
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/applicationContext-test.xml

index 17d95a9f0499a278473b6acedf1eb421a2cf1069..11955514682f91889b1c23420bba503821b11c9b 100644 (file)
@@ -1328,11 +1328,13 @@ cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxon.jav
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxonNameImport.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTransformer.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmDocumentBuilder.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmIDResolver.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmMarshallerListener.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmResourceResolver.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmSchemaGenerator.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/DataSet.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/DefaultErrorHandler.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/Error.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/JaxbExport.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/JaxbExportConfigurator.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/JaxbExportState.java -text
@@ -1506,9 +1508,12 @@ cdmlib-model/README.TXT -text
 cdmlib-model/pom.xml -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/aspectj/PropertyChangeAspect.aj -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/datagenerator/TaxonGenerator.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/DateTimeBridge.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/HibernateProxyHelper.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/PartialBridge.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/StripHtmlBridge.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessor.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessorFactoryImpl.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmNamespacePrefixMapper.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/ClassAdapter.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/DateTimeAdapter.java -text
@@ -1834,13 +1839,23 @@ cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/NonViralNameParserIm
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/strategy/parser/ParserProblem.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/Level2.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/Level3.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/BasionymsMustShareEpithetsAndAuthors.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustBeLowerRankThanParent.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustDeriveNameFromParent.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/CorrectEpithetsForRank.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/HomotypicSynonymsShouldBelongToGroup.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/MustHaveAuthority.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NamesWithHomotypicRelationshipsMustBelongToSameGroup.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NoDuplicateNames.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NullOrNotEmpty.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/TaxonNameCannotBeAcceptedAndSynonym.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/BasionymsMustShareEpithetsAndAuthorsValidator.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustBeLowerRankThanParentValidator.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustDeriveNameFromParentValidator.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/CorrectEpithetsForRankValidator.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/HomotypicSynonymsShouldBelongToGroupValidator.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/MustHaveAuthorityValidator.java -text
+cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/NullOrNotEmptyValidator.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/StubValidator.java -text
 cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/TaxonNameCannotBeAcceptedAndSynonymValidator.java -text
@@ -2272,6 +2287,7 @@ cdmlib-persistence/src/test/resources/log4j.properties -text
 cdmlib-persistence/src/test/resources/unitils.properties -text
 cdmlib-remote/LICENSE.TXT -text
 cdmlib-remote/README.TXT -text
+cdmlib-remote/dist/cdmserver_1-1_all.deb -text
 cdmlib-remote/ide/eclipse/cdmlib-remote[!!-~]-[!!-~]jetty[!!-~]run[!!-~]\[debug\].launch -text
 cdmlib-remote/ide/eclipse/cdmlib-remote[!!-~]-[!!-~]remote[!!-~]debug.launch -text
 cdmlib-remote/pom.xml -text
@@ -2433,6 +2449,7 @@ cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/OaiPmhResponseView.java
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/PatternViewResolver.java -text
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/RdfView.java -text
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/WsdlView.java -text
+cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/XmlView.java -text
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/oaipmh/GetRecordView.java -text
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/oaipmh/IdentifyView.java -text
 cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/oaipmh/ListIdentifiersView.java -text
@@ -2526,6 +2543,7 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IFeatureTreeService.j
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IIdentifiableEntityService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IIdentificationKeyService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ILocationService.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMarkerService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMediaService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/INameService.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IOccurrenceService.java -text
@@ -2542,6 +2560,7 @@ cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IWorkingSetService.ja
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentificationKeyServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/LocationServiceImpl.java -text
+cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MarkerServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MediaServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/NameServiceImpl.java -text
 cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/OccurrenceServiceImpl.java -text
index 40dc26e39835412316e387dcd04b46f7d0a16c67..b4c6a872ece2ba290ab8ffdd2e1f33170ec783e6 100644 (file)
@@ -156,6 +156,10 @@ public class EditGeoServiceUtilities {
                        char style = getStyleAbbrev(i);\r
                        \r
                        //getting the area title\r
+                       if (languages == null){\r
+                               languages = new ArrayList<Language>();\r
+                               languages.add(Language.DEFAULT());\r
+                       }\r
                        Representation representation = \r
                                status.getPreferredRepresentation(languages);\r
                        String statusLabel = representation.getLabel();\r
index c6b3f8ef4fc6b9486a135e6c3c1a0ade9c88caa3..7ab44bb60a2bd74c213c6bef471665d13ea93074 100644 (file)
@@ -13,8 +13,10 @@ package eu.etaxonomy.cdm.ext;
 import static org.junit.Assert.assertTrue;\r
 \r
 import java.awt.Color;\r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
+import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
 \r
@@ -23,8 +25,10 @@ import org.junit.After;
 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
 \r
+import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.description.AbsenceTerm;\r
 import eu.etaxonomy.cdm.model.description.Distribution;\r
 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
@@ -69,7 +73,7 @@ public class EditGeoServiceTest {
        }\r
        \r
 //******************************************** TESTS**************\r
-       @Test\r
+       @Ignore\r
        public void testGetWebServiceUrl() {\r
                //String webServiceUrl = "http://www.test.de/webservice";\r
                Set<Distribution> distributions = new HashSet<Distribution>();\r
@@ -79,6 +83,7 @@ public class EditGeoServiceTest {
                distributions.add(Distribution.NewInstance(TdwgArea.getAreaByTdwgAbbreviation("BGM"), AbsenceTerm.ABSENT()));\r
                distributions.add(Distribution.NewInstance(TdwgArea.getAreaByTdwgAbbreviation("FRA"), AbsenceTerm.ABSENT()));\r
                distributions.add(Distribution.NewInstance(TdwgArea.getAreaByTdwgAbbreviation("IND-AP"), PresenceTerm.PRESENT()));\r
+               \r
                Map<PresenceAbsenceTermBase<?>, Color> presenceAbsenceColorMap = new HashMap<PresenceAbsenceTermBase<?>, Color>();\r
                presenceAbsenceColorMap.put(PresenceTerm.PRESENT(), Color.BLUE);\r
                presenceAbsenceColorMap.put(PresenceTerm.INTRODUCED(), Color.BLACK);\r
@@ -87,7 +92,9 @@ public class EditGeoServiceTest {
                String backLayer ="";\r
                presenceAbsenceColorMap = null;\r
                String bbox="-20,0,120,70";\r
-               String result = EditGeoServiceUtilities.getEditGeoServiceUrlParameterString(distributions, presenceAbsenceColorMap, 600, 300, bbox,backLayer );\r
+               List<Language> languages = new ArrayList<Language>();\r
+                               \r
+               String result = EditGeoServiceUtilities.getEditGeoServiceUrlParameterString(distributions, presenceAbsenceColorMap, 600, 300, bbox,backLayer, languages );\r
                //TODO Set semantics is not determined\r
                //String expected = "http://www.test.de/webservice?l=tdwg3&ad=tdwg3:a:GER|b:OKL|c:BGM|b:SPA|d:FRA&as=a:005500|b:00FF00|c:FFFFFF|d:001100&bbox=-20,40,40,40&ms=400x300";\r
                System.out.println(result);\r
index 7b3bc8349ab1ef06c4714024032b5c7f00fe3f95..0ff45823770121c79c772757f836294b92e23247 100644 (file)
     <dependency>\r
       <groupId>xmlunit</groupId>\r
       <artifactId>xmlunit</artifactId>\r
-    </dependency>\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>
        <dependency>
                <groupId>org.apache.poi</groupId>
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmIDResolver.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmIDResolver.java
new file mode 100644 (file)
index 0000000..f7060f2
--- /dev/null
@@ -0,0 +1,221 @@
+package eu.etaxonomy.cdm.io.jaxb;\r
+\r
+import java.util.HashMap;\r
+import java.util.UUID;\r
+import java.util.concurrent.Callable;\r
+\r
+import javax.xml.bind.ValidationEventHandler;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.xml.sax.SAXException;\r
+\r
+import com.sun.xml.bind.IDResolver;\r
+\r
+import eu.etaxonomy.cdm.api.service.IAgentService;\r
+import eu.etaxonomy.cdm.api.service.ICollectionService;\r
+import eu.etaxonomy.cdm.api.service.IDescriptionService;\r
+import eu.etaxonomy.cdm.api.service.IFeatureTreeService;\r
+import eu.etaxonomy.cdm.api.service.IMediaService;\r
+import eu.etaxonomy.cdm.api.service.INameService;\r
+import eu.etaxonomy.cdm.api.service.IOccurrenceService;\r
+import eu.etaxonomy.cdm.api.service.IReferenceService;\r
+import eu.etaxonomy.cdm.api.service.IService;\r
+import eu.etaxonomy.cdm.api.service.ITaxonService;\r
+import eu.etaxonomy.cdm.api.service.ITermService;\r
+import eu.etaxonomy.cdm.api.service.IUserService;\r
+import eu.etaxonomy.cdm.api.service.IVocabularyService;\r
+import eu.etaxonomy.cdm.jaxb.UUIDAdapter;\r
+import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.agent.INomenclaturalAuthor;\r
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
+import eu.etaxonomy.cdm.model.common.User;\r
+import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
+import eu.etaxonomy.cdm.model.description.FeatureTree;\r
+import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.occurrence.Collection;\r
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+\r
+public class CdmIDResolver extends IDResolver {\r
+       private static final Logger logger = Logger.getLogger(CdmIDResolver.class);\r
+       \r
+       IUserService userService;\r
+       \r
+       IAgentService agentService;     \r
+       \r
+       ITermService termService;\r
+       \r
+       IVocabularyService vocabularyService;\r
+       \r
+       IDescriptionService descriptionService;\r
+       \r
+       IFeatureTreeService featureTreeService;\r
+       \r
+       IMediaService mediaService;\r
+       \r
+       INameService nameService;\r
+       \r
+       IOccurrenceService occurrenceService;\r
+       \r
+       ICollectionService collectionService;\r
+       \r
+       IReferenceService referenceService;\r
+       \r
+       ITaxonService taxonService;\r
+       \r
+       @Autowired\r
+       public void setUserService(IUserService userService) {\r
+               this.userService = userService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setAgentService(IAgentService agentService) {\r
+               this.agentService = agentService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setTermService(ITermService termService) {\r
+               this.termService = termService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setVocabularyService(IVocabularyService vocabularyService) {\r
+               this.vocabularyService = vocabularyService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setDescriptionService(IDescriptionService descriptionService) {\r
+               this.descriptionService = descriptionService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setFeatureTreeService(IFeatureTreeService featureTreeService) {\r
+               this.featureTreeService = featureTreeService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setMediaService(IMediaService mediaService) {\r
+               this.mediaService = mediaService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setNameService(INameService nameService) {\r
+               this.nameService = nameService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setOccurrenceService(IOccurrenceService occurrenceService) {\r
+               this.occurrenceService = occurrenceService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setCollectionService(ICollectionService collectionService) {\r
+               this.collectionService = collectionService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setReferenceService(IReferenceService referenceService) {\r
+               this.referenceService = referenceService;\r
+       }\r
+\r
+       @Autowired\r
+       public void setTaxonService(ITaxonService taxonService) {\r
+               this.taxonService = taxonService;\r
+       }\r
+       \r
+       private HashMap<String,Object> idmap = null;\r
+       \r
+       @Override\r
+       public void startDocument(ValidationEventHandler eventHandler) throws SAXException {\r
+               if(idmap!=null) {\r
+                   idmap.clear();\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void bind(String id, Object obj) throws SAXException {\r
+               if(idmap==null) {\r
+                       idmap = new HashMap<String,Object>();\r
+               }\r
+               idmap.put(id,obj);\r
+       }\r
+               \r
+\r
+       @Override\r
+       public Callable<?> resolve(final String id, final Class targetType) throws SAXException {\r
+               return new Callable() {\r
+               public Object call() throws Exception {\r
+                 logger.info("Resolving " + id + " for class " + targetType);\r
+                       \r
+                         if(idmap==null || !idmap.containsKey(id)) {\r
+                                 \r
+                                 String uuidPart = id.substring(UUIDAdapter.UUID_URN_PREFIX.length());\r
+                                 UUID uuid = UUID.fromString(uuidPart);\r
+                                 logger.info(uuid + " not in idmap, looking in database");\r
+                                 if(targetType.equals(User.class)) {\r
+                                         return resolveObject(uuid, targetType, userService);\r
+                                 } else if(AgentBase.class.isAssignableFrom(targetType) || INomenclaturalAuthor.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, agentService);\r
+                                 } else if(DefinedTermBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, termService);\r
+                                 } else if(TermVocabulary.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, vocabularyService);\r
+                                 } else if(DescriptionBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, descriptionService);\r
+                                 } else if(FeatureTree.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, featureTreeService);\r
+                                 } else if(Media.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, mediaService);\r
+                                 } else if(TaxonNameBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, nameService);\r
+                                 } else if(SpecimenOrObservationBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, occurrenceService);\r
+                                 } else if(Collection.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, collectionService);\r
+                                 } else if(ReferenceBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, referenceService);\r
+                                 } else if(TaxonBase.class.isAssignableFrom(targetType)) {\r
+                                         return resolveObject(uuid, targetType, taxonService);\r
+                                 } else {\r
+                                         /**\r
+                                          * Collections of IDREFS do not have a type at runtime\r
+                                          *  https://jaxb.dev.java.net/issues/show_bug.cgi?id=546\r
+                                          *  \r
+                                          *   Maybe in the future we'll be able to add targetType to IDREF\r
+                                          *   but the spec has to be changed first so no fix is likely at the moment\r
+                                          *   \r
+                                          */\r
+                                         \r
+                                         AgentBase agent = agentService.find(uuid);\r
+                                         if(agent != null) { \r
+                                                 return agent;\r
+                                         }\r
+                                         DefinedTermBase term = termService.find(uuid);\r
+                                         if(term != null) { \r
+                                                 return term;\r
+                                         }\r
+                                         Media media = mediaService.find(uuid);\r
+                                         if(media != null) { \r
+                                                 return media;\r
+                                         }\r
+                                         throw new SAXException(targetType.getSimpleName() + " with " + uuid + " not found");\r
+                                 }\r
+                         } else {\r
+                                 return idmap.get(id);\r
+                         }             \r
+                       }\r
+           };\r
+       }\r
+       \r
+       private Object resolveObject(UUID uuid, Class targetType, IService service) throws SAXException {\r
+               Object object = service.find(uuid);\r
+                 if(object == null) {\r
+                         throw new SAXException(targetType.getSimpleName() + " with " + uuid + " not found");\r
+                 }\r
+                 return object;\r
+       }\r
+}\r
index 97582bbb9fc02666349eaa053b4b2abd7bf53121..0a3099fe1ae9bd77f27ed841d08ecbe1627d038f 100644 (file)
@@ -21,7 +21,7 @@ import javax.xml.bind.annotation.XmlElements;
 import javax.xml.bind.annotation.XmlRootElement;\r
 import javax.xml.bind.annotation.XmlType;\r
 \r
-import org.springframework.security.GrantedAuthority;\r
+import org.springframework.security.core.GrantedAuthority;\r
 \r
 import eu.etaxonomy.cdm.model.agent.AgentBase;\r
 import eu.etaxonomy.cdm.model.agent.Institution;\r
@@ -48,6 +48,7 @@ import eu.etaxonomy.cdm.model.description.FeatureTree;
 import eu.etaxonomy.cdm.model.description.MeasurementUnit;\r
 import eu.etaxonomy.cdm.model.description.MediaKey;\r
 import eu.etaxonomy.cdm.model.description.Modifier;\r
+import eu.etaxonomy.cdm.model.description.PolytomousKey;\r
 import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
 import eu.etaxonomy.cdm.model.description.Scope;\r
 import eu.etaxonomy.cdm.model.description.Sex;\r
@@ -133,7 +134,6 @@ import eu.etaxonomy.cdm.model.taxon.TaxonomicTree;
                "eventBases",\r
            "references",\r
            "typeDesignations",\r
-           "featureNodes",\r
            "featureTrees",\r
            "taxonNodes",\r
            "taxonomicTrees",\r
@@ -215,13 +215,12 @@ public class DataSet {
     protected List<eu.etaxonomy.cdm.model.occurrence.Collection> collections = new ArrayList<eu.etaxonomy.cdm.model.occurrence.Collection>();\r
         \r
     @XmlElementWrapper(name = "FeatureTrees")\r
-    @XmlElement(name = "FeatureTree", namespace = "http://etaxonomy.eu/cdm/model/description/1.0")\r
+    @XmlElements({\r
+      @XmlElement(name = "FeatureTree", namespace = "http://etaxonomy.eu/cdm/model/description/1.0", type = FeatureTree.class),\r
+      @XmlElement(name = "PolytomousKey", namespace = "http://etaxonomy.eu/cdm/model/description/1.0", type = PolytomousKey.class)\r
+    })\r
     protected List<FeatureTree> featureTrees = new ArrayList<FeatureTree>();\r
     \r
-    @XmlElementWrapper(name = "FeatureNodes")\r
-    @XmlElement(name = "FeatureNodes", namespace = "http://etaxonomy.eu/cdm/model/description/1.0")\r
-    protected List<FeatureNode> featureNodes = new ArrayList<FeatureNode>();\r
-    \r
     @XmlElementWrapper(name = "TaxonomicTrees")\r
     @XmlElement(name = "TaxonomicTree", namespace = "http://etaxonomy.eu/cdm/model/taxon/1.0")\r
     protected List<TaxonomicTree> taxonomicTrees = new ArrayList<TaxonomicTree>();\r
@@ -822,16 +821,5 @@ public class DataSet {
        public void addUser(User deproxy) {\r
                this.users.add(deproxy);\r
                \r
-       }\r
-\r
-       public void setFeatureNodes(List<FeatureNode> featureNodesdeproxy) {\r
-               this.featureNodes = featureNodesdeproxy;\r
-               \r
-       }\r
-\r
-       public List<FeatureNode> getFeatureNodes() {\r
-       \r
-               return featureNodes;\r
-       }\r
-    \r
+       }    \r
 }\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/Error.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/Error.java
new file mode 100644 (file)
index 0000000..c93e9bf
--- /dev/null
@@ -0,0 +1,107 @@
+package eu.etaxonomy.cdm.io.jaxb;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.xml.bind.annotation.XmlAccessType;\r
+import javax.xml.bind.annotation.XmlAccessorType;\r
+import javax.xml.bind.annotation.XmlAttribute;\r
+import javax.xml.bind.annotation.XmlElement;\r
+import javax.xml.bind.annotation.XmlElementWrapper;\r
+import javax.xml.bind.annotation.XmlRootElement;\r
+import javax.xml.bind.annotation.XmlType;\r
+\r
+import org.springframework.core.annotation.AnnotationUtils;\r
+\r
+@XmlAccessorType(XmlAccessType.FIELD)\r
+@XmlType(name = "Error", propOrder = {\r
+           "code",\r
+           "message",\r
+               "resource",\r
+               "cause",\r
+               "stackTrace"\r
+})\r
+@XmlRootElement(name = "Error")\r
+public class Error {\r
+       @XmlAttribute\r
+       private Integer status;\r
+\r
+       @XmlElement(name = "Message")\r
+       private String message;\r
+       \r
+       @XmlElement(name = "Resource")\r
+       private String resource;\r
+       \r
+       @XmlElement(name = "Cause")\r
+       private String cause;\r
+       \r
+       @XmlElement(name = "Code")\r
+       private String code;\r
+\r
+       @XmlElementWrapper(name = "StackTrace")\r
+       @XmlElement(name = "StackTraceElement")\r
+       private List<String> stackTrace;\r
+\r
+       public Error() {\r
+               \r
+       }\r
+       \r
+       public Error(Throwable throwable) {\r
+               if(throwable.getCause() != null) {\r
+                   this.cause = throwable.getCause().getClass().getName();\r
+               }\r
+               this.message = throwable.getLocalizedMessage();\r
+               this.stackTrace = new ArrayList<String>();\r
+               for(StackTraceElement ste : throwable.getStackTrace()) {\r
+                       this.stackTrace.add(ste.toString());\r
+               }\r
+       }\r
+       \r
+       public Integer getStatus() {\r
+               return status;\r
+       }\r
+\r
+       public void setStatus(Integer status) {\r
+               this.status = status;\r
+       }\r
+\r
+       public String getMessage() {\r
+               return message;\r
+       }\r
+\r
+       public void setMessage(String message) {\r
+               this.message = message;\r
+       }\r
+\r
+       public String getResource() {\r
+               return resource;\r
+       }\r
+\r
+       public void setResource(String resource) {\r
+               this.resource = resource;\r
+       }\r
+\r
+       public String getCause() {\r
+               return cause;\r
+       }\r
+\r
+       public void setCause(String cause) {\r
+               this.cause = cause;\r
+       }\r
+\r
+       public String getCode() {\r
+               return code;\r
+       }\r
+\r
+       public void setCode(String code) {\r
+               this.code = code;\r
+       }\r
+\r
+       public List<String> getStackTrace() {\r
+               return stackTrace;\r
+       }\r
+\r
+       public void setStackTrace(List<String> stackTrace) {\r
+               this.stackTrace = stackTrace;\r
+       } \r
+}\r
index 2eb519ee6d9c32112d305a70f2a1dfb4e0720300..b6c87d605bada082e068afa5db6f588309d0dd17 100644 (file)
@@ -270,16 +270,6 @@ public class JaxbExport extends CdmExportBase<JaxbExportConfigurator, JaxbExport
                                taxTreesdeproxy.add(featureTree);\r
                        }\r
                        \r
-                       List<FeatureNode> featureNodes = new ArrayList<FeatureNode>();\r
-                       featureNodes= getFeatureTreeService().getFeatureNodesAll();\r
-                       List<FeatureNode> taxNodesdeproxy = new ArrayList<FeatureNode>();\r
-                       for (FeatureNode featureNode : featureNodes){\r
-                               HibernateProxyHelper.deproxy(featureNode);\r
-                               taxNodesdeproxy.add(featureNode);\r
-                       }\r
-                       \r
-                       dataSet.setFeatureNodes(taxNodesdeproxy);\r
-                       \r
                        dataSet.setFeatureTrees(getFeatureTreeService().list(null,null,null,null,null));\r
                }\r
                if (jaxbExpConfig.isDoTaxonomicTreeData() == true) {\r
index e5a3c67aa865eca5d8959cd6bdb243d3d9ed15d9..fb3ee4fe05af21ec1bef6ecf1ecf42bbb195884b 100644 (file)
@@ -310,10 +310,6 @@ public class JaxbImport extends CdmIoBase<JaxbImportState> implements ICdmIO<Jax
                //txStatus = startTransaction();\r
                try {\r
                        if (jaxbImpConfig.isDoFeatureData() == true) {\r
-                               if ((featureNodes = dataSet.getFeatureNodes()).size() >0){\r
-                                       logger.error("Feature data: " + featureNodes.size());\r
-                                       getFeatureTreeService().saveFeatureNodesAll(featureNodes);\r
-                               }\r
                                if ((featureTrees = dataSet.getFeatureTrees()).size() > 0) {\r
                                        logger.error("Feature data: " + featureTrees.size());\r
                                        getFeatureTreeService().save(featureTrees);\r
index 72c5790907806eca53145486e77200679b11dbda..c85cd4398a85571552de3f33b5a43247d7a11b8a 100644 (file)
@@ -38,7 +38,7 @@ targetNamespace="http://etaxonomy.eu/cdm/model/agent/1.0"
           <xs:element name="LastName" type="xs:string" minOccurs="0"/>
           <xs:element name="Suffix" type="xs:string" minOccurs="0"/>
           <xs:element name="Lifespan" type="common:TimePeriod" minOccurs="0"/>
-          <xs:element name="InstitutionalMemberships" minOccurs="0">
+          <xs:element name="InstitutionalMemberships" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element ref="agent:InstitutionalMembership" minOccurs="0" maxOccurs="unbounded"/>
@@ -90,7 +90,7 @@ targetNamespace="http://etaxonomy.eu/cdm/model/agent/1.0"
         <xs:sequence>
           <xs:element name="Code" type="xs:string" minOccurs="0"/>
           <xs:element name="Name" type="xs:string" minOccurs="0"/>
-          <xs:element name="Types" minOccurs="0">
+          <xs:element name="Types" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Type" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
@@ -113,35 +113,35 @@ targetNamespace="http://etaxonomy.eu/cdm/model/agent/1.0"
 
   <xs:complexType name="Contact">
     <xs:sequence>
-      <xs:element name="EmailAddresses" minOccurs="0">
+      <xs:element name="EmailAddresses" minOccurs="0" nillable="true">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="EmailAddress" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
-      <xs:element name="URLs" minOccurs="0">
+      <xs:element name="URLs" minOccurs="0" nillable="true">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="URL" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
-      <xs:element name="PhoneNumbers" minOccurs="0">
+      <xs:element name="PhoneNumbers" minOccurs="0" nillable="true">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="PhoneNumber" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
-      <xs:element name="FaxNumbers" minOccurs="0">
+      <xs:element name="FaxNumbers" minOccurs="0" nillable="true">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="FaxNumber" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
-      <xs:element name="Addresses" minOccurs="0">
+      <xs:element name="Addresses" minOccurs="0" nillable="true">
         <xs:complexType>
           <xs:sequence>
             <xs:element ref="agent:Address" minOccurs="0" maxOccurs="unbounded"/>
@@ -172,7 +172,7 @@ targetNamespace="http://etaxonomy.eu/cdm/model/agent/1.0"
       <xs:extension base="agent:TeamOrPersonBase">
         <xs:sequence>
           <xs:element name="ProtectedNomenclaturalTitleCache" type="xs:boolean"/>
-          <xs:element name="TeamMembers" minOccurs="0">
+          <xs:element name="TeamMembers" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="TeamMember" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
index bde021b40d031b6d45de22044c035e23d8dff590..6d3f6ec3be45b61b2ead9175dc479846e44d68e7 100644 (file)
@@ -35,6 +35,25 @@ xmlns:taxon="http://etaxonomy.eu/cdm/model/taxon/1.0">
   <xs:import namespace="http://etaxonomy.eu/cdm/model/reference/1.0" schemaLocation="reference.xsd"/>
 
   <xs:element name="DataSet" type="DataSet"/>
+  
+  <xs:element name="Error" type="Error"/>
+  
+  <xs:complexType name="Error">
+    <xs:sequence>
+      <xs:element name="Code" type="xs:string" minOccurs="1"/>
+      <xs:element name="Message" type="xs:string" minOccurs="1"/>
+      <xs:element name="Resource" type="xs:anyURI"/>
+      <xs:element name="Cause" type="xs:string" minOccurs="0"/>
+      <xs:element name="StackTrace" minOccurs="0">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="StackTraceElement" type="xs:string"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+    <xs:attribute name="status" type="xs:int"/>
+  </xs:complexType>
 
   <xs:complexType name="DataSet">
     <xs:sequence>
index bc7b7e79fe3ba8e3dac02bae7edbce36ddabfd3e..fe73f73e5dc7611f8fb8cd01fb8cc6f745dac107 100644 (file)
           <xs:element name="LSID" type="xs:string" minOccurs="0"/>
           <xs:element name="TitleCache" type="common:FormattedText"/>
           <xs:element name="ProtectedTitleCache" type="xs:boolean"/>
-          <xs:element name="Rights" minOccurs="0">
+          <xs:element name="Rights" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Rights" type="media:Rights" minOccurs="0" maxOccurs="unbounded"/>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
-          <xs:element name="Extensions" minOccurs="0">
+          <xs:element name="Extensions" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Extension" type="common:Extension" minOccurs="0" maxOccurs="unbounded"/>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
-          <xs:element name="Credits" minOccurs="0">
+          <xs:element name="Credits" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Credit" type="common:Credit" minOccurs="0" maxOccurs="unbounded"/>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
-          <xs:element name="Sources" minOccurs="0">
+          <xs:element name="Sources" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="IdentifiableSource" type="common:IdentifiableSource" minOccurs="0" maxOccurs="unbounded"/>
     <xs:complexContent>
       <xs:extension base="common:VersionableEntity">
         <xs:sequence>
-          <xs:element name="Markers" minOccurs="0">
+          <xs:element name="Markers" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Marker" type="common:Marker" minOccurs="0" maxOccurs="unbounded"/>
               </xs:sequence>
             </xs:complexType>
           </xs:element>
-          <xs:element name="Annotations" minOccurs="0">
+          <xs:element name="Annotations" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Annotation" type="common:Annotation" minOccurs="0" maxOccurs="unbounded"/>
index cdbe00c8872dce53d95fd519ecc3ce6062177c82..cfdfa93e45e5fb9ca8e291ff74bf03b1d62dd8ab 100644 (file)
@@ -108,7 +108,7 @@ xmlns:name="http://etaxonomy.eu/cdm/model/name/1.0">
     <xs:complexContent>
       <xs:extension base="common:VersionableEntity">
         <xs:sequence>
-          <xs:element ref="description:Feature" minOccurs="0"/>
+          <xs:element name="Feature" minOccurs="0" type="xs:IDREF"/>
           <xs:element name="Parent" type="xs:IDREF" minOccurs="0"/>
           <xs:element name="Children" minOccurs="0">
             <xs:complexType>
@@ -149,9 +149,9 @@ xmlns:name="http://etaxonomy.eu/cdm/model/name/1.0">
       <xs:extension base="common:DefinedTermBase">
         <xs:sequence>
           <xs:element ref="common:KindOf" minOccurs="0"/>
-          <xs:element ref="common:Generalizations"/>
+          <xs:element ref="common:Generalizations" minOccurs="0"/>
           <xs:element ref="common:PartOf" minOccurs="0"/>
-          <xs:element ref="common:Includes"/>
+          <xs:element ref="common:Includes" minOccurs="0"/>
           <xs:element name="SupportsTextData" type="xs:boolean"/>
           <xs:element name="SupportsQuantitativeData" type="xs:boolean"/>
           <xs:element name="SupportsDistribution" type="xs:boolean"/>
index f36bbfc12a2df3061e47ec954f9134eec833fa5f..d2a6bad37423bf36de5052684b07be16c202f013 100644 (file)
@@ -51,7 +51,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:complexContent>
       <xs:extension base="common:IdentifiableEntity">
         <xs:sequence>
-          <xs:element name="Media" minOccurs="0">
+          <xs:element name="Media" minOccurs="0" nillable="true">
             <xs:complexType>
               <xs:sequence>
                 <xs:element name="Medium" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
index b2ac525aa5d3970879d88d2a166d6860e770f020..96c8f4bf734623c1a03c4debf0c6522d736feb32 100644 (file)
       </property>\r
     </bean>\r
     \r
-    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">\r
+    <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">\r
         <property name="providers">\r
             <list>\r
-                <bean class="org.springframework.security.providers.TestingAuthenticationProvider"/>\r
+                <bean class="org.springframework.security.authentication.TestingAuthenticationProvider"/>\r
             </list>\r
         </property>\r
     </bean>\r
     \r
-    <bean id="passwordEncoder" class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>\r
+    <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>\r
     \r
-    <bean id="saltSource" class="org.springframework.security.providers.dao.salt.ReflectionSaltSource">\r
+    <bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">\r
         <property name="userPropertyToUse" value="getUsername"/>\r
     </bean>
     
index 087cc7670f4d16547b3f9fad89aa0a586a6c1199..d63c24603b2554869557ce189195ed0aefbd2e64 100644 (file)
     xsi:schemaLocation="http://etaxonomy.eu/cdm/model/1.0\r
                         ../../../../../../classes/schema/cdm/cdm.xsd">\r
     <Terms>\r
-        <common:Language id="1" uuid="urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d" iso639_1="en" iso639_2="eng"/>\r
-        <description:Feature id="2" uuid="urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c">\r
+        <common:Language uuid="urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d" iso639_1="en" iso639_2="eng">
+            <common:TitleCache>English</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>
+        </common:Language>\r
+        <description:Feature uuid="urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c">\r
+            <common:TitleCache>General</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="1" uuid="urn-uuid-00456f86-2e2f-47e2-a763-bd51094cd9c8">\r
+                <common:Representation uuid="urn-uuid-00456f86-2e2f-47e2-a763-bd51094cd9c8">\r
                     <common:Text>General</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>General</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
+            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <common:Generalizations>\r
                 <common:GeneralizationOf>urn-uuid-98cd50c9-3938-471b-b4d7-fe61b2f19efd</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</common:GeneralizationOf>\r
             </common:Generalizations>\r
-            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>false</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="3" uuid="urn-uuid-98cd50c9-3938-471b-b4d7-fe61b2f19efd">\r
+        <description:Feature  uuid="urn-uuid-98cd50c9-3938-471b-b4d7-fe61b2f19efd">\r
+            <common:TitleCache>Habitus</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="2" uuid="urn-uuid-d7ea34b3-9bd8-4b9d-989e-40bedcb96896">\r
+                <common:Representation  uuid="urn-uuid-d7ea34b3-9bd8-4b9d-989e-40bedcb96896">\r
                     <common:Text>Habitus</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Habitus</common:Label>\r
                 </common:Representation>\r
-            </common:Representations>\r
-            <common:KindOf>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:KindOf>\r
+            </common:Representations>            \r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:KindOf>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="4" uuid="urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513">\r
+        <description:Feature  uuid="urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513">\r
+            <common:TitleCache>Body</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="3" uuid="urn-uuid-be42a8f1-be83-4117-8f4a-0300c13937fd">\r
+                <common:Representation  uuid="urn-uuid-be42a8f1-be83-4117-8f4a-0300c13937fd">\r
                     <common:Text>Body</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Body</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
+            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <common:KindOf>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:KindOf>\r
             <common:Generalizations>\r
                 <common:GeneralizationOf>urn-uuid-c015b086-f5a9-4132-afa8-e6de6ec8406d</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-92534c0b-bb6c-415d-9ebf-96402ea2413a</common:GeneralizationOf>\r
-            </common:Generalizations>\r
-            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            </common:Generalizations>          \r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="5" uuid="urn-uuid-c015b086-f5a9-4132-afa8-e6de6ec8406d">\r
+        <description:Feature  uuid="urn-uuid-c015b086-f5a9-4132-afa8-e6de6ec8406d">\r
+            <common:TitleCache>Body Upperside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="4" uuid="urn-uuid-6c415cd7-af7b-4c17-a4f0-c14301dd1dc9">\r
+                <common:Representation  uuid="urn-uuid-6c415cd7-af7b-4c17-a4f0-c14301dd1dc9">\r
                     <common:Text>Body Upperside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Body Upperside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</common:KindOf>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="7" uuid="urn-uuid-92534c0b-bb6c-415d-9ebf-96402ea2413a">\r
+        <description:Feature  uuid="urn-uuid-92534c0b-bb6c-415d-9ebf-96402ea2413a">\r
+            <common:TitleCache>Body Underside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="5" uuid="urn-uuid-3fb097e1-e0c7-4b68-bb99-a98edf51699c">\r
+                <common:Representation  uuid="urn-uuid-3fb097e1-e0c7-4b68-bb99-a98edf51699c">\r
                     <common:Text>Body Underside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Body Underside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</common:KindOf>            \r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="7" uuid="urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7">\r
+        <description:Feature  uuid="urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7">\r
+            <common:TitleCache>Forewing</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="6" uuid="urn-uuid-c3947d3a-67fb-4e6d-9aee-fb6784f6b872">\r
+                <common:Representation  uuid="urn-uuid-c3947d3a-67fb-4e6d-9aee-fb6784f6b872">\r
                     <common:Text>Forewing</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Forewing</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
+            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <common:KindOf>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:KindOf>\r
             <common:Generalizations>\r
                 <common:GeneralizationOf>urn-uuid-3baf0225-619d-48d8-9017-bd673ca23dd3</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-4d2c9e16-20b7-4a87-958f-57c9ffaa6c0a</common:GeneralizationOf>\r
             </common:Generalizations>\r
-            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="8" uuid="urn-uuid-3baf0225-619d-48d8-9017-bd673ca23dd3">\r
+        <description:Feature  uuid="urn-uuid-3baf0225-619d-48d8-9017-bd673ca23dd3">\r
+            <common:TitleCache>Forewing Upperside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="7" uuid="urn-uuid-bff6a2d8-c47b-4609-bc86-92ccfab43c58">\r
+                <common:Representation  uuid="urn-uuid-bff6a2d8-c47b-4609-bc86-92ccfab43c58">\r
                     <common:Text>Forewing Upperside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Forewing Upperside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</common:KindOf>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="9" uuid="urn-uuid-4d2c9e16-20b7-4a87-958f-57c9ffaa6c0a">\r
+        <description:Feature  uuid="urn-uuid-4d2c9e16-20b7-4a87-958f-57c9ffaa6c0a">\r
+            <common:TitleCache>Forewing Underside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="8" uuid="urn-uuid-1a39da20-a3b5-4e25-a8bf-2a65a1b59059">\r
+                <common:Representation  uuid="urn-uuid-1a39da20-a3b5-4e25-a8bf-2a65a1b59059">\r
                     <common:Text>Forewing Underside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Forewing Underside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</common:KindOf>            \r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="10" uuid="urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775">\r
+        <description:Feature  uuid="urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775">\r
+            <common:TitleCache>Hindwing</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="9" uuid="urn-uuid-6b566114-0f20-4b34-8159-7af117cb2c50">\r
+                <common:Representation  uuid="urn-uuid-6b566114-0f20-4b34-8159-7af117cb2c50">\r
                     <common:Text>Hindwing</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Hindwing</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
+            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <common:KindOf>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:KindOf>\r
             <common:Generalizations>\r
                 <common:GeneralizationOf>urn-uuid-4dab37e3-80a2-4c86-9b60-eba4d4578967</common:GeneralizationOf>\r
                 <common:GeneralizationOf>urn-uuid-1aeb4db9-0496-4632-9d6c-471f65d717e6</common:GeneralizationOf>\r
             </common:Generalizations>\r
-            <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="11" uuid="urn-uuid-4dab37e3-80a2-4c86-9b60-eba4d4578967">\r
+        <description:Feature  uuid="urn-uuid-4dab37e3-80a2-4c86-9b60-eba4d4578967">\r
+            <common:TitleCache>Hindwing Upperside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="10" uuid="urn-uuid-1d8ca60d-6249-4d7d-82a0-7d0930220ece">\r
+                <common:Representation  uuid="urn-uuid-1d8ca60d-6249-4d7d-82a0-7d0930220ece">\r
                     <common:Text>Hindwing Upperside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Hindwing Upperside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</common:KindOf>            \r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
-        <description:Feature id="12" uuid="urn-uuid-1aeb4db9-0496-4632-9d6c-471f65d717e6">\r
+        <description:Feature  uuid="urn-uuid-1aeb4db9-0496-4632-9d6c-471f65d717e6">\r
+            <common:TitleCache>Hindwing Underside</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:Representations>\r
-                <common:Representation id="11" uuid="urn-uuid-6a6725b8-c7e9-4e1c-b73b-7a0b29843a17">\r
+                <common:Representation  uuid="urn-uuid-6a6725b8-c7e9-4e1c-b73b-7a0b29843a17">\r
                     <common:Text>Hindwing Underside</common:Text>\r
                     <common:Language>urn-uuid-27024e60-a78a-4950-8fda-e43b4c58a01d</common:Language>\r
                     <common:Label>Hindwing Underside</common:Label>\r
                 </common:Representation>\r
             </common:Representations>\r
-            <common:KindOf>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</common:KindOf>\r
             <common:TermVocabulary>urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d</common:TermVocabulary>\r
+            <common:KindOf>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</common:KindOf>\r
             <description:SupportsTextData>false</description:SupportsTextData>\r
             <description:SupportsQuantitativeData>false</description:SupportsQuantitativeData>\r
             <description:SupportsDistribution>false</description:SupportsDistribution>\r
             <description:SupportsIndividualAssociation>false</description:SupportsIndividualAssociation>\r
             <description:SupportsTaxonInteraction>false</description:SupportsTaxonInteraction>\r
             <description:SupportsCommonTaxonName>false</description:SupportsCommonTaxonName>\r
+            <description:SupportsCategoricalData>true</description:SupportsCategoricalData>\r
         </description:Feature>\r
     </Terms>\r
     <TermVocabularies>\r
-        <common:TermVocabulary id="1" uuid="urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d">\r
+        <common:TermVocabulary  uuid="urn-uuid-93a570fd-631d-464d-9b0a-8698b5ae3b8d">\r
+            <common:TitleCache>Diagnosis Terms</common:TitleCache>\r
+            <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <common:TermSourceURI>http://www.cate-sphingidae.org</common:TermSourceURI>\r
             <common:Terms>\r
                 <common:Term>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</common:Term>\r
         </common:TermVocabulary>\r
     </TermVocabularies>\r
     <FeatureTrees>\r
-      <description:FeatureTree id="1" uuid="urn-uuid-6509b4ca-a872-45cc-b743-a0fe50fc8bb7">\r
+      <description:FeatureTree  uuid="urn-uuid-6509b4ca-a872-45cc-b743-a0fe50fc8bb7">\r
+           <common:TitleCache>Feature Tree</common:TitleCache>\r
+           <common:ProtectedTitleCache>true</common:ProtectedTitleCache>\r
             <description:IsDescriptionSeparated>false</description:IsDescriptionSeparated>\r
-            <description:Root id="1" uuid="urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc">\r
+            <description:Root  uuid="urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc">\r
               <description:Feature>urn-uuid-e40912a5-3e36-4d1e-aee9-dc57a83fa81c</description:Feature>\r
               <description:Children>\r
-                <description:Child id="2" uuid="urn-uuid-38beaff6-00b9-4f32-8f70-d33153b8fe0f">\r
+                <description:Child  uuid="urn-uuid-38beaff6-00b9-4f32-8f70-d33153b8fe0f">\r
                   <description:Feature>urn-uuid-98cd50c9-3938-471b-b4d7-fe61b2f19efd</description:Feature>\r
                   <description:Parent>urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc</description:Parent>\r
                 </description:Child>\r
-                <description:Child id="3" uuid="urn-uuid-a5700c2f-8630-46e7-a900-59c9a612fbaf">\r
+                <description:Child  uuid="urn-uuid-a5700c2f-8630-46e7-a900-59c9a612fbaf">\r
                   <description:Feature>urn-uuid-0a9af077-0927-4655-9892-3a4bb3233513</description:Feature>\r
                   <description:Parent>urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc</description:Parent>\r
                   <description:Children>\r
-                    <description:Child id="4" uuid="urn-uuid-4438f658-8b78-4e33-af36-584e088703d2">\r
+                    <description:Child  uuid="urn-uuid-4438f658-8b78-4e33-af36-584e088703d2">\r
                       <description:Feature>urn-uuid-c015b086-f5a9-4132-afa8-e6de6ec8406d</description:Feature>\r
                       <description:Parent>urn-uuid-a5700c2f-8630-46e7-a900-59c9a612fbaf</description:Parent>\r
                     </description:Child>\r
-                    <description:Child id="5" uuid="urn-uuid-d458aef3-40f2-47c3-bc64-0a8191428df0">\r
+                    <description:Child  uuid="urn-uuid-d458aef3-40f2-47c3-bc64-0a8191428df0">\r
                       <description:Feature>urn-uuid-92534c0b-bb6c-415d-9ebf-96402ea2413a</description:Feature>\r
                       <description:Parent>urn-uuid-a5700c2f-8630-46e7-a900-59c9a612fbaf</description:Parent>\r
                     </description:Child>\r
                   </description:Children>\r
                 </description:Child>\r
-                <description:Child id="6" uuid="urn-uuid-20070dea-4455-444e-b7be-fd771370b85a">\r
+                <description:Child  uuid="urn-uuid-20070dea-4455-444e-b7be-fd771370b85a">\r
                   <description:Feature>urn-uuid-c64b38a9-e8a9-4e32-8aba-69f2c83496c7</description:Feature>\r
                   <description:Parent>urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc</description:Parent>\r
                   <description:Children>\r
-                    <description:Child id="7" uuid="urn-uuid-588e66df-eba4-4c00-a05d-e604fa9994a5">\r
+                    <description:Child  uuid="urn-uuid-588e66df-eba4-4c00-a05d-e604fa9994a5">\r
                       <description:Feature>urn-uuid-3baf0225-619d-48d8-9017-bd673ca23dd3</description:Feature>\r
                       <description:Parent>urn-uuid-20070dea-4455-444e-b7be-fd771370b85a</description:Parent>\r
                     </description:Child>\r
-                    <description:Child id="8" uuid="urn-uuid-f3f4617c-0a02-47a4-92f9-4790ff1156ee">\r
+                    <description:Child  uuid="urn-uuid-f3f4617c-0a02-47a4-92f9-4790ff1156ee">\r
                       <description:Feature>urn-uuid-4d2c9e16-20b7-4a87-958f-57c9ffaa6c0a</description:Feature>\r
                       <description:Parent>urn-uuid-20070dea-4455-444e-b7be-fd771370b85a</description:Parent>\r
                     </description:Child>\r
                   </description:Children>\r
                 </description:Child>\r
-                <description:Child id="9" uuid="urn-uuid-0ae5afe1-a0c4-4585-be09-d0cf295b671c">\r
+                <description:Child  uuid="urn-uuid-0ae5afe1-a0c4-4585-be09-d0cf295b671c">\r
                   <description:Feature>urn-uuid-2d69a75b-7557-4c8d-b212-0bd8e59a2775</description:Feature>\r
                   <description:Parent>urn-uuid-a137ed36-383f-49a9-8d84-976361188bcc</description:Parent>\r
                   <description:Children>\r
-                    <description:Child id="10" uuid="urn-uuid-b92df49d-2a58-4684-b478-397d506aea18">\r
+                    <description:Child  uuid="urn-uuid-b92df49d-2a58-4684-b478-397d506aea18">\r
                       <description:Feature>urn-uuid-4dab37e3-80a2-4c86-9b60-eba4d4578967</description:Feature>\r
                       <description:Parent>urn-uuid-0ae5afe1-a0c4-4585-be09-d0cf295b671c</description:Parent>\r
                     </description:Child>\r
-                    <description:Child id="11" uuid="urn-uuid-c9e61521-b474-4558-9a74-fd5731f52447">\r
+                    <description:Child  uuid="urn-uuid-c9e61521-b474-4558-9a74-fd5731f52447">\r
                       <description:Feature>urn-uuid-1aeb4db9-0496-4632-9d6c-471f65d717e6</description:Feature>\r
                       <description:Parent>urn-uuid-0ae5afe1-a0c4-4585-be09-d0cf295b671c</description:Parent>\r
                     </description:Child>\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/DateTimeBridge.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/hibernate/DateTimeBridge.java
new file mode 100644 (file)
index 0000000..a6d2983
--- /dev/null
@@ -0,0 +1,25 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.hibernate;\r
+\r
+import org.hibernate.search.bridge.StringBridge;\r
+import org.joda.time.DateTime;\r
+\r
+public class DateTimeBridge implements StringBridge {\r
+\r
+       public String objectToString(Object object) {\r
+               if(object != null) {\r
+                       DateTime dateTime = ((DateTime)object);\r
+                       return dateTime.toString();\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessor.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessor.java
new file mode 100644 (file)
index 0000000..f6da37e
--- /dev/null
@@ -0,0 +1,50 @@
+package eu.etaxonomy.cdm.jaxb;
+
+import org.apache.log4j.Logger;
+import org.hibernate.Hibernate;
+import org.hibernate.proxy.HibernateProxy;
+
+import com.sun.xml.bind.api.AccessorException;
+import com.sun.xml.bind.v2.runtime.JAXBContextImpl;
+import com.sun.xml.bind.v2.runtime.reflect.Accessor;
+
+public class CdmAccessor<BeanT,ValueT> extends Accessor<BeanT,ValueT> {
+
+       private static final Logger logger = Logger.getLogger(CdmAccessor.class);
+       
+       private Accessor<BeanT, ValueT> delegate;
+
+       public CdmAccessor(Accessor<BeanT, ValueT> delegate) {
+               super(delegate.getValueType());
+               this.delegate = delegate;
+       }
+
+       @Override
+       public Accessor<BeanT, ValueT> optimize(JAXBContextImpl context) {
+               delegate = delegate.optimize(context);
+               return this;
+       }
+
+       @Override
+       public ValueT get(BeanT bean) throws AccessorException {
+               return hideLazy(delegate.get(bean));
+       }
+
+       @Override
+       public void set(BeanT bean, ValueT value) throws AccessorException {
+               delegate.set(bean, value);
+       }
+
+       protected ValueT hideLazy(ValueT value) {
+               if (Hibernate.isInitialized(value)) {                   
+                       if(value instanceof HibernateProxy) {
+                               logger.info("Accessor Returning " + value + " as unwrapped proxy");
+                               return (ValueT)((HibernateProxy)value).getHibernateLazyInitializer().getImplementation();                                               
+                       } else {
+                               logger.info("Accessor Returning " + value);
+                           return value;
+                       }
+               }
+               return null;
+       }
+}
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessorFactoryImpl.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/jaxb/CdmAccessorFactoryImpl.java
new file mode 100644 (file)
index 0000000..f6d0acb
--- /dev/null
@@ -0,0 +1,36 @@
+package eu.etaxonomy.cdm.jaxb;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import javax.xml.bind.JAXBException;
+
+import com.sun.xml.bind.AccessorFactory;
+import com.sun.xml.bind.AccessorFactoryImpl;
+import com.sun.xml.bind.v2.runtime.reflect.Accessor;
+
+public class CdmAccessorFactoryImpl implements AccessorFactory {
+
+       private final AccessorFactory delegate;
+
+       public CdmAccessorFactoryImpl() {
+               this(AccessorFactoryImpl.getInstance());
+       }
+
+       public CdmAccessorFactoryImpl(AccessorFactory delegate) {
+               this.delegate = delegate;
+       }
+
+       @SuppressWarnings("unchecked")
+       public Accessor createFieldAccessor(Class bean, Field f, boolean readOnly)
+                       throws JAXBException {
+               return new CdmAccessor(delegate.createFieldAccessor(bean, f, readOnly));
+       }
+
+       @SuppressWarnings("unchecked")
+       public Accessor createPropertyAccessor(Class bean, Method getter,
+                       Method setter) throws JAXBException {
+               return new CdmAccessor(delegate.createPropertyAccessor(bean, getter, setter));
+       }
+
+}
index 4bd71ec3b01aaa2962e78502f43a7c3b53631fbc..1150dd3bdbe58a6741ec1c75cd3e3847fba99281 100644 (file)
@@ -94,19 +94,19 @@ public class Contact implements Serializable {
                if (country != null || CdmUtils.isNotEmpty(locality) || CdmUtils.isNotEmpty(pobox) || CdmUtils.isNotEmpty(postcode) || 
                                CdmUtils.isNotEmpty(region) || CdmUtils.isNotEmpty(street) ){
                        Address newAddress = Address.NewInstance(country, locality, pobox, postcode, region, street, location);
-                       result.addresses.add(newAddress);
+                       result.addAddress(newAddress);
                }
                if (email != null){
-                       result.emailAddresses.add(email);
+                       result.addEmailAddress(email);
                }
                if (faxNumber != null){
-                       result.faxNumbers.add(faxNumber);
+                       result.addFaxNumber(faxNumber);
                }
                if (phoneNumber != null){
-                       result.phoneNumbers.add(phoneNumber);
+                       result.addPhoneNumber(phoneNumber);
                }
                if (url != null){
-                       result.urls.add(url);
+                       result.addUrl(url);
                }
                return result;
        }
@@ -140,32 +140,32 @@ public class Contact implements Serializable {
        public Contact() {
        }
 
-       @XmlElementWrapper(name = "EmailAddresses")
+       @XmlElementWrapper(name = "EmailAddresses", nillable = true)
        @XmlElement(name = "EmailAddress")
        @CollectionOfElements(fetch = FetchType.LAZY)
-       private List<String> emailAddresses = new ArrayList<String>();
+       private List<String> emailAddresses;
        
-       @XmlElementWrapper(name = "URLs")
+       @XmlElementWrapper(name = "URLs", nillable = true)
        @XmlElement(name = "URL")
     @XmlSchemaType(name = "anyURI")
     @CollectionOfElements(fetch = FetchType.LAZY)
-       private List<String> urls = new ArrayList<String>();
+       private List<String> urls;
        
-       @XmlElementWrapper(name = "PhoneNumbers")
+       @XmlElementWrapper(name = "PhoneNumbers", nillable = true)
        @XmlElement(name = "PhoneNumber")
        @CollectionOfElements(fetch = FetchType.LAZY)
-       private List<String> phoneNumbers = new ArrayList<String>();
+       private List<String> phoneNumbers;
        
-       @XmlElementWrapper(name = "FaxNumbers")
+       @XmlElementWrapper(name = "FaxNumbers", nillable = true)
        @XmlElement(name = "FaxNumber")
        @CollectionOfElements(fetch = FetchType.LAZY)
-       private List<String> faxNumbers = new ArrayList<String>();
+       private List<String> faxNumbers;
        
-    @XmlElementWrapper(name = "Addresses")
+    @XmlElementWrapper(name = "Addresses", nillable = true)
     @XmlElement(name = "Address")
     @OneToMany(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE_ORPHAN})
-       protected Set<Address> addresses = new HashSet<Address>();
+       protected Set<Address> addresses;
        
        
        public void merge(Contact contact2) throws MergeException{
@@ -202,6 +202,9 @@ public class Contact implements Serializable {
         * @see     Address
         */
        public Set<Address> getAddresses(){
+               if(this.addresses == null) {
+                       this.addresses = new HashSet<Address>();
+               }
                return this.addresses;
        }
        
@@ -214,14 +217,14 @@ public class Contact implements Serializable {
         */
        public void addAddress(Address address){
                if (address != null){
-                       addresses.add(address);
+                       getAddresses().add(address);
                }
        }
        
        public void addAddress(String street, String postcode, String locality, 
                        WaterbodyOrCountry country, String pobox, String region, Point location){
                Address newAddress = Address.NewInstance(country, locality, pobox, postcode, region, street, location);
-               addresses.add(newAddress);
+               getAddresses().add(newAddress);
        }
        
        /** 
@@ -231,7 +234,7 @@ public class Contact implements Serializable {
         * @see                 #getAddresses()
         */
        public void removeAddress(Address address){
-               addresses.remove(address);
+               getAddresses().remove(address);
        }
 
        
@@ -240,6 +243,9 @@ public class Contact implements Serializable {
         * included in <i>this</i> contact.
         */
        public List<String> getEmailAddresses(){
+               if(this.emailAddresses == null) {
+                       this.emailAddresses = new ArrayList<String>();
+               }
                return this.emailAddresses;
        }
 
@@ -247,7 +253,7 @@ public class Contact implements Serializable {
         * @see  #getEmailAddress()
         */
        public void addEmailAddress(String emailAddress){
-               this.emailAddresses.add(emailAddress);
+               getEmailAddresses().add(emailAddress);
        }
        
        /** 
@@ -257,7 +263,7 @@ public class Contact implements Serializable {
         * @see                 #getEmailAddresses()
         */
        public void removeEmailAddress(String emailAddress){
-               emailAddresses.remove(emailAddress);
+               getEmailAddresses().remove(emailAddress);
        }
 
        /**
@@ -265,6 +271,9 @@ public class Contact implements Serializable {
         * included in <i>this</i> contact.
         */
        public List<String> getUrls(){
+               if(this.urls == null) {
+                       this.urls = new ArrayList<String>();
+               }
                return this.urls;
        }
 
@@ -272,7 +281,7 @@ public class Contact implements Serializable {
         * @see  #getUrls()
         */
        public void addUrl(String url){
-               this.urls.add(url);
+               getUrls().add(url);
        }
        
        /** 
@@ -282,7 +291,7 @@ public class Contact implements Serializable {
         * @see                 #getUrls()
         */
        public void removeUrl(String url){
-               urls.remove(url);
+               getUrls().remove(url);
        }
 
        /**
@@ -290,6 +299,9 @@ public class Contact implements Serializable {
         * included in <i>this</i> contact.
         */
        public List<String> getPhoneNumbers(){
+               if(this.phoneNumbers == null) {
+                       this.phoneNumbers = new ArrayList<String>();
+               }
                return this.phoneNumbers;
        }
 
@@ -297,7 +309,7 @@ public class Contact implements Serializable {
         * @see  #getPhone()
         */
        public void addPhoneNumber(String phoneNumber){
-               this.phoneNumbers.add(phoneNumber);
+               getPhoneNumbers().add(phoneNumber);
        }
        
        /** 
@@ -307,7 +319,7 @@ public class Contact implements Serializable {
         * @see                 #getPhoneNumber()
         */
        public void removePhoneNumber(String phoneNumber){
-               phoneNumbers.remove(phoneNumber);
+               getPhoneNumbers().remove(phoneNumber);
        }
 
        /**
@@ -315,6 +327,9 @@ public class Contact implements Serializable {
         * included in <i>this</i> contact.
         */
        public List<String> getFaxNumbers(){
+               if(this.faxNumbers == null) {
+                       this.faxNumbers = new ArrayList<String>();
+               }
                return this.faxNumbers;
        }
 
@@ -322,7 +337,7 @@ public class Contact implements Serializable {
         * @see  #getFaxNumbers()
         */
        public void addFaxNumber(String faxNumber){
-               this.faxNumbers.add(faxNumber);
+               getFaxNumbers().add(faxNumber);
        }
 
        /** 
@@ -332,7 +347,7 @@ public class Contact implements Serializable {
         * @see                 #getFaxNumber()
         */
        public void removeFaxNumber(String faxNumber){
-               faxNumbers.remove(faxNumber);
+               getFaxNumbers().remove(faxNumber);
        }
 
        
index 94664a18d9e7f930f41a633f0e243d4e49b0bc15..2b2c17a034f07aeb4a0bd6742557131f0c4697ac 100644 (file)
@@ -83,13 +83,12 @@ public class Institution extends AgentBase<IIdentifiableEntityCacheStrategy<Inst
     @Size(max = 255)
        private String name;
        
-    @XmlElementWrapper(name = "Types")
+    @XmlElementWrapper(name = "Types", nillable = true)
     @XmlElement(name = "Type")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
     @ManyToMany(fetch = FetchType.LAZY)
-    @NotNull
-       private Set<InstitutionType> types = new HashSet<InstitutionType>();
+       private Set<InstitutionType> types;
        
     @XmlElement(name = "IsPartOf")
     @XmlIDREF
@@ -138,7 +137,7 @@ public class Institution extends AgentBase<IIdentifiableEntityCacheStrategy<Inst
         * @see           InstitutionType
         */
        public void addType(InstitutionType t){
-               this.types.add(t);
+               getTypes().add(t);
        }
        
        /** 
@@ -148,7 +147,7 @@ public class Institution extends AgentBase<IIdentifiableEntityCacheStrategy<Inst
         * @see       #getTypes()
         */
        public void removeType(InstitutionType t){
-               this.types.remove(t);
+               getTypes().remove(t);
        }
 
        /** 
index 1d72ce80412a46021dff3616866a6e4225d3d037..bddff42614460d24ba49eca92894aaa07b753304 100644 (file)
@@ -110,12 +110,11 @@ public class Person extends TeamOrPersonBase<Person>{
     @NotNull
        private TimePeriod lifespan = TimePeriod.NewInstance();
        
-    @XmlElementWrapper(name = "InstitutionalMemberships")
+    @XmlElementWrapper(name = "InstitutionalMemberships", nillable = true)
     @XmlElement(name = "InstitutionalMembership")
     @OneToMany(fetch=FetchType.LAZY, mappedBy = "person")
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE})
-       @NotNull
-       protected Set<InstitutionalMembership> institutionalMemberships = new HashSet<InstitutionalMembership>();
+       protected Set<InstitutionalMembership> institutionalMemberships;
 
        /** 
         * Creates a new empty instance for a person whose existence is all what is known.
@@ -187,7 +186,7 @@ public class Person extends TeamOrPersonBase<Person>{
        }
 
        protected void addInstitutionalMembership(InstitutionalMembership ims){
-               this.institutionalMemberships.add(ims);
+               getInstitutionalMemberships().add(ims);
                if (ims.getPerson() != this){
                        logger.warn("Institutional membership's person has to be changed for adding it to person: " + this);
                        ims.getPerson().removeInstitutionalMembership(ims);
@@ -224,7 +223,7 @@ public class Person extends TeamOrPersonBase<Person>{
        public void removeInstitutionalMembership(InstitutionalMembership ims){
                ims.setInstitute(null);
                ims.setPerson(null);
-               this.institutionalMemberships.remove(ims);
+               getInstitutionalMemberships().remove(ims);
        }
 
        /**
index 52b8ebb5078c5a7ef94be30fd2b67df5909c8266..22729e5afba106cbe4f3fc6d87e3335e7ca44a77 100644 (file)
@@ -62,7 +62,7 @@ import eu.etaxonomy.cdm.strategy.match.MatchMode;
        "protectedNomenclaturalTitleCache",
     "teamMembers"
 })
-@XmlRootElement
+@XmlRootElement(name = "Team")
 @Entity
 @Indexed(index = "eu.etaxonomy.cdm.model.agent.AgentBase")
 @Audited
@@ -76,7 +76,7 @@ public class Team extends TeamOrPersonBase<Team> {
 
        //An abreviated name for the team (e. g. in case of nomenclatural authorteams). A non abreviated name for the team (e. g.
        //in case of some bibliographical references)
-    @XmlElementWrapper(name = "TeamMembers")
+    @XmlElementWrapper(name = "TeamMembers", nillable = true)
     @XmlElement(name = "TeamMember")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
@@ -84,8 +84,7 @@ public class Team extends TeamOrPersonBase<Team> {
        @ManyToMany(fetch = FetchType.LAZY)
        @Cascade(CascadeType.SAVE_UPDATE)
        @Match(MatchMode.MATCH)
-       @NotNull
-       private List<Person> teamMembers = new ArrayList<Person>();
+       private List<Person> teamMembers;
        
        
        /** 
@@ -115,6 +114,10 @@ public class Team extends TeamOrPersonBase<Team> {
                return this.teamMembers;
        }
        
+       protected void setTeamMembers(List<Person> teamMembers) {
+               this.teamMembers = teamMembers;
+       }
+       
        /** 
         * Adds a new {@link Person person} to <i>this</i> team at the end of the members' list. 
         *
@@ -123,7 +126,7 @@ public class Team extends TeamOrPersonBase<Team> {
         * @see                    Person
         */
        public void addTeamMember(Person person){
-               this.teamMembers.add(person);
+               getTeamMembers().add(person);
        }
        
        /** 
@@ -141,11 +144,11 @@ public class Team extends TeamOrPersonBase<Team> {
        public void addTeamMember(Person person, int index){
                // TODO is still not fully implemented (range for index!)
                logger.warn("not yet fully implemented (range for index!)");
-               int oldIndex = teamMembers.indexOf(person);
+               int oldIndex = getTeamMembers().indexOf(person);
                if (oldIndex != -1 ){
-                       teamMembers.remove(person);
+                       getTeamMembers().remove(person);
                }
-               this.teamMembers.add(index, person);
+               getTeamMembers().add(index, person);
        }
        
        /** 
@@ -155,7 +158,7 @@ public class Team extends TeamOrPersonBase<Team> {
         * @see            #getTeamMembers()
         */
        public void removeTeamMember(Person person){
-               this.teamMembers.remove(person);
+               getTeamMembers().remove(person);
        }
 
        /**
index c9caa8bac30c13f05f7c99d152e6c577749a425a..32857f3c756b5b9a4d5b68bd2095c386ed590ed0 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/agent/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.agent;
\ No newline at end of file
index 85afa41e619bade65e1eaeeaaae11687dbe1e5d5..a5e722ce6b5767560dec2a361c4c9d483310d359 100644 (file)
@@ -46,21 +46,19 @@ public abstract class AnnotatableEntity extends VersionableEntity {
        @SuppressWarnings("unused")
        private static final Logger logger = Logger.getLogger(AnnotatableEntity.class);
 
-       @XmlElementWrapper(name = "Markers")
+       @XmlElementWrapper(name = "Markers", nillable = true)
        @XmlElement(name = "Marker")
        @OneToMany(fetch=FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       protected Set<Marker> markers = new HashSet<Marker>();
+       protected Set<Marker> markers;
        
-       @XmlElementWrapper(name = "Annotations")
+       @XmlElementWrapper(name = "Annotations", nillable = true)
        @XmlElement(name = "Annotation")
        @OneToMany(fetch=FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       protected Set<Annotation> annotations = new HashSet<Annotation>();
+       protected Set<Annotation> annotations;
        
        protected AnnotatableEntity() {
                super();
@@ -78,12 +76,12 @@ public abstract class AnnotatableEntity extends VersionableEntity {
        public void addMarker(Marker marker){
                if (marker != null){
                        marker.setMarkedObj(this);
-                       markers.add(marker);
+                       getMarkers().add(marker);
                }
        }
        public void removeMarker(Marker marker){
-               if(this.markers.contains(marker)) {
-                   this.markers.remove(marker);
+               if(getMarkers().contains(marker)) {
+                       getMarkers().remove(marker);
                    marker.setMarkedObj(null);
                }
        }
@@ -99,13 +97,13 @@ public abstract class AnnotatableEntity extends VersionableEntity {
        public void addAnnotation(Annotation annotation){
                if (annotation != null){
                        annotation.setAnnotatedObj(this);
-                       annotations.add(annotation);
+                       getAnnotations().add(annotation);
                }
        }
        
        public void removeAnnotation(Annotation annotation){
-               if(this.annotations.contains(annotation)) {
-                   this.annotations.remove(annotation);
+               if(getAnnotations().contains(annotation)) {
+                       getAnnotations().remove(annotation);
                    annotation.setAnnotatedObj(null);
                }
        }
@@ -121,14 +119,14 @@ public abstract class AnnotatableEntity extends VersionableEntity {
                
                //Annotations
                result.annotations = new HashSet<Annotation>();
-               for (Annotation annotation : this.annotations ){
+               for (Annotation annotation : getAnnotations()){
                        Annotation newAnnotation = (Annotation)annotation.clone();
                        result.addAnnotation(newAnnotation);
                }
                
                //Markers
                result.markers = new HashSet<Marker>();
-               for (Marker marker : this.markers ){
+               for (Marker marker : getMarkers()){
                        Marker newMarker = (Marker)marker.clone();
                        result.addMarker(newMarker);
                }
index f89c0d7a8f4d990d716afdab20742c37bedfd6a4..131aa24ee1643df4fea948ba99698f489d54ec3f 100644 (file)
@@ -189,7 +189,9 @@ public class Annotation extends LanguageStringBase implements Cloneable {
        @Override
        public Object clone() throws CloneNotSupportedException{
                Annotation result = (Annotation)super.clone();
-               //no changes to: type, flag
+               result.setCommentator(this.getCommentator());
+               result.setAnnotationType(this.getAnnotationType());
+               result.setLinkbackUrl(this.linkbackUrl);
                return result;
        }
        
index 23c5b4d9b7b2c78532b21631a4c3c0b17cc18d26..5fbd7963d3831fdb747faf129c318701d2421fc2 100644 (file)
@@ -23,8 +23,8 @@ import javax.persistence.Id;
 import javax.persistence.ManyToOne;
 import javax.persistence.MappedSuperclass;
 import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -40,8 +40,11 @@ import org.apache.log4j.Logger;
 import org.hibernate.annotations.NaturalId;
 import org.hibernate.annotations.Type;
 import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
 import org.joda.time.DateTime;
 
+import eu.etaxonomy.cdm.hibernate.DateTimeBridge;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.jaxb.DateTimeAdapter;
 import eu.etaxonomy.cdm.jaxb.UUIDAdapter;
@@ -104,6 +107,8 @@ public abstract class CdmBase implements Serializable, ICdmBase{
        @Type(type="dateTimeUserType")
        @Basic(fetch = FetchType.LAZY)
        @Match(MatchMode.IGNORE)
+       @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+       @FieldBridge(impl = DateTimeBridge.class)
        private DateTime created;
        
        @XmlElement (name = "CreatedBy")
index 10263834008213df8204c19f9a22860f83ac60e7..ed4b1c997435bba64ca671d5f6e8b832b597b281 100644 (file)
@@ -17,7 +17,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;\r
 \r
 import org.hibernate.annotations.NaturalId;\r
-import org.springframework.security.GrantedAuthority;\r
+import org.springframework.security.core.GrantedAuthority;\r
 \r
 @XmlAccessorType(XmlAccessType.FIELD)\r
 @XmlType(name = "GrantedAuthority", propOrder = {\r
index 2268b3360f626e09b6c25bd8cef7d26a9bc57bb4..da195201070ee073423ffd01fa6b6fb00c9e1bd6 100644 (file)
@@ -28,7 +28,7 @@ import org.hibernate.annotations.NaturalId;
 import org.hibernate.search.annotations.Field;\r
 import org.hibernate.search.annotations.Index;\r
 import org.hibernate.search.annotations.Indexed;\r
-import org.springframework.security.GrantedAuthority;\r
+import org.springframework.security.core.GrantedAuthority;\r
 \r
 @XmlAccessorType(XmlAccessType.FIELD)\r
 @XmlType(name = "Group", propOrder = {\r
index 6441169c7d73c0b13e394c52bce0e056b7eeb478..7cea90e49bb07938a5aaf8912998df1224367c95 100644 (file)
@@ -99,8 +99,8 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
        @XmlElement(name = "TitleCache", required = true)
        @XmlJavaTypeAdapter(FormattedTextAdapter.class)
        @Column(length=255, name="titleCache")
-       @Fields({@Field(index = org.hibernate.search.annotations.Index.TOKENIZED),
-                @Field(name = "titleCache_forSort", index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+       @Fields({@Field(name = "titleCache_tokenized",index = org.hibernate.search.annotations.Index.TOKENIZED),
+                @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
        })
        @FieldBridge(impl=StripHtmlBridge.class)
        @Match(value=MatchMode.CACHE, cacheReplaceMode=ReplaceMode.ALL)
@@ -112,40 +112,36 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
        @XmlElement(name = "ProtectedTitleCache")
        protected boolean protectedTitleCache;
        
-    @XmlElementWrapper(name = "Rights")
+    @XmlElementWrapper(name = "Rights", nillable = true)
     @XmlElement(name = "Rights")
     @OneToMany(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        //TODO
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       private Set<Rights> rights = new HashSet<Rights>();
+       private Set<Rights> rights;
     
-    @XmlElementWrapper(name = "Credits")
+    @XmlElementWrapper(name = "Credits", nillable = true)
     @XmlElement(name = "Credit")
     @IndexColumn(name="sortIndex", base = 0)
        @OneToMany(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
     //TODO
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       private List<Credit> credits = new ArrayList<Credit>();
+       private List<Credit> credits;
        
-    @XmlElementWrapper(name = "Extensions")
+    @XmlElementWrapper(name = "Extensions", nillable = true)
     @XmlElement(name = "Extension")
     @OneToMany(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       private Set<Extension> extensions = new HashSet<Extension>();
+       private Set<Extension> extensions;
        
-    @XmlElementWrapper(name = "Sources")
+    @XmlElementWrapper(name = "Sources", nillable = true)
     @XmlElement(name = "IdentifiableSource")
     @OneToMany(fetch = FetchType.LAZY)         
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @Merge(MergeMode.ADD_CLONE)
-       @NotNull
-       private Set<IdentifiableSource> sources = new HashSet<IdentifiableSource>();
+       private Set<IdentifiableSource> sources;
     
     @XmlTransient
        @Transient
@@ -252,13 +248,13 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#addRights(eu.etaxonomy.cdm.model.media.Rights)
         */
        public void addRights(Rights right){
-               this.rights.add(right);
+               getRights().add(right);
        }
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#removeRights(eu.etaxonomy.cdm.model.media.Rights)
         */
        public void removeRights(Rights right){
-               this.rights.remove(right);
+               getRights().remove(right);
        }
 
        
@@ -273,14 +269,14 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#getCredits(int)
         */
        public Credit getCredits(int index){
-               return this.credits.get(index);
+               return getCredits().get(index);
        }
        
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#addCredit(eu.etaxonomy.cdm.model.common.Credit)
         */
        public void addCredit(Credit credit){
-               this.credits.add(credit);
+               getCredits().add(credit);
        }
        
 
@@ -288,21 +284,21 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#addCredit(eu.etaxonomy.cdm.model.common.Credit, int)
         */
        public void addCredit(Credit credit, int index){
-               this.credits.add(index, credit);
+               getCredits().add(index, credit);
        }
        
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#removeCredit(eu.etaxonomy.cdm.model.common.Credit)
         */
        public void removeCredit(Credit credit){
-               this.credits.remove(credit);
+               getCredits().remove(credit);
        }
        
        /* (non-Javadoc)
         * @see eu.etaxonomy.cdm.model.common.IIdentifiableEntity#removeCredit(int)
         */
        public void removeCredit(int index){
-               this.credits.remove(index);
+               getCredits().remove(index);
        }
        
        
@@ -326,7 +322,7 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
        public void addExtension(Extension extension){
                if (extension != null){
                        extension.setExtendedObj(this);
-                       this.extensions.add(extension);
+                       getExtensions().add(extension);
                }
        }
        /* (non-Javadoc)
@@ -335,7 +331,7 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
        public void removeExtension(Extension extension){
                if (extension != null){
                        extension.setExtendedObj(null);
-                       this.extensions.remove(extension);
+                       getExtensions().remove(extension);
                }
        }
 
@@ -373,7 +369,7 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
                        if (oldSourcedObj != null && oldSourcedObj != this){
                                oldSourcedObj.getSources().remove(source);
                        }
-                       this.sources.add(source);
+                       getSources().add(source);
                        source.setSourcedObj(this);
                }
        }
@@ -382,7 +378,7 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
         * @see eu.etaxonomy.cdm.model.common.ISourceable#removeSource(eu.etaxonomy.cdm.model.common.IOriginalSource)
         */
        public void removeSource(IdentifiableSource source) {
-               this.sources.remove(source);
+               getSources().remove(source);
        }
        
 //******************************** TO STRING *****************************************************/    
@@ -511,28 +507,28 @@ public abstract class IdentifiableEntity<S extends IIdentifiableEntityCacheStrat
                
                //Extensions
                result.extensions = new HashSet<Extension>();
-               for (Extension extension : this.extensions ){
+               for (Extension extension : getExtensions() ){
                        Extension newExtension = (Extension)extension.clone();
                        result.addExtension(newExtension);
                }
                
                //OriginalSources
                result.sources = new HashSet<IdentifiableSource>();
-               for (IdentifiableSource source : this.sources){
+               for (IdentifiableSource source : getSources()){
                        IdentifiableSource newSource = (IdentifiableSource)source.clone();
                        result.addSource(newSource);
                }
                
                //Rights
                result.rights = new HashSet<Rights>();
-        for(Rights rights : this.rights) {
+        for(Rights rights : getRights()) {
                result.addRights(rights);
         }
 
                
                //Rights
                result.credits = new ArrayList<Credit>();
-        for(Credit credit : this.credits) {
+        for(Credit credit : getCredits()) {
                result.addCredit(credit);
         }
 
index 405d99cd858854d03dc39f33471d1910c35b1402..4bb843bf18c4cb7704e177241a3e4b72e441e046 100644 (file)
@@ -115,6 +115,8 @@ public abstract class LanguageStringBase extends AnnotatableEntity{
        @Override
        public Object clone() throws CloneNotSupportedException{
                LanguageStringBase result = (LanguageStringBase) super.clone();
+               result.setText(this.text);
+               result.setLanguage(this.language);
                return result;
        }
 }
\ No newline at end of file
index 67d4d614cf21ddee606ed9bf63618e483634bdbe..f63580e89fbf5db54c24ee9d4898163d1bdf5eca 100644 (file)
@@ -151,7 +151,8 @@ public class Marker extends VersionableEntity implements Cloneable{
        @Override
        public Object clone() throws CloneNotSupportedException{
                Marker result = (Marker)super.clone();
-               //no changes to: type, flag
+               result.setFlag(this.flag);
+               result.setMarkerType(this.markerType);
                return result;
        }
        
index 215918cf2451b4541a77bbb1b7aa37000dcd4c54..15b105f5f9acde731b9ba6a307481a2d813d611e 100644 (file)
@@ -19,7 +19,6 @@ import javax.persistence.ManyToMany;
 import javax.persistence.OneToOne;\r
 import javax.persistence.Table;\r
 import javax.persistence.Transient;\r
-\r
 import javax.xml.bind.annotation.XmlAccessType;\r
 import javax.xml.bind.annotation.XmlAccessorType;\r
 import javax.xml.bind.annotation.XmlElement;\r
@@ -38,12 +37,14 @@ import org.hibernate.annotations.Fetch;
 import org.hibernate.annotations.NaturalId;\r
 import org.hibernate.envers.Audited;\r
 import org.hibernate.envers.NotAudited;\r
+\r
+\r
 import org.hibernate.search.annotations.Field;\r
 import org.hibernate.search.annotations.Index;\r
 import org.hibernate.search.annotations.Indexed;\r
 import org.hibernate.search.annotations.IndexedEmbedded;\r
-import org.springframework.security.GrantedAuthority;\r
-import org.springframework.security.userdetails.UserDetails;\r
+import org.springframework.security.core.GrantedAuthority;\r
+import org.springframework.security.core.userdetails.UserDetails;\r
 \r
 import eu.etaxonomy.cdm.model.agent.Person;\r
 \r
@@ -141,20 +142,18 @@ public class User extends CdmBase implements UserDetails {
        \r
        @XmlTransient\r
        @Transient\r
-       private GrantedAuthority[] authorities;\r
+       private Set<GrantedAuthority> authorities;\r
        \r
        private void initAuthorities() {\r
-               Set<GrantedAuthority> allAuthorities = new TreeSet<GrantedAuthority>();\r
-               allAuthorities.addAll(grantedAuthorities);\r
+               authorities = new HashSet<GrantedAuthority>();\r
+               authorities.addAll(grantedAuthorities);\r
                for(Group group : groups) {\r
-                       allAuthorities.addAll(group.getGrantedAuthorities());\r
+                       authorities.addAll(group.getGrantedAuthorities());\r
                }\r
-               \r
-               authorities = allAuthorities.toArray(new GrantedAuthority[allAuthorities.size()]);\r
        }\r
        \r
        @Transient\r
-       public GrantedAuthority[] getAuthorities() {\r
+       public Set<GrantedAuthority> getAuthorities() {\r
                if(authorities == null) initAuthorities();\r
                return authorities;\r
        }\r
index b4e880e84ce5b1ca38c13405c0317f56277ec931..42201dbc9cc30d74d61e21985b7c86110c314e62 100644 (file)
@@ -23,8 +23,11 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.apache.log4j.Logger;
 import org.hibernate.annotations.Type;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
 import org.joda.time.DateTime;
 
+import eu.etaxonomy.cdm.hibernate.DateTimeBridge;
 import eu.etaxonomy.cdm.jaxb.DateTimeAdapter;
 import eu.etaxonomy.cdm.strategy.match.Match;
 import eu.etaxonomy.cdm.strategy.match.MatchMode;
@@ -63,6 +66,8 @@ public abstract class VersionableEntity extends CdmBase {
        @Type(type="dateTimeUserType")
        @Basic(fetch = FetchType.LAZY)
        @Match(MatchMode.IGNORE)
+       @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+       @FieldBridge(impl = DateTimeBridge.class)
        private DateTime updated;
        
        @XmlElement(name = "UpdatedBy")
index 452cded2821fba7b2631796889e8c35b1211cf2a..4d03e2f125d880883364ffbc28e8b36354b9ccb4 100644 (file)
@@ -1,6 +1,7 @@
 /* Package Annotations*/\r
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/common/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 @GenericGenerator(\r
                name="system-increment", \r
                strategy = "increment"\r
index 3047709248fecdd021dedda47a276b11dab9e950..168b05a362435796b01f57bb026842541029c47c 100644 (file)
@@ -507,6 +507,13 @@ public abstract class DescriptionElementBase extends AnnotatableEntity implement
                }
        }
        
+       @Override
+       public Object clone() throws CloneNotSupportedException{
+               DescriptionElementBase result = (DescriptionElementBase)super.clone();
+               
+               return result;
+       }
+       
        /**
         * Clones this original source and sets the clones sourced object to 'sourceObj'
         * @see java.lang.Object#clone()
index 4ce69aba82b5caf153b6925efdee24d78fbc9168..1d95049d1b41e50810aa0aef54444aaa5a4d56eb 100644 (file)
@@ -69,8 +69,6 @@ public class FeatureTree extends TermBase {
        //private Set<FeatureNode> nodes = new HashSet<FeatureNode>();
        
        @XmlElement(name = "Root")
-       @XmlIDREF
-       @XmlSchemaType(name="IDREF")
        @OneToOne(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE})
        private FeatureNode root;
index 7a3527cec2b87cff2344660ea8b521205f42b0a2..a1102da17058fdf28c98bcee95b5b550a8ae20c3 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/description/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.description;
\ No newline at end of file
index ceb834d8ce542d5a85a93792e7a854bd924e6045..22ea49c77ed9b73f183b1c555916f639a1a30934 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/location/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.location;
\ No newline at end of file
index d7c5a6839797f8272947215f8a03a308cc4c7799..93983ffc41d7576088102d0c4975c6f97e0fc08a 100644 (file)
@@ -43,7 +43,7 @@ public abstract class IdentifiableMediaEntity<S extends IIdentifiableEntityCache
 
        protected static Logger logger = Logger.getLogger(IdentifiableMediaEntity.class);
 
-    @XmlElementWrapper(name = "Media")
+    @XmlElementWrapper(name = "Media", nillable = true)
     @XmlElement(name = "Medium")
     @XmlIDREF
     @XmlSchemaType(name = "IDREF")
index 58bd3a36457d2e1da59134cb80182c9b687f8c10..02ac03549b92aefc154740e32572c2cc1b5fd111 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/media/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.media;
\ No newline at end of file
index 52719d0afc5f1aa345c98a85827f5b1bb6b720c0..128bcaf185cc8d91128ba66ed798e99024e32fb8 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/molecular/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.molecular;
\ No newline at end of file
index 5db4d926c4c2ba975bb9a0d6d49a24ed62e76488..84222b45b07efa6cc9fb272066c8d4dff506feb6 100644 (file)
@@ -27,6 +27,8 @@ import org.hibernate.envers.Audited;
 
 import eu.etaxonomy.cdm.model.common.RelationshipBase;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
+import eu.etaxonomy.cdm.validation.Level3;
+import eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup;
 
 /**
  * The class representing a relationship between two {@link TaxonNameBase taxon names} according
@@ -53,6 +55,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 })
 @Entity
 @Audited
+@NamesWithHomotypicRelationshipsMustBelongToSameGroup(groups = {Level3.class})
 public class NameRelationship extends RelationshipBase<TaxonNameBase, TaxonNameBase, NameRelationshipType> {
 
   static Logger logger = Logger.getLogger(NameRelationship.class);
index f9754620d07652bea8897c31311841bec63cf8da..39bd8bc084f609fbde35251762bcece293d6465b 100644 (file)
@@ -42,6 +42,7 @@ import org.hibernate.search.annotations.Field;
 import org.hibernate.search.annotations.Fields;
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.IndexedEmbedded;
 import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.beans.factory.annotation.Configurable;
 
@@ -118,8 +119,8 @@ public class NonViralName<T extends NonViralName> extends TaxonNameBase<T, INonV
        private static final Logger logger = Logger.getLogger(NonViralName.class);
        
        @XmlElement(name = "NameCache")
-       @Fields({@Field(index = org.hibernate.search.annotations.Index.TOKENIZED),
-        @Field(name = "nameCache_forSort", index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+       @Fields({@Field(name = "nameCache_tokenized",index = org.hibernate.search.annotations.Index.TOKENIZED),
+        @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
     })
        @Match(value=MatchMode.CACHE, cacheReplaceMode=ReplaceMode.DEFINED, 
                        cacheReplacedProperties={"genusOrUninomial", "infraGenericEpithet", "specificEpithet", "infraSpecificEpithet"} )
@@ -172,6 +173,7 @@ public class NonViralName<T extends NonViralName> extends TaxonNameBase<T, INonV
        @Target(TeamOrPersonBase.class)
        @Cascade(CascadeType.SAVE_UPDATE)
        @CacheUpdate("authorshipCache")
+       @IndexedEmbedded
        private INomenclaturalAuthor combinationAuthorTeam;
        
        @XmlElement(name = "ExCombinationAuthorTeam", type = TeamOrPersonBase.class)
@@ -181,6 +183,7 @@ public class NonViralName<T extends NonViralName> extends TaxonNameBase<T, INonV
        @Target(TeamOrPersonBase.class)
        @Cascade(CascadeType.SAVE_UPDATE)
        @CacheUpdate("authorshipCache")
+       @IndexedEmbedded
        private INomenclaturalAuthor exCombinationAuthorTeam;
        
        @XmlElement(name = "BasionymAuthorTeam", type = TeamOrPersonBase.class)
@@ -190,6 +193,7 @@ public class NonViralName<T extends NonViralName> extends TaxonNameBase<T, INonV
        @Target(TeamOrPersonBase.class)
        @Cascade(CascadeType.SAVE_UPDATE)
        @CacheUpdate("authorshipCache")
+       @IndexedEmbedded
        private INomenclaturalAuthor basionymAuthorTeam;
        
        @XmlElement(name = "ExBasionymAuthorTeam", type = TeamOrPersonBase.class)
@@ -199,14 +203,18 @@ public class NonViralName<T extends NonViralName> extends TaxonNameBase<T, INonV
        @Target(TeamOrPersonBase.class)
        @Cascade(CascadeType.SAVE_UPDATE)
        @CacheUpdate("authorshipCache")
+       @IndexedEmbedded
        private INomenclaturalAuthor exBasionymAuthorTeam;
        
        @XmlElement(name = "AuthorshipCache")
-       @Field(index=Index.TOKENIZED)
+       @Fields({@Field(name = "authorshipCache_tokenized",index = org.hibernate.search.annotations.Index.TOKENIZED),
+            @Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
+    })
        @Match(value=MatchMode.CACHE, cacheReplaceMode=ReplaceMode.DEFINED, 
                        cacheReplacedProperties={"combinationAuthorTeam", "basionymAuthorTeam", "exCombinationAuthorTeam", "exBasionymAuthorTeam"} )
        @NullOrNotEmpty
        @Size(max = 255)
+       @Pattern(regexp = "[A-Za-z0-9 \\u00E4\\u00EB\\u00EF\\u00F6\\u00FC\\-\\&\\,\\(\\)\\.]+", groups=Level2.class, message = "{eu.etaxonomy.cdm.model.name.NonViralName.allowedCharactersForAuthority.message}")
        private String authorshipCache;
        
        @XmlElement(name = "ProtectedAuthorshipCache")
index cd78cbeb7fafe3eb5261501c0bbc872a30919a01..172bc33880954540a389d36c07189a3bc7560154 100644 (file)
@@ -24,6 +24,7 @@ import javax.persistence.ManyToMany;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Transient;
+import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlAccessType;
@@ -43,6 +44,7 @@ import org.hibernate.annotations.Index;
 import org.hibernate.annotations.Table;
 import org.hibernate.envers.Audited;
 import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.IndexedEmbedded;
 import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.util.ReflectionUtils;
 
@@ -185,6 +187,7 @@ public abstract class TaxonNameBase<T extends TaxonNameBase<?,?>, S extends INam
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE_ORPHAN})
        @Merge(MergeMode.RELATION)
        @NotNull
+       @Valid
        private Set<NameRelationship> relationsFromThisName = new HashSet<NameRelationship>();
 
     @XmlElementWrapper(name = "RelationsToThisName")
@@ -195,6 +198,7 @@ public abstract class TaxonNameBase<T extends TaxonNameBase<?,?>, S extends INam
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE , CascadeType.DELETE_ORPHAN })
        @Merge(MergeMode.RELATION)
        @NotNull
+       @Valid
        private Set<NameRelationship> relationsToThisName = new HashSet<NameRelationship>();
 
     @XmlElementWrapper(name = "NomenclaturalStatuses")
@@ -226,6 +230,7 @@ public abstract class TaxonNameBase<T extends TaxonNameBase<?,?>, S extends INam
     @ManyToOne(fetch = FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE})
        @CacheUpdate(noUpdate ="titleCache")
+       @IndexedEmbedded
        private ReferenceBase nomenclaturalReference;
        
 // ************* CONSTRUCTORS *************/   
@@ -1122,7 +1127,7 @@ public void addRelationshipToName(TaxonNameBase toName, NameRelationshipType typ
        /* 
         * @see #getHomotypicalGroup()
         */
-       protected void setHomotypicalGroup(HomotypicalGroup homotypicalGroup) {
+       public void setHomotypicalGroup(HomotypicalGroup homotypicalGroup) {
                if (homotypicalGroup == null){
                        throw new IllegalArgumentException("HomotypicalGroup of name should never be null but was set to 'null'");
                }
index 03858de3fc4cd23692b2c6e1c606ddb62136982f..44301782335aeec1613031cdae9fdcf90c52fb8d 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/name/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.name;
\ No newline at end of file
index 80e6bf14c73c35dc94e47ad5b1767b1f442aa047..fb5ead21d762599a781e95c862c685c0e5dbd484 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/occurrence/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.occurrence;
\ No newline at end of file
index bdb15806d88d125eef1d3cd2a0784ef10961bad0..434e03a91e5a4d0e29b500cba7d7e94e09c00986 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/reference/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.reference;
\ No newline at end of file
index f3668712fc7bd47aca038bc6d3721e92d5ce95ca..c5f5fa232d32d047c44ff1aa5e808dbfc545f5ba 100644 (file)
@@ -33,6 +33,8 @@ import eu.etaxonomy.cdm.model.common.RelationshipBase;
 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 import eu.etaxonomy.cdm.validation.Level2;
+import eu.etaxonomy.cdm.validation.Level3;
+import eu.etaxonomy.cdm.validation.annotation.HomotypicSynonymsShouldBelongToGroup;
 
 /**
  * The class representing the assignation of a {@link Synonym synonym} to an
@@ -64,6 +66,7 @@ import eu.etaxonomy.cdm.validation.Level2;
 @XmlRootElement(name = "SynonymRelationship")
 @Entity
 @Audited
+@HomotypicSynonymsShouldBelongToGroup(groups = Level3.class)
 public class SynonymRelationship extends RelationshipBase<Synonym, Taxon, SynonymRelationshipType> {
        private static final Logger logger = Logger.getLogger(SynonymRelationship.class);
 
index 98495384fb32c3fe6838ea307b760a3c22794145..41f5827004c7f67921f43c51e0adac093126d47c 100644 (file)
@@ -110,6 +110,7 @@ public class Taxon extends TaxonBase<IIdentifiableEntityCacheStrategy<Taxon>> im
     @OneToMany(mappedBy="relatedFrom", fetch=FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @NotNull
+       @Valid
        private Set<TaxonRelationship> relationsFromThisTaxon = new HashSet<TaxonRelationship>();
 
        // all taxa relations with rel.toTaxon==this
@@ -120,6 +121,7 @@ public class Taxon extends TaxonBase<IIdentifiableEntityCacheStrategy<Taxon>> im
     @OneToMany(mappedBy="relatedTo", fetch=FetchType.LAZY)
        @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE, CascadeType.DELETE_ORPHAN})
        @NotNull
+       @Valid
        private Set<TaxonRelationship> relationsToThisTaxon = new HashSet<TaxonRelationship>();
 
        @XmlAttribute(name= "taxonStatusUnknown")
index 538b79e204e4c543b4dcc181b060cfdff2a8b090..ceb36ac907e868acd6b11f1d4be5b0f42155836a 100644 (file)
@@ -42,6 +42,7 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
 import eu.etaxonomy.cdm.validation.Level2;
+import eu.etaxonomy.cdm.validation.Level3;
 import eu.etaxonomy.cdm.validation.annotation.CorrectEpithetsForRank;
 import eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynonym;
 
@@ -74,7 +75,7 @@ import eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynony
 @Entity
 @Audited
 @Table(appliesTo="TaxonBase", indexes = { @Index(name = "taxonBaseTitleCacheIndex", columnNames = { "titleCache" }) })
-@TaxonNameCannotBeAcceptedAndSynonym(groups = Level2.class)
+@TaxonNameCannotBeAcceptedAndSynonym(groups = Level3.class)
 public abstract class TaxonBase<S extends IIdentifiableEntityCacheStrategy> extends IdentifiableEntity<S> {
        private static final long serialVersionUID = -3589185949928938529L;
        private static final Logger logger = Logger.getLogger(TaxonBase.class);
index 7f4dd05edca1c3c144f49ea0a8e45319ea66571e..f34ad1541d473124d79f3fa33b69f8120bbcfdd2 100644 (file)
@@ -28,6 +28,9 @@ import org.hibernate.envers.Audited;
 
 import eu.etaxonomy.cdm.model.common.RelationshipBase;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
+import eu.etaxonomy.cdm.validation.Level3;
+import eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustBeLowerRankThanParent;
+import eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent;
 
 /**
  * The class representing a relationship between two {@link Taxon ("accepted/correct") taxa}. 
@@ -52,6 +55,8 @@ import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 @XmlRootElement(name = "TaxonRelationship")
 @Entity
 @Audited
+@ChildTaxaMustBeLowerRankThanParent(groups = Level3.class)
+@ChildTaxaMustDeriveNameFromParent(groups = Level3.class)
 public class TaxonRelationship extends RelationshipBase<Taxon, Taxon, TaxonRelationshipType> {
 
        static private final Logger logger = Logger.getLogger(TaxonRelationship.class);
index ca825d48480b2e8f3ba26924ee09a389252ebce5..bf966e4faa8b7eeec6df7d1870b64f0813734c51 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.log4j.Logger;
 import org.hibernate.annotations.Cascade;\r
 import org.hibernate.annotations.CascadeType;\r
 import org.hibernate.envers.Audited;\r
+import org.hibernate.search.annotations.Indexed;\r
 import org.hibernate.search.annotations.IndexedEmbedded;\r
 \r
 import eu.etaxonomy.cdm.model.common.IReferencedEntity;\r
@@ -59,6 +60,7 @@ import eu.etaxonomy.cdm.model.reference.ReferenceBase;
 @XmlRootElement(name = "TaxonomicTree")\r
 @Entity\r
 @Audited\r
+@Indexed(index = "eu.etaxonomy.cdm.model.taxon.TaxonomicTree")\r
 public class TaxonomicTree extends IdentifiableEntity implements IReferencedEntity, ITreeNode{\r
        private static final long serialVersionUID = -753804821474209635L;\r
        private static final Logger logger = Logger.getLogger(TaxonomicTree.class);\r
index 11f63e86868c2373f3a33c009c5a08b4c6a878ff..4cdc9586e42486cd2f7c718fb29aa9c710ae2c69 100644 (file)
@@ -1,3 +1,4 @@
 \r
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://etaxonomy.eu/cdm/model/taxon/1.0", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)\r
+@com.sun.xml.bind.XmlAccessorFactory(eu.etaxonomy.cdm.jaxb.CdmAccessorFactoryImpl.class)\r
 package eu.etaxonomy.cdm.model.taxon;
\ No newline at end of file
index 80d3fa32981e4d9c8f20ddbd4a4f9f7cf4cb5296..112aa9a85a06c40037d0a2f8d1ac2d820b6d8dc7 100644 (file)
@@ -344,9 +344,14 @@ public class DefaultMatchStrategy extends StrategyBase implements IMatchStrategy
                boolean result;\r
                List<IMatchable> list1 = (List<IMatchable>)value1;\r
                List<IMatchable> list2 = (List<IMatchable>)value2;\r
-               if (list1.size()!= list2.size()){\r
+               if(list1 == null && list2 == null) {\r
+                       return true;\r
+               }\r
+               \r
+               if ((list1 != null && list2 == null) || (list1 == null && list2 != null) || (list1.size()!= list2.size())){\r
                        return false;\r
                }\r
+               \r
                result = true;\r
                for (int i = 0; i < list1.size(); i++){\r
                        IMatchable listObject1 = list1.get(i);\r
index 001962e0563d2a4346e187bf3a57bf102e5469c6..9a365c05b5102e9073a083fc3933acedac3aa180 100644 (file)
@@ -320,6 +320,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                        if (Set.class.isAssignableFrom(fieldType) || List.class.isAssignableFrom(fieldType)){\r
                                Collection<ICdmBase> secondCollection = (Collection<ICdmBase>)field.get(mergeSecond);\r
                                List<ICdmBase> removeList = new ArrayList<ICdmBase>();\r
+                               if(secondCollection != null) {\r
                                for (ICdmBase obj : secondCollection){\r
                                        Object objectToAdd; \r
                                        if (mergeMode == MergeMode.ADD){\r
@@ -334,6 +335,7 @@ public class DefaultMergeStrategy extends StrategyBase implements IMergeStrategy
                                        addMethod.invoke(mergeFirst, objectToAdd);\r
                                        removeList.add(obj);\r
                                }\r
+                               }\r
                                for (ICdmBase removeObj : removeList ){\r
                                        //removeMethod.invoke(mergeSecond, removeObj);\r
                                        if ((removeObj instanceof CdmBase)&& mergeMode == MergeMode.ADD_CLONE) {\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/BasionymsMustShareEpithetsAndAuthors.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/BasionymsMustShareEpithetsAndAuthors.java
new file mode 100644 (file)
index 0000000..d935e17
--- /dev/null
@@ -0,0 +1,24 @@
+package eu.etaxonomy.cdm.validation.annotation;\r
+\r
+import static java.lang.annotation.ElementType.TYPE;\r
+import static java.lang.annotation.RetentionPolicy.RUNTIME;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
+\r
+import javax.validation.Constraint;\r
+import javax.validation.Payload;\r
+\r
+import eu.etaxonomy.cdm.validation.constraint.BasionymsMustShareEpithetsAndAuthorsValidator;\r
+import eu.etaxonomy.cdm.validation.constraint.NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator;\r
+\r
+@Target( { TYPE })\r
+@Retention(RUNTIME)\r
+@Constraint(validatedBy = BasionymsMustShareEpithetsAndAuthorsValidator.class)\r
+@Documented\r
+public @interface BasionymsMustShareEpithetsAndAuthors {\r
+       String message() default "{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.message}";\r
+       Class<? extends Payload>[] payload() default {};\r
+       Class<?>[] groups() default {};\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustBeLowerRankThanParent.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustBeLowerRankThanParent.java
new file mode 100644 (file)
index 0000000..24735cc
--- /dev/null
@@ -0,0 +1,23 @@
+package eu.etaxonomy.cdm.validation.annotation;\r
+\r
+import static java.lang.annotation.ElementType.TYPE;\r
+import static java.lang.annotation.RetentionPolicy.RUNTIME;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
+\r
+import javax.validation.Constraint;\r
+import javax.validation.Payload;\r
+\r
+import eu.etaxonomy.cdm.validation.constraint.ChildTaxaMustBeLowerRankThanParentValidator;\r
+\r
+@Target( { TYPE })\r
+@Retention(RUNTIME)\r
+@Constraint(validatedBy = ChildTaxaMustBeLowerRankThanParentValidator.class)\r
+@Documented\r
+public @interface ChildTaxaMustBeLowerRankThanParent {\r
+       String message() default "{eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustBeLowerRankThanParent.message}";\r
+       Class<? extends Payload>[] payload() default {};\r
+       Class<?>[] groups() default {};\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustDeriveNameFromParent.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/ChildTaxaMustDeriveNameFromParent.java
new file mode 100644 (file)
index 0000000..11543c6
--- /dev/null
@@ -0,0 +1,23 @@
+package eu.etaxonomy.cdm.validation.annotation;\r
+\r
+import static java.lang.annotation.ElementType.TYPE;\r
+import static java.lang.annotation.RetentionPolicy.RUNTIME;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
+\r
+import javax.validation.Constraint;\r
+import javax.validation.Payload;\r
+\r
+import eu.etaxonomy.cdm.validation.constraint.ChildTaxaMustDeriveNameFromParentValidator;\r
+\r
+@Target( { TYPE })\r
+@Retention(RUNTIME)\r
+@Constraint(validatedBy = ChildTaxaMustDeriveNameFromParentValidator.class)\r
+@Documented\r
+public @interface ChildTaxaMustDeriveNameFromParent {\r
+       String message() default "{eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent.message}";\r
+       Class<? extends Payload>[] payload() default {};\r
+       Class<?>[] groups() default {};\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/HomotypicSynonymsShouldBelongToGroup.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/HomotypicSynonymsShouldBelongToGroup.java
new file mode 100644 (file)
index 0000000..ab61853
--- /dev/null
@@ -0,0 +1,24 @@
+package eu.etaxonomy.cdm.validation.annotation;\r
+\r
+import static java.lang.annotation.ElementType.TYPE;\r
+import static java.lang.annotation.RetentionPolicy.RUNTIME;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
+\r
+import javax.validation.Constraint;\r
+import javax.validation.Payload;\r
+\r
+import eu.etaxonomy.cdm.validation.constraint.ChildTaxaMustBeLowerRankThanParentValidator;\r
+import eu.etaxonomy.cdm.validation.constraint.HomotypicSynonymsShouldBelongToGroupValidator;\r
+\r
+@Target( { TYPE })\r
+@Retention(RUNTIME)\r
+@Constraint(validatedBy = HomotypicSynonymsShouldBelongToGroupValidator.class)\r
+@Documented\r
+public @interface HomotypicSynonymsShouldBelongToGroup {\r
+       String message() default "{eu.etaxonomy.cdm.validation.annotation.HomotypicSynonymsShouldBelongToGroup.message}";\r
+       Class<? extends Payload>[] payload() default {};\r
+       Class<?>[] groups() default {};\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NamesWithHomotypicRelationshipsMustBelongToSameGroup.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/annotation/NamesWithHomotypicRelationshipsMustBelongToSameGroup.java
new file mode 100644 (file)
index 0000000..e00e999
--- /dev/null
@@ -0,0 +1,23 @@
+package eu.etaxonomy.cdm.validation.annotation;\r
+\r
+import static java.lang.annotation.ElementType.TYPE;\r
+import static java.lang.annotation.RetentionPolicy.RUNTIME;\r
+\r
+import java.lang.annotation.Documented;\r
+import java.lang.annotation.Retention;\r
+import java.lang.annotation.Target;\r
+\r
+import javax.validation.Constraint;\r
+import javax.validation.Payload;\r
+\r
+import eu.etaxonomy.cdm.validation.constraint.NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator;\r
+\r
+@Target( { TYPE })\r
+@Retention(RUNTIME)\r
+@Constraint(validatedBy = NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator.class)\r
+@Documented\r
+public @interface NamesWithHomotypicRelationshipsMustBelongToSameGroup {\r
+       String message() default "{eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup.message}";\r
+       Class<? extends Payload>[] payload() default {};\r
+       Class<?>[] groups() default {};\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/BasionymsMustShareEpithetsAndAuthorsValidator.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/BasionymsMustShareEpithetsAndAuthorsValidator.java
new file mode 100644 (file)
index 0000000..cd8a222
--- /dev/null
@@ -0,0 +1,71 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.validation.constraint;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintValidatorContext;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
+import eu.etaxonomy.cdm.model.name.NonViralName;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
+import eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors;\r
+\r
+\r
+public class BasionymsMustShareEpithetsAndAuthorsValidator implements\r
+               ConstraintValidator<BasionymsMustShareEpithetsAndAuthors, NameRelationship> {\r
+\r
+       public void initialize(BasionymsMustShareEpithetsAndAuthors basionymsMustShareEpithetsAndAuthors) { }\r
+\r
+       public boolean isValid(NameRelationship nameRelationship, ConstraintValidatorContext constraintContext) {\r
+               boolean valid = true;\r
+               if(nameRelationship.getType().equals(NameRelationshipType.BASIONYM())) {\r
+                       TaxonNameBase from = CdmBase.deproxy(nameRelationship.getFromName(), TaxonNameBase.class);\r
+                       TaxonNameBase to = CdmBase.deproxy(nameRelationship.getToName(), TaxonNameBase.class);\r
+                       \r
+                       if(from instanceof NonViralName && to instanceof NonViralName) {\r
+                               NonViralName fromName = (NonViralName) from;\r
+                               NonViralName toName = (NonViralName) to;\r
+                               if(fromName.getBasionymAuthorTeam() == null || !fromName.getBasionymAuthorTeam().equals(toName.getBasionymAuthorTeam())) {\r
+                                       valid = false;\r
+                                       constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentAuthors.message}").addSubNode("fromName").addSubNode("basionymAuthorTeam").addError();                           \r
+                                       constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentAuthors.message}").addSubNode("toName").addSubNode("basionymAuthorTeam").addError();\r
+                               }\r
+\r
+                               String fromNameLastEpithet = fromName.getInfraSpecificEpithet() == null ? fromName.getInfraSpecificEpithet() : fromName.getSpecificEpithet();\r
+                               String toNameLastEpithet = toName.getInfraSpecificEpithet() == null ? toName.getInfraSpecificEpithet() : toName.getSpecificEpithet();\r
+                               if(!fromNameLastEpithet.equals(toNameLastEpithet)) {\r
+                                       valid = false;\r
+                                       constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentEpithets.message}").addSubNode("fromName").addSubNode("nameCache").addError();                           \r
+                                       constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentEpithets.message}").addSubNode("toName").addSubNode("nameCache").addError();\r
+                               }\r
+                               \r
+                               if(fromName instanceof ZoologicalName && toName instanceof ZoologicalName) {\r
+                                       if(!fromName.getNomenclaturalReference().equals(toName.getNomenclaturalReference())) {\r
+                                               valid = false;\r
+                                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentNomenclaturalReference.message}").addSubNode("fromName").addSubNode("nomenclaturalReference").addError();                                \r
+                                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentNomenclaturalReference.message}").addSubNode("toName").addSubNode("nomenclaturalReference").addError();\r
+                                       }\r
+                                       \r
+                                       if(!fromName.getNomenclaturalMicroReference().equals(toName.getNomenclaturalMicroReference())) {\r
+                                               valid = false;\r
+                                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentNomenclaturalReference.message}").addSubNode("fromName").addSubNode("nomenclaturalMicroReference").addError();                           \r
+                                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentNomenclaturalReference.message}").addSubNode("toName").addSubNode("nomenclaturalMicroReference").addError();\r
+                                       }\r
+                               }\r
+                       }\r
+                               \r
+               }\r
+               \r
+               return valid;           \r
+       }\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustBeLowerRankThanParentValidator.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustBeLowerRankThanParentValidator.java
new file mode 100644 (file)
index 0000000..8b02e2e
--- /dev/null
@@ -0,0 +1,40 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.validation.constraint;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintValidatorContext;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustBeLowerRankThanParent;\r
+\r
+public class ChildTaxaMustBeLowerRankThanParentValidator implements\r
+               ConstraintValidator<ChildTaxaMustBeLowerRankThanParent, TaxonRelationship> {\r
+\r
+       public void initialize(ChildTaxaMustBeLowerRankThanParent childTaxaMustBeLowerRankThanParent) { }\r
+\r
+       public boolean isValid(TaxonRelationship taxonRelationship, ConstraintValidatorContext constraintContext) {\r
+               boolean valid = true;\r
+               if(taxonRelationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {\r
+                       Taxon parent = taxonRelationship.getToTaxon();\r
+                       Taxon child = taxonRelationship.getFromTaxon();\r
+                       \r
+                       \r
+                       if(parent.getName().getRank().equals(child.getName().getRank()) || parent.getName().getRank().isLower(child.getName().getRank())) {\r
+                               valid = false;\r
+                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustBeLowerRankThanParent.message}").addSubNode("fromTaxon").addSubNode("name").addSubNode("rank").addError();                                \r
+                       }\r
+               }\r
+               \r
+               return valid;           \r
+       }\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustDeriveNameFromParentValidator.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/ChildTaxaMustDeriveNameFromParentValidator.java
new file mode 100644 (file)
index 0000000..fad1415
--- /dev/null
@@ -0,0 +1,55 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.validation.constraint;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintValidatorContext;\r
+\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.name.NonViralName;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent;\r
+\r
+public class ChildTaxaMustDeriveNameFromParentValidator implements\r
+               ConstraintValidator<ChildTaxaMustDeriveNameFromParent, TaxonRelationship> {\r
+\r
+       public void initialize(ChildTaxaMustDeriveNameFromParent childTaxaMustDeriveNameFromParent) { }\r
+\r
+       public boolean isValid(TaxonRelationship taxonRelationship, ConstraintValidatorContext constraintContext) {\r
+               boolean valid = true;\r
+               if(taxonRelationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {\r
+                       Taxon parent = taxonRelationship.getToTaxon();\r
+                       Taxon child = taxonRelationship.getFromTaxon();\r
+                       TaxonNameBase parentName = CdmBase.deproxy(parent.getName(), TaxonNameBase.class);\r
+                       TaxonNameBase childName = CdmBase.deproxy(child.getName(), TaxonNameBase.class);\r
+                       if(parentName instanceof NonViralName && childName instanceof NonViralName) {\r
+                               if(((NonViralName)childName).getRank().isSpecies()) {\r
+                                       System.out.println("Comparing " + ((NonViralName)parentName).getGenusOrUninomial() + " to" + ((NonViralName)childName).getGenusOrUninomial());\r
+                                   if(!((NonViralName)parentName).getGenusOrUninomial().equals(((NonViralName)childName).getGenusOrUninomial())) {\r
+                                       valid = false;\r
+                                       constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent.message}").addSubNode("fromTaxon").addSubNode("name").addSubNode("genusOrUninomial").addError();\r
+                               }\r
+                               if(((NonViralName)parentName).getRank().isSpecies() || ((NonViralName)parentName).getRank().isInfraSpecific()) {\r
+                                       System.out.println("Comparing " + ((NonViralName)parentName).getSpecificEpithet() + " to" + ((NonViralName)childName).getSpecificEpithet());\r
+                                       if(!((NonViralName)parentName).getSpecificEpithet().equals(((NonViralName)childName).getSpecificEpithet())) {\r
+                                               valid = false;\r
+                                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent.message}").addSubNode("fromTaxon").addSubNode("name").addSubNode("specificEpithet").addError();\r
+                                       }       \r
+                               }\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               return valid;           \r
+       }\r
+}\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/HomotypicSynonymsShouldBelongToGroupValidator.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/HomotypicSynonymsShouldBelongToGroupValidator.java
new file mode 100644 (file)
index 0000000..e16b51a
--- /dev/null
@@ -0,0 +1,41 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.validation.constraint;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintValidatorContext;\r
+\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;\r
+import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.validation.annotation.HomotypicSynonymsShouldBelongToGroup;\r
+\r
+public class HomotypicSynonymsShouldBelongToGroupValidator implements\r
+               ConstraintValidator<HomotypicSynonymsShouldBelongToGroup, SynonymRelationship> {\r
+\r
+       public void initialize(HomotypicSynonymsShouldBelongToGroup homotypicSynonymsShouldBelongToGroup) { }\r
+\r
+       public boolean isValid(SynonymRelationship synonymRelationship, ConstraintValidatorContext constraintContext) {\r
+               boolean valid = true;\r
+               if(synonymRelationship.getType().equals(SynonymRelationshipType.HOMOTYPIC_SYNONYM_OF())) {\r
+                       Taxon accepted = synonymRelationship.getAcceptedTaxon();\r
+                       Synonym synonym = synonymRelationship.getSynonym();\r
+                       \r
+                       \r
+                       if(!accepted.getName().getHomotypicalGroup().equals(synonym.getName().getHomotypicalGroup())) {\r
+                               valid = false;\r
+                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.HomotypicSynonymsShouldBelongToGroup.message}").addSubNode("tyoe").addError();                         \r
+                       }\r
+               }\r
+               \r
+               return valid;           \r
+       }\r
+}\r
index 9a57fbdd4befdc7325c46c9faec17cddb5babf68..ef7ec7a35dd580032aa27958e26aa603987d853d 100644 (file)
@@ -14,6 +14,7 @@ import javax.validation.ConstraintValidatorContext;
 \r
 import eu.etaxonomy.cdm.model.name.BotanicalName;\r
 import eu.etaxonomy.cdm.model.name.NonViralName;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
 import eu.etaxonomy.cdm.validation.annotation.MustHaveAuthority;\r
 \r
 public class MustHaveAuthorityValidator implements\r
@@ -25,14 +26,24 @@ public class MustHaveAuthorityValidator implements
                boolean valid = true;\r
                \r
                if(name.getBasionymAuthorTeam() == null && name.getAuthorshipCache() == null) {\r
-               \r
+                   valid = false;\r
                    if(name instanceof BotanicalName && name.getRank().isInfraSpecific()) {\r
                            if(name.getSpecificEpithet() != null && name.getInfraSpecificEpithet() != null && name.getInfraSpecificEpithet().equals(name.getSpecificEpithet())) {\r
                                    valid = true; // is AUTONYM\r
-                           } else {\r
-                                   valid = false;\r
+                           } \r
+                   } \r
+                   if(name.getRank().isSpeciesAggregate()) { // Species aggregates don't have authorities\r
+                       valid = true;\r
                            }\r
+                   \r
                    } else {\r
+                       valid = true;\r
+                       if(name instanceof BotanicalName && name.getRank().isInfraSpecific()) {\r
+                           if(name.getSpecificEpithet() != null && name.getInfraSpecificEpithet() != null && name.getInfraSpecificEpithet().equals(name.getSpecificEpithet())) {\r
+                                   valid = false; // is AUTONYM\r
+                           } \r
+                   } \r
+                   if(name.getRank().isSpeciesAggregate()) { // Species aggregates don't have authorities\r
                            valid = false;\r
                    }\r
                }\r
diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/validation/constraint/NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator.java
new file mode 100644 (file)
index 0000000..dcd9d3b
--- /dev/null
@@ -0,0 +1,43 @@
+/**\r
+* Copyright (C) 2009 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/ \r
+\r
+package eu.etaxonomy.cdm.validation.constraint;\r
+\r
+import javax.validation.ConstraintValidator;\r
+import javax.validation.ConstraintValidatorContext;\r
+\r
+import eu.etaxonomy.cdm.model.name.NameRelationship;\r
+import eu.etaxonomy.cdm.model.name.NameRelationshipType;\r
+import eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup;\r
+\r
+\r
+public class NamesWithHomotypicRelationshipsMustBelongToSameGroupValidator implements\r
+               ConstraintValidator<NamesWithHomotypicRelationshipsMustBelongToSameGroup, NameRelationship> {\r
+\r
+       public void initialize(NamesWithHomotypicRelationshipsMustBelongToSameGroup namesWithHomotypicRelationshipsMustBelongToSameGroup) { }\r
+\r
+       public boolean isValid(NameRelationship nameRelationship, ConstraintValidatorContext constraintContext) {\r
+               boolean valid = true;\r
+               if(nameRelationship.getType().equals(NameRelationshipType.ALTERNATIVE_NAME()) ||\r
+                  nameRelationship.getType().equals(NameRelationshipType.BASIONYM()) ||\r
+                  nameRelationship.getType().equals(NameRelationshipType.CONSERVED_AGAINST()) ||\r
+                  nameRelationship.getType().equals(NameRelationshipType.EMENDATION()) || \r
+                  nameRelationship.getType().equals(NameRelationshipType.MISSPELLING()) ||\r
+                  nameRelationship.getType().equals(NameRelationshipType.ORTHOGRAPHIC_VARIANT()) ||\r
+                  nameRelationship.getType().equals(NameRelationshipType.REPLACED_SYNONYM())) {\r
+                       if(nameRelationship.getFromName().getHomotypicalGroup().equals(nameRelationship.getToName().getHomotypicalGroup())) {\r
+                               valid = false;\r
+                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup.message}").addSubNode("fromName").addSubNode("homotypicalGroup").addError();                              \r
+                               constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup.message}").addSubNode("toName").addSubNode("homotypicalGroup").addError();\r
+                       }\r
+               }\r
+               \r
+               return valid;           \r
+       }\r
+}\r
index 646282c52944a4fe467ea308fcd763fdd20ed79e..3848980457bd47d1386c26a8f5864e0b8e075794 100644 (file)
@@ -40,6 +40,7 @@ public class TaxonNameCannotBeAcceptedAndSynonymValidator implements
                                                        if(t1.getSec().equals(t2.getSec())) { // only compare concepts belonging to the same source\r
                                                                TaxonBase taxonBase1 = TaxonBase.deproxy(t1, TaxonBase.class);\r
                                                                TaxonBase taxonBase2 = TaxonBase.deproxy(t2, TaxonBase.class);\r
+                                                               \r
                                                                if(taxonBase1 instanceof Taxon && taxonBase2 instanceof Taxon) {\r
                                                                        valid = false;\r
                                                                        constraintContext.buildErrorWithMessageTemplate("{eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynonym.twoAcceptedTaxaNotAllowed.message}").addSubNode("name").addError();\r
index a32e065fda2b7dea263ed0ec47cc92ede6652e54..b0b5c02f9caa1f9ebd2e828b6fd4d85bd2e08865 100644 (file)
@@ -5,10 +5,18 @@ eu.etaxonomy.cdm.validation.annotation.CorrectEpithetsForRank.epithetNull=must n
 eu.etaxonomy.cdm.validation.annotation.CorrectEpithetsForRank.message=must have the epithets required for a name of this rank\r
 eu.etaxonomy.cdm.model.name.NonViralName.allowedCharactersForEpithet.message=must only contain lowercase characters a-z, lowercase vowels with a diaeresis, or hyphens\r
 eu.etaxonomy.cdm.model.name.NonViralName.allowedCharactersForUninomial.message=must start with a capital letter and proceeded by lowercase characters a-z, a lowercase vowels with a diaeresis, or hyphens\r
+eu.etaxonomy.cdm.model.name.NonViralName.allowedCharactersForAuthority.message=must contain capital or lowercase roman characters, lowercase vowels with a diaeresis, numbers, ampersands, commas, periods, parenthesis or hyphens\r
 eu.etaxonomy.cdm.validation.annotation.MustHaveAuthority.message=must have an authority (at least a basionym author team / original author or a non-null, non-empty authorship cache)\r
 eu.etaxonomy.cdm.model.reference.ReferenceBase.uri.message=must be a valid Universal Resource Identifier. An example of a valid URI is http://www.e-taxonomy.eu\r
 eu.etaxonomy.cdm.model.reference.ReferenceBase.issn.message=must be a valid ISSN. An example of a valid International Standard Serial Number is ISSN 0378-5955 where the last digit may be X.\r
 eu.etaxonomy.cdm.model.reference.ReferenceBase.isbn.message=must be a valid ISBN. An example of a valid International Standard Book Number is ISBN 0-306-40615-2 where the last digit may be X.\r
 eu.etaxonomy.cdm.model.taxon.Synonym.noOrphanedSynonyms.message=Synonyms must be related to at least one accepted taxon\r
 eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynonym.twoAcceptedTaxaNotAllowed.message=must not be the same as the name of an existing accepted taxon.\r
-eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynonym.synonymAndTaxonNotAllowed.message=must not be the same as the name of an existing synonym / accepted name
\ No newline at end of file
+eu.etaxonomy.cdm.validation.annotation.TaxonNameCannotBeAcceptedAndSynonym.synonymAndTaxonNotAllowed.message=must not be the same as the name of an existing synonym / accepted name\r
+eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustDeriveNameFromParent.message=does not match that of the parent taxon. A child name must derive its name from the parent taxon\r
+eu.etaxonomy.cdm.validation.annotation.ChildTaxaMustBeLowerRankThanParent.message=is the same as, or higher than the parent taxon. A child taxon must be a lower rank than its parent\r
+eu.etaxonomy.cdm.validation.annotation.NamesWithHomotypicRelationshipsMustBelongToSameGroup.message=must belong to the same homotypical group as its related name, given the relationship between the two names.\r
+eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentAuthors.message=must have the same original authorship as original combination / recombined name\r
+eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentEpithets.message=must have the same terminal epithet as original combination / recombined name\r
+eu.etaxonomy.cdm.validation.annotation.BasionymsMustShareEpithetsAndAuthors.differentNomenclaturalReference.message=must have the same nomenclatural reference as original combination / recombined name\r
+eu.etaxonomy.cdm.validation.annotation.HomotypicSynonymsShouldBelongToGroup.message=must belong to the same homotypical group if related with a 'homotypical synonym' relationship
\ No newline at end of file
index 3bae3ab3605a78ed510c9f54daaae988a198a0cb..8eb9211b1ee680ca8d872d12e64b36cb5826f190 100644 (file)
     <dependency>\r
        <groupId>org.springframework.security</groupId>\r
        <artifactId>spring-security-core</artifactId>\r
-    </dependency>\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
-       \r
-       \r
+    </dependency>      \r
        <!-- ******* DATABASES DRIVER ******* -->\r
        <dependency>\r
                <groupId>mysql</groupId>\r
index 32e20370ef264e2fe655799b0919bef8c9f758c3..56a12efa04d434fa3c6cb51adc18c2bd352c5cca 100644 (file)
@@ -14,7 +14,9 @@ import java.util.List;
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
 import eu.etaxonomy.cdm.model.common.Annotation;
 import eu.etaxonomy.cdm.model.common.MarkerType;
+import eu.etaxonomy.cdm.model.common.Marker;
 import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;
+import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.OrderHint;
 
 /**
@@ -45,4 +47,48 @@ public interface IAnnotatableDao<T extends AnnotatableEntity> extends IVersionab
         * @return a count of Annotation instances
         */
        public int countAnnotations(T annotatableEntity, MarkerType status);
+       
+       /**
+        * Returns a count of Markers belonging to the supplied AnnotatableEntity 
+        * 
+        * @param annotatableEntity the entity which is marked
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)
+        * @return a count of Marker instances
+        */
+       public int countMarkers(T annotatableEntity, Boolean technical);
+       
+       /**
+        * 
+        * @param annotatableEntity the entity which is marked
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)
+        * @param pageSize The maximum number of markers returned (can be null for all markers)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @param orderHints may be null
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}
+        * @return a List of Marker instances
+        */
+       public List<Marker> getMarkers(T annotatableEntity, Boolean technical, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
+       /**
+        * Returns a list of arrays representing counts of entities of type clazz, grouped by their markerTypes. The arrays have two elements. 
+        * The first element is the MarkerType, initialized using the propertyPaths parameter. The second element is the count of all markers of Objects
+        * of type clazz with that MarkerType. The boolean technical can be used to choose only technical or only non-technical marker types. The list is sorted by
+        * titleCache of the markerType, in ascending order.
+        * 
+        * @param clazz optionally restrict the markers to those belonging to this class
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)
+        * @param pageSize The maximum number of arrays returned (can be null for all arrays)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}
+        * @return
+        */
+       public List<Object[]> groupMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths);
+       
+       /**
+        * returns a count of all markers belonging to that clazz, optionally filtered to include only technical or only non-technical markers.
+        * 
+        * @param clazz optionally restrict the markers to those belonging to this class
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)
+        * @return a count of markers
+        */
+       public int countMarkers(Class<? extends T> clazz, Boolean technical);
 }
index a6b8f091eab73835585026bb01c3cf4ad4506972..66653d894baf046e7d524505f6eaebf106604427 100644 (file)
@@ -9,8 +9,32 @@
 \r
 package eu.etaxonomy.cdm.persistence.dao.common;\r
 \r
+import java.util.List;\r
+\r
 import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
-public interface IMarkerDao extends ICdmEntityDao<Marker> {\r
+public interface IMarkerDao extends IVersionableDao<Marker> {\r
+       \r
+       /**\r
+        * Returns a count of markers which have the same type\r
+        * @param markerType The type of markerType\r
+        * @return a count of markers\r
+        */\r
+       public int count(MarkerType markerType);\r
+       \r
+       /**\r
+        * Returns a list of markers which have the same type\r
+        * \r
+        * @param markerType The type of markerType\r
+        * @param pageSize The maximum number of markers returned (can be null for all markers)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints may be null\r
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}\r
+        * @return\r
+        */\r
+       public List<Marker> list(MarkerType markerType, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
 \r
 }\r
index 393dbf8e5cbd2b347f00f2a9a0edc52ad5ea52f7..bcecdeb4801ada4aee6c61b7e7fcb6708a20730c 100644 (file)
@@ -16,8 +16,10 @@ import org.hibernate.Query;
 
 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
 import eu.etaxonomy.cdm.model.common.Annotation;
+import eu.etaxonomy.cdm.model.common.Marker;
 import eu.etaxonomy.cdm.model.common.MarkerType;
 import eu.etaxonomy.cdm.persistence.dao.common.IAnnotatableDao;
+import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.OrderHint;
 import eu.etaxonomy.cdm.persistence.query.OrderHint.SortOrder;
 
@@ -95,4 +97,116 @@ public abstract class AnnotatableDaoImpl<T extends AnnotatableEntity> extends Ve
                return results;
        }
        
+       public int countMarkers(T annotatableEntity, Boolean technical) {
+               checkNotInPriorView("AnnotatableDaoImpl.countMarkers(T annotatableEntity, Boolean technical");
+        Query query = null;
+               
+               if(technical == null) {
+                       query = getSession().createQuery("select count(marker) from Marker marker where marker.markedObj.id = :id and marker.markedObj.class = :class");
+               } else {
+                       query = getSession().createQuery("select count(marker) from Marker marker join marker.markerType type where marker.markedObj.id = :id and marker.markedObj.class = :class and type.isTechnical = :technical");
+                       query.setParameter("technical",technical);
+               }
+               
+               query.setParameter("id",annotatableEntity.getId());
+               query.setParameter("class", annotatableEntity.getClass().getName());
+               
+               return ((Long)query.uniqueResult()).intValue();
+       }
+       
+    public List<Marker> getMarkers(T annotatableEntity, Boolean technical, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
+       checkNotInPriorView("AnnotatableDaoImpl.getMarkers(T annotatableEntity, Boolean technical, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths)");
+        Query query = null;
+        
+        StringBuffer orderString = new StringBuffer();
+        
+        if(orderHints != null && !orderHints.isEmpty()) {
+                   orderString.append(" order by");
+                   for(OrderHint orderHint : orderHints) {
+                       orderString.append(" marker." + orderHint.getPropertyName() + " ");
+                       
+                       if(orderHint.getSortOrder() == SortOrder.ASCENDING) {
+                               orderString.append("asc");
+                       } else {
+                               orderString.append("desc");
+                       }
+                   }
+               }
+        
+               
+               if(technical == null) {
+                       query = getSession().createQuery("select marker from Marker marker where marker.markedObj.id = :id and marker.markedObj.class = :class" + orderString.toString());
+               } else {
+                       query = getSession().createQuery("select marker from Marker marker join marker.markerType type where marker.markedObj.id = :id and marker.markedObj.class = :class and type.isTechnical = :technical" + orderString.toString());
+                       query.setParameter("technical",technical);
+               }
+               
+               query.setParameter("id",annotatableEntity.getId());
+               query.setParameter("class", annotatableEntity.getClass().getName());
+               
+               if(pageSize != null) {
+                       query.setMaxResults(pageSize);
+                   if(pageNumber != null) {
+                       query.setFirstResult(pageNumber * pageSize);
+                   }
+               }
+               
+               List<Marker> results = (List<Marker>)query.list();
+               defaultBeanInitializer.initializeAll(results, propertyPaths);
+               return results;
+    }
+       
+    public int countMarkers(Class<? extends T> clazz, Boolean technical) {
+               checkNotInPriorView("AnnotatableDaoImpl.countMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");
+               Query query = null;
+               if(technical == null) {
+                       query = getSession().createQuery("select count(marker) from Marker marker join marker.markerType type where marker.markedObj.class = :class");
+               } else {
+                       query = getSession().createQuery("select count(marker) from Marker marker join marker.markerType type where marker.markedObj.class = :class and type.technical = :technical");
+                       query.setParameter("technical",technical);
+               }
+               
+               if(clazz == null) {
+                 query.setParameter("class", type.getName());
+               } else {
+             query.setParameter("class", clazz.getName());
+               }
+               
+               return ((Long)query.uniqueResult()).intValue();
+       }
+       
+       public List<Object[]> groupMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
+               checkNotInPriorView("AnnotatableDaoImpl.groupMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths)");
+               Query query = null;
+               if(technical == null) {
+                       query = getSession().createQuery("select type, count(marker) from Marker marker join marker.markerType type where marker.markedObj.class = :class group by type order by type.titleCache asc");
+               } else {
+                       query = getSession().createQuery("select type, count(marker) from Marker marker join marker.markerType type where marker.markedObj.class = :class and type.technical = :technical group by type order by type.titleCache asc");
+                       query.setParameter("technical",technical);
+               }
+               
+               if(clazz == null) {
+                         query.setParameter("class", type.getName());
+               } else {
+                     query.setParameter("class", clazz.getName());
+               }
+               
+               if(pageSize != null) {
+                       query.setMaxResults(pageSize);
+                   if(pageNumber != null) {
+                       query.setFirstResult(pageNumber * pageSize);
+                   }
+               }
+               
+               List<Object[]> result = (List<Object[]>)query.list();
+               
+               if(propertyPaths != null && !propertyPaths.isEmpty()) {
+                 for(Object[] objects : result) {
+                       defaultBeanInitializer.initialize(objects[0], propertyPaths);
+                 }
+               }
+               
+               return result;
+       }
+       
 }
index 651400304bf2c47e2c588267cabb67133ac9f517..53363ffebcc9b08319fb0b9f1e79875e70cdc650 100644 (file)
@@ -44,10 +44,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;\r
 import org.springframework.dao.DataAccessException;\r
 import org.springframework.dao.InvalidDataAccessApiUsageException;\r
-import org.springframework.dao.NonTransientDataAccessException;\r
-import org.springframework.dao.UncategorizedDataAccessException;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
 import org.springframework.stereotype.Repository;\r
 import org.springframework.util.ReflectionUtils;\r
 \r
@@ -77,6 +75,9 @@ public abstract class CdmEntityDaoBase<T extends CdmBase> extends DaoBase implem
        @Qualifier("defaultBeanInitializer")\r
        protected BeanInitializer defaultBeanInitializer;\r
        \r
+       public void setDefaultBeanInitializer(BeanInitializer defaultBeanInitializer) {\r
+               this.defaultBeanInitializer = defaultBeanInitializer;\r
+       }\r
 \r
        @Autowired\r
        private ReferringObjectMetadataFactory referringObjectMetadataFactory;\r
@@ -442,13 +443,17 @@ public abstract class CdmEntityDaoBase<T extends CdmBase> extends DaoBase implem
                        OrderHint orderHint = orderHints.get(i);\r
                        switch(orderHint.getSortOrder()) {\r
                        case ASCENDING:\r
-                           sortFields[i] = new SortField(orderHint.getPropertyName() + "_forSort", true);\r
+                           sortFields[i] = new SortField(orderHint.getPropertyName(), true);\r
+                           break;\r
                        case DESCENDING:\r
-                               sortFields[i] = new SortField(orderHint.getPropertyName() + "_forSort",false);\r
+                       default:\r
+                               sortFields[i] = new SortField(orderHint.getPropertyName(),false);\r
+                               \r
                        }\r
                    }\r
                    sort.setSort(sortFields);\r
                    fullTextQuery.setSort(sort);\r
+                   \r
                }\r
        }\r
        \r
index 6d34facac912889059782d082baf870aab96bcb0..a0bdae15f5ec90f3d8683febf002a09d3e6f9ea1 100644 (file)
@@ -27,6 +27,10 @@ public abstract class DaoBase {
        @Autowired
        private SessionFactory factory;
        
+       public void setSessionFactory(SessionFactory sessionFactory) {
+               this.factory = sessionFactory;
+       }
+       
        protected Session getSession(){
                Session session = factory.getCurrentSession();
                return session;
index 2bed58f5b16391a3098fd66c320ca999e3efce3b..d1eea2f7c686a6ce3a48e7328fd166ab15dd8e00 100644 (file)
@@ -46,7 +46,7 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint;
 public class IdentifiableDaoBase<T extends IdentifiableEntity> extends AnnotatableDaoImpl<T> implements IIdentifiableDao<T>{
        @SuppressWarnings("unused")
        private static final Logger logger = Logger.getLogger(IdentifiableDaoBase.class);
-       protected String defaultField = "titleCache";
+       protected String defaultField = "titleCache_tokenized";
        protected Class<? extends T> indexedClasses[]; 
 
        public IdentifiableDaoBase(Class<T> type) {
index bd32abeba08495b740f20d404410b8bf50dfb5d2..95e168466a8a42e2be0cd50f68c0a89aa92a85d4 100644 (file)
@@ -9,16 +9,47 @@
 \r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.common;\r
 \r
+import java.util.List;\r
+\r
+import org.hibernate.Criteria;\r
+import org.hibernate.criterion.Projections;\r
+import org.hibernate.criterion.Restrictions;\r
 import org.springframework.stereotype.Repository;\r
 \r
 import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IMarkerDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 @Repository\r
-public class MarkerDaoImpl extends CdmEntityDaoBase<Marker> implements IMarkerDao {\r
+public class MarkerDaoImpl extends VersionableDaoBase<Marker> implements IMarkerDao {\r
 \r
        public MarkerDaoImpl() {\r
                super(Marker.class);\r
        }\r
 \r
+       public int count(MarkerType markerType) {\r
+               Criteria criteria = getSession().createCriteria(Marker.class);\r
+               criteria.add(Restrictions.eq("markerType", markerType));\r
+               criteria.setProjection(Projections.rowCount());\r
+               return (Integer) criteria.uniqueResult();\r
+       }\r
+\r
+       public List<Marker> list(MarkerType markerType, Integer pageSize,       Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+               Criteria criteria = getSession().createCriteria(Marker.class);\r
+               criteria.add(Restrictions.eq("markerType", markerType));\r
+               \r
+               if(pageSize != null) {\r
+                       criteria.setMaxResults(pageSize);\r
+                   if(pageNumber != null) {\r
+                       criteria.setFirstResult(pageNumber * pageSize);\r
+                   }\r
+               }\r
+               \r
+               addOrder(criteria, orderHints);\r
+               List<Marker> results = (List<Marker>)criteria.list();           \r
+               defaultBeanInitializer.initializeAll(results, propertyPaths);\r
+               return results;\r
+       }\r
+\r
 }\r
index 4937994430bd2ccb2c6a64885776606117bb748a..f890707acc318cb2c5a193075113de228234448a 100644 (file)
@@ -29,8 +29,6 @@ import eu.etaxonomy.cdm.persistence.dao.occurrence.ICollectionDao;
 public class CollectionDaoHibernateImpl extends IdentifiableDaoBase<Collection> implements\r
                ICollectionDao {\r
        \r
-       private static final String defaultField = "titleCache";\r
-               \r
        public CollectionDaoHibernateImpl() {\r
                super(Collection.class);\r
                indexedClasses = new Class[1];\r
index 04a26bb76bb7e58f4edc95e006808fb4d0dc49cd..db2d74c06bd69522ffb74ad306ca6d475dcfc23d 100644 (file)
@@ -29,7 +29,7 @@ public class TaxonAlternativeSpellingSuggestionParser extends AlternativeSpellin
                indexedClasses[0] = Taxon.class;\r
                indexedClasses[1] = Synonym.class;\r
                super.setIndexedClasses(indexedClasses);\r
-               super.setDefaultField("name.titleCache");\r
+               super.setDefaultField("name.titleCache_tokenized");\r
        }\r
 \r
        @Override\r
index b4eaed2845b2474447dd5d873a084541155c9b90..b1da4fcc015b053084ddde128956d365653a15fc 100644 (file)
@@ -79,7 +79,7 @@ public class TaxonDaoHibernateImpl extends IdentifiableDaoBase<TaxonBase> implem
                indexedClasses = new Class[2];\r
                indexedClasses[0] = Taxon.class;\r
                indexedClasses[1] = Synonym.class;\r
-               super.defaultField = "name.titleCache";\r
+               super.defaultField = "name.titleCache_tokenized";\r
        }\r
        \r
        @Autowired(required = false)   //TODO switched of because it caused problems when starting CdmApplicationController\r
index 19aa7609c2e66bc1686e63e5f1976ce2741589e8..03e09f73d87d7f6a07a6ead34c370c5bd0ffe13f 100644 (file)
@@ -14,8 +14,8 @@ import org.hibernate.HibernateException;
 import org.hibernate.event.SaveOrUpdateEvent;\r
 import org.hibernate.event.SaveOrUpdateEventListener;\r
 import org.joda.time.DateTime;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
 \r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
index a1f954bf7ec850de7b05ee18f5437c3acac3a7f9..ff91387bc590b845894a1d77ad828ca007f93d93 100644 (file)
@@ -27,7 +27,7 @@ import eu.etaxonomy.cdm.model.common.RelationshipBase;
 public class CdmDeleteListener implements DeleteEventListener {\r
        private static final long serialVersionUID = -5511287200489449838L;\r
        @SuppressWarnings("unused")\r
-       private static final Logger logger = Logger.getLogger(CdmDeleteListener.class);\r
+       protected static final Logger logger = Logger.getLogger(CdmDeleteListener.class);\r
 \r
        /* (non-Javadoc)\r
         * @see org.hibernate.event.DeleteEventListener#onDelete(org.hibernate.event.DeleteEvent)\r
@@ -35,6 +35,7 @@ public class CdmDeleteListener implements DeleteEventListener {
        public void onDelete(DeleteEvent event) throws HibernateException {\r
                Object entity = event.getObject();\r
                if(entity != null && RelationshipBase.class.isAssignableFrom(entity.getClass())) {\r
+                       logger.info("Deleting " + entity);\r
                        deleteRelationship(event, entity);\r
                }\r
        }\r
@@ -46,6 +47,7 @@ public class CdmDeleteListener implements DeleteEventListener {
                        throws HibernateException {\r
                Object entity = event.getObject();\r
                if(entity != null && RelationshipBase.class.isAssignableFrom(entity.getClass())) {\r
+                       logger.info("Deleting " + entity);\r
                        deleteRelationship(event, entity);\r
                }\r
        }\r
@@ -60,6 +62,7 @@ public class CdmDeleteListener implements DeleteEventListener {
                        Set<IRelated> deletedObjects = relationshipEntity.getDeletedObjects();\r
                        for (IRelated rel : deletedObjects){\r
                                if (rel != null){\r
+                                       logger.info("Updating related entity " + rel);\r
                                        event.getSession().update(rel);\r
                                }\r
                        }\r
index 3cd86e24ff44d48b2ba1a00be01a6a8ceecf155c..5fc8fa563b35ab2a25ada49c0c70fa2be8ed0cbe 100644 (file)
@@ -14,8 +14,8 @@ import org.hibernate.HibernateException;
 import org.hibernate.event.SaveOrUpdateEvent;\r
 import org.hibernate.event.SaveOrUpdateEventListener;\r
 import org.joda.time.DateTime;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
 \r
 import eu.etaxonomy.cdm.model.common.ICdmBase;\r
 import eu.etaxonomy.cdm.model.common.User;\r
index 2c94bcf09bfbced5e2ae1331a712a80e42588c65..0aecd357d47221006b5a8e9a94a202ff6807c736 100644 (file)
@@ -4,8 +4,8 @@ import org.hibernate.HibernateException;
 import org.hibernate.event.SaveOrUpdateEvent;\r
 import org.hibernate.event.SaveOrUpdateEventListener;\r
 import org.joda.time.DateTime;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
 \r
 import eu.etaxonomy.cdm.model.common.User;\r
 import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
index 883e0a6dfb1c4c510380d93b65042d2de6317040..a181c7397ff0243770b99144c39a397d0083bea4 100644 (file)
@@ -14,8 +14,8 @@ import org.hibernate.HibernateException;
 import org.hibernate.event.SaveOrUpdateEvent;\r
 import org.hibernate.event.SaveOrUpdateEventListener;\r
 import org.joda.time.DateTime;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.context.SecurityContextHolder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
 \r
 import eu.etaxonomy.cdm.model.common.User;\r
 import eu.etaxonomy.cdm.model.common.VersionableEntity;\r
index 1b2d1aade8b52d281e26eac0f0568ffdb3812a47..1bb3aa50c05da4981b1e3d8ac19a8a22da78e26a 100644 (file)
@@ -18,6 +18,8 @@ import org.hibernate.envers.query.AuditEntity;
 import org.hibernate.envers.query.AuditQuery;\r
 import org.hibernate.search.FullTextQuery;\r
 \r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.ICdmBase;\r
 import eu.etaxonomy.cdm.persistence.dao.common.OperationNotSupportedInPriorViewException;\r
 \r
 public class OrderHint {\r
@@ -117,5 +119,30 @@ public class OrderHint {
                }\r
        }\r
 \r
-\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               if (obj == this){\r
+                       return true;\r
+               }\r
+               if (obj == null){\r
+                       return false;\r
+               }\r
+               if (!OrderHint.class.isAssignableFrom(obj.getClass())){\r
+                       return false;\r
+               }\r
+               OrderHint orderHint= (OrderHint)obj;\r
+               boolean propertyNameEqual = orderHint.getPropertyName().equals(this.getPropertyName());\r
+               boolean sortOrderEqual = orderHint.getSortOrder().equals(this.getSortOrder());\r
+               if (! propertyNameEqual || !sortOrderEqual){\r
+                               return false;\r
+               }\r
+               return true;\r
+       }\r
+       \r
+       @Override\r
+       public int hashCode() {\r
+                  int hashCode = 7;\r
+                  hashCode = 29 * hashCode + this.getPropertyName().hashCode() * this.getSortOrder().hashCode();\r
+                  return hashCode;\r
+       }\r
 }\r
index 120f0a0b704f00c213b3a3631e04653848b5bae6..0f291877a3237eb76d1723ae15282d38f11687a2 100644 (file)
@@ -20,11 +20,11 @@ import java.util.UUID;
 \r
 import org.junit.Before;\r
 import org.junit.Test;\r
-import org.springframework.security.Authentication;\r
-import org.springframework.security.AuthenticationManager;\r
-import org.springframework.security.context.SecurityContextHolder;\r
-import org.springframework.security.context.SecurityContextImpl;\r
-import org.springframework.security.providers.TestingAuthenticationToken;\r
+import org.springframework.security.authentication.AuthenticationManager;\r
+import org.springframework.security.authentication.TestingAuthenticationToken;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
+import org.springframework.security.core.context.SecurityContextImpl;\r
 import org.unitils.dbunit.annotation.DataSet;\r
 import org.unitils.dbunit.annotation.ExpectedDataSet;\r
 import org.unitils.spring.annotation.SpringBeanByType;\r
index 7545a93fbd7799e90c56c0a4450ad7394f7adefd..52eff77466c1eb496101a980cec993c9338241d8 100644 (file)
@@ -9,14 +9,13 @@
 \r
 package eu.etaxonomy.cdm.persistence.dao.hibernate.common;\r
 \r
-import static org.junit.Assert.assertNotNull;\r
 import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
 \r
 import java.lang.reflect.Array;\r
 \r
 import org.junit.Test;\r
 import org.unitils.dbunit.annotation.DataSet;\r
-import org.unitils.spring.annotation.SpringApplicationContext;\r
 import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
 import eu.etaxonomy.cdm.model.common.User;\r
@@ -34,7 +33,7 @@ public class UserDaoHibernateImplTest extends CdmIntegrationTest {
                User user = userDao.findUserByUsername("test");\r
                \r
                assertNotNull("findUserByUsername should return a user", user);\r
-               assertEquals("the user should have had their authorities loaded",2,Array.getLength(user.getAuthorities()));\r
+               assertEquals("the user should have had their authorities loaded",2,user.getAuthorities().size());\r
        }\r
 \r
 }\r
index af081b7f1f6add4f708eb42a686f4200e2aa01e3..ee3f59930810b862b9397967c51734d46b62351f 100644 (file)
@@ -12,6 +12,7 @@ package eu.etaxonomy.cdm.persistence.hibernate;
 \r
 import static org.junit.Assert.assertNotNull;\r
 \r
+import java.io.FileOutputStream;\r
 import java.util.Set;\r
 import java.util.UUID;\r
 \r
@@ -23,6 +24,8 @@ import org.junit.Test;
 import org.unitils.dbunit.annotation.DataSet;\r
 import org.unitils.dbunit.annotation.ExpectedDataSet;\r
 import org.unitils.spring.annotation.SpringBeanByType;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
+import org.hibernate.LockMode;\r
 \r
 import eu.etaxonomy.cdm.model.name.HybridRelationship;\r
 import eu.etaxonomy.cdm.model.name.NameRelationship;\r
@@ -50,7 +53,7 @@ public class CdmDeleteListenerTest extends CdmTransactionalIntegrationTest {
         */\r
        @Before\r
        public void setUp() throws Exception {\r
-               uuid = UUID.fromString("a49a3963-c4ea-4047-8588-2f8f15352730");\r
+               uuid = UUID.fromString("44415fc0-1703-11df-8a39-0800200c9a66");\r
        }\r
        \r
        /**\r
@@ -59,8 +62,12 @@ public class CdmDeleteListenerTest extends CdmTransactionalIntegrationTest {
        @Test\r
        @DataSet("CdmDeleteListenerTest.xml")\r
        @ExpectedDataSet\r
-       public void testOnDelete() {\r
+       public void testOnDelete() throws Exception {\r
                NonViralName name = (NonViralName)taxonNameDao.findByUuid(uuid);\r
+               /**\r
+                * Ended up with some horrible hibernate errors otherwise\r
+                */\r
+               taxonNameDao.refresh(name, LockMode.READ, null);\r
                assertNotNull(name);\r
                Set<NameRelationship> relations = name.getNameRelations();\r
                Assert.assertEquals("There must be 1 name relationship", 1, relations.size());\r
index dd96dfba099df4e22dcd54c6a3348fa8e116d7f8..9a352175682f8e648b3688176ded853af40d3117 100644 (file)
       <context:exclude-filter type="regex" expression="eu\.etaxonomy\.cdm\.database\.PersistentTermInitializer"/>\r
     </context:component-scan>\r
     \r
-    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">\r
+    <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">\r
         <property name="providers">\r
             <list>\r
-                <bean class="org.springframework.security.providers.TestingAuthenticationProvider"/>\r
+                <bean class="org.springframework.security.authentication.TestingAuthenticationProvider"/>\r
             </list>\r
         </property>\r
     </bean>\r
index 623dec3c6b8504f05a21a7b86898e038a3309aa8..6e87e1dedaef3cd66ea11934ba13f105eb3168d5 100644 (file)
@@ -90,6 +90,7 @@
   <TAXONNAMEBASE DTYPE="BotanicalName" ID="39" CREATED="2008-12-10 09:56:07.0" UUID="497a9955-5c5a-4f2b-b08c-2135d336d633" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Cryptocoryne griffithii Schott" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="Schott" NAMECACHE="Cryptocoryne griffithii " PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="38" RANK_ID="765" GENUSORUNINOMIAL="Cryptocoryne" SPECIFICEPITHET="griffithii" NOMENCLATURALREFERENCE_ID="1"/>\r
   <TAXONNAMEBASE DTYPE="BotanicalName" ID="40" CREATED="2008-12-10 09:56:07.0" UUID="e1b7f640-c1ef-4701-b9ee-4bc28a8e33d7" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Cryptocoryne cordata var. zonata (de Wit) N.Jacobsen" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(de Wit) N.Jacobsen" NAMECACHE="Cryptocoryne cordata var. zonata" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="39" RANK_ID="761" GENUSORUNINOMIAL="Cryptocoryne" SPECIFICEPITHET="cordata" INFRASPECIFICEPITHET="zonata" NOMENCLATURALREFERENCE_ID="1"/>\r
   <TAXONNAMEBASE_TYPEDESIGNATIONBASE TAXONNAMEBASE_ID="36" TYPEDESIGNATIONS_ID="1"/>\r
+  <TAXONRELATIONSHIP/>\r
   <TYPEDESIGNATIONBASE DTYPE="SpecimenTypeDesignation" ID="1" CREATED="2008-12-10 09:56:07.0" UUID="e1b7f640-c1ef-4701-b9ee-4bc28a8e33d7" UPDATED="2008-12-10 09:56:07.238" HOMOTYPICALGROUP_ID="35" NOTDESIGNATED="false" TYPESPECIMEN_ID="1" TYPESTATUS_ID="821"/>\r
   <TYPEDESIGNATIONBASE_TAXONNAMEBASE TYPEDESIGNATIONBASE_ID="1" TYPIFIEDNAMES_ID="36"/>\r
   </dataset>
\ No newline at end of file
index 10fdfe5c51cba87c9dec363e322ab82899130b98..5b2bbb31ddca5c2056ee6ea8e2eac82175f30936 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version='1.0' encoding='UTF-8'?>\r
 <dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../dao/hibernate/dataset.xsd">\r
-  <HOMOTYPICALGROUP ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="7b214eb9-a6ac-48e5-af02-bbea634d2a03" />\r
-  <HOMOTYPICALGROUP ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="6c241a4c-e5a0-4344-8e5e-a81f17b75973" />  \r
-  <HOMOTYPICALGROUP_AUD ID="1001" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="7b214eb9-a6ac-48e5-af02-bbea634d2a03" />\r
-  <HOMOTYPICALGROUP_AUD ID="1002" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="6c241a4c-e5a0-4344-8e5e-a81f17b75973" />  \r
-  <REFERENCE DTYPE="Book" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
-  <REFERENCE_AUD REV="1000" REVTYPE="0" DTYPE="Book" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
-  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="a49a3963-c4ea-4047-8588-2f8f15352730" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="05a438d6-065f-49ef-84db-c7dc2c259975" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="a49a3963-c4ea-4047-8588-2f8f15352730"  TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="05a438d6-065f-49ef-84db-c7dc2c259975" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="1001"/>\r
+  <HOMOTYPICALGROUP ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="a7e20bd1-2d76-43b0-899b-6ee8056720bf" />\r
+  <HOMOTYPICALGROUP ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="c69b1c20-d321-4550-a755-bfcd2db9c9c5" />  \r
+  <HOMOTYPICALGROUP_AUD ID="2001" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="a7e20bd1-2d76-43b0-899b-6ee8056720bf" />\r
+  <HOMOTYPICALGROUP_AUD ID="2002" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="c69b1c20-d321-4550-a755-bfcd2db9c9c5" />  \r
+  <REFERENCE DTYPE="Book" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="c243ec4c-6cb7-4e81-a251-a478ef58c945" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
+  <REFERENCE_AUD REV="1000" REVTYPE="0" DTYPE="Book" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="c243ec4c-6cb7-4e81-a251-a478ef58c945" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="44415fc0-1703-11df-8a39-0800200c9a66" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="523498fc-5fa8-4ac6-9347-303770ac46a1" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="44415fc0-1703-11df-8a39-0800200c9a66"  TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="523498fc-5fa8-4ac6-9347-303770ac46a1" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="2001"/>\r
  </dataset>
\ No newline at end of file
index 2770b646758562bca2f2e97a4075a38aa8bdf16e..13b7d75d4262335e481d1de2ee13c18bb677bec3 100644 (file)
@@ -1,21 +1,17 @@
 <?xml version='1.0' encoding='UTF-8'?>\r
 <dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../dao/hibernate/dataset.xsd">\r
-  <HOMOTYPICALGROUP ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="7b214eb9-a6ac-48e5-af02-bbea634d2a03" UPDATED="2008-12-10 09:56:07.238"/>\r
-  <HOMOTYPICALGROUP ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="6c241a4c-e5a0-4344-8e5e-a81f17b75973" UPDATED="2008-12-10 09:56:07.253"/>  \r
-  <HOMOTYPICALGROUP_AUD ID="1001" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="7b214eb9-a6ac-48e5-af02-bbea634d2a03" UPDATED="2008-12-10 09:56:07.238"/>\r
-  <HOMOTYPICALGROUP_AUD ID="1002" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="6c241a4c-e5a0-4344-8e5e-a81f17b75973" UPDATED="2008-12-10 09:56:07.253"/>  \r
-  <REFERENCE DTYPE="Book" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
-  <REFERENCE_AUD REV="1000" REVTYPE="0" DTYPE="Book" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
-  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="a49a3963-c4ea-4047-8588-2f8f15352730" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE DTYPE="BotanicalName" ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="05a438d6-065f-49ef-84db-c7dc2c259975" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="1001" CREATED="2008-12-10 09:56:07.0" UUID="a49a3963-c4ea-4047-8588-2f8f15352730" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="1002" CREATED="2008-12-10 09:56:07.0" UUID="05a438d6-065f-49ef-84db-c7dc2c259975" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="1002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="1001"/>\r
-  <NAMERELATIONSHIP ID="1" CREATED="2008-12-10 09:56:07.0" UUID="e9baf86f-a8d0-444a-8e64-db0dd9e33cfa" RELATEDFROM_ID="1001" RELATEDTO_ID="1002" DOUBTFUL="false" TYPE_ID="868"/>\r
-  <NAMERELATIONSHIP_AUD ID="2" REV="1025" REVTYPE="0" CREATED="2009-09-17 18:20:37.0" UUID="3c82cfdd-0157-4340-9ccd-ba99e742cb31" DOUBTFUL="false" RELATEDFROM_ID="1003" RELATEDTO_ID="1004" TYPE_ID="862"/>\r
-  <HYBRIDRELATIONSHIP ID="1" CREATED="2008-12-10 09:56:07.0" UUID="864af86f-a8d0-444a-8e64-db0dd9e33ce4a" RELATEDFROM_ID="1001" RELATEDTO_ID="1002" DOUBTFUL="false" TYPE_ID="857"/>   \r
-  <TAXONRELATIONSHIP ID="1" CREATED="2008-12-10 09:56:07.0" UUID="893ef86f-a8d0-444a-8e64-db0dd9e33ce4a" RELATEDFROM_ID="1001" RELATEDTO_ID="1002" DOUBTFUL="false" TYPE_ID="874"/>    \r
-  <SYNONYMRELATIONSHIP ID="1" CREATED="2008-12-10 09:56:07.0" UUID="573af86f-a8d0-444a-8e64-db0dd9e33ce4a" RELATEDFROM_ID="1003" RELATEDTO_ID="1002" DOUBTFUL="false" TYPE_ID="852"/>  \r
-  <TAXONBASE DTYPE="Taxon" ID="1001" SEC_ID="1" CREATED="2008-01-10 09:56:07.0" UUID="496b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" sec. ???" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="1" TAXONNAME_FK="1"/>\r
-  <TAXONBASE DTYPE="Taxon" ID="1002" SEC_ID="1" CREATED="2008-01-12 09:56:07.0" UUID="822d98dc-9ef7-44b7-a870-94573a3bcb46" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="  sec. ???" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="0" TAXONOMICPARENTCACHE_ID="1" TAXONNAME_FK="2"/>\r
-  <TAXONBASE DTYPE="Synonym" ID="1003" SEC_ID="2" CREATED="2009-12-10 09:56:07.0" UUID="d75b2e3d-7394-4ada-b6a5-93175b8751c1" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Atropos Agassiz, 1846 sec. cate-sphingidae.org" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false" DOUBTFUL="false" USENAMECACHE="false" TAXONNAME_FK="27"/>\r
+  <HOMOTYPICALGROUP ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="a7e20bd1-2d76-43b0-899b-6ee8056720bf" UPDATED="2008-12-10 09:56:07.238"/>\r
+  <HOMOTYPICALGROUP ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="c69b1c20-d321-4550-a755-bfcd2db9c9c5" UPDATED="2008-12-10 09:56:07.253"/>  \r
+  <HOMOTYPICALGROUP_AUD ID="2001" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="a7e20bd1-2d76-43b0-899b-6ee8056720bf" UPDATED="2008-12-10 09:56:07.238"/>\r
+  <HOMOTYPICALGROUP_AUD ID="2002" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="c69b1c20-d321-4550-a755-bfcd2db9c9c5" UPDATED="2008-12-10 09:56:07.253"/>  \r
+  <REFERENCE DTYPE="Book" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="c243ec4c-6cb7-4e81-a251-a478ef58c945" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
+  <REFERENCE_AUD REV="1000" REVTYPE="0" DTYPE="Book" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="c243ec4c-6cb7-4e81-a251-a478ef58c945" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="44415fc0-1703-11df-8a39-0800200c9a66" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE DTYPE="BotanicalName" ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="523498fc-5fa8-4ac6-9347-303770ac46a1" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="44415fc0-1703-11df-8a39-0800200c9a66" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2001" RANK_ID="774" GENUSORUNINOMIAL="Aus" NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <TAXONNAMEBASE_AUD DTYPE="BotanicalName" REV="1000" REVTYPE="0" ID="2002" CREATED="2008-12-10 09:56:07.0" UUID="523498fc-5fa8-4ac6-9347-303770ac46a1" UPDATED="2008-12-10 09:56:07.253" TITLECACHE=" " PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE=" " PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="" NAMECACHE="Aus aus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false" BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="2002" RANK_ID="765" GENUSORUNINOMIAL="Aus" SPECIFICEPITHET="aus"  NOMENCLATURALREFERENCE_ID="2001"/>\r
+  <NAMERELATIONSHIP ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="43165a02-db6b-4d92-9b48-2fd8df12ee1e" RELATEDFROM_ID="2001" RELATEDTO_ID="2002" DOUBTFUL="false" TYPE_ID="868"/>\r
+  <NAMERELATIONSHIP_AUD ID="2001" REV="1000" REVTYPE="0" CREATED="2009-09-17 18:20:37.0" UUID="43165a02-db6b-4d92-9b48-2fd8df12ee1e" DOUBTFUL="false" RELATEDFROM_ID="2001" RELATEDTO_ID="2002" TYPE_ID="862"/>\r
+  <HYBRIDRELATIONSHIP ID="2001" CREATED="2008-12-10 09:56:07.0" UUID="fe8ca4b0-af10-4e0c-bf19-e6b80fd84e2a" RELATEDFROM_ID="2001" RELATEDTO_ID="2002" DOUBTFUL="false" TYPE_ID="857"/>\r
+  <HYBRIDRELATIONSHIP_AUD ID="2001" REV="1000" REVTYPE="0" CREATED="2008-12-10 09:56:07.0" UUID="fe8ca4b0-af10-4e0c-bf19-e6b80fd84e2a" RELATEDFROM_ID="2001" RELATEDTO_ID="2002" DOUBTFUL="false" TYPE_ID="857"/>\r
 </dataset>
\ No newline at end of file
diff --git a/cdmlib-remote/dist/cdmserver_1-1_all.deb b/cdmlib-remote/dist/cdmserver_1-1_all.deb
new file mode 100644 (file)
index 0000000..16632f1
Binary files /dev/null and b/cdmlib-remote/dist/cdmserver_1-1_all.deb differ
index e38143fd6031f02d7502e33e044428a1a31f18d0..e8fabd0dcd343650789734b42edcc7c450e90943 100644 (file)
                        <groupId>eu.etaxonomy</groupId>
                        <artifactId>cdmlib-services</artifactId>
                </dependency>
+               <dependency>
+                       <groupId>eu.etaxonomy</groupId>
+                       <artifactId>cdmlib-io</artifactId>
+               </dependency>
                <!--<dependency>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>jetty</artifactId>
                                    <goals>
                                        <goal>embed</goal>
                                    </goals>
-                                   <phase>package</phase>
+                                   <phase>deploy</phase>
                                </execution>
                            </executions>
                        </plugin>
                                        <version>1.3</version>
                                                <executions>
                                                        <execution>
-                                                               <phase>package</phase>
+                                                               <phase>deploy</phase>
                                                                <!--
                                                                        must run after winstone-maven-plugin
                                                                -->
index 82913b36d19e1af8b5101b0158193159626e4b2e..9a8853dc8c69a1d9b8f004ab38ae6fc3748f4dd8 100644 (file)
@@ -166,8 +166,7 @@ public class TermListController extends BaseListController<DefinedTermBase, ITer
                        case 3: level = NamedAreaLevel.TDWG_LEVEL3(); break;\r
                        case 4: level = NamedAreaLevel.TDWG_LEVEL4(); break;\r
                }\r
-               NamedAreaType type = null;\r
-               Pager<NamedArea> p = service.list(level, type, null, null, null, null);\r
+               Pager<NamedArea> p = service.list(level, (NamedAreaType)null, null, null, null, null);\r
                return p.getRecords();\r
        }\r
 \r
index c569a2e6f7df77a2670394978c46dc056a05555d..97733a3a0eac8913d34f1569e7d753e8aef32b53 100644 (file)
@@ -22,6 +22,8 @@ import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;\r
 import org.springframework.context.ApplicationContextAware;\r
 \r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+\r
 public class HibernateProxyNullSafeDeepConverter implements ConfigurableCustomConverter, ApplicationContextAware {\r
        \r
        private MapperIF mapper;\r
@@ -52,7 +54,11 @@ public class HibernateProxyNullSafeDeepConverter implements ConfigurableCustomCo
                        if(value == null || !Hibernate.isInitialized(value)) {\r
                            return null;\r
                        } else {\r
+                               if(value instanceof CdmBase) {\r
                                return getMapper().map(value, destClass);\r
+                               } else {\r
+                                       return value;\r
+                       }\r
                        }\r
                        } catch (Exception e) {\r
                                throw new MappingException("Converter HibernateProxyNullSafeDeepConverter used incorrectly. Arguments passed in were:"+ destination + " and " + source + " sourceClass " + sourceClass + " destClass " + destClass, e);\r
diff --git a/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/XmlView.java b/cdmlib-remote/src/main/java/eu/etaxonomy/cdm/remote/view/XmlView.java
new file mode 100644 (file)
index 0000000..42a6f9e
--- /dev/null
@@ -0,0 +1,67 @@
+// $Id: RdfView.java 7479 2009-11-02 12:31:13Z ben.clark $
+package eu.etaxonomy.cdm.remote.view;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.transform.stream.StreamResult;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.oxm.Marshaller;
+import org.springframework.web.servlet.view.AbstractView;
+
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
+
+/**
+ * View class which takes a serializes a cdm object as xml
+ * @author ben
+ * @see javax.xml.transform.Source
+ * @see com.ibm.lsid.MetadataResponse
+ */
+public class XmlView extends AbstractView {
+       
+       private Marshaller marshaller;
+       
+       private boolean locationHeader = false;
+       
+       private String locationPrefix = "";
+       
+       public void setLocationHeader(boolean locationHeader) {
+               this.locationHeader = locationHeader;
+       }
+
+       public void setLocationPrefix(String locationPrefix) {
+               this.locationPrefix = locationPrefix;
+       }
+
+       public XmlView() {
+               
+       }
+       
+       @Autowired
+       public void setMarshaller(Marshaller marshaller) {
+               this.marshaller = marshaller;
+       }
+       
+       
+       
+       @Override
+       protected void renderMergedOutputModel(Map model,HttpServletRequest request, HttpServletResponse response)
+                       throws Exception {
+               
+               for(Object object : model.values()) {
+                   if(object instanceof IdentifiableEntity) {                                          
+                       IdentifiableEntity identifiableEntity = (IdentifiableEntity)object;
+                if(locationHeader) {
+                               response.addHeader("Location", locationPrefix + identifiableEntity.getUuid().toString());
+                       }
+                       marshaller.marshal(identifiableEntity, new StreamResult(response.getOutputStream()));
+                   } else if(object instanceof Throwable) {
+                       eu.etaxonomy.cdm.io.jaxb.Error error = new eu.etaxonomy.cdm.io.jaxb.Error((Throwable)object);
+                       marshaller.marshal(error, new StreamResult(response.getOutputStream()));
+                   }
+               }               
+       }
+
+}
index e9343cea9a2f416a977b2fa537d917a875729255..b1b829ed68f6d25dd0b9f27d86999a3eaea9a116 100644 (file)
@@ -38,8 +38,8 @@
     <mapping> 
         <class-a>eu.etaxonomy.cdm.model.common.CdmBase</class-a>
         <class-b>eu.etaxonomy.cdm.remote.dto.tdwg.BaseThing</class-b>
-        <field>
-            <a>createdBy.username</a>
+        <field custom-converter-id="hibernateProxyDeepConverter" custom-converter-param="username">
+            <a>createdBy</a>
             <b>creator</b>
         </field>
         <field custom-converter-id="dateTimeConverter">
@@ -51,8 +51,8 @@
     <mapping> 
         <class-a>eu.etaxonomy.cdm.model.common.VersionableEntity</class-a>
         <class-b>eu.etaxonomy.cdm.remote.dto.tdwg.BaseThing</class-b>
-        <field>
-            <a>updatedBy.username</a>
+        <field custom-converter-id="hibernateProxyDeepConverter" custom-converter-param="username">
+            <a>updatedBy</a>
             <b>contributor</b>
         </field>
         <field custom-converter-id="dateTimeConverter">
index 0bc2d10a51bbc17b4420baa86a724833c1dcf25d..a9f83b807aa187e886a88b9f06b1912e186567db 100644 (file)
     <dependency>\r
       <groupId>com.ibm.lsid</groupId>\r
       <artifactId>lsid-server</artifactId>\r
-    </dependency>\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>
        <dependency>
                <groupId>commons-lang</groupId>
index f8e3b20909b2863420836539da9ef1e2480b2648..7233191db979d0150500312c536774f3f7ef749b 100644 (file)
@@ -24,7 +24,7 @@ import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.GenericApplicationContext;\r
 import org.springframework.core.io.ClassPathResource;\r
 import org.springframework.core.io.Resource;\r
-import org.springframework.security.providers.ProviderManager;\r
+import org.springframework.security.authentication.ProviderManager;\r
 import org.springframework.transaction.PlatformTransactionManager;\r
 import org.springframework.transaction.TransactionDefinition;\r
 import org.springframework.transaction.TransactionStatus;\r
index 930b37cb3d2fe70e63f2789a39097386ce8133a2..7ea78bcc93df2921e33a1a6bdac696ac94d6b988 100644 (file)
@@ -16,7 +16,7 @@ import org.apache.log4j.Logger;
 import org.hibernate.SessionFactory;\r
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.orm.hibernate3.HibernateTransactionManager;\r
-import org.springframework.security.providers.ProviderManager;\r
+import org.springframework.security.authentication.ProviderManager;\r
 import org.springframework.stereotype.Component;\r
 import org.springframework.transaction.PlatformTransactionManager;\r
 \r
index db2afb67383532b1341c451736039f31d4ed9df3..87afc5c2f448846bd332a6fe1537e6e9fde4cd71 100644 (file)
@@ -10,7 +10,7 @@
 \r
 package eu.etaxonomy.cdm.api.application;\r
 \r
-import org.springframework.security.providers.ProviderManager;\r
+import org.springframework.security.authentication.ProviderManager;\r
 import org.springframework.transaction.PlatformTransactionManager;\r
 \r
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;\r
index ee52745bc1dcdbe998d72c4f86bfb961a804dffc..3846bcff7b9b0d9cd0125eb092052c204ece8c06 100644 (file)
@@ -19,6 +19,7 @@ import eu.etaxonomy.cdm.api.service.pager.Pager;
 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.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.persistence.dao.common.IAnnotatableDao;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
@@ -36,4 +37,27 @@ public abstract class AnnotatableServiceBase<T extends AnnotatableEntity,DAO ext
                \r
                return new DefaultPagerImpl<Annotation>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
+       \r
+       @Transactional(readOnly = true)\r
+    public Pager<Marker> getMarkers(T annotatableEntity, Boolean technical, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.countMarkers(annotatableEntity, technical);\r
+               \r
+               List<Marker> results = new ArrayList<Marker>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.getMarkers(annotatableEntity, technical, pageSize, pageNumber, orderHints, propertyPaths);\r
+               }\r
+               \r
+               return new DefaultPagerImpl<Marker>(pageNumber, numberOfResults, pageSize, results);\r
+    }\r
+       \r
+\r
+       @Transactional(readOnly = true)\r
+       public List<Object[]> groupMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {\r
+               return dao.groupMarkers(clazz, technical, pageSize, pageNumber, propertyPaths);\r
+       }\r
+\r
+       @Transactional(readOnly = true)\r
+       public int countMarkers(Class<? extends T> clazz, Boolean technical) {\r
+               return dao.countMarkers(clazz, technical);\r
+       }\r
 }\r
index f7218d3f0657d84b68be6a410d20683db3cf703a..f7ed05b13f343150fda96d84ad9067c9d24de40f 100644 (file)
@@ -14,6 +14,7 @@ import java.util.List;
 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.Marker;\r
 import eu.etaxonomy.cdm.model.common.MarkerType;\r
 import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
@@ -33,4 +34,42 @@ public interface IAnnotatableService<T extends AnnotatableEntity> extends IVersi
         * @return a Pager of Annotation entities\r
         */\r
        public Pager<Annotation> getAnnotations(T annotatedObj, MarkerType status, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
+       \r
+       /**\r
+        * Returns a Pager containing Marker entities belonging to the object supplied, optionally filtered by\r
+        * whether they are technical or non-technical markers\r
+        * \r
+        * @param annotatableEntity the entity which is marked\r
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)\r
+        * @param pageSize The maximum number of markers returned (can be null for all markers)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints may be null\r
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}\r
+        * @return a List of Marker instances\r
+        */\r
+       public Pager<Marker> getMarkers(T annotatableEntity, Boolean technical, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
+       \r
+       /**\r
+        * Returns a list of arrays representing counts of entities of type clazz, grouped by their markerTypes. The arrays have two elements. \r
+        * The first element is the MarkerType, initialized using the propertyPaths parameter. The second element is the count of all markers of Objects\r
+        * of type clazz with that MarkerType. The boolean technical can be used to choose only technical or only non-technical marker types. The list is sorted by\r
+        * titleCache of the markerType, in ascending order.\r
+        * \r
+        * @param clazz optionally restrict the markers to those belonging to this class\r
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)\r
+        * @param pageSize The maximum number of arrays returned (can be null for all arrays)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}\r
+        * @return\r
+        */\r
+       public List<Object[]> groupMarkers(Class<? extends T> clazz, Boolean technical, Integer pageSize, Integer pageNumber, List<String> propertyPaths);\r
+       \r
+       /**\r
+        * returns a count of all markers belonging to that clazz, optionally filtered to include only technical or only non-technical markers.\r
+        * \r
+        * @param clazz optionally restrict the markers to those belonging to this class\r
+        * @param technical The type of MarkerTypes to consider (null to count all markers, regardless of whether the makerType is technical or not)\r
+        * @return a count of markers\r
+        */\r
+       public int countMarkers(Class<? extends T> clazz, Boolean technical);\r
 } \r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMarkerService.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMarkerService.java
new file mode 100644 (file)
index 0000000..d09b670
--- /dev/null
@@ -0,0 +1,25 @@
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.List;\r
+\r
+import eu.etaxonomy.cdm.api.service.pager.Pager;\r
+import eu.etaxonomy.cdm.model.common.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
+\r
+public interface IMarkerService extends IVersionableService<Marker> {\r
+       \r
+       /**\r
+        * Returns a pager of markers which have the same type\r
+        * \r
+        * @param markerType The type of markerType\r
+        * @param pageSize The maximum number of markers returned (can be null for all markers)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints may be null\r
+        * @param propertyPaths properties to initialize - see {@link BeanInitializer#initialize(Object, List)}\r
+        * @return\r
+        */\r
+       public Pager<Marker> page(MarkerType markerType, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
+\r
+}\r
index 0c6c3ac499f6c24a12ebf878d0975f27907d3c00..dfdcd25a08dbb08bd8dfb4bfc4445934568effbb 100644 (file)
@@ -12,10 +12,10 @@ package eu.etaxonomy.cdm.api.service;
 import java.util.UUID;\r
 \r
 import org.springframework.dao.DataAccessException;\r
-import org.springframework.security.GrantedAuthority;\r
-import org.springframework.security.userdetails.GroupManager;\r
-import org.springframework.security.userdetails.UserDetailsManager;\r
-import org.springframework.security.userdetails.UsernameNotFoundException;\r
+import org.springframework.security.core.GrantedAuthority;\r
+import org.springframework.security.core.userdetails.UsernameNotFoundException;\r
+import org.springframework.security.provisioning.GroupManager;\r
+import org.springframework.security.provisioning.UserDetailsManager;\r
 \r
 import eu.etaxonomy.cdm.model.common.Group;\r
 import eu.etaxonomy.cdm.model.common.User;\r
diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MarkerServiceImpl.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MarkerServiceImpl.java
new file mode 100644 (file)
index 0000000..af7ac9b
--- /dev/null
@@ -0,0 +1,38 @@
+package eu.etaxonomy.cdm.api.service;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Service;\r
+import org.springframework.transaction.annotation.Propagation;\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.Marker;\r
+import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.persistence.dao.hibernate.common.MarkerDaoImpl;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
+\r
+@Service\r
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)\r
+public class MarkerServiceImpl extends VersionableServiceBase<Marker, MarkerDaoImpl> implements IMarkerService {\r
+\r
+       @Autowired\r
+       protected void setDao(MarkerDaoImpl dao) {\r
+               this.dao = dao;\r
+       }\r
+\r
+       public Pager<Marker> page(MarkerType markerType, Integer pageSize,      Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.count(markerType);\r
+               \r
+               List<Marker> results = new ArrayList<Marker>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.list(markerType, pageSize, pageNumber, orderHints, propertyPaths);\r
+               }\r
+               \r
+               return new DefaultPagerImpl<Marker>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
+\r
+}\r
index bf3ea66da492aebf0632a4472020be8b6658c6ed..5c3978c94dbcbb84d79ae05658794ec8ac0fea0d 100644 (file)
@@ -9,6 +9,7 @@
  */\r
 package eu.etaxonomy.cdm.api.service;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 import java.util.UUID;\r
 \r
@@ -16,20 +17,21 @@ import org.hibernate.NonUniqueResultException;
 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.dao.salt.ReflectionSaltSource;\r
-import org.springframework.security.providers.encoding.Md5PasswordEncoder;\r
-import org.springframework.security.providers.encoding.PasswordEncoder;\r
-import org.springframework.security.userdetails.UserDetails;\r
-import org.springframework.security.userdetails.UsernameNotFoundException;\r
+\r
+import org.springframework.security.access.AccessDeniedException;\r
+import org.springframework.security.authentication.AuthenticationManager;\r
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\r
+import org.springframework.security.authentication.dao.ReflectionSaltSource;\r
+import org.springframework.security.authentication.dao.SaltSource;\r
+import org.springframework.security.authentication.encoding.Md5PasswordEncoder;\r
+import org.springframework.security.authentication.encoding.PasswordEncoder;\r
+import org.springframework.security.core.Authentication;\r
+import org.springframework.security.core.GrantedAuthority;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
+import org.springframework.security.core.userdetails.UserCache;\r
+import org.springframework.security.core.userdetails.UserDetails;\r
+import org.springframework.security.core.userdetails.UsernameNotFoundException;\r
+import org.springframework.security.core.userdetails.cache.NullUserCache;\r
 import org.springframework.stereotype.Service;\r
 import org.springframework.transaction.annotation.Propagation;\r
 import org.springframework.transaction.annotation.Transactional;\r
@@ -236,7 +238,7 @@ public class UserService extends ServiceBase<User,IUserDao> implements IUserServ
        }\r
 \r
        @Transactional(readOnly=false)\r
-       public void createGroup(String groupName, GrantedAuthority[] authorities) {\r
+       public void createGroup(String groupName, List<GrantedAuthority> authorities) {\r
                Assert.hasText(groupName);\r
                Assert.notNull(authorities);\r
                \r
@@ -258,25 +260,24 @@ public class UserService extends ServiceBase<User,IUserDao> implements IUserServ
                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
+       public List<String> findAllGroups() {\r
+               return groupDao.listNames(null,null);\r
        }\r
 \r
-       public GrantedAuthority[] findGroupAuthorities(String groupName) {\r
+       public List<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
+               return new ArrayList<GrantedAuthority>(group.getGrantedAuthorities());\r
        }\r
 \r
-       public String[] findUsersInGroup(String groupName) {\r
+       public List<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
+               return users;\r
        }\r
 \r
        @Transactional(readOnly=false)\r
index 2c52d6ff8dd8bf29deffb3cbbb270d5d8f8bc25b..258d0c18252a60ebb49d57b3881d68bfbc1dfed0 100644 (file)
@@ -7,7 +7,7 @@
     http://www.springframework.org/schema/context\r
     http://www.springframework.org/schema/context/spring-context-2.5.xsd">\r
     \r
-    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">\r
+    <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">\r
         <property name="providers">\r
             <list>\r
                 <ref local="daoAuthenticationProvider"/>\r
         </property>\r
     </bean>\r
     \r
-    <bean id="daoAuthenticationProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider">\r
+    <bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">\r
         <property name="userDetailsService" ref="userService"/>\r
         <property name="saltSource" ref="saltSource"/>\r
         <property name="passwordEncoder" ref="passwordEncoder"/>\r
     </bean>\r
     \r
-    <bean id="passwordEncoder" class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>\r
+    <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>\r
     \r
-    <bean id="saltSource" class="org.springframework.security.providers.dao.salt.ReflectionSaltSource">\r
+    <bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">\r
         <property name="userPropertyToUse" value="getUsername"/>\r
     </bean>\r
     \r
index 60f3f8cba30cbec0339e73d5739c405e24d313b7..9b391e294b5578cdf1329aa1970651e6a2a718a6 100644 (file)
 package eu.etaxonomy.cdm.api.service;\r
 \r
 \r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
 import java.util.UUID;\r
 \r
 import org.joda.time.DateTime;\r
 import org.junit.Assert;\r
 import org.junit.Before;\r
 import org.junit.Test;\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.core.Authentication;\r
+import org.springframework.security.authentication.AuthenticationManager;\r
+import org.springframework.security.core.GrantedAuthority;\r
+import org.springframework.security.core.context.SecurityContextHolder;\r
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;\r
 import org.unitils.dbunit.annotation.DataSet;\r
 import org.unitils.spring.annotation.SpringBeanByType;\r
 \r
@@ -36,12 +40,12 @@ public class UserServiceImplTest extends CdmIntegrationTest {
        @SpringBeanByType\r
        private IUserService userService;\r
        \r
-       private GrantedAuthority[] expectedRoles;\r
+       private Set<GrantedAuthority> expectedRoles;\r
        private UsernamePasswordAuthenticationToken token;\r
        \r
        @Before\r
        public void setUp() {\r
-               expectedRoles = new GrantedAuthority[4];\r
+               expectedRoles = new HashSet<GrantedAuthority>();\r
                GrantedAuthorityImpl publish = new GrantedAuthorityImpl();\r
                publish.setAuthority("Publish");\r
                publish.setUuid(UUID.fromString("441a3c40-0c84-11de-8c30-0800200c9a66"));\r
@@ -58,10 +62,10 @@ public class UserServiceImplTest extends CdmIntegrationTest {
                checkAnnotation.setAuthority("CheckAnnotation");\r
                checkAnnotation.setUuid(UUID.fromString("e5354c0e-657b-4b4d-bb2f-791612199711"));\r
                checkAnnotation.setCreated(new DateTime(2009,2,3,17,52,26,0));\r
-               expectedRoles[3] = publish;\r
-               expectedRoles[2] = edit;\r
-               expectedRoles[0] = annotate;\r
-               expectedRoles[1] = checkAnnotation;\r
+               expectedRoles.add(publish);\r
+               expectedRoles.add(edit);\r
+               expectedRoles.add(annotate);\r
+               expectedRoles.add(checkAnnotation);\r
                token = new UsernamePasswordAuthenticationToken("ben","sPePhAz6");\r
        }\r
        \r
@@ -76,7 +80,8 @@ public class UserServiceImplTest extends CdmIntegrationTest {
         \r
                Assert.assertEquals(principal.getUsername(),"ben");\r
                \r
-               Assert.assertArrayEquals(expectedRoles, authentication.getAuthorities());\r
+               Assert.assertNotNull(expectedRoles);\r
+               Assert.assertEquals(expectedRoles.size(), authentication.getAuthorities().size());\r
        }\r
        \r
        @Test\r
index c145290d332eb17fff28fe3adbd75fc5bdf2fce5..7131af4824f0c348fe11cae4e2226d77584b7ed8 100644 (file)
@@ -83,7 +83,7 @@ public class TaxonNameCannotBeAcceptedAndSynonymTest extends CdmIntegrationTest
        @Test\r
        public void testValidTaxon() {\r
                assert taxon1.getName().getTaxonBases().size() == 1;\r
-        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level2.class);\r
+        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level3.class);\r
         assertTrue("There should be no constraint violations as this taxon does not have the same name as any other taxa",constraintViolations.isEmpty());\r
        }\r
        \r
@@ -91,7 +91,7 @@ public class TaxonNameCannotBeAcceptedAndSynonymTest extends CdmIntegrationTest
        public void testTwoAcceptedTaxaWithSameNameSameSec() {\r
                taxon2.setName(name1);\r
                assert taxon1.getName().getTaxonBases().size() == 2;\r
-        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level2.class);\r
+        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level3.class);\r
         assertTrue("There should be a single constraint violation as this taxon shares the same name as taxon2 and is according to the same authority, sec1",!constraintViolations.isEmpty());\r
        }\r
        \r
@@ -100,7 +100,7 @@ public class TaxonNameCannotBeAcceptedAndSynonymTest extends CdmIntegrationTest
                taxon2.setName(name1);\r
                taxon2.setSec(sec2);\r
                assert taxon1.getName().getTaxonBases().size() == 2;\r
-        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level2.class);\r
+        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level3.class);\r
         assertTrue("There should not be any constraint violations despite both accepted taxa sharing the same name as the sec reference is different",constraintViolations.isEmpty());\r
        }\r
        \r
@@ -108,7 +108,7 @@ public class TaxonNameCannotBeAcceptedAndSynonymTest extends CdmIntegrationTest
        public void testTaxonAndSynonymWithSameNameSameSec() {\r
                synonym.setName(name1);\r
                assert taxon1.getName().getTaxonBases().size() == 2;\r
-        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level2.class);\r
+        Set<ConstraintViolation<Taxon>> constraintViolations  = validator.validate(taxon1, Level3.class);\r
         assertTrue("There should be a single constraint violation as this taxon shares the same name as synonym and is according to the same authority, sec1",!constraintViolations.isEmpty());\r
        }\r
 }\r
index 871bec9b3829a7c84ac9830099fa56ab55a95501..b2b9d3907e5404616f4688e5a25006541d004647 100644 (file)
         </property>\r
     </bean> \r
     \r
-    <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">\r
+    <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">\r
         <property name="providers">\r
             <list>\r
-                <bean class="org.springframework.security.providers.TestingAuthenticationProvider"/>\r
+                <bean class="org.springframework.security.authentication.TestingAuthenticationProvider"/>\r
                 <ref local="daoAuthenticationProvider"/>\r
             </list>\r
         </property>\r
     </bean>\r
     \r
-    <bean id="daoAuthenticationProvider" class="org.springframework.security.providers.dao.DaoAuthenticationProvider">\r
+    <bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">\r
         <property name="userDetailsService" ref="userService"/>\r
         <property name="saltSource" ref="saltSource"/>\r
         <property name="passwordEncoder" ref="passwordEncoder"/>\r
     </bean>\r
     \r
-    <bean id="passwordEncoder" class="org.springframework.security.providers.encoding.Md5PasswordEncoder"/>\r
+    <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>\r
     \r
-    <bean id="saltSource" class="org.springframework.security.providers.dao.salt.ReflectionSaltSource">\r
+    <bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">\r
         <property name="userPropertyToUse" value="getUsername"/>\r
     </bean>