2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.api
.facade
;
11 import java
.io
.FileNotFoundException
;
12 import java
.util
.UUID
;
14 import org
.apache
.log4j
.Logger
;
15 import org
.hibernate
.proxy
.HibernateProxy
;
16 import org
.junit
.Assert
;
17 import org
.junit
.Before
;
18 import org
.junit
.Ignore
;
19 import org
.junit
.Test
;
20 import org
.unitils
.dbunit
.annotation
.DataSet
;
21 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IDescriptionService
;
24 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
25 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
26 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
27 import eu
.etaxonomy
.cdm
.model
.agent
.Team
;
28 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTerm
;
30 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
31 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
32 import eu
.etaxonomy
.cdm
.model
.common
.TimePeriod
;
33 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
34 import eu
.etaxonomy
.cdm
.model
.description
.IndividualsAssociation
;
35 import eu
.etaxonomy
.cdm
.model
.location
.Country
;
36 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
37 import eu
.etaxonomy
.cdm
.model
.location
.Point
;
38 import eu
.etaxonomy
.cdm
.model
.location
.ReferenceSystem
;
39 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
40 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
41 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
42 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameFactory
;
43 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
44 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEvent
;
45 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivationEventType
;
46 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
47 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldUnit
;
48 import eu
.etaxonomy
.cdm
.model
.occurrence
.GatheringEvent
;
49 import eu
.etaxonomy
.cdm
.model
.occurrence
.PreservationMethod
;
50 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
52 import eu
.etaxonomy
.cdm
.strategy
.parser
.TimePeriodParser
;
53 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
56 * NOTE: The only reason for having this test is to test if injection of the cache strategy into a
57 * standard specimen works. Once we use another default cache strategy then the derived unit facade
58 * this test can be deleted or adapted and moved to cdmlib-model.
64 public class DerivedUnitFacadeCacheStrategyInjectionTest
extends CdmTransactionalIntegrationTest
{
65 @SuppressWarnings("unused")
66 private static final Logger logger
= Logger
.getLogger(DerivedUnitFacadeCacheStrategyInjectionTest
.class);
69 private IOccurrenceService occService
;
71 private ITaxonService taxonService
;
73 private IDescriptionService descService
;
75 private static final UUID taxonUuid
= UUID
.fromString("10cfb372-0b1a-4d82-9707-c5ffd2b93a55");
78 private DerivedUnit specimen
;
79 private DerivationEvent derivationEvent
;
80 private FieldUnit fieldUnit
;
81 private GatheringEvent gatheringEvent
;
82 private final Integer absoluteElevation
= 40;
83 private final Integer absoluteElevationError
= 2;
84 private final Team collector
= Team
.NewInstance();
85 private final String collectingMethod
= "Collection Method";
86 private final Double distanceToGround
= 22.0;
87 private final Double distanceToSurface
= 50.0;
88 private final ReferenceSystem referenceSystem
= ReferenceSystem
.WGS84();
89 private final Point exactLocation
= Point
.NewInstance(12.3, 10.567, referenceSystem
, 22);
90 private final String gatheringEventDescription
= "A nice gathering description";
91 private final TimePeriod gatheringPeriod
= TimePeriodParser
.parseString("03.05.2005");
92 private final String ecology
= "sand dunes";
93 private final String plantDescription
= "flowers blue";
95 private final String fieldNumber
= "5678";
96 private final String fieldNotes
= "such a beautiful specimen";
97 private Person primaryCollector
;
99 private final Integer individualCount
= 1;
100 private final DefinedTerm lifeStage
= DefinedTerm
.NewStageInstance("A wonderful stage", "stage", "st");
101 private final DefinedTerm sex
= DefinedTerm
.NewSexInstance("FemaleMale", "FM", "FM");
102 private final NamedArea country
= Country
.GERMANY();
103 private final LanguageString locality
= LanguageString
.NewInstance("Berlin-Dahlem, E side of Englerallee", Language
.DEFAULT());
105 private final String exsiccatum
= "Greuter, Pl. Dahlem. 456";
106 private final String accessionNumber
= "8909756";
107 private final String catalogNumber
= "UU879873590";
108 private final TaxonName taxonName
= TaxonNameFactory
.NewBotanicalInstance(Rank
.GENUS(), "Abies", null, null, null, null, null, null, null);
109 private final String collectorsNumber
= "234589913A34";
110 private final Collection collection
= Collection
.NewInstance();
112 private final PreservationMethod preservationMethod
= PreservationMethod
.NewInstance(null, "my prservation");
114 private DerivedUnit collectionSpecimen
;
115 private GatheringEvent existingGatheringEvent
;
116 private DerivationEvent firstDerivationEvent
;
117 private FieldUnit firstFieldObject
;
118 private final Media media1
= Media
.NewInstance();
121 //****************************** SET UP *****************************************/
124 // * @throws java.lang.Exception
127 // public static void setUpBeforeClass() throws Exception {
128 // // FIXME maybe this will cause problems in other tests
129 // // INDEED !!!! it causes problems thus this is replaced by making this test a CdmIntegrationTest !!!
130 // new DefaultTermInitializer().initialize();
134 * @throws java.lang.Exception
137 public void setUp() throws Exception
{
138 specimen
= DerivedUnit
.NewPreservedSpecimenInstance();
140 derivationEvent
= DerivationEvent
.NewInstance(DerivationEventType
.ACCESSIONING());
141 specimen
.setDerivedFrom(derivationEvent
);
142 fieldUnit
= FieldUnit
.NewInstance();
143 fieldUnit
.addDerivationEvent(derivationEvent
);
144 gatheringEvent
= GatheringEvent
.NewInstance();
145 fieldUnit
.setGatheringEvent(gatheringEvent
);
146 gatheringEvent
.setAbsoluteElevation(absoluteElevation
);
147 // gatheringEvent.setAbsoluteElevationError(absoluteElevationError);
148 gatheringEvent
.setActor(collector
);
149 gatheringEvent
.setCollectingMethod(collectingMethod
);
150 gatheringEvent
.setDistanceToGround(distanceToGround
);
151 gatheringEvent
.setDistanceToWaterSurface(distanceToSurface
);
152 gatheringEvent
.setExactLocation(exactLocation
);
153 gatheringEvent
.setDescription(gatheringEventDescription
);
155 gatheringEvent
.setTimeperiod(gatheringPeriod
);
156 gatheringEvent
.setLocality(locality
);
157 gatheringEvent
.setCountry(country
);
159 fieldUnit
.setFieldNumber(fieldNumber
);
160 fieldUnit
.setFieldNotes(fieldNotes
);
161 fieldUnit
.setIndividualCount(individualCount
);
162 fieldUnit
.setSex(sex
);
163 fieldUnit
.setLifeStage(lifeStage
);
164 primaryCollector
= Person
.NewTitledInstance("Kilian");
165 collector
.addTeamMember(primaryCollector
);
166 Person secondCollector
= Person
.NewInstance();
167 secondCollector
.setFirstname("Andreas");
168 secondCollector
.setLastname("Muller");
169 collector
.addTeamMember(secondCollector
);
170 Person thirdCollector
= Person
.NewTitledInstance("Kohlbecker");
171 collector
.addTeamMember(thirdCollector
);
172 fieldUnit
.setPrimaryCollector(primaryCollector
);
174 specimen
.setAccessionNumber(accessionNumber
);
175 specimen
.setCatalogNumber(catalogNumber
);
176 specimen
.setStoredUnder(taxonName
);
177 specimen
.setCollection(collection
);
178 specimen
.setPreservation(preservationMethod
);
179 specimen
.setExsiccatum(exsiccatum
);
181 //existing specimen with 2 derivation events in line
182 collectionSpecimen
= DerivedUnit
.NewPreservedSpecimenInstance();
183 DerivedUnit middleSpecimen
= DerivedUnit
.NewPreservedSpecimenInstance();
184 firstFieldObject
= FieldUnit
.NewInstance();
186 //TODO maybe we should define concrete event types here
187 DerivationEvent lastDerivationEvent
= DerivationEvent
.NewInstance(null);
188 DerivationEvent middleDerivationEvent
= DerivationEvent
.NewInstance(null);
189 firstDerivationEvent
= DerivationEvent
.NewInstance(null);
191 collectionSpecimen
.setDerivedFrom(lastDerivationEvent
);
193 lastDerivationEvent
.addOriginal(middleSpecimen
);
194 middleSpecimen
.setDerivedFrom(firstDerivationEvent
);
195 firstDerivationEvent
.addOriginal(firstFieldObject
);
196 existingGatheringEvent
= GatheringEvent
.NewInstance();
197 firstFieldObject
.setGatheringEvent(existingGatheringEvent
);
201 * Test method for {@link eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.occurrence.Specimen)}.
204 public void testGetSpecimenTitleCache() {
205 // String correctCache = "Germany, Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10\u00B034'1.2\"N, 12\u00B018'E (WGS84), sand dunes, 3.5.2005, Kilian 5678, A. Muller & Kohlbecker; Greuter, Pl. Dahlem. 456 (B 8909756); flowers blue.";
206 String correctCache
= "Germany, Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10\u00B034'1.2\"N, 12\u00B018'E (WGS84), 3.5.2005, Kilian 5678, A. Muller & Kohlbecker; Greuter, Pl. Dahlem. 456 (B 8909756).";
208 // DescriptionElementBase ecologyItem = TextData.NewInstance(Feature.ECOLOGY(), ecology, Language.DEFAULT(), null);
209 // SpecimenDescription fieldUnitDescription = SpecimenDescription.NewInstance(fieldUnit);
210 // fieldUnitDescription.addElement(ecologyItem);
211 //// specimenFacade.setEcology(ecology);
212 // DescriptionElementBase plantDescItem = TextData.NewInstance(Feature.DESCRIPTION(), plantDescription, Language.DEFAULT(), null);
213 // fieldUnitDescription.addElement(plantDescItem);
214 //// specimenFacade.setPlantDescription(plantDescription);
216 collection
.setCode("B");
217 Assert
.assertEquals(correctCache
, specimen
.getTitleCache());
224 * Test method for {@link eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy#getTitleCache(eu.etaxonomy.cdm.model.occurrence.Specimen)}.
227 public void testGetFieldUnitTitleCache() {
228 // String correctCache = "Germany, Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10\u00B034'1.2\"N, 12\u00B018'E (WGS84), sand dunes, 3.5.2005, Kilian 5678, A. Muller & Kohlbecker; flowers blue.";
229 String correctCache
= "Germany, Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10\u00B034'1.2\"N, 12\u00B018'E (WGS84), 3.5.2005, Kilian 5678, A. Muller & Kohlbecker.";
231 // DescriptionElementBase ecologyItem = TextData.NewInstance(Feature.ECOLOGY(), ecology, Language.DEFAULT(), null);
232 // SpecimenDescription fieldUnitDescription = SpecimenDescription.NewInstance(fieldUnit);
233 // fieldUnitDescription.addElement(ecologyItem);
234 // DescriptionElementBase plantDescItem = TextData.NewInstance(Feature.DESCRIPTION(), plantDescription, Language.DEFAULT(), null);
235 // fieldUnitDescription.addElement(plantDescItem);
237 collection
.setCode("B"); //no effect
238 Assert
.assertEquals(correctCache
, fieldUnit
.getTitleCache());
241 //Test if even a hibernate proxy (javassist) class correctly loads the DerivedUnitCacheStrategy.
244 public void testPersistedDerivedUnit(){
245 Taxon taxon
= (Taxon
)this.taxonService
.find(taxonUuid
);
247 IndividualsAssociation indivAssoc
= getDescriptionElement(taxon
, 5000);
248 SpecimenOrObservationBase
<?
> specimen
= indivAssoc
.getAssociatedSpecimenOrObservation();
249 Assert
.assertTrue("Specimen should be proxy otherwise the test does not test what it should", specimen
instanceof HibernateProxy
);
250 DerivedUnit myUnit
= CdmBase
.deproxy(specimen
, DerivedUnit
.class);
251 myUnit
.setTitleCache(null);
252 String expectedDerivedUnitCache
= "Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10°34'1.2\"N, 12°18'E, 3.5.2005, Kilian 5678, A. Muller & Kohlbecker; Greuter, Pl. Dahlem. 456 (8909756).";
253 Assert
.assertEquals(expectedDerivedUnitCache
, myUnit
.getTitleCache());
258 public void testPersistedFieldUnit(){
259 Taxon taxon
= (Taxon
)this.taxonService
.find(taxonUuid
);
260 IndividualsAssociation indivAssoc
= getDescriptionElement(taxon
, 5001);
261 SpecimenOrObservationBase
<?
> fieldUnit
= indivAssoc
.getAssociatedSpecimenOrObservation();
262 Assert
.assertTrue("FieldUnit should be proxy otherwise the test does not test what it should", fieldUnit
instanceof HibernateProxy
);
263 FieldUnit myFieldUnit
= CdmBase
.deproxy(fieldUnit
, FieldUnit
.class);
264 myFieldUnit
.setTitleCache(null);
265 String expectedFieldUnitCache
= "Berlin-Dahlem, E side of Englerallee, alt. 40 m, 10°34'1.2\"N, 12°18'E, 3.5.2005, Kilian 5678, A. Muller & Kohlbecker.";
266 Assert
.assertEquals(expectedFieldUnitCache
, myFieldUnit
.getTitleCache());
276 private IndividualsAssociation
getDescriptionElement(Taxon taxon
, int id
) {
277 for (DescriptionElementBase el
: taxon
.getDescriptions().iterator().next().getElements()){
278 if (el
.getId() == id
) {
279 return (IndividualsAssociation
)el
;
288 public void createTestDataSet() throws FileNotFoundException
{
289 // specimen.setUuid(derivedUnitUuid);
290 // fieldUnit.setUuid(fieldUnitUuid);
291 // Taxon taxon = Taxon.NewInstance(null, null);
292 // taxon.setUuid(taxonUuid);
293 // TaxonDescription desc = TaxonDescription.NewInstance(taxon);
295 // IndividualsAssociation indAssoc = IndividualsAssociation.NewInstance(specimen);
296 // desc.addElement(indAssoc);
298 // this.taxonService.saveOrUpdate(taxon);
303 // writeDbUnitDataSetFile(new String[]{"SpecimenOrObservationBase",
304 // "DerivationEvent", "DescriptionBase","DescriptionElementBase",
305 // "GatheringEvent","AgentBase","LanguageString","TaxonName",
306 // "TaxonBase","Collection",
307 // "MaterialOrMethodEvent","SpecimenOrObservationBase_DerivationEvent"});