View Javadoc
1   package org.kuali.ole.docstore.engine.service.rest;
2   
3   import org.kuali.ole.docstore.common.document.*;
4   import org.kuali.ole.docstore.common.exception.BibImportResponse;
5   import org.kuali.ole.docstore.common.exception.BibImportResult;
6   import org.kuali.ole.docstore.common.exception.DocstoreException;
7   import org.kuali.ole.docstore.common.exception.DocstoreExceptionProcessor;
8   import org.kuali.ole.docstore.common.find.FindParams;
9   import org.kuali.ole.docstore.common.service.DocstoreService;
10  import org.kuali.ole.docstore.service.BeanLocator;
11  import org.slf4j.Logger;
12  import org.slf4j.LoggerFactory;
13  import org.springframework.stereotype.Controller;
14  import org.springframework.web.bind.annotation.*;
15  
16  import java.util.ArrayList;
17  import java.util.HashMap;
18  import java.util.List;
19  
20  /**
21   * Created with IntelliJ IDEA.
22   * User: jayabharathreddy
23   * Date: 12/18/13
24   * Time: 4:06 PM
25   * To change this template use File | Settings | File Templates.
26   */
27  @Controller
28  @RequestMapping("/holdings")
29  public class HoldingsRestController extends AbstractRestService {
30  
31      private static final Logger LOG = LoggerFactory.getLogger(HoldingsRestController.class);
32      private static String responseUrl = "documentrest/holdings/doc/";
33      private static String responseTreeUrl = "documentrest/holdings/doc/tree/";
34      private static String bindUrl = "bind";
35      private static String unbindUrl = "unbind";
36      private Logger logger = LoggerFactory.getLogger(HoldingsRestController.class);
37  
38      @Override
39      @RequestMapping(value = "/doc/", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
40      @ResponseBody
41      public String createHoldings(@RequestBody String requestBody) {
42          DocstoreService ds = BeanLocator.getDocstoreService();
43          Holdings holdings = new Holdings();
44          try {
45          holdings = (Holdings) holdings.deserialize(requestBody);
46          if (holdings.getHoldingsType().equalsIgnoreCase("print")) {
47              holdings = new PHoldings();
48              holdings = (PHoldings) holdings.deserialize(requestBody);
49          } else {
50              holdings = new EHoldings();
51              holdings = (EHoldings) holdings.deserialize(requestBody);
52          }
53  
54              ds.createHoldings(holdings);
55          } catch (DocstoreException e) {
56              LOG.error("Exception Occurred in createHoldings() :", e);
57              return DocstoreExceptionProcessor.toXml(e);
58          } catch (Exception exp) {
59              LOG.error("Exception Occurred in createHoldings() :", exp);
60          }
61          return responseUrl + holdings.getId();
62      }
63  
64      @Override
65      @RequestMapping(value = "/doc", method = RequestMethod.GET, produces = "application/xml")
66      @ResponseBody
67      public String retrieveHoldings(@RequestParam("holdingsId") String holdingsId) {
68          DocstoreService ds = BeanLocator.getDocstoreService();
69          Holdings holdings = null;
70          try {
71              holdings = ds.retrieveHoldings(holdingsId);
72          } catch (DocstoreException e) {
73              LOG.error("Exception occurred in retrieveHoldings() :", e);
74              return DocstoreExceptionProcessor.toXml(e);
75          }
76          if (holdings.getHoldingsType().equalsIgnoreCase("print")) {
77              holdings = ds.retrieveHoldings(holdingsId);
78              Holdings pHoldings = new Holdings();
79              return pHoldings.serialize(holdings);
80          } else {
81              holdings = ds.retrieveHoldings(holdingsId);
82              Holdings eHoldings = new EHoldings();
83              return eHoldings.serialize(holdings);
84          }
85      }
86  
87      @Override
88      @RequestMapping(value = "/doc/", method = RequestMethod.PUT, consumes = "application/xml", produces = "application/xml")
89      @ResponseBody
90      public String updateHoldings(@RequestBody String requestBody) {
91          DocstoreService ds = BeanLocator.getDocstoreService();
92          Holdings holdings = new Holdings();
93          holdings = (Holdings) holdings.deserialize(requestBody);
94          if (holdings.getHoldingsType().equalsIgnoreCase("print")) {
95              holdings = new PHoldings();
96              holdings = (PHoldings) holdings.deserialize(requestBody);
97          } else {
98              holdings = new EHoldings();
99              holdings = (EHoldings) holdings.deserialize(requestBody);
100         }
101         try {
102             ds.updateHoldings((holdings));
103         } catch (DocstoreException e) {
104             LOG.error("Exception occurred in updateHoldings() :", e);
105             return DocstoreExceptionProcessor.toXml(e);
106         }
107         return responseUrl + holdings.getId();
108     }
109 
110     @Override
111     @RequestMapping(value = "/doc", method = RequestMethod.DELETE)
112     @ResponseBody
113     public String deleteHoldings(@RequestParam("holdingsId") String holdingsId) {
114         DocstoreService ds = BeanLocator.getDocstoreService();
115         try {
116             ds.deleteHoldings(holdingsId);
117         } catch (DocstoreException e) {
118             LOG.error("Exception occurred in deleteHoldings() :", e);
119             return DocstoreExceptionProcessor.toXml(e);
120         }
121         return "Suceess";
122     }
123 
124     @Override
125     @RequestMapping(value = "/doc/tree", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
126     @ResponseBody
127     public String createHoldingsTree(@RequestBody String requestBody) {
128         DocstoreService ds = BeanLocator.getDocstoreService();
129         HoldingsTree holdingsTree = new HoldingsTree();
130         holdingsTree = (HoldingsTree) holdingsTree.deserialize(requestBody);
131         try {
132             ds.createHoldingsTree(holdingsTree);
133         } catch (DocstoreException e) {
134             LOG.error("Exception occurred in createHoldingsTree()  :", e);
135             return DocstoreExceptionProcessor.toXml(e);
136         }
137         StringBuilder itemIds = new StringBuilder();
138         for (Item item : holdingsTree.getItems()) {
139             if (holdingsTree.getItems().get(holdingsTree.getItems().size() - 1) == item) {
140                 itemIds.append(item.getId());
141             } else {
142                 itemIds.append(item.getId() + "/");
143             }
144         }
145         return responseTreeUrl + holdingsTree.getHoldings().getId() + "/" + itemIds.toString();
146 
147     }
148 
149 
150     @Override
151     @RequestMapping(value = "/doc/trees", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
152     @ResponseBody
153     public String createHoldingsTrees(@RequestBody String requestBody) {
154         DocstoreService ds = BeanLocator.getDocstoreService();
155 
156         HoldingsTrees holdingsTrees = (HoldingsTrees) HoldingsTrees.deserialize(requestBody);
157         try {
158             for (HoldingsTree holdingsTree : holdingsTrees.getHoldingsTrees())
159                 ds.createHoldingsTree(holdingsTree);
160         } catch (DocstoreException e) {
161             LOG.error("Exception occurred in createHoldingsTrees() :", e);
162             return DocstoreExceptionProcessor.toXml(e);
163         }
164         BibImportResponse bibImportResponse = new BibImportResponse();
165         for (int i = 0; i < holdingsTrees.getHoldingsTrees().size(); i++) {
166             BibImportResult bibImportResult = new BibImportResult();
167             if (holdingsTrees.getHoldingsTrees().get(i).getHoldings().getId() != null) {
168                 bibImportResult.setMessage("success");
169             } else {
170                 bibImportResult.setId(String.valueOf(i));
171             }
172             bibImportResponse.getBibImportResults().add(bibImportResult);
173         }
174         return BibImportResponse.serialize(bibImportResponse);
175 
176     }
177 
178     @Override
179     @RequestMapping(value = "/doc/tree", method = RequestMethod.GET, produces = "application/xml")
180     @ResponseBody
181     public String retrieveHoldingsTree(@RequestParam("holdingsId") String holdingsId) {
182         DocstoreService ds = BeanLocator.getDocstoreService();
183         HoldingsTree holdingsTree = null;
184         try {
185             holdingsTree = ds.retrieveHoldingsTree(holdingsId);
186         } catch (DocstoreException e) {
187             LOG.error("Exception occurred in retrieveHoldingsTree() :", e);
188             return DocstoreExceptionProcessor.toXml(e);
189         }
190         return holdingsTree.serialize(holdingsTree);
191     }
192 
193     @Override
194     @RequestMapping(value = "/tree", method = RequestMethod.GET, produces = "application/xml")
195     @ResponseBody
196     public String retrieveHoldingsTrees(@RequestParam("bibId") String[] bibIds) {
197         DocstoreService ds = BeanLocator.getDocstoreService();
198         StringBuilder holdingsTrees = new StringBuilder("<holdingsTrees>");
199         for (String bibId : bibIds) {
200             try {
201                 BibTree bibTree = ds.retrieveBibTree(bibId);
202                 if (bibTree != null && bibTree.getHoldingsTrees() != null && bibTree.getHoldingsTrees().size() > 0) {
203                     holdingsTrees.append("\n" + "<holdingsTree>").append("\n");
204                     for (HoldingsTree holdingsTree : bibTree.getHoldingsTrees()) {
205                         holdingsTrees.append(holdingsTree.getHoldings().getContent());
206 
207                         holdingsTrees.append("<items>").append("\n");
208                         for (Item item : holdingsTree.getItems()) {
209                             holdingsTrees.append(item.getContent()).append("\n");
210                         }
211                         holdingsTrees.append("</items>").append("\n");
212                         holdingsTrees.append("</holdingsTree>").append("\n");
213                     }
214                 }
215             } catch (DocstoreException e) {
216                 LOG.error("Exception occurred in retrieveHoldingsTrees :", e);
217                 return DocstoreExceptionProcessor.toXml(e);
218             }
219         }
220         holdingsTrees.append("</holdingsTrees>");
221         String result = holdingsTrees.toString();
222         result = result.replaceAll("<shelvingOrder/>", "<shelvingOrder></shelvingOrder>");
223         result = result.replaceAll("<uri/>", "<uri></uri>");
224         result = result.replaceAll("<statisticalSearchingCode/>", "<statisticalSearchingCode></statisticalSearchingCode>");
225         result = result.replaceAll("<location/>", "<location></location>");
226         result = result.replaceAll("<donorInfo/>", "<donorInfo></donorInfo>");
227         result = result.replaceAll("<highDensityStorage/>", "<highDensityStorage></highDensityStorage>");
228         return result;
229     }
230 
231 
232     @Override
233     @RequestMapping(value = "/doc/find", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
234     @ResponseBody
235     public String findHoldings(@RequestBody String requestBody) {
236         DocstoreService ds = BeanLocator.getDocstoreService();
237         FindParams findParams = new FindParams();
238         findParams = (FindParams) findParams.deserialize(requestBody);
239         HashMap<String, String> hashMap = new HashMap();
240         List<FindParams.Map.Entry> entries = findParams.getMap().getEntry();
241         for (FindParams.Map.Entry entry : entries) {
242             hashMap.put(entry.getKey(), entry.getValue());
243         }
244         Holdings holdings = null;
245         try {
246             holdings = ds.findHoldings(hashMap);
247         } catch (DocstoreException e) {
248             LOG.error("Exception occurred in findHoldings() :", e);
249             return DocstoreExceptionProcessor.toXml(e);
250         }
251         return holdings.serialize(holdings);
252     }
253 
254     @Override
255     @RequestMapping(value = "/doc/tree/find", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
256     @ResponseBody
257     public String findHoldingsTree(@RequestBody String requestBody) {
258         DocstoreService ds = BeanLocator.getDocstoreService();
259         FindParams findParams = new FindParams();
260         findParams = (FindParams) findParams.deserialize(requestBody);
261         HashMap<String, String> hashMap = new HashMap();
262         List<FindParams.Map.Entry> entries = findParams.getMap().getEntry();
263         for (FindParams.Map.Entry entry : entries) {
264             hashMap.put(entry.getKey(), entry.getValue());
265         }
266         HoldingsTree holdings = null;
267         try {
268             holdings = ds.findHoldingsTree(hashMap);
269         } catch (DocstoreException e) {
270             LOG.error("Exception occurred in findHoldingsTree() :", e);
271             return DocstoreExceptionProcessor.toXml(e);
272         }
273         return holdings.serialize(holdings);
274     }
275 
276     @Override
277     @RequestMapping(value = "/doc/{holdingsId}/bound", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
278     @ResponseBody
279     public String boundWithBibs(@PathVariable("holdingsId") String holdingsId, @RequestBody String requestBody) {
280         DocstoreService ds = BeanLocator.getDocstoreService();
281         if (requestBody.contains("[")) {
282             requestBody = requestBody.substring(1, requestBody.length() - 1);
283         }
284         String[] splitBibid = requestBody.split(",");
285         List<String> bibIds = new ArrayList<>();
286         for (String bibId : splitBibid) {
287             bibIds.add(bibId);
288         }
289         try {
290             ds.boundHoldingsWithBibs(holdingsId, bibIds);
291         } catch (DocstoreException e) {
292             LOG.error("Exception occurred in boundWithBibs() :", e);
293             return DocstoreExceptionProcessor.toXml(e);
294         }
295         return responseUrl + holdingsId + bindUrl;
296     }
297 
298     @RequestMapping(value = "/doc/{seriesHoldingsId}/breakAnalytic", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
299     @ResponseBody
300     public String breakAnalyticsRelation(@PathVariable("seriesHoldingsId") String seriesHoldingsId, @RequestBody String requestBody) {
301         DocstoreService ds = BeanLocator.getDocstoreService();
302         if (requestBody.contains("[")) {
303             requestBody = requestBody.substring(1, requestBody.length() - 1);
304         }
305         String[] splitItemid = requestBody.split(",");
306         List<String> itemIds = new ArrayList<>();
307         for (String itemId : splitItemid) {
308             itemIds.add(itemId);
309         }
310         try {
311             ds.breakAnalyticsRelation(seriesHoldingsId, itemIds);
312         } catch (DocstoreException e) {
313             LOG.error("Exception occurred in breakAnalyticsRelation() :", e);
314             return DocstoreExceptionProcessor.toXml(e);
315         }
316         return responseUrl + seriesHoldingsId + unbindUrl;
317     }
318 
319     @RequestMapping(value = "/doc/{seriesHoldingsId}/analytic", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
320     @ResponseBody
321     public String createAnalyticsRelation(@PathVariable("seriesHoldingsId") String seriesHoldingsId, @RequestBody String requestBody) {
322         DocstoreService ds = BeanLocator.getDocstoreService();
323         if (requestBody.contains("[")) {
324             requestBody = requestBody.substring(1, requestBody.length() - 1);
325         }
326         String[] splitItemid = requestBody.split(",");
327         List<String> itemIds = new ArrayList<>();
328         for (String itemId : splitItemid) {
329             itemIds.add(itemId);
330         }
331         try {
332             ds.createAnalyticsRelation(seriesHoldingsId, itemIds);
333         } catch (DocstoreException e) {
334             LOG.error("Exception occurrred in createAnalyticsRelation() :", e);
335             return DocstoreExceptionProcessor.toXml(e);
336         }
337         return responseUrl + seriesHoldingsId + bindUrl;
338     }
339 
340 
341     @RequestMapping(value = "/doc/{holdingsId}/transfer", method = RequestMethod.POST, consumes = "application/xml", produces = "application/text")
342     @ResponseBody
343     public String transferItems(@PathVariable("holdingsId") String holdingsId,  @RequestParam("itemId") String[] itemIds) {
344         DocstoreService ds = BeanLocator.getDocstoreService();
345         List<String> itemsIds = new ArrayList<>();
346         for (String itemId : itemIds) {
347             itemsIds.add(itemId);
348         }
349         try {
350             ds.transferItems(itemsIds, holdingsId);
351         } catch (DocstoreException e) {
352             LOG.error("Exception occurred in transferItems() :", e);
353             return DocstoreExceptionProcessor.toXml(e);
354         }
355         return "Success";
356     }
357 
358     @RequestMapping(value = "/doc/bulkUpdate", method = RequestMethod.PUT, consumes = "application/xml", produces = "application/xml")
359     @ResponseBody
360     public String bulkUpdateHoldings( @RequestBody String requestBody) {
361         DocstoreService ds = BeanLocator.getDocstoreService();
362 
363         String[] bulkUpdateRequest = requestBody.split("\n", 3);
364 
365         String holdingsId = bulkUpdateRequest[0];
366         String canUpdateStaffOnlyFlag = bulkUpdateRequest[1];
367         requestBody = bulkUpdateRequest[2];
368 
369 
370         String[] holdingItemIds = holdingsId.split(",");
371         List<String> holdingIds = new ArrayList<>();
372         for (String itemId : holdingItemIds) {
373             holdingIds.add(itemId);
374         }
375         Holdings holdings = new Holdings();
376         holdings = (Holdings) holdings.deserialize(requestBody);
377         if (holdings.getHoldingsType().equalsIgnoreCase("print")) {
378             holdings = new PHoldings();
379             holdings = (PHoldings) holdings.deserialize(requestBody);
380         } else {
381             holdings = new EHoldings();
382             holdings = (EHoldings) holdings.deserialize(requestBody);
383         }
384         try {
385             ds.bulkUpdateHoldings(holdings, holdingIds,canUpdateStaffOnlyFlag);
386         } catch (DocstoreException e) {
387             LOG.error("Exception occurred in bulkUpdateHoldings() :", e);
388             return DocstoreExceptionProcessor.toXml(e);
389         }
390         return "Success";
391     }
392 
393 
394 }