View Javadoc
1   /*
2    * Copyright 2009 the original author or authors.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *     
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.openehealth.ipf.commons.ihe.xds.core.transform.ebxml;
17  
18  import static org.apache.commons.lang3.Validate.notNull;
19  import static org.openehealth.ipf.commons.ihe.xds.core.metadata.Vocabulary.*;
20  import static org.openehealth.ipf.commons.ihe.xds.core.metadata.Timestamp.toHL7;
21  
22  import java.util.List;
23  import java.util.stream.Collectors;
24  
25  import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLClassification;
26  import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLFactory;
27  import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLObjectLibrary;
28  import org.openehealth.ipf.commons.ihe.xds.core.ebxml.EbXMLRegistryPackage;
29  import org.openehealth.ipf.commons.ihe.xds.core.metadata.Code;
30  import org.openehealth.ipf.commons.ihe.xds.core.metadata.Folder;
31  
32  /**
33   * Transforms between a {@link Folder} and its ebXML 2.1 representation.
34   * @author Jens Riemschneider
35   */
36  public class FolderTransformer extends XDSMetaClassTransformer<EbXMLRegistryPackage, Folder> {
37      private final EbXMLFactory factory;
38  
39      private final CodeTransformer codeTransformer;
40  
41      /**
42       * Constructs the transformer
43       * @param factory
44       *          factory for version independent ebXML objects. 
45       */
46      public FolderTransformer(EbXMLFactory factory) {
47          super(FOLDER_PATIENT_ID_EXTERNAL_ID, 
48                  FOLDER_LOCALIZED_STRING_PATIENT_ID, 
49                  FOLDER_UNIQUE_ID_EXTERNAL_ID,
50                  FOLDER_LOCALIZED_STRING_UNIQUE_ID);
51  
52          notNull(factory, "factory cannot be null");
53  
54          this.factory = factory;
55          codeTransformer = new CodeTransformer(factory);
56      }
57      
58      @Override
59      protected EbXMLRegistryPackage createEbXMLInstance(String id, EbXMLObjectLibrary objectLibrary) {
60          return factory.createRegistryPackage(id, objectLibrary);
61      }
62      
63      @Override
64      protected Folder createMetaClassInstance() {
65          return new Folder();
66      }
67      
68      @Override
69      protected void addAttributes(Folder metaData, EbXMLRegistryPackage ebXML, EbXMLObjectLibrary objectLibrary) {
70          super.addAttributes(metaData, ebXML, objectLibrary);
71          ebXML.setStatus(metaData.getAvailabilityStatus());                
72          ebXML.setHome(metaData.getHomeCommunityId());
73      }
74      
75      @Override
76      protected void addAttributesFromEbXML(Folder metaData, EbXMLRegistryPackage ebXML) {
77          super.addAttributesFromEbXML(metaData, ebXML);
78          metaData.setAvailabilityStatus(ebXML.getStatus());        
79          metaData.setHomeCommunityId(ebXML.getHome());
80      }
81  
82      @Override
83      protected void addSlotsFromEbXML(Folder folder, EbXMLRegistryPackage regPackage) {
84          super.addSlotsFromEbXML(folder, regPackage);        
85          
86          folder.setLastUpdateTime(regPackage.getSingleSlotValue(SLOT_NAME_LAST_UPDATE_TIME));
87      }
88  
89      @Override
90      protected void addSlots(Folder folder, EbXMLRegistryPackage regPackage, EbXMLObjectLibrary objectLibrary) {
91          super.addSlots(folder, regPackage, objectLibrary);
92          
93          regPackage.addSlot(SLOT_NAME_LAST_UPDATE_TIME, toHL7(folder.getLastUpdateTime()));
94      }
95  
96      @Override
97      protected void addClassificationsFromEbXML(Folder folder, EbXMLRegistryPackage regPackage) {
98          super.addClassificationsFromEbXML(folder, regPackage);
99          
100         List<Code> codes = folder.getCodeList();
101         codes.addAll(regPackage.getClassifications(FOLDER_CODE_LIST_CLASS_SCHEME).stream()
102                 .map(codeTransformer::fromEbXML)
103                 .collect(Collectors.toList()));
104 
105         List<EbXMLClassification> limitedMetadata = regPackage.getClassifications(FOLDER_LIMITED_METADATA_CLASS_SCHEME);
106         folder.setLimitedMetadata(! limitedMetadata.isEmpty());
107     }
108 
109     @Override
110     protected void addClassifications(Folder folder, EbXMLRegistryPackage regPackage, EbXMLObjectLibrary objectLibrary) {
111         super.addClassifications(folder, regPackage, objectLibrary);
112         
113         for (Code codeListElem : folder.getCodeList()) {
114             EbXMLClassification code = codeTransformer.toEbXML(codeListElem, objectLibrary);
115             regPackage.addClassification(code, FOLDER_CODE_LIST_CLASS_SCHEME);
116         }
117 
118         if (folder.isLimitedMetadata()) {
119             EbXMLClassification classification = factory.createClassification(objectLibrary);
120             regPackage.addClassification(classification, FOLDER_LIMITED_METADATA_CLASS_SCHEME);
121         }
122     }
123 }