source: VirtualCollectionRegistry/branches/VirtualCollectionRegistry-1.0-beta/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/service/impl/VirtualCollectionCMDICreatorImpl.java @ 5596

Last change on this file since 5596 was 5596, checked in by Twan Goosen, 10 years ago

created a branch for VCR 1.0-beta. Trunk now 1.1-SNAPSHOT

File size: 15.3 KB
Line 
1package eu.clarin.cmdi.virtualcollectionregistry.service.impl;
2
3import eu.clarin.cmdi.virtualcollectionregistry.model.Creator;
4import eu.clarin.cmdi.virtualcollectionregistry.model.GeneratedBy;
5import eu.clarin.cmdi.virtualcollectionregistry.model.Resource;
6import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
7import static eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.State.DEAD;
8import static eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.State.DELETED;
9import static eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.State.PUBLIC;
10import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD;
11import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.Creator.Email;
12import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.Creator.Organisation;
13import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.Description;
14import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.GeneratedBy.QueryProfile;
15import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.GeneratedBy.QueryValue;
16import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.Name;
17import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Components.VirtualCollection.ReproducabilityNotice;
18import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Resources.ResourceProxyList.ResourceProxy;
19import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.CMD.Resources.ResourceProxyList.ResourceProxy.ResourceType;
20import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.ComplextypePurpose1;
21import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.ComplextypeReproducability1;
22import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.ComplextypeStatus1;
23import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.ResourcetypeSimple;
24import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.SimpletypePurpose1;
25import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.SimpletypeReproducability1;
26import eu.clarin.cmdi.virtualcollectionregistry.model.cmdi.SimpletypeStatus1;
27import eu.clarin.cmdi.virtualcollectionregistry.service.VirtualCollectionCMDICreator;
28import java.util.Date;
29import java.util.List;
30import java.util.UUID;
31import javax.xml.datatype.DatatypeConfigurationException;
32import javax.xml.datatype.DatatypeFactory;
33import javax.xml.datatype.XMLGregorianCalendar;
34import org.apache.commons.lang.StringUtils;
35import org.apache.commons.lang3.time.FastDateFormat;
36import org.slf4j.Logger;
37import org.slf4j.LoggerFactory;
38import org.springframework.beans.factory.annotation.Value;
39import org.springframework.stereotype.Service;
40
41/**
42 * A service implementation that creates a CMDI object hierarchy for a
43 * {@link VirtualCollection} object based on the classes generated from the
44 * Virtual Collection profile schema by JAXB (as configured in the pom.xml of
45 * this project)
46 *
47 * @author twagoo
48 */
49@Service
50public class VirtualCollectionCMDICreatorImpl implements VirtualCollectionCMDICreator {
51
52    private final static Logger logger = LoggerFactory.getLogger(VirtualCollectionCMDICreatorImpl.class);
53    private final DatatypeFactory dataTypeFactory;
54
55    // Collection display name value read from context.xml with a fallback value inserted by Spring
56    @Value("${eu.clarin.cmdi.virtualcollectionregistry.collectiondisplayname:CLARIN Virtual Collection Registry}")
57    private String collectionDisplayName;
58
59    public VirtualCollectionCMDICreatorImpl() throws DatatypeConfigurationException {
60        dataTypeFactory = DatatypeFactory.newInstance();
61    }
62
63    ///////// CMDI CONSTANTS ////////////////////
64    // These should match up with the schema   
65    // the classes in eu.clarin.cmdi.         
66    // virtualcollectionregistry.model.cmdi are
67    // generated from by JAXB                 
68    /////////////////////////////////////////////
69    public static final String VIRTUAL_COLLECTION_PROFILE_ID
70            = "clarin.eu:cr1:p_1404130561238";
71    public static final String VIRTUAL_COLLECTION_PROFILE_SCHEMA_LOCATION
72            = "http://www.clarin.eu/cmd/ http://catalog.clarin.eu/ds/ComponentRegistry/rest/registry/profiles/"
73            + VIRTUAL_COLLECTION_PROFILE_ID
74            + "/xsd";
75    private static final String CMD_VERSION = "1.1";
76    private static final FastDateFormat DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd");
77    ///////// END OF CMDI CONSTANTS   /////////
78
79    @Override
80    public String getSchemaLocation() {
81        return VIRTUAL_COLLECTION_PROFILE_SCHEMA_LOCATION;
82    }
83
84    @Override
85    public CMD createMetadataStructure(VirtualCollection vc) {
86        logger.debug("Creating CMD root");
87        final CMD cmdRoot = new CMD();
88        cmdRoot.setCMDVersion(CMD_VERSION);
89        logger.trace("Creating header");
90        cmdRoot.setHeader(createHeader(vc));
91        logger.trace("Creating resources");
92        final CMD.Resources resources = createResources(vc);
93        cmdRoot.setResources(resources);
94        logger.trace("Creating components");
95        cmdRoot.setComponents(createComponents(vc, resources));
96        return cmdRoot;
97    }
98
99    private CMD.Header createHeader(VirtualCollection vc) {
100        final CMD.Header header = new CMD.Header();
101        header.setMdCreationDate(dataTypeFactory.newXMLGregorianCalendar(DATE_FORMAT.format(new Date())));
102        header.setMdProfile(VIRTUAL_COLLECTION_PROFILE_ID);
103        header.getMdCreator().add(vc.getOwner().getName());
104        header.setMdSelfLink(vc.getPersistentIdentifier().getURI());
105        if (collectionDisplayName != null) {
106            header.setMdCollectionDisplayName(collectionDisplayName);
107        }
108        return header;
109    }
110
111    private CMD.Resources createResources(VirtualCollection vc) {
112        final CMD.Resources resources = new CMD.Resources();
113
114        final CMD.Resources.ResourceProxyList resourceProxyList = new CMD.Resources.ResourceProxyList();
115        resources.setResourceProxyList(resourceProxyList);
116        final List<ResourceProxy> proxyList = resourceProxyList.getResourceProxy();
117
118        for (Resource resource : vc.getResources()) {
119            final ResourceProxy resourceProxy = new ResourceProxy();
120            if (resource.getId() == null) {
121                resourceProxy.setId("r" + UUID.randomUUID().toString());
122            } else {
123                resourceProxy.setId("r" + Long.toString(resource.getId()));
124            }
125            resourceProxy.setResourceRef(resource.getRef());
126
127            final ResourceType type = new ResourceType();
128            if (resource.getType() == Resource.Type.METADATA) {
129                type.setValue(ResourcetypeSimple.METADATA);
130            } else {
131                type.setValue(ResourcetypeSimple.RESOURCE);
132            }
133            resourceProxy.setResourceType(type);
134
135            proxyList.add(resourceProxy);
136        }
137
138        // add empty instance of mandatory journal file proxy list
139        resources.setJournalFileProxyList(new CMD.Resources.JournalFileProxyList());
140        // add empty instance of mandatory resource relation list
141        resources.setResourceRelationList(new CMD.Resources.ResourceRelationList());
142        return resources;
143    }
144
145    private CMD.Components createComponents(VirtualCollection vc, CMD.Resources resources) {
146        final CMD.Components.VirtualCollection virtualCollection = new CMD.Components.VirtualCollection();
147
148        final Name name = new Name();
149        name.setValue(vc.getName());
150        virtualCollection.setName(name);
151
152        if (vc.getDescription() != null) {
153            final Description description = new Description();
154            description.setValue(vc.getDescription());
155            virtualCollection.setDescription(description);
156        }
157
158        virtualCollection.setCreationDate(getCreationDate(vc));
159        virtualCollection.setStatus(getStatus(vc));
160        virtualCollection.setPurpose(getPurpose(vc));
161        virtualCollection.getCreator().add(getCreator(vc));
162        virtualCollection.setReproducability(getReproducability(vc));
163
164        if (vc.getReproducibilityNotice() != null) {
165            final ReproducabilityNotice reproducabilityNotice = new ReproducabilityNotice();
166            reproducabilityNotice.setValue(vc.getReproducibilityNotice());
167            virtualCollection.setReproducabilityNotice(reproducabilityNotice);
168        }
169
170        for (Resource resource : vc.getResources()) {
171            addResource(virtualCollection, resource, resources);
172        }
173
174        if (vc.getType() == VirtualCollection.Type.INTENSIONAL && vc.getGeneratedBy() != null) {
175            virtualCollection.setGeneratedBy(getGeneratedBy(vc.getGeneratedBy()));
176        }
177
178        final CMD.Components components = new CMD.Components();
179        components.setVirtualCollection(virtualCollection);
180        return components;
181    }
182
183    private CMD.Components.VirtualCollection.GeneratedBy getGeneratedBy(GeneratedBy generatedBy) {
184        final CMD.Components.VirtualCollection.GeneratedBy component = new CMD.Components.VirtualCollection.GeneratedBy();
185
186        final String uri = generatedBy.getURI();
187        if (uri != null) {
188            component.setURI(uri);
189        }
190
191        final String description = generatedBy.getDescription();
192        if (description != null) {
193            final CMD.Components.VirtualCollection.GeneratedBy.Description descriptionElement = new CMD.Components.VirtualCollection.GeneratedBy.Description();
194            descriptionElement.setValue(description);
195            component.setDescription(descriptionElement);
196        }
197
198        if (generatedBy.getQuery() != null) {
199            final String profile = generatedBy.getQuery().getProfile();
200            if (profile != null) {
201                final QueryProfile profileElement = new QueryProfile();
202                profileElement.setValue(profile);
203                component.setQueryProfile(profileElement);
204            }
205
206            final String value = generatedBy.getQuery().getValue();
207            if (value != null) {
208                final QueryValue valueElement = new QueryValue();
209                valueElement.setValue(value);
210                component.setQueryValue(valueElement);
211            }
212        }
213
214        return component;
215    }
216
217    private XMLGregorianCalendar getCreationDate(VirtualCollection vc) {
218        final Date creationDate = vc.getCreationDate();
219        return dataTypeFactory.newXMLGregorianCalendar(DATE_FORMAT.format(creationDate));
220    }
221
222    private ComplextypeStatus1 getStatus(VirtualCollection vc) {
223        // status is a mandatory field
224        final ComplextypeStatus1 status = new ComplextypeStatus1();
225        switch (vc.getState()) {
226            case PUBLIC:
227                status.setValue(SimpletypeStatus1.PUBLISHED);
228                break;
229            case DELETED:
230                status.setValue(SimpletypeStatus1.DEPRECATED);
231                break;
232            case DEAD:
233                status.setValue(SimpletypeStatus1.DEPRECATED);
234                break;
235            default:
236                status.setValue(SimpletypeStatus1.DRAFT);
237        }
238        return status;
239    }
240
241    private ComplextypeReproducability1 getReproducability(VirtualCollection vc) {
242        if (vc.getReproducibility() == null) {
243            return null;
244        } else {
245            final ComplextypeReproducability1 reproducability = new ComplextypeReproducability1();
246            switch (vc.getReproducibility()) {
247                //TODO: better mapping
248                case FLUCTUATING:
249                    reproducability.setValue(SimpletypeReproducability1.FLUCTUATING);
250                    break;
251                case INTENDED:
252                    reproducability.setValue(SimpletypeReproducability1.INTENDED);
253                    break;
254                case UNTENDED:
255                    reproducability.setValue(SimpletypeReproducability1.UNTENDED);
256                    break;
257            }
258            return reproducability;
259        }
260    }
261
262    private ComplextypePurpose1 getPurpose(VirtualCollection vc) {
263        if (vc.getPurpose() == null) {
264            return null;
265        } else {
266            final ComplextypePurpose1 purpose = new ComplextypePurpose1();
267            switch (vc.getPurpose()) {
268                case FUTURE_USE:
269                    purpose.setValue(SimpletypePurpose1.FUTURE_USE);
270                    break;
271                case REFERENCE:
272                    purpose.setValue(SimpletypePurpose1.REFERENCE);
273                    break;
274                case RESEARCH:
275                    purpose.setValue(SimpletypePurpose1.RESEARCH);
276                    break;
277                case SAMPLE:
278                    purpose.setValue(SimpletypePurpose1.SAMPLE);
279                    break;
280            }
281            return purpose;
282        }
283    }
284
285    private CMD.Components.VirtualCollection.Creator getCreator(VirtualCollection vc) {
286        if (vc.getCreators().isEmpty()) {
287            return null;
288        } else {
289            final CMD.Components.VirtualCollection.Creator creator = new CMD.Components.VirtualCollection.Creator();
290            final Creator vcCreator = vc.getCreators().get(0);
291
292            // name/creator is a mandatory field
293            final CMD.Components.VirtualCollection.Creator.Name name = new CMD.Components.VirtualCollection.Creator.Name();
294            name.setValue(vcCreator.getPerson());
295            creator.setName(name);
296
297            if (vcCreator.getEMail() != null) {
298                final Email email = new Email();
299                email.setValue(vcCreator.getEMail());
300                creator.setEmail(email);
301            }
302
303            if (vcCreator.getOrganisation() != null) {
304                final Organisation organisation = new Organisation();
305                organisation.setValue(vcCreator.getOrganisation());
306                creator.setOrganisation(organisation);
307            }
308            return creator;
309        }
310    }
311
312    private void addResource(final CMD.Components.VirtualCollection virtualCollection, Resource resource, CMD.Resources resources) {
313        if (!StringUtils.isEmpty(resource.getLabel()) || !StringUtils.isEmpty(resource.getDescription())) {
314            final CMD.Components.VirtualCollection.Resource resourceComponent = new CMD.Components.VirtualCollection.Resource();
315            if (!StringUtils.isEmpty(resource.getLabel())) {
316                // add label
317                final CMD.Components.VirtualCollection.Resource.Label label = new CMD.Components.VirtualCollection.Resource.Label();
318                label.setValue(resource.getLabel());
319                resourceComponent.setLabel(label);
320            }
321            if (!StringUtils.isEmpty(resource.getDescription())) {
322                // add description
323                final CMD.Components.VirtualCollection.Resource.Description description = new CMD.Components.VirtualCollection.Resource.Description();
324                description.setValue(resource.getDescription());
325                resourceComponent.setDescription(description);
326            }
327            // look up the resource proxy (by URI) and set a reference
328            for (ResourceProxy rp : resources.getResourceProxyList().getResourceProxy()) {
329                if (rp.getResourceRef().equals(resource.getRef())) {
330                    resourceComponent.getRef().add(rp);
331                    break;
332                }
333            }
334            virtualCollection.getResource().add(resourceComponent);
335        }
336    }
337}
Note: See TracBrowser for help on using the repository browser.