initial version of frontend layer
[opensuse:webpin2.git] / api / webpin.api / src / main / java / org / opensuse / webpin / api / Api1.java
1 /*
2  * Created on Aug 3, 2010
3  */
4 package org.opensuse.webpin.api;
5
6 import java.util.HashMap;
7 import java.util.LinkedList;
8 import java.util.List;
9 import java.util.Map;
10
11 import org.restlet.Request;
12 import org.restlet.Response;
13 import org.restlet.data.MediaType;
14 import org.restlet.data.Method;
15 import org.restlet.data.Status;
16 import org.restlet.ext.freemarker.TemplateRepresentation;
17 import org.restlet.representation.StringRepresentation;
18 import org.restlet.representation.Variant;
19 import org.restlet.resource.ResourceException;
20 import org.restlet.service.MetadataService;
21 import org.springframework.beans.factory.annotation.Required;
22
23 import freemarker.template.Configuration;
24
25 public class Api1 extends SolrQueryRestlet {
26         
27         private QueryMethod queryMethod;
28         private Configuration freemarker;
29         
30         @Override
31         public void handle(final Request request, final Response response) {
32                 final Method method = request.getMethod();
33                 if (method.equals(Method.GET)) {
34                         get(request, response);
35                 } else if (method.equals(Method.HEAD)) {
36                         head(request, response);
37                 } else {
38                         response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED, String.format("the method %s is not supported", method.getName()));
39                 }
40         }
41         
42         private static final MetadataService METADATA_SERVICE = new MetadataService();
43         private static final List<Variant> VARIANTS;
44         static {
45                 VARIANTS = new LinkedList<Variant>();
46                 VARIANTS.add(new Variant(MediaType.APPLICATION_XML));
47                 VARIANTS.add(new Variant(MediaType.TEXT_XML));
48                 VARIANTS.add(new Variant(MediaType.APPLICATION_JSON));
49                 VARIANTS.add(new Variant(MediaType.TEXT_PLAIN));
50                 VARIANTS.add(new Variant(MediaType.TEXT_CSV));
51                 VARIANTS.add(new Variant(MediaType.TEXT_HTML));
52         }
53
54         protected final void head(final Request request, final Response response) throws ResourceException {
55         final QueryResult r = query(queryMethod, request, response);
56         if (r == null) {
57                 return;
58         }
59
60                 if (r.results.getNumFound() < 1) {
61                         response.setStatus(Status.CLIENT_ERROR_NOT_FOUND);
62                 }
63
64                 response.setEntity(new StringRepresentation("", MediaType.TEXT_PLAIN));
65         }
66         
67     //@Get("xml|json|txt|csv|html")
68         public final void get(final Request request, final Response response) throws ResourceException {
69         final String template;
70         final MediaType mediaType;
71         {
72                 final String format = getStringAttribute(request, "format", null);
73                 if (format != null) {
74                         if (format.equals("json")) {
75                                 mediaType = MediaType.APPLICATION_JSON;
76                         } else if (format.equals("txt")) {
77                                 mediaType = MediaType.TEXT_PLAIN;
78                         } else if (format.equals("csv")) {
79                                 mediaType = MediaType.TEXT_CSV;
80                         } else if (format.equals("html")) {
81                                 mediaType = MediaType.TEXT_HTML;
82                         } else {
83                                 mediaType = MediaType.TEXT_XML;
84                         }
85                 } else {
86                         mediaType = request.getClientInfo().getPreferredVariant(VARIANTS, METADATA_SERVICE).getMediaType();
87                 }
88             if (mediaType.equals(MediaType.APPLICATION_JSON)) {
89                 template = "api1.json";
90             } else if (mediaType.equals(MediaType.TEXT_PLAIN)) {
91                 template = "api1.txt";
92             } else if (mediaType.equals(MediaType.TEXT_CSV)) {
93                 template = "api1.csv";
94             } else if (mediaType.equals(MediaType.TEXT_HTML)) {
95                 template = "api1.html";
96             } else {
97                 template = "api1.xml";
98             }
99         }
100         
101         final QueryResult r = query(queryMethod, request, response);
102         if (r == null) {
103                 return;
104         }
105
106                 final Map<String, Object> model = new HashMap<String, Object>(1);
107                 model.put("packages", r.results);
108                 model.put("q", r.query);
109                 
110                 if (r.results.getNumFound() < 1) {
111                         response.setStatus(Status.CLIENT_ERROR_NOT_FOUND);
112                 }
113                 
114                 response.setEntity(new TemplateRepresentation(template, freemarker, model, mediaType));
115         }
116     
117         @Required public void setQueryMethod(QueryMethod queryMethod) {
118                 this.queryMethod = queryMethod;
119         }
120         
121         @Required public void setFreemarker(Configuration freemarker) {
122                 this.freemarker = freemarker;
123         }
124     
125 }