View Javadoc

1   /*
2    * MimeRendererEngine.java
3    *
4    * Created on 4 Май 2006 г., 15:24
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 }