KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > contineo > actions > rest > GetDocumentMetaRESTAction


1 /* License: GNU General Public License (GPL) version 2 from June 1991; but not any newer version!
2  */

3 package org.contineo.actions.rest;
4
5 import java.io.IOException JavaDoc;
6 import java.io.PrintWriter JavaDoc;
7 import java.util.Collection JavaDoc;
8
9 import javax.servlet.http.HttpServletResponse JavaDoc;
10 import javax.xml.parsers.ParserConfigurationException JavaDoc;
11 import javax.xml.transform.TransformerConfigurationException JavaDoc;
12 import javax.xml.transform.TransformerException JavaDoc;
13
14 import org.contineo.admin.Menu;
15 import org.contineo.admin.dao.MenuDAO;
16 import org.contineo.apis.rest.HttpStatusCodes;
17 import org.contineo.documan.Version;
18 import org.contineo.documan.dao.DocumentDAO;
19 import org.w3c.dom.Document JavaDoc;
20 import org.w3c.dom.Element JavaDoc;
21
22 /**
23  * answers a HTTP get request to retrieve the meta data of a document resource
24  * @author Sebastian Stein
25  */

26 public class GetDocumentMetaRESTAction extends RESTAction {
27
28     /** id of the document the client requests the meta data of */
29     private final int thisDocId;
30     
31     /** document name */
32     private String JavaDoc thisDocName;
33     
34     /** document's parent id */
35     private int parentId;
36     
37     /** document's parent name */
38     private String JavaDoc parentName;
39     
40     /** specifies, if this document can be changed by the given user */
41     private boolean thisWriteable;
42     
43     /** contineo user, who uploaded the document */
44     private String JavaDoc uploadUser;
45     
46     /** date the document was uploaded to contineo */
47     private String JavaDoc uploadDate;
48     
49     /** a free text field to specify the author */
50     private String JavaDoc sourceAuthor;
51     
52     /** the date the document was created outside of contineo */
53     private String JavaDoc sourceDate;
54     
55     /** a free text field specifying where the document came from */
56     private String JavaDoc sourceSource;
57     
58     /** a free text field specifying the doc type */
59     private String JavaDoc sourceDocType;
60     
61     /** a free text field specifying where the document was created */
62     private String JavaDoc sourceLocation;
63     
64     /** language of the document */
65     private String JavaDoc language;
66     
67     /** true, if document is currently marked as checked out */
68     private boolean isCheckedOut;
69     
70     /** contains a Version object for each version of the document */
71     private Collection JavaDoc<Version> versions;
72     
73     /** constructor sets some initial values and calls the processing of the request */
74     public GetDocumentMetaRESTAction(String JavaDoc p_schemaName,
75             String JavaDoc requestedRESTUrl, String JavaDoc p_userName,
76             HttpServletResponse JavaDoc p_response, int p_docId) {
77         super(p_schemaName, requestedRESTUrl, p_userName, p_response, "GET REST/document/XX/meta: get meta data of doc XX");
78         thisDocId = p_docId;
79         
80         processRequest();
81     }
82
83     @Override JavaDoc
84     protected void processRequest() {
85         // check if we can find the document
86
MenuDAO menuDao = new MenuDAO();
87         Menu thisMenu = menuDao.findByPrimaryKey(thisDocId);
88         DocumentDAO ddao = new DocumentDAO();
89         org.contineo.documan.Document thisDoc = ddao.findByMenuId(thisDocId);
90         if (thisMenu == null || thisDoc == null) {
91             setHttpStatusCode(HttpStatusCodes.NOT_FOUND);
92             return;
93         }
94         
95         // check, if the user has at least read access to the document
96
if (!menuDao.isReadEnable(thisDocId, userName)) {
97             setHttpStatusCode(HttpStatusCodes.FORBIDDEN);
98             return;
99         }
100
101         // start extracting data
102
//
103
// data of the parent
104
parentId = thisMenu.getMenuParent();
105         Menu parentMenu = menuDao.findByPrimaryKey(parentId);
106         if (parentMenu == null) {
107             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
108             return;
109         }
110         parentName = parentMenu.getMenuText();
111
112         // other header data
113
thisDocName = thisDoc.getDocName();
114         thisWriteable = menuDao.isWriteEnable(thisDocId, userName);
115         uploadUser = thisDoc.getDocPublisher();
116         uploadDate = convertDateToXML(thisDoc.getDocDate());
117         sourceSource = thisDoc.getSource();
118         sourceAuthor = thisDoc.getSourceAuthor();
119         sourceDate = convertDateToXML(thisDoc.getSourceDate());
120         sourceDocType = thisDoc.getSourceType();
121         sourceLocation = thisDoc.getCoverage();
122         language = thisDoc.getLanguage();
123         
124         // determine, whether document is checked out or in
125
if (thisDoc.getDocStatus() == org.contineo.documan.Document.DOC_CHECKED_OUT)
126             isCheckedOut = true;
127         else
128             isCheckedOut = false;
129         
130         // get document versions unsorted
131
versions = thisDoc.getVersions();
132         
133         // we have now all the data for the answer, we just have
134
// to create and write the XML document to the response
135
if (createXMLAnswer() == false) {
136             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
137             return;
138         } else {
139             // seems we were successful
140
setHttpStatusCode(HttpStatusCodes.OK);
141             return;
142         }
143     }
144     
145     /**
146      * creates the XML document containing the menu content
147      * @return true, if successful; on any errors false
148      */

149     private boolean createXMLAnswer() {
150         PrintWriter JavaDoc responseWriter;
151         try {
152             responseWriter = response.getWriter();
153         } catch (IOException JavaDoc e) {
154             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
155             addLogMessage("Unable to get output object for sending XML answer to client: " + e.getMessage());
156             return false;
157         }
158         
159         // set correct content type
160
response.setContentType("text/xml;charset=utf-8");
161         boolean ret = true;
162        
163         try {
164             // create XML document
165
Document JavaDoc xmlDoc = createXMLDocument();
166             
167             // root element
168
Element JavaDoc rootElement = createRootElement(xmlDoc, "documentMetaData", "document", "get-meta.xsd");
169             
170             // write header data
171
writeHeader(xmlDoc, rootElement);
172             
173             // write data for each version
174
writeVersions(xmlDoc, rootElement);
175
176             // transform and write XML document
177
writeXMLDocument(xmlDoc, responseWriter);
178         } catch (ParserConfigurationException JavaDoc e) {
179             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
180             addLogMessage("While trying to create XML answer a ParserConfigurationException occured: " + e.getMessage());
181             ret = false;
182         } catch (TransformerConfigurationException JavaDoc e) {
183             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
184             addLogMessage("While trying to create XML answer a TransformerConfigurationException occured: " + e.getMessage());
185             ret = false;
186         } catch (TransformerException JavaDoc e) {
187             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
188             addLogMessage("While trying to create XML answer a TransformerException occured: " + e.getMessage());
189             ret = false;
190         } finally {
191             // finally write content to the response and close output stream
192
responseWriter.flush();
193             responseWriter.close();
194         }
195         
196         return ret;
197     }
198
199     /**
200      * writes an complex element for each version of the document
201      * @param xmlDoc this is the XML document we write to
202      * @param parentElement those elements should be children of this parent element
203      */

204     private void writeVersions(Document JavaDoc xmlDoc, Element JavaDoc parentElement) {
205         for (Version version : versions) {
206             Element JavaDoc verElement = createChildElement(xmlDoc, "versionInfo", parentElement, ""); // <versionInfo xmlns="">
207
createTextNodeElement(xmlDoc, "id", verElement, version.getVersion()); // <id>1.1</id>
208

209             // <downloadURL>http://localhost:8080/contineo/rest/document/29/1.1</downloadURL>
210
createTextNodeElement(xmlDoc, "downloadURL", verElement,
211                         localRESTUrl + "document/" + thisDocId + "/" + version.getVersion());
212             
213             // <uploadUser>admin</uploadUser>
214
createTextNodeElement(xmlDoc, "uploadUser", verElement, version.getVersionUser());
215             
216              // <versionDate>2006-05-17</versionDate>
217
String JavaDoc versionDate = convertDateToXML(version.getVersionDate());
218             if (versionDate != null)
219                 createTextNodeElement(xmlDoc, "versionDate", verElement, versionDate);
220
221             // <description>some changes</description>
222
createTextNodeElement(xmlDoc, "description", verElement, version.getVersionComment());
223         }
224     }
225
226     /**
227      * writes the header data of the meta data document
228      * @param xmlDoc this is the XML document we write to
229      * @param parentElement header should be a child of this parent element
230      */

231     private void writeHeader(Document JavaDoc xmlDoc, Element JavaDoc parentElement) {
232         Element JavaDoc headerRootElement = createChildElement(xmlDoc, "header", parentElement, ""); // <header xmlns="">
233
createTextNodeElement(xmlDoc, "id", headerRootElement, thisDocId); // <id>29</id>
234
createTextNodeElement(xmlDoc, "name", headerRootElement, thisDocName); // <name>thisDocument</name>
235
createTextNodeElement(xmlDoc, "writeable", headerRootElement, thisWriteable); // <writeable>true</writeable>
236

237         // <downloadURL>http://localhost:8080/contineo/rest/document/29</downloadURL>
238
createTextNodeElement(xmlDoc, "downloadURL", headerRootElement, localRESTUrl + "document/" + thisDocId);
239         
240         createTextNodeElement(xmlDoc, "parentId", headerRootElement, parentId); // <parentId>5</parentId>
241
createTextNodeElement(xmlDoc, "parentName", headerRootElement, parentName); // <parentName>Folder</parentName>
242
createTextNodeElement(xmlDoc, "uploadUser", headerRootElement, uploadUser); // <uploadUser>admin</uploadUser>
243

244         // <uploadDate>2006-05-18</uploadDate>
245
if (uploadDate != null)
246             createTextNodeElement(xmlDoc, "uploadDate", headerRootElement, uploadDate);
247         createTextNodeElement(xmlDoc, "source", headerRootElement, sourceSource); // <source>received by email</source>
248
createTextNodeElement(xmlDoc, "author", headerRootElement, sourceAuthor); // <author>Author1, Author3</author>
249

250         // <creationDate>2006-05-14</creationDate>
251
if (sourceDate != null)
252             createTextNodeElement(xmlDoc, "creationDate", headerRootElement, sourceDate);
253         
254         // <documentType>sales document</documentType>
255
createTextNodeElement(xmlDoc, "documentType", headerRootElement, sourceDocType);
256         
257         // <creationLocation>Office in UK</creationLocation>
258
createTextNodeElement(xmlDoc, "creationLocation", headerRootElement, sourceLocation);
259         createTextNodeElement(xmlDoc, "language", headerRootElement, language); // <language>en</language>
260

261         // <checkoutURL>http://localhost:8080/contineo/rest/document/29/checkout</checkoutURL>
262
if (isCheckedOut == false)
263             createTextNodeElement(xmlDoc, "checkoutURL", headerRootElement, localRESTUrl + "document/" + thisDocId + "/checkout");
264         else
265             createTextNodeElement(xmlDoc, "checkinURL", headerRootElement, localRESTUrl + "document/" + thisDocId + "/checkin");
266     }
267 }
Popular Tags