"typeDesignations.typeName.$",
"typeDesignations.citation",
"typeDesignations.citation.authorship.$",
+ "typeDesignations.annotations", // needed for AnnotatableEntity.clone() in DerivedUnitConverter.copyPropertiesTo
+ "typeDesignations.markers", // needed for AnnotatableEntity.clone() in DerivedUnitConverter.copyPropertiesTo
+ "typeDesignations.registrations", // DerivedUnitConverter.copyPropertiesTo(TARGET n)
+
// name
"name.$",
"name.nomenclaturalReference.authorship.$",
FieldUnit fieldUnit = FieldUnit.NewInstance();
GatheringEvent gatheringEvent = GatheringEvent.NewInstance();
fieldUnit.setGatheringEvent(gatheringEvent);
- repo.getOccurrenceService().save(fieldUnit);
+ fieldUnit = (FieldUnit) repo.getOccurrenceService().save(fieldUnit);
VersionableEntity baseEntity = bean.getBaseEntity();
Set<TypeDesignationBase> typeDesignations = regDTO.getTypeDesignationsInWorkingSet(
Session session = repo.getSession();
-// PersistentContextAnalyzer regAnalyzer = new PersistentContextAnalyzer(dto.getOwner(), session);
-// regAnalyzer.printEntityGraph(System.out);
-// regAnalyzer.printCopyEntities(System.out);
-
session.merge(dto.getOwner());
session.flush();
// ------------------------ perform delete of removed SpecimenTypeDesignations
+ // this step also includes the deletion of DerivedUnits which have been converted by
+ // the DerivedUnitConverter in turn of a kindOfUnit change
for(SpecimenTypeDesignation std : dto.deletedSpecimenTypeDesignations()){
deleteSpecimenTypeDesignation(dto, std);
}
- session.flush();
}
import eu.etaxonomy.cdm.api.utility.DerivedUnitConversionException;
import eu.etaxonomy.cdm.api.utility.DerivedUnitConverter;
-import eu.etaxonomy.cdm.api.utility.DerivedUnitConverterFactory;
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
import eu.etaxonomy.cdm.model.common.DefinedTerm;
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
public class SpecimenTypeDesignationDTO {
SpecimenTypeDesignation std;
+ private DerivedUnit replacedTypeSpecimen;
/**
* @return the std
return std;
}
+ public DerivedUnit replacedTypeSpecimen(){
+ return replacedTypeSpecimen;
+ }
+
/**
* Creates an new new instance of SpecimenTypeDesignationDTO which is backed up
* by an newly instantiated <code>SpecimenTypeDesignation.typeSpecimen.derivedFrom.type</code> object graph.
Class<? extends DerivedUnit> currentType = typeSpecimen.getClass();
if(!requiredSpecimenType.equals(currentType)){
-
- DerivedUnit convertedSpecimen;
-
SpecimenOrObservationType convertToType = specimenOrObservationTypeFor(kindOfUnit);
if(requiredSpecimenType.equals(MediaSpecimen.class)){
- DerivedUnitConverter<MediaSpecimen> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, MediaSpecimen.class);
- convertedSpecimen = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
+ DerivedUnitConverter<MediaSpecimen> converter = new DerivedUnitConverter<MediaSpecimen>(std);
+ std = converter.convertTo((Class<MediaSpecimen>)requiredSpecimenType, convertToType);
} else {
if(currentType == MediaSpecimen.class){
MediaSpecimen mediaSpecimen = (MediaSpecimen)typeSpecimen;
// set null to allow conversion
mediaSpecimen.setMediaSpecimen(null);
}
- DerivedUnitConverter<DerivedUnit> converter = DerivedUnitConverterFactory.createDerivedUnitConverter(typeSpecimen, DerivedUnit.class);
- convertedSpecimen = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, convertToType);
+ DerivedUnitConverter<DerivedUnit> converter = new DerivedUnitConverter<DerivedUnit>(std);
+ std = converter.convertTo((Class<DerivedUnit>)requiredSpecimenType, convertToType);
+ }
+ if(typeSpecimen.getId() != 0){
+ replacedTypeSpecimen = typeSpecimen;
}
- std.setTypeSpecimen(convertedSpecimen);
}
}
+ /**
+ *
+ * @return the total count of typeDesignations associated with the type specimen
+ */
+ public int getAssociatedTypeDesignationCount() {
+ return std.getTypeSpecimen().getSpecimenTypeDesignations().size();
+ }
+
/**
* See constructor doc.
import eu.etaxonomy.cdm.model.location.Point;
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
import eu.etaxonomy.cdm.model.name.TaxonName;
+import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
import eu.etaxonomy.cdm.model.occurrence.GatheringEvent;
import eu.etaxonomy.cdm.model.reference.Reference;
package eu.etaxonomy.cdm.vaadin.view.name;
import java.util.Arrays;
+import java.util.List;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Component;
*
* The fieldname must match the properties of the SpecimenTypeDesignationDTO
*/
- RowListSelect kindOfUnit = new RowListSelect();
+ TextField associatedTypeDesignationCount = new TextField();
+ RowListSelect kindOfUnit = new RowListSelect(); // position is IMPORTANT, see rowListSelectColumn()
ListSelect typeStatus = new ListSelect();
ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection> collection =
new ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection>(null, eu.etaxonomy.cdm.model.occurrence.Collection.class);
kindOfUnit.setRow(this);
typeStatus.setRows(1);
typeStatus.setRequired(true);
+
accessionNumber.setWidth(100, Unit.PIXELS);
preferredStableUri.setWidth(150, Unit.PIXELS);
preferredStableUri.setConverter(new UriConverter());
*/
public Component[] components() {
Component[] components = new Component[]{
+ associatedTypeDesignationCount,
kindOfUnit, typeStatus,
collection, accessionNumber,
preferredStableUri,
mediaUri, mediaSpecimenReference,
- mediaSpecimenReferenceDetail, mediaSpecimenReferenceDetail
+ mediaSpecimenReferenceDetail
};
addAll(Arrays.asList(components));
return components;
}
+ public static List<String> visibleFields() {
+ List<String> visibleFields = Arrays.asList(new String[]{
+ "kindOfUnit", "typeStatus",
+ "collection", "accessionNumber",
+ "preferredStableUri",
+ "mediaUri", "mediaSpecimenReference",
+ "mediaSpecimenReferenceDetail"
+ });
+ return visibleFields;
+ }
+
@Override
public void updateRowItemsEnablement() {
boolean publishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.PUBLISHED_IMAGE());
boolean unPublishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.UNPUBLISHED_IMAGE());
- mediaSpecimenReference.setEnabled(publishedImageType);
- mediaSpecimenReferenceDetail.setEnabled(publishedImageType);
+ boolean kindOfUnitLocked = !associatedTypeDesignationCount.getValue().isEmpty() && Integer.valueOf(associatedTypeDesignationCount.getValue()) > 1;
+ kindOfUnit.setEnabled(!kindOfUnitLocked);
+ kindOfUnit.setDescription(kindOfUnitLocked ?
+ "Can not be changed since the type specimen is associated with multiple type designations" : "");
+ mediaSpecimenReference.setEnabled(publishedImageType || unPublishedImageType);
+ mediaSpecimenReferenceDetail.setEnabled(publishedImageType || unPublishedImageType);
mediaUri.setEnabled(publishedImageType || unPublishedImageType);
}
+ /**
+ *
+ * @return the 0-based position index of the <code>kindOfUnit</code> field in this class
+ * which are visible according to {@link #visibleFields())
+ */
+ public static int rowListSelectColumn(){
+ return 0;
+ }
+
class RowListSelect extends ListSelect implements CollectionRowRepresentative {
private static final long serialVersionUID = 3235653923633494213L;
// FIXME: can we use the Grid instead?
typeDesignationsCollectionField = new ElementCollectionField<>(
SpecimenTypeDesignationDTO.class,
- //getPresenter().specimenTypeDesignationDTOInstantiator(getBean());
SpecimenTypeDesignationDTORow.class
);
typeDesignationsCollectionField.withCaption("Types");
typeDesignationsCollectionField.getLayout().setSpacing(false);
typeDesignationsCollectionField.getLayout().setColumns(3);
+ typeDesignationsCollectionField.setVisibleProperties(SpecimenTypeDesignationDTORow.visibleFields());
+
typeDesignationsCollectionField.setPropertyHeader("accessionNumber", "Access. num.");
typeDesignationsCollectionField.setPropertyHeader("preferredStableUri", "Stable URI");
typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReference", "Image reference");
super.afterItemDataSourceSet();
GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
for(int rowIndex = 1; rowIndex < gridLayout.getRows(); rowIndex++){ // first row is header
- Component item = gridLayout.getComponent(0, rowIndex);
+ Component item = gridLayout.getComponent(SpecimenTypeDesignationDTORow.rowListSelectColumn(), rowIndex);
((CollectionRowRepresentative)item).updateRowItemsEnabledStates();
}
updateAllowDelete();