diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java index a4cc92b22870673cc0134e337eb2dc161e835cbb..cdadf650d1b4d90d34138c24e83be8cf141f2fd2 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java @@ -190,11 +190,11 @@ public class MasterDataExtractor { if (vocabularies.size() > 0) { - Element vocabsElement = doc.createElement("vocabularies"); + Element vocabsElement = doc.createElement("controlledVocabularies"); rootElement.appendChild(vocabsElement); for (IVocabularyImmutable vocabImmutable : vocabularies) { - Element vocabElement = doc.createElement("vocabulary"); + Element vocabElement = doc.createElement("controlledVocabulary"); String code = vocabImmutable.isInternalNamespace() && vocabImmutable.getCode().startsWith(INTERNAL_NAMESPACE_PREFIX) ? CodeConverter.tryToDatabase(vocabImmutable.getCode()) : vocabImmutable.getCode(); @@ -267,12 +267,12 @@ public class MasterDataExtractor { if (experimentTypes.size() > 0) { - Element experimentTypesElement = doc.createElement("experimentTypes"); + Element experimentTypesElement = doc.createElement("collectionTypes"); rootElement.appendChild(experimentTypesElement); Map<String, List<PropertyAssignment>> expTypeCodePropAssignmentMap = loadExperimentTypesUsingV3WithPropertyAssignments(); for (IExperimentTypeImmutable expType : experimentTypes) { - Element experimentTypeElement = getEntityTypeXML(doc, expType, "experimentType"); + Element experimentTypeElement = getEntityTypeXML(doc, expType, "collectionType"); experimentTypeElement.setAttribute("description", expType.getDescription()); // TODO validation script? experimentTypesElement.appendChild(experimentTypeElement); @@ -286,13 +286,13 @@ public class MasterDataExtractor { if (sampleTypes.size() > 0) { - Element sampleTypesElement = doc.createElement("sampleTypes"); + Element sampleTypesElement = doc.createElement("objectTypes"); rootElement.appendChild(sampleTypesElement); Map<String, List<PropertyAssignment>> sampleTypeCodePropAssignmentMap = loadSampleTypesUsingV3WithPropertyAssignments(); for (ISampleTypeImmutable sampleType : sampleTypes) { - Element sampleTypeElement = getEntityTypeXML(doc, sampleType, "sampleType"); + Element sampleTypeElement = getEntityTypeXML(doc, sampleType, "objectType"); sampleTypeElement.setAttribute("description", sampleType.getDescription()); sampleTypeElement.setAttribute("listable", String.valueOf(sampleType.isListable())); sampleTypeElement.setAttribute("showContainer", String.valueOf(sampleType.isShowContainer())); diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java index a1dd6caab805d4de312fdfa5feeb6bdef5251b25..8a5533855cdbe8b249ecf123cfbe4074eb8b312a 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java @@ -584,7 +584,14 @@ public class EntitySynchronizer // delete materials MaterialDeletionOptions matDeletionOptions = new MaterialDeletionOptions(); matDeletionOptions.setReason("sync materials"); - v3Api.deleteMaterials(sessionToken, matPermIds, matDeletionOptions); + + try + { + v3Api.deleteMaterials(sessionToken, matPermIds, matDeletionOptions); + } catch (Exception e) + { + operationLog.warn("One or more materials could not be deleted due to: " + e.getMessage()); + } // confirm deletions ArrayList<IDeletionId> deletionIds = new ArrayList<IDeletionId>(); diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java index 65fb0e249c989ccc0be68f980cb2e814e6dca9bd..30b7a11486a40940b27dec6e7c9c7a68f5633747 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java @@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewVocabulary; @@ -59,6 +60,8 @@ public class MasterDataParser { private final INameTranslator nameTranslator; + private Map<String, FileFormatType> fileFormatTypes = new HashMap<String, FileFormatType>(); + private Map<String, PropertyType> propertyTypes = new HashMap<String, PropertyType>(); private Map<String, SampleType> sampleTypes = new HashMap<String, SampleType>(); @@ -68,17 +71,11 @@ public class MasterDataParser private Map<String, ExperimentType> experimentTypes = new HashMap<String, ExperimentType>(); private Map<String, MaterialType> materialTypes = new HashMap<String, MaterialType>(); - private Map<String, NodeList> materialTypePropertyAssignmentsMap = new HashMap<String, NodeList>(); private Map<String, NewVocabulary> vocabularies = new HashMap<String, NewVocabulary>(); MultiKeyMap<String, List<NewETPTAssignment>> entityPropertyAssignments = new MultiKeyMap<String, List<NewETPTAssignment>>(); - public Map<String, NewVocabulary> getVocabularies() - { - return vocabularies; - } - private MasterDataParser(INameTranslator nameTranslator) { this.nameTranslator = nameTranslator; @@ -108,12 +105,23 @@ public class MasterDataParser throw new XPathExpressionException("The master data resurce list should contain 1 master data element"); } Element docElement = (Element) xdNode; - parseVocabularies(docElement.getElementsByTagName("vocabularies")); + parseFileFormatTypes(docElement.getElementsByTagName("fileFormatTypes")); + parseVocabularies(docElement.getElementsByTagName("controlledVocabularies")); parseMaterialTypes(docElement.getElementsByTagName("materialTypes")); parsePropertyTypes(docElement.getElementsByTagName("propertyTypes")); - parseSampleTypes(docElement.getElementsByTagName("sampleTypes")); + parseSampleTypes(docElement.getElementsByTagName("objectTypes")); parseDataSetTypes(docElement.getElementsByTagName("dataSetTypes")); - parseExperimentTypes(docElement.getElementsByTagName("experimentTypes")); + parseExperimentTypes(docElement.getElementsByTagName("collectionTypes")); + } + + public Map<String, FileFormatType> getFileFormatTypes() + { + return fileFormatTypes; + } + + public Map<String, NewVocabulary> getVocabularies() + { + return vocabularies; } public Map<String, PropertyType> getPropertyTypes() @@ -146,28 +154,47 @@ public class MasterDataParser return materialTypes; } - private void parseVocabularies(NodeList vocabulariesNode) + private void parseFileFormatTypes(NodeList fileFormatTypesNode) { - if (vocabulariesNode.getLength() == 1) + assert fileFormatTypesNode.getLength() == 1 : "Resource List should contain a single 'fileFormatTypes' node"; + + Element fileFormatTypesElement = (Element) fileFormatTypesNode.item(0); + NodeList fileFormatTypeNodes = fileFormatTypesElement.getElementsByTagName("fileFormatType"); + + for (int i = 0; i < fileFormatTypeNodes.getLength(); i++) { - Element vocabsElement = (Element) vocabulariesNode.item(0); - NodeList vocabNodes = vocabsElement.getElementsByTagName("vocabulary"); + Element typeElement = (Element) fileFormatTypeNodes.item(i); + + FileFormatType type = new FileFormatType(); + String code = getAttribute(typeElement, "code"); + type.setCode(code); + type.setDescription(getAttribute(typeElement, "description")); + + fileFormatTypes.put(code, type); + } + } - for (int i = 0; i < vocabNodes.getLength(); i++) - { - Element vocabElement = (Element) vocabNodes.item(i); - String code = getAttribute(vocabElement, "code"); - - NewVocabulary newVocabulary = new NewVocabulary(); - newVocabulary.setCode(code); - newVocabulary.setDescription(getAttribute(vocabElement, "description")); - newVocabulary.setURLTemplate(getAttribute(vocabElement, "urlTemplate")); - newVocabulary.setManagedInternally(Boolean.valueOf(getAttribute(vocabElement, "managedInternally"))); - newVocabulary.setInternalNamespace(Boolean.valueOf(getAttribute(vocabElement, "internalNamespace"))); - newVocabulary.setChosenFromList(Boolean.valueOf(getAttribute(vocabElement, "chosenFromList"))); - vocabularies.put(CodeConverter.tryToBusinessLayer(newVocabulary.getCode(), newVocabulary.isInternalNamespace()), newVocabulary); - parseVocabularyTerms(vocabElement, newVocabulary); - } + private void parseVocabularies(NodeList vocabulariesNode) + { + assert vocabulariesNode.getLength() == 1 : "Resource List should contain a single 'controlledVocabularies' node"; + + Element vocabsElement = (Element) vocabulariesNode.item(0); + NodeList vocabNodes = vocabsElement.getElementsByTagName("controlledVocabulary"); + + for (int i = 0; i < vocabNodes.getLength(); i++) + { + Element vocabElement = (Element) vocabNodes.item(i); + String code = getAttribute(vocabElement, "code"); + + NewVocabulary newVocabulary = new NewVocabulary(); + newVocabulary.setCode(code); + newVocabulary.setDescription(getAttribute(vocabElement, "description")); + newVocabulary.setURLTemplate(getAttribute(vocabElement, "urlTemplate")); + newVocabulary.setManagedInternally(Boolean.valueOf(getAttribute(vocabElement, "managedInternally"))); + newVocabulary.setInternalNamespace(Boolean.valueOf(getAttribute(vocabElement, "internalNamespace"))); + newVocabulary.setChosenFromList(Boolean.valueOf(getAttribute(vocabElement, "chosenFromList"))); + vocabularies.put(CodeConverter.tryToBusinessLayer(newVocabulary.getCode(), newVocabulary.isInternalNamespace()), newVocabulary); + parseVocabularyTerms(vocabElement, newVocabulary); } } @@ -194,172 +221,166 @@ public class MasterDataParser private void parseMaterialTypes(NodeList matTypesNode) { - if (matTypesNode.getLength() == 1) + assert matTypesNode.getLength() == 1 : "Resource List should contain a single 'materialTypes' node"; + + Element matTypesElement = (Element) matTypesNode.item(0); + NodeList matTypeNodes = matTypesElement.getElementsByTagName("materialType"); + for (int i = 0; i < matTypeNodes.getLength(); i++) { - Element matTypesElement = (Element) matTypesNode.item(0); - NodeList matTypeNodes = matTypesElement.getElementsByTagName("materialType"); - for (int i = 0; i < matTypeNodes.getLength(); i++) - { - Element materialTypeElement = (Element) matTypeNodes.item(i); - MaterialType materialType = new MaterialType(); - materialType.setCode(getAttribute(materialTypeElement, "code")); - materialType.setDescription(getAttribute(materialTypeElement, "description")); - materialTypes.put(materialType.getCode(), materialType); + Element materialTypeElement = (Element) matTypeNodes.item(i); + MaterialType materialType = new MaterialType(); + materialType.setCode(getAttribute(materialTypeElement, "code")); + materialType.setDescription(getAttribute(materialTypeElement, "description")); + materialTypes.put(materialType.getCode(), materialType); - parsePropertyAssignments(EntityKind.MATERIAL, materialType, materialTypeElement.getElementsByTagName("propertyAssignments")); - } + parsePropertyAssignments(EntityKind.MATERIAL, materialType, materialTypeElement.getElementsByTagName("propertyAssignments")); } } private void parseExperimentTypes(NodeList expTypesNode) { - if (expTypesNode.getLength() == 1) + assert expTypesNode.getLength() == 1 : "Resource List should contain a single 'collectionTypes' node"; + + Element expTypesElement = (Element) expTypesNode.item(0); + NodeList expTypeNodes = expTypesElement.getElementsByTagName("collectionType"); + for (int i = 0; i < expTypeNodes.getLength(); i++) { - Element expTypesElement = (Element) expTypesNode.item(0); - NodeList expTypeNodes = expTypesElement.getElementsByTagName("experimentType"); - for (int i = 0; i < expTypeNodes.getLength(); i++) - { - Element expTypeElement = (Element) expTypeNodes.item(i); - String code = getAttribute(expTypeElement, "code"); - ExperimentType expType = new ExperimentType(); - expType.setCode(code); - expType.setDescription(getAttribute(expTypeElement, "description")); - experimentTypes.put(expType.getCode(), expType); - - parsePropertyAssignments(EntityKind.EXPERIMENT, expType, expTypeElement.getElementsByTagName("propertyAssignments")); - } + Element expTypeElement = (Element) expTypeNodes.item(i); + String code = getAttribute(expTypeElement, "code"); + ExperimentType expType = new ExperimentType(); + expType.setCode(code); + expType.setDescription(getAttribute(expTypeElement, "description")); + experimentTypes.put(expType.getCode(), expType); + + parsePropertyAssignments(EntityKind.EXPERIMENT, expType, expTypeElement.getElementsByTagName("propertyAssignments")); } } private void parseSampleTypes(NodeList sampleTypesNode) { - if (sampleTypesNode.getLength() == 1) + assert sampleTypesNode.getLength() == 1 : "Resource List should contain a single 'objectTypes' node"; + + Element sampleTypesElement = (Element) sampleTypesNode.item(0); + NodeList sampleTypeNodes = sampleTypesElement.getElementsByTagName("objectType"); + for (int i = 0; i < sampleTypeNodes.getLength(); i++) { - Element sampleTypesElement = (Element) sampleTypesNode.item(0); - NodeList sampleTypeNodes = sampleTypesElement.getElementsByTagName("sampleType"); - for (int i = 0; i < sampleTypeNodes.getLength(); i++) - { - Element sampleTypeElement = (Element) sampleTypeNodes.item(i); - SampleType sampleType = new SampleType(); - sampleType.setCode(getAttribute(sampleTypeElement, "code")); - sampleType.setDescription(getAttribute(sampleTypeElement, "description")); - sampleType.setListable(Boolean.valueOf(getAttribute(sampleTypeElement, "listable"))); - sampleType.setShowContainer(Boolean.valueOf(getAttribute(sampleTypeElement, "showContainer"))); - sampleType.setShowParents(Boolean.valueOf(getAttribute(sampleTypeElement, "showParents"))); - sampleType.setShowParentMetadata(Boolean.valueOf(getAttribute(sampleTypeElement, "showParentMetadata"))); - sampleType.setSubcodeUnique(Boolean.valueOf(getAttribute(sampleTypeElement, "subcodeUnique"))); - sampleType.setAutoGeneratedCode(Boolean.valueOf(getAttribute(sampleTypeElement, "autoGeneratedCode"))); - sampleType.setGeneratedCodePrefix(getAttribute(sampleTypeElement, "generatedCodePrefix")); - sampleTypes.put(sampleType.getCode(), sampleType); - - parsePropertyAssignments(EntityKind.SAMPLE, sampleType, sampleTypeElement.getElementsByTagName("propertyAssignments")); - } + Element sampleTypeElement = (Element) sampleTypeNodes.item(i); + SampleType sampleType = new SampleType(); + sampleType.setCode(getAttribute(sampleTypeElement, "code")); + sampleType.setDescription(getAttribute(sampleTypeElement, "description")); + sampleType.setListable(Boolean.valueOf(getAttribute(sampleTypeElement, "listable"))); + sampleType.setShowContainer(Boolean.valueOf(getAttribute(sampleTypeElement, "showContainer"))); + sampleType.setShowParents(Boolean.valueOf(getAttribute(sampleTypeElement, "showParents"))); + sampleType.setShowParentMetadata(Boolean.valueOf(getAttribute(sampleTypeElement, "showParentMetadata"))); + sampleType.setSubcodeUnique(Boolean.valueOf(getAttribute(sampleTypeElement, "subcodeUnique"))); + sampleType.setAutoGeneratedCode(Boolean.valueOf(getAttribute(sampleTypeElement, "autoGeneratedCode"))); + sampleType.setGeneratedCodePrefix(getAttribute(sampleTypeElement, "generatedCodePrefix")); + sampleTypes.put(sampleType.getCode(), sampleType); + + parsePropertyAssignments(EntityKind.SAMPLE, sampleType, sampleTypeElement.getElementsByTagName("propertyAssignments")); } } private void parseDataSetTypes(NodeList dataSetTypesNode) { - if (dataSetTypesNode.getLength() == 1) + assert dataSetTypesNode.getLength() == 1 : "Resource List should contain a single 'dataSetTypes' node"; + + Element dataSetTypesElement = (Element) dataSetTypesNode.item(0); + NodeList dataSetTypeNodes = dataSetTypesElement.getElementsByTagName("dataSetType"); + for (int i = 0; i < dataSetTypeNodes.getLength(); i++) { - Element dataSetTypesElement = (Element) dataSetTypesNode.item(0); - NodeList dataSetTypeNodes = dataSetTypesElement.getElementsByTagName("dataSetType"); - for (int i = 0; i < dataSetTypeNodes.getLength(); i++) + Element dataSetTypeElement = (Element) dataSetTypeNodes.item(i); + String code = getAttribute(dataSetTypeElement, "code"); + DataSetType dataSetType = new DataSetType(); + dataSetType.setCode(code); + dataSetType.setDescription(getAttribute(dataSetTypeElement, "description")); + dataSetType.setDataSetKind(DataSetKind.valueOf(getAttribute(dataSetTypeElement, "dataSetKind"))); + String mainDataSetPattern = getAttribute(dataSetTypeElement, "mainDataSetPattern"); + if (mainDataSetPattern.length() < 1) { - Element dataSetTypeElement = (Element) dataSetTypeNodes.item(i); - String code = getAttribute(dataSetTypeElement, "code"); - DataSetType dataSetType = new DataSetType(); - dataSetType.setCode(code); - dataSetType.setDescription(getAttribute(dataSetTypeElement, "description")); - dataSetType.setDataSetKind(DataSetKind.valueOf(getAttribute(dataSetTypeElement, "dataSetKind"))); - String mainDataSetPattern = getAttribute(dataSetTypeElement, "mainDataSetPattern"); - if (mainDataSetPattern.length() < 1) - { - dataSetType.setMainDataSetPattern(null); - } - else - { - dataSetType.setMainDataSetPattern(mainDataSetPattern); - } - if (mainDataSetPattern.length() < 1) - { - dataSetType.setMainDataSetPath(null); - } - else - { - dataSetType.setMainDataSetPath(mainDataSetPattern); - } - dataSetType.setDeletionDisallow(Boolean.valueOf(getAttribute(dataSetTypeElement, "deletionDisallowed"))); - dataSetTypes.put(dataSetType.getCode(), dataSetType); - - parsePropertyAssignments(EntityKind.DATA_SET, dataSetType, dataSetTypeElement.getElementsByTagName("propertyAssignments")); + dataSetType.setMainDataSetPattern(null); } + else + { + dataSetType.setMainDataSetPattern(mainDataSetPattern); + } + if (mainDataSetPattern.length() < 1) + { + dataSetType.setMainDataSetPath(null); + } + else + { + dataSetType.setMainDataSetPath(mainDataSetPattern); + } + dataSetType.setDeletionDisallow(Boolean.valueOf(getAttribute(dataSetTypeElement, "deletionDisallowed"))); + dataSetTypes.put(dataSetType.getCode(), dataSetType); + + parsePropertyAssignments(EntityKind.DATA_SET, dataSetType, dataSetTypeElement.getElementsByTagName("propertyAssignments")); } } private void parsePropertyAssignments(EntityKind entityKind, EntityType entityType, NodeList propertyAssignmentsNode) { - if (propertyAssignmentsNode.getLength() == 1) + assert propertyAssignmentsNode.getLength() == 1 : "Resource List should contain a single property assignments node"; + + List<NewETPTAssignment> list = new ArrayList<NewETPTAssignment>(); + Element propertyAssignmentsElement = (Element) propertyAssignmentsNode.item(0); + NodeList propertyAssignmentNodes = propertyAssignmentsElement.getElementsByTagName("propertyAssignment"); + for (int i = 0; i < propertyAssignmentNodes.getLength(); i++) { - List<NewETPTAssignment> list = new ArrayList<NewETPTAssignment>(); - Element propertyAssignmentsElement = (Element) propertyAssignmentsNode.item(0); - NodeList propertyAssignmentNodes = propertyAssignmentsElement.getElementsByTagName("propertyAssignment"); - for (int i = 0; i < propertyAssignmentNodes.getLength(); i++) - { - Element propertyAssignmentElement = (Element) propertyAssignmentNodes.item(i); - String propertyTypeCode = getAttribute(propertyAssignmentElement, "property_type_code"); - NewETPTAssignment assignment = new NewETPTAssignment(); - assignment.setPropertyTypeCode(propertyTypeCode); - assignment.setEntityKind(entityType.getEntityKind()); - assignment.setEntityTypeCode(entityType.getCode()); - assignment.setMandatory(Boolean.valueOf(getAttribute(propertyAssignmentElement, "mandatory"))); - assignment.setDefaultValue(ERROR_PROPERTY_PREFIX); - assignment.setSection(getAttribute(propertyAssignmentElement, "section")); - assignment.setOrdinal(Long.valueOf(getAttribute(propertyAssignmentElement, "ordinal"))); - assignment.setShownInEditView(Boolean.valueOf(getAttribute(propertyAssignmentElement, "showInEdit"))); - list.add(assignment); - } - entityPropertyAssignments.put(entityType.getEntityKind().name(), entityType.getCode(), list); + Element propertyAssignmentElement = (Element) propertyAssignmentNodes.item(i); + String propertyTypeCode = getAttribute(propertyAssignmentElement, "propertyTypeCode"); + NewETPTAssignment assignment = new NewETPTAssignment(); + assignment.setPropertyTypeCode(propertyTypeCode); + assignment.setEntityKind(entityType.getEntityKind()); + assignment.setEntityTypeCode(entityType.getCode()); + assignment.setMandatory(Boolean.valueOf(getAttribute(propertyAssignmentElement, "mandatory"))); + assignment.setDefaultValue(ERROR_PROPERTY_PREFIX); + assignment.setSection(getAttribute(propertyAssignmentElement, "section")); + assignment.setOrdinal(Long.valueOf(getAttribute(propertyAssignmentElement, "ordinal"))); + assignment.setShownInEditView(Boolean.valueOf(getAttribute(propertyAssignmentElement, "showInEdit"))); + list.add(assignment); } + entityPropertyAssignments.put(entityType.getEntityKind().name(), entityType.getCode(), list); } private void parsePropertyTypes(NodeList propertyTypesNode) { - if (propertyTypesNode.getLength() == 1) + assert propertyTypesNode.getLength() == 1 : "Resource List should contain a single 'propertyTypes' node"; + + Element propertyTypesElement = (Element) propertyTypesNode.item(0); + NodeList propertyTypeNodes = propertyTypesElement.getElementsByTagName("propertyType"); + for (int i = 0; i < propertyTypeNodes.getLength(); i++) { - Element propertyTypesElement = (Element) propertyTypesNode.item(0); - NodeList propertyTypeNodes = propertyTypesElement.getElementsByTagName("propertyType"); - for (int i = 0; i < propertyTypeNodes.getLength(); i++) + Element propertyTypeElement = (Element) propertyTypeNodes.item(i); + PropertyType newPropertyType = new PropertyType(); + + String code = getAttribute(propertyTypeElement, "code"); + newPropertyType.setLabel(getAttribute(propertyTypeElement, "label")); + DataTypeCode dataTypeCode = DataTypeCode.valueOf(getAttribute(propertyTypeElement, "dataType")); + newPropertyType.setDataType(new DataType(dataTypeCode)); + newPropertyType.setDescription(getAttribute(propertyTypeElement, "description")); + newPropertyType.setManagedInternally(Boolean.valueOf(getAttribute(propertyTypeElement, "managedInternally"))); + newPropertyType.setInternalNamespace(Boolean.valueOf(getAttribute(propertyTypeElement, "internalNamespace"))); + newPropertyType.setCode(CodeConverter.tryToBusinessLayer(code, newPropertyType.isInternalNamespace())); + + propertyTypes.put(newPropertyType.getCode(), newPropertyType); + if (dataTypeCode.equals(DataTypeCode.CONTROLLEDVOCABULARY)) { - Element propertyTypeElement = (Element) propertyTypeNodes.item(i); - PropertyType newPropertyType = new PropertyType(); - - String code = getAttribute(propertyTypeElement, "code"); - newPropertyType.setLabel(getAttribute(propertyTypeElement, "label")); - DataTypeCode dataTypeCode = DataTypeCode.valueOf(getAttribute(propertyTypeElement, "dataType")); - newPropertyType.setDataType(new DataType(dataTypeCode)); - newPropertyType.setDescription(getAttribute(propertyTypeElement, "description")); - newPropertyType.setManagedInternally(Boolean.valueOf(getAttribute(propertyTypeElement, "managedInternally"))); - newPropertyType.setInternalNamespace(Boolean.valueOf(getAttribute(propertyTypeElement, "internalNamespace"))); - newPropertyType.setCode(CodeConverter.tryToBusinessLayer(code, newPropertyType.isInternalNamespace())); - - propertyTypes.put(newPropertyType.getCode(), newPropertyType); - if (dataTypeCode.equals(DataTypeCode.CONTROLLEDVOCABULARY)) + String vocabularyCode = getAttribute(propertyTypeElement, "vocabulary"); + newPropertyType.setVocabulary(vocabularies.get(vocabularyCode)); + } + else if (dataTypeCode.equals(DataTypeCode.MATERIAL)) + { + String materialCode = getAttribute(propertyTypeElement, "material"); + if (materialCode.trim().length() < 1) { - String vocabularyCode = getAttribute(propertyTypeElement, "vocabulary"); - newPropertyType.setVocabulary(vocabularies.get(vocabularyCode)); + newPropertyType.setMaterialType(null); // material of any type } - else if (dataTypeCode.equals(DataTypeCode.MATERIAL)) + else { - String materialCode = getAttribute(propertyTypeElement, "material"); - if (materialCode.trim().length() < 1) - { - newPropertyType.setMaterialType(null); // material of any type - } - else - { - newPropertyType.setMaterialType(materialTypes.get(materialCode)); - } - } + newPropertyType.setMaterialType(materialTypes.get(materialCode)); + } } } } diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java index 3bd0f9d96c04b71caf60f1161a853ec7bf22d754..5aa900f229c7d0bdcc587a73afcce6c5b92ab8ed 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java @@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewVocabulary; @@ -69,6 +70,7 @@ public class MasterDataSynchronizer public void synchronizeMasterData() { MultiKeyMap<String, List<NewETPTAssignment>> propertyAssignmentsToProcess = masterData.getPropertyAssignmentsToProcess(); + processFileFormatTypes(masterData.getFileFormatTypesToProcess()); processVocabularies(masterData.getVocabulariesToProcess()); // materials are registered but their property assignments are deferred until after property types are processed processEntityTypes(masterData.getMaterialTypesToProcess(), propertyAssignmentsToProcess); @@ -102,6 +104,31 @@ public class MasterDataSynchronizer } } + private void processFileFormatTypes(Map<String, FileFormatType> fileFormatTypesToProcess) + { + List<FileFormatType> fileFormatTypes = commonServer.listFileFormatTypes(sessionToken); + Map<String, FileFormatType> typeMap = new HashMap<String, FileFormatType>(); + for (FileFormatType type : fileFormatTypes) + { + typeMap.put(type.getCode(), type); + } + + for (String typeCode : fileFormatTypesToProcess.keySet()) + { + FileFormatType incomingType = fileFormatTypesToProcess.get(typeCode); + FileFormatType existingTypeOrNull = typeMap.get(typeCode); + if (existingTypeOrNull != null) + { + existingTypeOrNull.setDescription(incomingType.getDescription()); + commonServer.updateFileFormatType(sessionToken, existingTypeOrNull); + } + else + { + commonServer.registerFileFormatType(sessionToken, incomingType); + } + } + } + private void processVocabularies(Map<String, NewVocabulary> vocabulariesToProcess) { List<Vocabulary> existingVocabularies = commonServer.listVocabularies(sessionToken, true, false); diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java index f846888e5d87f4d7eab7e57111ba21dac48cab1e..f25c3eed3734e7a56ed9ad1a15733a645047abbe 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java @@ -192,6 +192,7 @@ public class ResourceListParser MasterDataParser mdParser = MasterDataParser.create(nameTranslator); mdParser.parseMasterData(doc, xpath, uri); MasterData masterData = data.getMasterData(); + masterData.setFileFormatTypesToProcess(mdParser.getFileFormatTypes()); masterData.setVocabulariesToProcess(mdParser.getVocabularies()); masterData.setPropertyTypesToProcess(mdParser.getPropertyTypes()); masterData.setSampleTypesToProcess(mdParser.getSampleTypes()); diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java index 165f5585263fd4eb337b825bb58c9f19faa1b52f..7f383e89f6c20073b1fd0c606707007083c5eb0b 100644 --- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java +++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java @@ -29,6 +29,7 @@ import org.apache.commons.collections.map.MultiKeyMap; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; @@ -307,6 +308,8 @@ public class ResourceListParserData class MasterData { + private Map<String, FileFormatType> fileFormatTypesToProcess = new HashMap<String, FileFormatType>(); + private Map<String, NewVocabulary> vocabulariesToProcess = new HashMap<String, NewVocabulary>(); private Map<String, PropertyType> propertyTypesToProcess = new HashMap<String, PropertyType>(); @@ -356,6 +359,16 @@ public class ResourceListParserData return vocabulariesToProcess; } + public Map<String, FileFormatType> getFileFormatTypesToProcess() + { + return fileFormatTypesToProcess; + } + + public void setFileFormatTypesToProcess(Map<String, FileFormatType> fileFormatTypesToProcess) + { + this.fileFormatTypesToProcess = fileFormatTypesToProcess; + } + public void setVocabulariesToProcess(Map<String, NewVocabulary> vocabulariesToProcess) { this.vocabulariesToProcess = vocabulariesToProcess;