import java.util.Optional;
import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
import org.hibernate.search.hcore.util.impl.HibernateHelper;
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeCacheStrategy;
import eu.etaxonomy.cdm.api.service.exception.RegistrationValidationException;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.IdentifiableSource;
import eu.etaxonomy.cdm.model.common.TermVocabulary;
import eu.etaxonomy.cdm.model.common.VersionableEntity;
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
+import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen;
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
import eu.etaxonomy.cdm.ref.EntityReference;
import eu.etaxonomy.cdm.ref.TypedEntityReference;
final VersionableEntity baseEntity = baseEntity(td);
final TypedEntityReference<VersionableEntity> baseEntityReference = makeEntityReference(baseEntity);
- EntityReference typeDesignationEntityReference = new EntityReference(td.getUuid(), stringify(td));
+ TypedEntityReference typeDesignationEntityReference = new TypedEntityReference(
+ HibernateProxyHelper.deproxy(td).getClass(),
+ td.getUuid(),
+ stringify(td));
TypeDesignationWorkingSet typedesignationWorkingSet;
if(!byBaseEntityByTypeStatus.containsKey(baseEntityReference)){
workingsetBuilder.add(TagEnum.label, typeStatus.getLabel() + (isPlural ? "s:" : ","));
}
int typeDesignationCount = 0;
- for(EntityReference typeDesignationEntityReference : typeDesignationWorkingSet.get(typeStatus)) {
+ for(TypedEntityReference typeDesignationEntityReference : typeDesignationWorkingSet.get(typeStatus)) {
if(typeDesignationCount++ > 0){
workingsetBuilder.add(TagEnum.separator, TYPE_DESIGNATION_SEPARATOR);
}
- workingsetBuilder.add(TagEnum.typeDesignation, typeDesignationEntityReference.getLabel(), new TypedEntityReference<TypeDesignationBase>(TypeDesignationBase.class, typeDesignationEntityReference.getUuid()));
+ workingsetBuilder.add(TagEnum.typeDesignation, typeDesignationEntityReference.getLabel(), typeDesignationEntityReference);
}
}
typeDesignationWorkingSet.setRepresentation(workingsetBuilder.toString());
if(du.isProtectedTitleCache()){
result += du.getTitleCache();
} else {
- DerivedUnitFacadeCacheStrategy cacheStrategy = new DerivedUnitFacadeCacheStrategy();
- result += cacheStrategy.getTitleCache(du, true);
+ du = HibernateProxyHelper.deproxy(du);
+ boolean isMediaSpecimen = du instanceof MediaSpecimen;
+ String typeSpecimenTitle = "";
+ if(isMediaSpecimen && HibernateProxyHelper.deproxyOrNull(du.getCollection()) == null) {
+ // special case of an published image which is not covered by the DerivedUnitFacadeCacheStrategy
+ MediaSpecimen msp = (MediaSpecimen)du;
+ if(msp.getMediaSpecimen() != null){
+ for(IdentifiableSource source : msp.getMediaSpecimen().getSources()){
+ String refDetailStr = source.getCitationMicroReference();
+ String referenceStr = source.getCitation().getTitleCache();
+ if(StringUtils.isNotBlank(source.getCitationMicroReference())){
+ typeSpecimenTitle += refDetailStr;
+ }
+ if(!typeSpecimenTitle.isEmpty() && !referenceStr.isEmpty()){
+ typeSpecimenTitle += " in ";
+ }
+ typeSpecimenTitle += referenceStr + " ";
+ }
+ }
+ } else {
+ DerivedUnitFacadeCacheStrategy cacheStrategy = new DerivedUnitFacadeCacheStrategy();
+ typeSpecimenTitle += cacheStrategy.getTitleCache(du, true);
+ }
+
+ result += (isMediaSpecimen ? "[icon] " : "") + typeSpecimenTitle.trim();
}
}
}
*
* A workingset can be referenced by the <code>baseEntityReference</code>.
*/
- public class TypeDesignationWorkingSet extends LinkedHashMap<TypeDesignationStatusBase<?>, Collection<EntityReference>> {
+ public class TypeDesignationWorkingSet extends LinkedHashMap<TypeDesignationStatusBase<?>, Collection<TypedEntityReference>> {
private static final long serialVersionUID = -1329007606500890729L;
return baseEntity;
}
- public List<EntityReference> getTypeDesignations() {
- List<EntityReference> typeDesignations = new ArrayList<>();
+ public List<TypedEntityReference> getTypeDesignations() {
+ List<TypedEntityReference> typeDesignations = new ArrayList<>();
this.values().forEach(typeDesignationReferences -> typeDesignationReferences.forEach(td -> typeDesignations.add(td)));
return typeDesignations;
}
* @param status
* @param typeDesignationEntityReference
*/
- public void insert(TypeDesignationStatusBase<?> status, EntityReference typeDesignationEntityReference) {
+ public void insert(TypeDesignationStatusBase<?> status, TypedEntityReference typeDesignationEntityReference) {
if(status == null){
status = NULL_STATUS;