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
22
23
24
25
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 }