1 package org.kuali.ole.docstore.repository;
2
3 import org.kuali.ole.docstore.OleDocStoreException;
4 import org.kuali.ole.docstore.document.WorkInstanceDocumentManager;
5 import org.kuali.ole.docstore.model.xmlpojo.ingest.RequestDocument;
6 import org.kuali.ole.docstore.model.xmlpojo.work.instance.oleml.InstanceCollection;
7 import org.kuali.ole.docstore.model.xmlpojo.work.instance.oleml.Item;
8 import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkItemOlemlRecordProcessor;
9 import org.kuali.ole.docstore.process.ProcessParameters;
10 import org.kuali.ole.repository.NodeHandler;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 import javax.jcr.Node;
15 import javax.jcr.NodeIterator;
16 import javax.jcr.RepositoryException;
17 import javax.jcr.Session;
18 import java.io.FileNotFoundException;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import static org.kuali.ole.docstore.process.ProcessParameters.*;
23
24
25
26
27
28 public class WorkInstanceNodeManager
29 extends CustomNodeManager
30 implements NodeManager {
31 private static WorkInstanceNodeManager ourInstance = new WorkInstanceNodeManager();
32 private static Logger LOG = LoggerFactory.getLogger(WorkInstanceNodeManager.class);
33
34 public static WorkInstanceNodeManager getInstance() {
35 return ourInstance;
36 }
37
38 private WorkInstanceNodeManager() {
39 super();
40 numLevels = 2;
41 }
42
43 public String getParentNodePath() {
44 return "/work/instance";
45 }
46
47 @Override
48 public Node createFileNode(RequestDocument document, String name, Node parentNode, Session session)
49 throws OleDocStoreException {
50 Node instanceNode = null;
51 WorkInstanceDocumentManager resolver = WorkInstanceDocumentManager.getInstance();
52 List<String> docUUIDs = new ArrayList<String>();
53 List<RequestDocument> resolvedDocs = resolver.getParsedHoldingsNItemDocuments(document, docUUIDs);
54 CustomNodeManager nodeManager = CustomNodeManager.getInstance();
55 try {
56 instanceNode = initLevelNode(NODE_INSTANCE, parentNode, false, session);
57 Node holdingsNode = initNonStaticNode(NODE_HOLDINGS, instanceNode);
58 document.setUuid(instanceNode.getIdentifier());
59
60 Node fileNode = nodeManager.createFileNode(resolvedDocs.get(0), FILE_INSTANCE, instanceNode, session);
61 resolver.modifyDocumentContent(resolvedDocs.get(0), fileNode.getIdentifier(), instanceNode.getIdentifier());
62 createContentNode(fileNode, resolvedDocs.get(0), parentNode, session);
63
64 fileNode = nodeManager.createFileNode(resolvedDocs.get(1), FILE_HOLDINGS, holdingsNode, session);
65 resolver.modifyDocumentContent(resolvedDocs.get(1), fileNode.getIdentifier(), holdingsNode.getIdentifier());
66 createContentNode(fileNode, resolvedDocs.get(1), parentNode, session);
67
68 fileNode = nodeManager.createFileNode(resolvedDocs.get(2), FILE_SOURCE_HOLDINGS, holdingsNode, session);
69 resolver.modifyDocumentContent(resolvedDocs.get(2), fileNode.getIdentifier(), holdingsNode.getIdentifier());
70 createContentNode(fileNode, resolvedDocs.get(2), parentNode, session);
71
72
73 for (int i = 3; i < resolvedDocs.size(); i++) {
74 fileNode = nodeManager.createFileNode(resolvedDocs.get(i), FILE_ITEM, holdingsNode, session);
75 resolver.modifyDocumentContent(resolvedDocs.get(i), fileNode.getIdentifier(),
76 holdingsNode.getIdentifier());
77 createContentNode(fileNode, resolvedDocs.get(i), parentNode, session);
78 }
79
80 ((InstanceCollection) document.getContent().getContentObject()).getInstance().get(0).setInstanceIdentifier(
81 instanceNode.getIdentifier());
82 }
83 catch (Exception e) {
84 LOG.info(e.getMessage(), e);
85 }
86 return instanceNode;
87 }
88
89 public void ingestItemRecForInstance(RequestDocument reqDoc, Session session) throws OleDocStoreException {
90 try {
91 Node nodeByUUID = getNodeByUUID(session, reqDoc.getId());
92 Node holdingsNode = nodeByUUID.getNode(ProcessParameters.NODE_HOLDINGS);
93 NodeHandler nodeHandler = new NodeHandler();
94
95 for (RequestDocument linkedItemDocument : reqDoc.getLinkedRequestDocuments()) {
96 WorkItemOlemlRecordProcessor recordProcessor = new WorkItemOlemlRecordProcessor();
97 Item item = recordProcessor.fromXML(linkedItemDocument.getContent().getContent());
98 linkedItemDocument.getContent().setContentObject(item);
99 String uuid = (nodeHandler.initFileNode(linkedItemDocument, FILE_ITEM, holdingsNode, session))
100 .getIdentifier();
101 linkedItemDocument.setId(uuid);
102 }
103 }
104 catch (Exception e) {
105 LOG.info(e.getMessage());
106 throw new OleDocStoreException(e.getMessage(), e);
107 }
108 }
109
110
111 public Node getNodeByUUID(Session newSession, String uuid) throws OleDocStoreException {
112 return CustomNodeManager.getInstance().getNodeByUUID(newSession, uuid);
113 }
114
115
116 public String getInstanceData(Node instanceNode)
117 throws RepositoryException, OleDocStoreException, FileNotFoundException {
118 String instance = "";
119 String holdings = "";
120 String sourceHolding = "";
121 List<String> items = new ArrayList<String>();
122 StringBuffer stringBuffer = new StringBuffer();
123 NodeIterator nodeIterator = instanceNode.getNodes();
124 Node node = null;
125 while (nodeIterator.hasNext()) {
126 node = nodeIterator.nextNode();
127 if (node.getName().equalsIgnoreCase(ProcessParameters.FILE_INSTANCE)) {
128 instance = getData(node);
129 }
130 else if (node.getName().equalsIgnoreCase(ProcessParameters.NODE_HOLDINGS)) {
131 NodeIterator nodes = node.getNodes();
132 while (nodes.hasNext()) {
133 Node node1 = nodes.nextNode();
134 if (node1.getName().equalsIgnoreCase(ProcessParameters.FILE_HOLDINGS)) {
135 holdings = getData(node1);
136 }
137 else if (node1.getName().equalsIgnoreCase(ProcessParameters.FILE_SOURCE_HOLDINGS)) {
138 if (getData(node1) != null && getData(node1).length() > 0) {
139 sourceHolding = getData(node1);
140 }
141 }
142 else if (node1.getName().equalsIgnoreCase(ProcessParameters.FILE_ITEM)) {
143 items.add(getData(node1));
144 }
145 }
146
147 }
148 }
149 stringBuffer
150 .append(instance.substring(instance.indexOf("<instanceCollection>"), instance.indexOf("</instance>")));
151 if (!holdings.equalsIgnoreCase("<null/>")) {
152 stringBuffer.append(holdings);
153 }
154 if (!sourceHolding.equalsIgnoreCase("<null/>")) {
155 stringBuffer.append(sourceHolding);
156 }
157 stringBuffer.append("<items>");
158 for (String str : items) {
159 if (!str.equalsIgnoreCase("<null/>")) {
160 stringBuffer.append(str);
161 }
162 }
163 stringBuffer.append("</items>");
164 stringBuffer.append("</instance>");
165 stringBuffer.append("</instanceCollection>");
166 return stringBuffer.toString();
167 }
168
169 public String getXMLOnlyForInstanceType(Node instanceNode)
170 throws RepositoryException, OleDocStoreException, FileNotFoundException {
171 NodeIterator nodeIterator = instanceNode.getNodes();
172 Node node = null;
173 String instance = "";
174 while (nodeIterator.hasNext()) {
175 node = nodeIterator.nextNode();
176 if (node.getName().equalsIgnoreCase("instanceFile")) {
177 instance = getData(node);
178
179 }
180 }
181 return instance;
182 }
183 }