1   package org.kuali.ole.docstore.model.xstream.ingest;
2   
3   import com.thoughtworks.xstream.converters.Converter;
4   import com.thoughtworks.xstream.converters.MarshallingContext;
5   import com.thoughtworks.xstream.converters.UnmarshallingContext;
6   import com.thoughtworks.xstream.io.HierarchicalStreamReader;
7   import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
8   import org.kuali.ole.docstore.model.xmlpojo.ingest.Content;
9   import org.kuali.ole.docstore.model.xmlpojo.ingest.ResponseDocument;
10  
11  import java.util.Iterator;
12  import java.util.List;
13  
14  
15  
16  
17  
18  
19  
20  
21  public class ResponseDocumentConverter
22          implements Converter {
23  
24      @Override
25      public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter,
26                          MarshallingContext marshallingContext) {
27          ResponseDocument responseDocument = (ResponseDocument) o;
28          if (responseDocument.getId() != null) {
29              hierarchicalStreamWriter.addAttribute("id", responseDocument.getId());
30          }
31          if (responseDocument.getCategory() != null) {
32              hierarchicalStreamWriter.addAttribute("category", responseDocument.getCategory());
33          }
34          if (responseDocument.getType() != null) {
35              hierarchicalStreamWriter.addAttribute("type", responseDocument.getType());
36          }
37          if (responseDocument.getFormat() != null) {
38              hierarchicalStreamWriter.addAttribute("format", responseDocument.getFormat());
39          }
40          if(responseDocument.getStatus() != null){
41              hierarchicalStreamWriter.startNode("status");
42              hierarchicalStreamWriter.setValue(responseDocument.getStatus());
43              hierarchicalStreamWriter.endNode();
44          }
45          if(responseDocument.getStatus() != null){
46              hierarchicalStreamWriter.startNode("statusMessage");
47              hierarchicalStreamWriter.setValue(responseDocument.getStatusMessage());
48              hierarchicalStreamWriter.endNode();
49          }
50  
51          if (responseDocument.getUuid() != null) {
52              hierarchicalStreamWriter.startNode("uuid");
53              hierarchicalStreamWriter.setValue(responseDocument.getUuid());
54              hierarchicalStreamWriter.endNode();
55          }
56          if (responseDocument.getContent()!= null) {
57              hierarchicalStreamWriter.startNode("content");
58              hierarchicalStreamWriter.setValue(responseDocument.getContent().getContent());
59              hierarchicalStreamWriter.endNode();
60          }
61  
62          if(responseDocument.getDocumentName() != null)
63          {
64              hierarchicalStreamWriter.startNode("documentName");
65              hierarchicalStreamWriter.setValue(responseDocument.getDocumentName());
66              hierarchicalStreamWriter.endNode();
67          }
68          if(responseDocument.getDocumentTitle() != null)
69          {
70              hierarchicalStreamWriter.startNode("documentTitle");
71              hierarchicalStreamWriter.setValue(responseDocument.getDocumentTitle());
72              hierarchicalStreamWriter.endNode();
73          }
74          if(responseDocument.getDocumentMimeType() != null)
75          {
76              hierarchicalStreamWriter.startNode("documentMimeType");
77              hierarchicalStreamWriter.setValue(responseDocument.getDocumentMimeType());
78              hierarchicalStreamWriter.endNode();
79          }
80          if (responseDocument.getVersion() != null) {
81              hierarchicalStreamWriter.startNode("version");
82              hierarchicalStreamWriter.setValue(responseDocument.getVersion());
83              hierarchicalStreamWriter.endNode();
84          }
85  
86          List<ResponseDocument> linkedResponseDocuments = responseDocument.getLinkedDocuments();
87          if (linkedResponseDocuments != null && linkedResponseDocuments.size() > 0) {
88              hierarchicalStreamWriter.startNode("linkedDocuments");
89              for (Iterator<ResponseDocument> iterator = linkedResponseDocuments.iterator(); iterator.hasNext(); ) {
90                  hierarchicalStreamWriter.startNode("linkedDocument");
91                  ResponseDocument respDoc = iterator.next();
92                  marshal(respDoc, hierarchicalStreamWriter, marshallingContext);
93                  List<ResponseDocument> instanceResposeDocuments = responseDocument.getLinkedInstanceDocuments();
94                  if (instanceResposeDocuments != null && instanceResposeDocuments.size() > 0) {
95                      hierarchicalStreamWriter.startNode("linkedDocuments");
96                      for (Iterator<ResponseDocument> instanceIterator = instanceResposeDocuments
97                              .iterator(); instanceIterator.hasNext(); ) {
98                          hierarchicalStreamWriter.startNode("linkedDocument");
99                          ResponseDocument instanceDoc = instanceIterator.next();
100                         marshalInstance(instanceDoc, hierarchicalStreamWriter, marshallingContext);
101                         hierarchicalStreamWriter.endNode();
102                     }
103                     hierarchicalStreamWriter.endNode();
104                 }
105                 hierarchicalStreamWriter.endNode();
106             }
107             hierarchicalStreamWriter.endNode();
108         }
109     }
110 
111     private void marshalInstance(ResponseDocument instanceDoc, HierarchicalStreamWriter hierarchicalStreamWriter,
112                                  MarshallingContext marshallingContext) {
113         ResponseDocument responseDocument = (ResponseDocument) instanceDoc;
114         hierarchicalStreamWriter.addAttribute("id", responseDocument.getId());
115         hierarchicalStreamWriter.addAttribute("category", responseDocument.getCategory());
116         hierarchicalStreamWriter.addAttribute("type", responseDocument.getType());
117         hierarchicalStreamWriter.addAttribute("format", responseDocument.getFormat());
118         hierarchicalStreamWriter.startNode("content");
119         hierarchicalStreamWriter.setValue(responseDocument.getContent().getContent());
120         hierarchicalStreamWriter.endNode();
121         hierarchicalStreamWriter.startNode("uuid");
122         hierarchicalStreamWriter.setValue(responseDocument.getUuid());
123         hierarchicalStreamWriter.endNode();
124     }
125 
126     @Override
127     public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader,
128                             UnmarshallingContext unmarshallingContext) {
129 
130         ResponseDocument responseDocument = new ResponseDocument();
131         responseDocument.setId(hierarchicalStreamReader.getAttribute("id"));
132         responseDocument.setCategory(hierarchicalStreamReader.getAttribute("category"));
133         responseDocument.setType(hierarchicalStreamReader.getAttribute("type"));
134         responseDocument.setFormat(hierarchicalStreamReader.getAttribute("format"));
135 
136 
137         while (hierarchicalStreamReader.hasMoreChildren()) {
138             hierarchicalStreamReader.moveDown();
139             if(hierarchicalStreamReader.getNodeName().equals("status")){
140                 responseDocument.setStatus(hierarchicalStreamReader.getValue());
141             }
142             else if(hierarchicalStreamReader.getNodeName().equals("statusMessage")){
143                 responseDocument.setStatusMessage(hierarchicalStreamReader.getValue());
144             }
145 
146             else if (hierarchicalStreamReader.getNodeName().equals("uuid")) {
147                 responseDocument.setUuid(hierarchicalStreamReader.getValue());
148             }
149 
150             else if (hierarchicalStreamReader.getNodeName().equals("content")) {
151                 String value = hierarchicalStreamReader.getValue();
152                 Content content = new Content(value);
153                 responseDocument.setContent(content);
154             }
155 
156             else if (hierarchicalStreamReader.getNodeName().equals("documentName")) {
157                 responseDocument.setDocumentName(hierarchicalStreamReader.getValue());
158             }
159             else if (hierarchicalStreamReader.getNodeName().equals("documentTitle")) {
160                 responseDocument.setDocumentTitle(hierarchicalStreamReader.getValue());
161             }
162 
163             else if (hierarchicalStreamReader.getNodeName().equals("documentMimeType")) {
164                 responseDocument.setDocumentMimeType(hierarchicalStreamReader.getValue());
165             }
166             
167             else if (hierarchicalStreamReader.getNodeName().equals("version")) {
168                 responseDocument.setVersion(hierarchicalStreamReader.getValue());
169             }
170 
171             else if (hierarchicalStreamReader.getNodeName().equals("linkedDocuments")) {
172                 while (hierarchicalStreamReader.hasMoreChildren()) {
173                     hierarchicalStreamReader.moveDown();
174                     responseDocument.addLinkedDocument(
175                             (ResponseDocument) unmarshal(hierarchicalStreamReader, unmarshallingContext));
176                     hierarchicalStreamReader.moveUp();
177                 }
178             }
179             hierarchicalStreamReader.moveUp();
180         }
181         
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218 
219 
220 
221 
222 
223 
224 
225         return responseDocument;
226     }
227 
228     @Override
229     public boolean canConvert(Class aClass) {
230         return aClass.equals(ResponseDocument.class);
231     }
232 }