First pass implementation of an OAI-PMH Controller for identifiable objects
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / view / RdfView.java
1 // $Id$
2 package eu.etaxonomy.cdm.remote.view;
3
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletResponse;
9 import javax.xml.transform.stream.StreamResult;
10
11 import net.sf.dozer.util.mapping.MapperIF;
12
13 import org.joda.time.DateTime;
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.oxm.Marshaller;
16 import org.springframework.web.servlet.view.AbstractView;
17
18 import com.ibm.lsid.http.HTTPConstants;
19
20 import eu.etaxonomy.cdm.model.common.CdmBase;
21 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
22 import eu.etaxonomy.cdm.model.description.TaxonDescription;
23 import eu.etaxonomy.cdm.model.taxon.Synonym;
24 import eu.etaxonomy.cdm.model.taxon.Taxon;
25 import eu.etaxonomy.cdm.remote.dto.tdwg.BaseThing;
26 import eu.etaxonomy.cdm.remote.dto.tdwg.voc.SpeciesProfileModel;
27 import eu.etaxonomy.cdm.remote.dto.tdwg.voc.TaxonConcept;
28 import eu.etaxonomy.remote.dto.rdf.Rdf;
29
30 /**
31 * View class which takes a MetadataResponse and returns the Source for serialization
32 * @author ben
33 * @see javax.xml.transform.Source
34 * @see com.ibm.lsid.MetadataResponse
35 */
36 public class RdfView extends AbstractView {
37
38 private Marshaller marshaller;
39
40 private MapperIF mapper;
41
42 private Map<Class<? extends CdmBase>,Class<? extends BaseThing>> classMap = new HashMap<Class<? extends CdmBase>,Class<? extends BaseThing>>();
43
44 private Integer expiresPlus;
45
46 public RdfView() {
47 classMap.put(Taxon.class, TaxonConcept.class);
48 classMap.put(Synonym.class, TaxonConcept.class);
49 classMap.put(TaxonDescription.class, SpeciesProfileModel.class);
50 }
51
52 @Autowired
53 public void setMarshaller(Marshaller marshaller) {
54 this.marshaller = marshaller;
55 }
56
57 @Autowired
58 public void setMapper(MapperIF mapper) {
59 this.mapper = mapper;
60 }
61
62 public void setExpiresPlus(Integer expiresPlus) {
63 this.expiresPlus = expiresPlus;
64 }
65
66 @Override
67 protected void renderMergedOutputModel(Map model,HttpServletRequest request, HttpServletResponse response)
68 throws Exception {
69 if(expiresPlus != null) {
70 DateTime expires = new DateTime();
71 response.setHeader(HTTPConstants.EXPIRES_HEADER, HTTPConstants.HTTP_DATE_FORMAT.format(expires.plusDays(expiresPlus).toDate()));
72 }
73
74 Rdf rdf = new Rdf();
75 for(Object object : model.values()) {
76 if(object instanceof IdentifiableEntity) {
77 IdentifiableEntity identifiableEntity = (IdentifiableEntity)object;
78 Class clazz = classMap.get(identifiableEntity.getClass());
79 if(clazz != null) {
80 rdf.addThing((BaseThing)mapper.map(identifiableEntity, clazz));
81 }
82 }
83 }
84
85 marshaller.marshal(rdf, new StreamResult(response.getOutputStream()));
86 }
87
88 }