1
2
3
4
5
6
7 package org.weda.tapestry;
8
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.io.OutputStream;
12 import java.io.PrintWriter;
13 import java.util.HashMap;
14 import java.util.Map;
15 import org.apache.commons.io.IOUtils;
16 import org.apache.hivemind.ApplicationRuntimeException;
17 import org.apache.tapestry.IRequestCycle;
18 import org.apache.tapestry.engine.IEngineService;
19 import org.apache.tapestry.engine.ILink;
20 import org.apache.tapestry.util.ContentType;
21 import org.apache.tapestry.web.WebRequest;
22 import org.apache.tapestry.web.WebResponse;
23 import org.weda.converter.ValueTypeConverter;
24 import org.weda.data.DataProvider;
25 import org.weda.data.DataProviderLinkBuilder;
26 import org.weda.data.DataProviderRegistry;
27
28 /**
29 * @author Mikhail Titov
30 */
31 public class DataViewerEngine implements IEngineService{
32 private final static String SERVICE_NAME="dataViewer";
33
34 private WebResponse response;
35 private WebRequest request;
36 private DataProviderLinkBuilder linkBuilder;
37 private DataProviderRegistry dataProviderRegistry;
38 private ValueTypeConverter converter;
39
40 public void service(IRequestCycle cycle) throws IOException {
41 try{
42 Map<String, String> reqParameters = new HashMap<String, String>();
43 for (Object name: request.getParameterNames())
44 reqParameters.put(
45 (String)name, request.getParameterValue((String)name));
46 Object dataId = linkBuilder.getDataIdentificator(reqParameters);
47 DataProvider provider =
48 dataProviderRegistry.getDataProvider(dataId);
49 Object data = provider.getData();
50 if (data!=null){
51 try{
52 OutputStream out =
53 response.getOutputStream(
54 new ContentType(provider.getMimeType()));
55 response.setHeader("Pragma", "nocache");
56 InputStream dataInput =
57 (InputStream)converter.convert(
58 InputStream.class, data, null);
59 IOUtils.copy(dataInput, out);
60 dataInput.close();
61 }finally{
62 provider.release();
63 }
64 }else{
65 OutputStream out =
66 response.getOutputStream(new ContentType("text/html"));
67 StringBuffer buf = new StringBuffer();
68 buf.append("<html>");
69 buf.append("<head>");
70 buf.append(
71 "<meta http-equiv=\"Content-Type\" " +
72 "content=\"text/html;charset=utf-8\"/>");
73 buf.append("</head>");
74 buf.append("<body>");
75 buf.append("<h3>Данные не установлены</h3>");
76 buf.append("</body>");
77 buf.append("</html>");
78 out.write(buf.toString().getBytes("UTF-8"));
79 }
80 }catch(Exception e){
81 throw new ApplicationRuntimeException("Can't show data", e);
82 }
83 }
84
85 public ILink getLink(boolean b, Object object) {
86 return null;
87 }
88
89 public String getName() {
90 return SERVICE_NAME;
91 }
92
93 public WebResponse getResponse() {
94 return response;
95 }
96
97 public void setResponse(WebResponse response) {
98 this.response = response;
99 }
100
101 public WebRequest getRequest() {
102 return request;
103 }
104
105 public void setRequest(WebRequest request) {
106 this.request = request;
107 }
108
109 public void setLinkBuilder(DataProviderLinkBuilder linkBuilder) {
110 this.linkBuilder = linkBuilder;
111 }
112
113 public void setDataProviderRegistry(DataProviderRegistry dataProviderRegistry) {
114 this.dataProviderRegistry = dataProviderRegistry;
115 }
116
117 public void setConverter(ValueTypeConverter converter) {
118 this.converter = converter;
119 }
120
121 }