import java.util.Map;\r
import java.util.Set;\r
\r
-import javax.mail.MethodNotSupportedException;\r
import javax.persistence.Transient;\r
\r
import org.apache.log4j.Logger;\r
\r
import eu.etaxonomy.cdm.api.service.IOccurrenceService;\r
import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.agent.Person;\r
import eu.etaxonomy.cdm.model.common.Annotation;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
import eu.etaxonomy.cdm.model.common.IdentifiableSource;\r
import eu.etaxonomy.cdm.model.occurrence.PreservationMethod;\r
import eu.etaxonomy.cdm.model.occurrence.Specimen;\r
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.reference.Reference;\r
\r
/**\r
* This class is a facade to the eu.etaxonomy.cdm.model.occurrence package from\r
}\r
\r
/**\r
- * Creates a derived unit facade for a given derived unit using the default configuation.\r
+ * Creates a derived unit facade for a given derived unit using the default configuration.\r
* @param derivedUnit\r
* @return\r
* @throws DerivedUnitFacadeNotSupportedException\r
* Transforms the property paths in a way that the facade is handled just like an \r
* ordinary CdmBase object.<BR>\r
* E.g. a property path "collectinAreas" will be translated into gatheringEvent.collectingAreas\r
+ * \r
+ * Not needed (?) as the facade works with REST service property paths without using this method.\r
* @param propertyPaths\r
* @return\r
*/\r
* \r
*/\r
private void setCacheStrategy() {\r
+ if (derivedUnit == null){\r
+ throw new NullPointerException("Facade's derviedUnit must not be null to set cache strategy");\r
+ }\r
derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy());\r
}\r
\r
/**\r
* Tests if a given image gallery is supported by the derived unit facade.\r
* It returns the only text data attached to the given image gallery.\r
- * It the given image gallery does not have text data attached, it is created and attached.\r
+ * If the given image gallery does not have text data attached, it is created and attached.\r
* @param imageGallery\r
* @return\r
* @throws DerivedUnitFacadeNotSupportedException\r
public LanguageString getLocality(){\r
return (hasGatheringEvent() ? getGatheringEvent(true).getLocality() : null);\r
}\r
+ /**\r
+ * convienience method for {@link #getLocality()}.{@link LanguageString#getText() getText()}\r
+ * @return\r
+ */\r
@Transient\r
public String getLocalityText(){\r
LanguageString locality = getLocality();\r
}\r
return null;\r
}\r
+ /**\r
+ * convienience method for {@link #getLocality()}.{@link LanguageString#getLanguage() getLanguage()}\r
+ * @return\r
+ */\r
@Transient\r
public Language getLocalityLanguage(){\r
LanguageString locality = getLocality();\r
public boolean hasGatheringEvent(){\r
return (getGatheringEvent(false) != null);\r
}\r
- @Transient\r
- public GatheringEvent getGatheringEvent() {\r
+ \r
+ public GatheringEvent innerGatheringEvent() {\r
return getGatheringEvent(false);\r
}\r
\r
// LanguageString languageString = getEcologyAll().getPreferredLanguageString(languages);\r
// return languageString.getText();\r
// }\r
+ /**\r
+ * Returns a copy of the multilanguage text holding the ecology data.\r
+ * @see {@link TextData#getMultilanguageText()}\r
+ * @return\r
+ */\r
@Transient\r
public Map<Language, LanguageString> getEcologyAll(){\r
if (ecology == null){\r
if (ecologyText == null){\r
ecology.removeText(language);\r
}else{\r
- ecology.putText(ecologyText, language);\r
+ ecology.putText(language, ecologyText);\r
}\r
}\r
public void removeEcology(Language language){\r
// LanguageString languageString = getPlantDescriptionAll().getPreferredLanguageString(languages);\r
// return languageString.getText();\r
// }\r
+ /**\r
+ * Returns a copy of the multilanguage text holding the description data.\r
+ * @see {@link TextData#getMultilanguageText()}\r
+ * @return\r
+ */\r
@Transient\r
public Map<Language, LanguageString> getPlantDescriptionAll(){\r
if (plantDescription == null){\r
if (plantDescriptionText == null){\r
plantDescription.removeText(language);\r
}else{\r
- plantDescription.putText(plantDescriptionText, language);\r
+ plantDescription.putText(language, plantDescriptionText);\r
}\r
}\r
public void removePlantDescription(Language language){\r
\r
public void setFieldObjectImageGallery(SpecimenDescription imageGallery) throws DerivedUnitFacadeNotSupportedException{\r
SpecimenDescription existingGallery = getFieldObjectImageGallery(false);\r
- //TODO test attached fieldObject is the same as this.getFieldObject\r
+ \r
+ //test attached specimens contain this.derivedUnit\r
+ SpecimenOrObservationBase<?> facadeFieldObservation = innerFieldObservation();\r
+ testSpecimenInImageGallery(imageGallery, facadeFieldObservation);\r
\r
if (existingGallery != null){\r
if (existingGallery != imageGallery){\r
getFieldObservation(true).setFieldNumber(fieldNumber);\r
}\r
\r
+ //primary collector\r
+ @Transient\r
+ public Person getPrimaryCollector() {\r
+ if (! hasFieldObservation()){\r
+ return null;\r
+ }else{\r
+ return getFieldObservation(true).getPrimaryCollector();\r
+ }\r
+ }\r
+ public void setPrimaryCollector(Person primaryCollector) {\r
+ getFieldObservation(true).setPrimaryCollector(primaryCollector);\r
+ }\r
+ \r
+ \r
\r
//field notes\r
@Transient\r
* Returns the field observation as an object.\r
* @return\r
*/\r
- @Transient\r
- public FieldObservation getFieldObservation(){\r
+ public FieldObservation innerFieldObservation(){\r
return getFieldObservation(false);\r
}\r
\r
}\r
public void setDerivedUnitImageGallery(SpecimenDescription imageGallery) throws DerivedUnitFacadeNotSupportedException{\r
SpecimenDescription existingGallery = getDerivedUnitImageGallery(false);\r
- //TODO test attached fieldObject is the same as this.getFieldObject\r
+ \r
+ //test attached specimens contain this.derivedUnit\r
+ SpecimenOrObservationBase facadeDerivedUnit = innerDerivedUnit();\r
+ testSpecimenInImageGallery(imageGallery, facadeDerivedUnit);\r
\r
if (existingGallery != null){\r
if (existingGallery != imageGallery){\r
this.derivedUnitMediaTextData = textData;\r
}\r
}\r
+\r
+ /**\r
+ * @param imageGallery\r
+ * @throws DerivedUnitFacadeNotSupportedException\r
+ */\r
+ private void testSpecimenInImageGallery(SpecimenDescription imageGallery, SpecimenOrObservationBase specimen) throws DerivedUnitFacadeNotSupportedException {\r
+ Set<SpecimenOrObservationBase> imageGallerySpecimens = imageGallery.getDescribedSpecimenOrObservations();\r
+ if (imageGallerySpecimens.size() < 1){\r
+ throw new DerivedUnitFacadeNotSupportedException("Image Gallery has no Specimen attached. Please attache according specimen or field observation.");\r
+ }\r
+ if (! imageGallerySpecimens.contains(specimen)){\r
+ throw new DerivedUnitFacadeNotSupportedException("Image Gallery has not the facade's field object attached. Please add field object first to image gallery specimenOrObservation list.");\r
+ }\r
+ }\r
\r
/**\r
* Returns the media for the specimen.<BR>\r
return derivedUnit.getBarcode();\r
}\r
public void setBarcode(String barcode) {\r
- derivedUnit.setCatalogNumber(barcode);\r
+ derivedUnit.setBarcode(barcode);\r
}\r
\r
\r
}\r
return this.derivedUnit.getTitleCache();\r
}\r
+ public boolean isProtectedTitleCache(){\r
+ return derivedUnit.isProtectedTitleCache();\r
+ }\r
public void setTitleCache(String titleCache, boolean isProtected) {\r
this.derivedUnit.setTitleCache(titleCache, isProtected);\r
}\r
* Returns the derived unit itself.\r
* @return the derived unit\r
*/\r
- @Transient\r
- public DerivedUnitBase getDerivedUnit() {\r
+ public DerivedUnitBase innerDerivedUnit() {\r
return this.derivedUnit;\r
}\r
\r
return result;\r
}\r
@Transient\r
- public String getExsiccatum() {\r
- logger.warn("Exsiccatum method not yet supported. Needs model change");\r
- return null;\r
+ public String getExsiccatum() throws MethodNotSupportedByDerivedUnitTypeException {\r
+ if (derivedUnit.isInstanceOf(Specimen.class)){\r
+ return CdmBase.deproxy(derivedUnit, Specimen.class).getExsiccatum();\r
+ }else{\r
+ if (this.config.isThrowExceptionForNonSpecimenPreservationMethodRequest()){\r
+ throw new MethodNotSupportedByDerivedUnitTypeException("An exsiccatum is only available in derived units of type 'Specimen' or 'Fossil'");\r
+ }else{\r
+ return null;\r
+ }\r
+ }\r
}\r
\r
public void setExsiccatum(String exsiccatum) throws Exception{\r
- throw new Exception("Exsiccatum method not yet supported. Needs model change");\r
+ if (derivedUnit.isInstanceOf(Specimen.class)){\r
+ CdmBase.deproxy(derivedUnit, Specimen.class).setExsiccatum(exsiccatum);\r
+ }else{\r
+ if (this.config.isThrowExceptionForNonSpecimenPreservationMethodRequest()){\r
+ throw new MethodNotSupportedByDerivedUnitTypeException("An exsiccatum is only available in derived units of type 'Specimen' or 'Fossil'");\r
+ }else{\r
+ return;\r
+ }\r
+ }\r
}\r
\r
\r
* @param originalNameString\r
* @return\r
*/\r
- public IdentifiableSource addSource(ReferenceBase reference, String microReference, String originalNameString){\r
+ public IdentifiableSource addSource(Reference reference, String microReference, String originalNameString){\r
IdentifiableSource source = IdentifiableSource.NewInstance(reference, microReference);\r
source.setOriginalNameString(originalNameString);\r
derivedUnit.addSource(source);\r