]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
ca4ac692e171ac001d7222e99a2c47632cc98e42
[tmp/jakarta-migration.git] /
1 /**     \r
2  * RelationUtilsNuxeoImpl.java\r
3  *\r
4  * {Purpose of This Class}\r
5  *\r
6  * {Other Notes Relating to This Class (Optional)}\r
7  *\r
8  * $LastChangedBy: $\r
9  * $LastChangedRevision: $\r
10  * $LastChangedDate: $\r
11  *\r
12  * This document is a part of the source code and related artifacts\r
13  * for CollectionSpace, an open source collections management system\r
14  * for museums and related institutions:\r
15  *\r
16  * http://www.collectionspace.org\r
17  * http://wiki.collectionspace.org\r
18  *\r
19  * Copyright © 2009 {Contributing Institution}\r
20  *\r
21  * Licensed under the Educational Community License (ECL), Version 2.0.\r
22  * You may not use this file except in compliance with this License.\r
23  *\r
24  * You may obtain a copy of the ECL 2.0 License at\r
25  * https://source.collectionspace.org/collection-space/LICENSE.txt\r
26  */\r
27 package org.collectionspace.services.nuxeo.relation;\r
28 \r
29 import java.io.IOException;\r
30 import java.io.Serializable;\r
31 import java.util.ArrayList;\r
32 import java.util.List;\r
33 import java.util.Map;\r
34 \r
35 import org.collectionspace.services.relation.RelationJAXBSchema;\r
36 import org.collectionspace.services.relation.RelationListItemJAXBSchema;\r
37 import org.collectionspace.services.common.relation.RelationUtils;\r
38 \r
39 import org.collectionspace.services.relation.Relation;\r
40 import org.collectionspace.services.relation.RelationshipType;\r
41 import org.collectionspace.services.nuxeo.util.NuxeoUtils;\r
42 import org.collectionspace.services.common.repository.DocumentException;\r
43 \r
44 import org.dom4j.Document;\r
45 import org.dom4j.Element;\r
46 import org.dom4j.dom.DOMElement;\r
47 import org.dom4j.dom.DOMDocument;\r
48 import org.dom4j.dom.DOMDocumentFactory;\r
49 //import org.dom4j.DocumentException;\r
50 \r
51 import org.nuxeo.common.utils.IdUtils;\r
52 import org.nuxeo.ecm.core.api.ClientException;\r
53 import org.nuxeo.ecm.core.api.DocumentModel;\r
54 import org.nuxeo.ecm.core.api.DocumentModelList;\r
55 import org.nuxeo.ecm.core.api.model.DocumentPart;\r
56 import org.nuxeo.ecm.core.api.repository.RepositoryInstance;\r
57 import org.slf4j.Logger;\r
58 import org.slf4j.LoggerFactory;\r
59 //import org.w3c.dom.DOMException;\r
60 //import org.w3c.dom.Element;\r
61 \r
62 /**\r
63  * The Class RelationUtilsNuxeoImpl.\r
64  */\r
65 public class RelationUtilsNuxeoImpl implements RelationUtils {\r
66         \r
67         /** The C s_ relatio n_ servic e_ name. */\r
68         static public String CS_RELATION_SERVICE_NAME = "relations";\r
69         static public String CS_EMPTY_STRING = "";\r
70         \r
71         /** The Constant REL_NUXEO_DOCTYPE. */\r
72         final public static String REL_NUXEO_DOCTYPE = "Relation";\r
73         \r
74         /** The Constant REL_NUXEO_SCHEMA_NAME. */\r
75         final public static String REL_NUXEO_SCHEMA_NAME = "relation";\r
76         \r
77         /** The Constant REL_NUXEO_SCHEMA_ROOT_ELEMENT. */\r
78         final public static String REL_NUXEO_SCHEMA_ROOT_ELEMENT = "relationtype";\r
79         \r
80         /** The Constant REL_NUXEO_DC_TITLE. */\r
81         final public static String REL_NUXEO_DC_TITLE = "CollectionSpace-Relation";\r
82         \r
83         /** The logger. */\r
84         private static Logger logger = LoggerFactory\r
85         .getLogger(RelationUtilsNuxeoImpl.class);       \r
86 \r
87 \r
88         /**\r
89          * Fill relation from doc model.\r
90          * \r
91          * @param relation the relation\r
92          * @param relDocModel the rel doc model\r
93          * \r
94          * @throws ClientException the client exception\r
95          */\r
96         static public void fillRelationFromDocModel(Relation relation, DocumentModel relDocModel)\r
97                         throws ClientException {\r
98                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
99                 Object valueObject = null;\r
100 \r
101                 relation.setCsid(relDocModel.getId());\r
102 \r
103                 valueObject = relDocModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
104                                 + RelationJAXBSchema.DOCUMENT_ID_1);\r
105                 relation.setDocumentId1((String) valueObject);\r
106 \r
107                 valueObject = relDocModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
108                                 + RelationJAXBSchema.DOCUMENT_TYPE_1);\r
109                 relation.setDocumentType1((String) valueObject);\r
110 \r
111                 valueObject = relDocModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
112                                 + RelationJAXBSchema.DOCUMENT_ID_2);\r
113                 relation.setDocumentId2((String) valueObject);\r
114 \r
115                 valueObject = relDocModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
116                                 + RelationJAXBSchema.DOCUMENT_TYPE_1);\r
117                 relation.setDocumentType2((String) valueObject);\r
118 \r
119                 valueObject = relDocModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
120                                 + RelationJAXBSchema.RELATIONSHIP_TYPE);\r
121                 relation.setRelationshipType(RelationshipType\r
122                                 .fromValue((String) valueObject));\r
123 \r
124                 if (logger.isDebugEnabled() == true) {\r
125                         System.out.println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");\r
126                         System.out.println(relation.toString());\r
127                         System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");\r
128                 }\r
129         }\r
130 \r
131         /**\r
132          * Fill doc model from relation.\r
133          * \r
134          * @param p the p\r
135          * @param relDocModel the rel doc model\r
136          * \r
137          * @throws Exception the exception\r
138          */\r
139         static public void fillDocModelFromRelation(Relation p, DocumentModel relDocModel)\r
140                         throws Exception {\r
141 \r
142                 // set the DublinCore title (this works)\r
143                 relDocModel.setPropertyValue("dublincore:title", "default title");\r
144 \r
145                 // // set value for <documentType1> element\r
146                 // try {\r
147                 // relDocModel.setProperty("relation", "/relationtype/documentId1",\r
148                 // "docId1");\r
149                 // } catch (Exception x) {\r
150                 // x.printStackTrace();\r
151                 // }\r
152 \r
153                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
154                 if (p.getDocumentId1() != null) {\r
155                         String property = xpathRoot + RelationJAXBSchema.DOCUMENT_ID_1;\r
156                         relDocModel.setProperty(REL_NUXEO_SCHEMA_NAME, property, p\r
157                                         .getDocumentId1());\r
158                 }\r
159                 if (p.getDocumentType1() != null) {\r
160                         String property = xpathRoot + RelationJAXBSchema.DOCUMENT_TYPE_1;\r
161                         relDocModel.setProperty(REL_NUXEO_SCHEMA_NAME, property, p\r
162                                         .getDocumentType1());\r
163                 }\r
164                 if (p.getDocumentId2() != null) {\r
165                         String property = xpathRoot + RelationJAXBSchema.DOCUMENT_ID_2;\r
166                         relDocModel.setProperty(REL_NUXEO_SCHEMA_NAME, property, p\r
167                                         .getDocumentId2());\r
168                 }\r
169                 if (p.getDocumentType2() != null) {\r
170                         String property = xpathRoot + "/"\r
171                                         + RelationJAXBSchema.DOCUMENT_TYPE_2;\r
172                         relDocModel.setProperty(REL_NUXEO_SCHEMA_NAME, property, p\r
173                                         .getDocumentType2());\r
174                 }\r
175 \r
176                 if (p.getRelationshipType() != null) {\r
177                         String property = xpathRoot + RelationJAXBSchema.RELATIONSHIP_TYPE;\r
178                         relDocModel.setProperty(REL_NUXEO_SCHEMA_NAME, property, p\r
179                                         .getRelationshipType().value());\r
180                 }\r
181         }\r
182         \r
183         /**\r
184          * Prints the document model.\r
185          * \r
186          * @param documentModel the document model\r
187          */\r
188         static public void printDocumentModel(DocumentModel documentModel) {\r
189                 System.out.println(documentModel);\r
190         }\r
191         \r
192         /**\r
193          * Describe document model.\r
194          * \r
195          * @param docModel the doc model\r
196          * \r
197          * @throws Exception the exception\r
198          */\r
199         static private void describeDocumentModel(DocumentModel docModel) throws Exception {\r
200                 String[] schemas = docModel.getDeclaredSchemas();\r
201                 for (int i = 0; schemas != null && i < schemas.length; i++) {\r
202                         System.out.println("Schema-" + i + "=" + schemas[i]);\r
203                 }\r
204                 \r
205                 DocumentPart[] parts = docModel.getParts();\r
206                 Map<String,Serializable> propertyValues = null;\r
207                 for (int i = 0; parts != null && i < parts.length; i++) {\r
208                         System.out.println("Part-" + i + " name =" + parts[i].getName());\r
209                         System.out.println("Part-" + i + " path =" + parts[i].getPath());\r
210                         System.out.println("Part-" + i + " schema =" + parts[i].getSchema().getName());\r
211                         propertyValues = parts[i].exportValues();\r
212                 }\r
213 \r
214         }\r
215 \r
216         /**\r
217          * Creates the relationship.\r
218          * \r
219          * @param nuxeoRepoSession the nuxeo repo session\r
220          * @param newRelation the new relation\r
221          * \r
222          * @return the document model\r
223          * \r
224          * @throws DocumentException the document exception\r
225          */\r
226         static public DocumentModel createRelationship(Object nuxeoRepoSession, Relation newRelation)\r
227                         throws DocumentException {\r
228                 DocumentModel result = null;\r
229                 RepositoryInstance repoSession = (RepositoryInstance)nuxeoRepoSession;\r
230                 \r
231                 try {\r
232                         // get the Nuxeo 'Relations' workspace\r
233                         DocumentModel workspaceModel = NuxeoUtils.getWorkspaceModel(repoSession,\r
234                                         CS_RELATION_SERVICE_NAME);\r
235                         \r
236                 String docType = REL_NUXEO_DOCTYPE;\r
237                 String id = IdUtils.generateId("New " + docType);\r
238                 \r
239                 //create document model\r
240                 String workspacePath = workspaceModel.getPathAsString();            \r
241                 DocumentModel newRelDocModel = repoSession.createDocumentModel(workspacePath, id, docType);\r
242         \r
243                 newRelation.setCsid(newRelDocModel.getId());\r
244                 fillDocModelFromRelation(newRelation, newRelDocModel);\r
245                 \r
246                 //create document with the new DocumentModel\r
247                 result = repoSession.createDocument(newRelDocModel);\r
248                 repoSession.save();\r
249                 } catch (Exception e) {\r
250                         e.printStackTrace();\r
251                         throw new DocumentException(e);\r
252                 }\r
253                 \r
254                 return result;\r
255         }\r
256         \r
257         /* (non-Javadoc)\r
258          * @see org.collectionspace.services.common.RelationUtils#createRelationship(java.lang.Object, java.lang.String, java.lang.String, java.lang.String)\r
259          */\r
260         public Relation createRelationship(Object nuxeoRepoSession, String subjectCsid, String predicate,\r
261                         String objectCsid) throws DocumentException {\r
262                 Relation result = null;\r
263                 RepositoryInstance repoSession = (RepositoryInstance)nuxeoRepoSession;\r
264                 \r
265         Relation temp = new Relation();\r
266         temp.setDocumentId1(subjectCsid);\r
267         temp.setRelationshipType(null);\r
268         temp.setDocumentId2(objectCsid);\r
269         createRelationship(repoSession, temp);\r
270                 \r
271                 return result;\r
272         }\r
273         \r
274         /* (non-Javadoc)\r
275          * @see org.collectionspace.services.common.RelationUtils#getRelationships(java.lang.Object)\r
276          */\r
277         public List<Relation> getRelationships(Object nuxeoRepoSession)\r
278                         throws DocumentException {\r
279                 List<Relation> result = null;\r
280                 RepositoryInstance repoSession = (RepositoryInstance)nuxeoRepoSession;\r
281 \r
282                 try {\r
283                         DocumentModel relationWorkspace = NuxeoUtils.getWorkspaceModel(\r
284                                         repoSession, CS_RELATION_SERVICE_NAME);\r
285                         DocumentModelList children = repoSession.getChildren(relationWorkspace\r
286                                         .getRef());\r
287                         \r
288                         result = new ArrayList<Relation>();\r
289                         Relation relation = null;\r
290                         for (DocumentModel child : children) {\r
291                                 relation = new Relation();\r
292                                 fillRelationFromDocModel(relation, child);\r
293                                 result.add(relation);\r
294                         }\r
295                 } catch (Exception e) {\r
296                         e.printStackTrace();\r
297                         throw new DocumentException(e);\r
298                 }\r
299 \r
300                 return result;\r
301         }\r
302         \r
303         /* (non-Javadoc)\r
304          * @see org.collectionspace.services.common.RelationUtils#getRelationships(java.lang.Object, java.lang.String)\r
305          */\r
306         public List<Relation> getRelationships(Object nuxeoRepoSession, String csid)\r
307                         throws DocumentException {\r
308                 List<Relation> result = null;\r
309                 RepositoryInstance repoSession = (RepositoryInstance)nuxeoRepoSession;\r
310                                 \r
311                 try {\r
312                         DocumentModel relationWorkspace = NuxeoUtils.getWorkspaceModel(\r
313                                         repoSession, CS_RELATION_SERVICE_NAME);\r
314                         DocumentModelList children = repoSession.getChildren(relationWorkspace\r
315                                         .getRef());\r
316                         \r
317                         result = new ArrayList<Relation>();\r
318                         Relation relation = null;\r
319                         for (DocumentModel child : children) {\r
320                                 if ((isSubjectOfRelation(csid, child) == true) ||\r
321                                                 (isObjectOfRelation(csid, child) == true)) {\r
322                                         relation = new Relation();\r
323                                         fillRelationFromDocModel(relation, child);\r
324                                         result.add(relation);\r
325                                 }\r
326                         }\r
327                 } catch (Exception e) {\r
328                         e.printStackTrace();\r
329                         throw new DocumentException(e);\r
330                 }\r
331                 \r
332                 return result;\r
333         }\r
334         \r
335         \r
336         /* (non-Javadoc)\r
337          * @see org.collectionspace.services.common.RelationUtils#getRelationships(java.lang.Object, java.lang.String, java.lang.String, java.lang.String)\r
338          */\r
339         public List<Relation> getRelationships(Object nuxeoRepoSession,\r
340                         String subjectCsid, \r
341                         String predicate, \r
342                         String objectCsid) throws DocumentException {\r
343                 List<Relation> result = null;\r
344                 RepositoryInstance repoSession = (RepositoryInstance)nuxeoRepoSession;\r
345                 \r
346                 try {\r
347                         DocumentModel relationWorkspace = NuxeoUtils.getWorkspaceModel(\r
348                                         repoSession, CS_RELATION_SERVICE_NAME);\r
349                         DocumentModelList children = repoSession.getChildren(relationWorkspace\r
350                                         .getRef());\r
351                         \r
352                         result = new ArrayList<Relation>();\r
353                         Relation relation = null;\r
354                         for (DocumentModel child : children) {\r
355                                 if (isQueryMatch(child, subjectCsid, predicate, objectCsid) == true) {\r
356                                         relation = new Relation();\r
357                                         fillRelationFromDocModel(relation, child);\r
358                                         result.add(relation);                   }\r
359                         }\r
360                 } catch (Exception e) {\r
361                         e.printStackTrace();\r
362                         throw new DocumentException(e);\r
363                 }\r
364                 \r
365                 return result;\r
366         }\r
367                 \r
368         /**\r
369          * Checks if is subject of relation.\r
370          * \r
371          * @param csid the csid\r
372          * @param documentModel the document model\r
373          * \r
374          * @return true, if is subject of relation\r
375          * \r
376          * @throws ClientException the client exception\r
377          */\r
378         private boolean isSubjectOfRelation(String csid, DocumentModel documentModel)\r
379                         throws ClientException {\r
380                 boolean result = false;\r
381                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
382 \r
383                 Object valueObject = documentModel.getProperty(REL_NUXEO_SCHEMA_NAME, xpathRoot\r
384                                 + RelationJAXBSchema.DOCUMENT_ID_1);\r
385                 if (valueObject != null && csid != null) {\r
386                         String subjectID = (String) valueObject;\r
387                         result = subjectID.equals(csid);\r
388                 }\r
389                 \r
390                 return result;\r
391         }\r
392 \r
393         /**\r
394          * Checks if is object of relation.\r
395          * \r
396          * @param csid the csid\r
397          * @param documentModel the document model\r
398          * \r
399          * @return true, if is object of relation\r
400          * \r
401          * @throws ClientException the client exception\r
402          */\r
403         private boolean isObjectOfRelation(String csid, DocumentModel documentModel)\r
404                         throws ClientException {\r
405                 boolean result = false;\r
406                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
407 \r
408                 Object valueObject = documentModel.getProperty(REL_NUXEO_SCHEMA_NAME,\r
409                                 xpathRoot + RelationJAXBSchema.DOCUMENT_ID_2);\r
410                 if (valueObject != null  && csid != null) {\r
411                         String subjectID = (String) valueObject;\r
412                         result = subjectID.equals(csid);\r
413                 }\r
414 \r
415                 return result;\r
416         }\r
417         \r
418         private boolean isPredicateOfRelation(String predicate,\r
419                         DocumentModel documentModel) throws ClientException {\r
420                 boolean result = false;\r
421                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
422 \r
423                 Object valueObject = documentModel.getProperty(REL_NUXEO_SCHEMA_NAME,\r
424                                 xpathRoot + RelationJAXBSchema.RELATIONSHIP_TYPE);\r
425                 if (valueObject != null  && predicate != null) {\r
426                         String relationType = (String) valueObject;\r
427                         result = predicate.equalsIgnoreCase(relationType);\r
428                 }\r
429 \r
430                 return result;\r
431         }\r
432 \r
433         /**\r
434          * Gets the object ID from of the (Subject-Predicate-Object) relationship.\r
435          * \r
436          * @param csid the ID of the 'Subject' (Subject-Predicate-Object)\r
437          * @param documentModel represents the relation entry.\r
438          * \r
439          * @return the object csid of the relationship\r
440          * \r
441          * @throws ClientException the client exception\r
442          */\r
443         private String getObjectFromSubject(String csid, DocumentModel documentModel)\r
444                         throws ClientException {\r
445                 String result = null;\r
446                 String xpathRoot = "/" + REL_NUXEO_SCHEMA_ROOT_ELEMENT + "/";\r
447 \r
448                 Object valueObject = documentModel.getProperty(REL_NUXEO_SCHEMA_NAME,\r
449                                 xpathRoot + RelationJAXBSchema.DOCUMENT_ID_1);\r
450                 if (valueObject != null) {\r
451                         String subjectID = (String) valueObject;\r
452                         if (subjectID.equals(csid) == true) {\r
453                                 valueObject = documentModel.getProperty(REL_NUXEO_SCHEMA_NAME,\r
454                                                 xpathRoot + RelationJAXBSchema.DOCUMENT_ID_2);\r
455                                 if (valueObject != null) {\r
456                                         result = (String) valueObject;\r
457                                 }\r
458                         }\r
459                 }\r
460 \r
461                 return result;\r
462         }\r
463         \r
464         static public Document getDocument(List<Relation> relationList)\r
465                         throws DocumentException {\r
466                 DOMDocumentFactory domfactory = new DOMDocumentFactory();\r
467                 DOMDocument result = (DOMDocument) domfactory.createDocument();\r
468 \r
469                 try {\r
470                         // setup the root element\r
471                         DOMElement root = (DOMElement) result\r
472                                         .createElement(RelationListItemJAXBSchema.REL_ROOT_ELEM_NAME);\r
473                         result.setRootElement((org.dom4j.Element) root);\r
474 \r
475                         // populate the document with child elements\r
476                         for (Relation child : relationList) {\r
477                                 DOMElement el = (DOMElement) result.createElement(RelationJAXBSchema.REL_ROOT_ELEM_NAME);\r
478                                 el.setAttribute(RelationListItemJAXBSchema.CSID, child\r
479                                                 .getCsid());\r
480                                 el.setAttribute(RelationListItemJAXBSchema.URI, getRelURL(\r
481                                                 CS_RELATION_SERVICE_NAME, child.getCsid()));\r
482 \r
483                                 if (logger.isDebugEnabled() == true) {\r
484                                         System.out.println(el.asXML());\r
485                                 }\r
486                                 \r
487                                 root.appendChild(el);\r
488                         }\r
489                 } catch (Exception e) {\r
490                         if (logger.isDebugEnabled()) {\r
491                                 logger.debug("Caught exception ", e);\r
492                         }\r
493                         throw new DocumentException(e);\r
494                 }\r
495 \r
496                 if (logger.isDebugEnabled() == true) {\r
497                         System.out.println(result.asXML());\r
498                 }\r
499 \r
500                 return result;\r
501         }\r
502         \r
503         private boolean isQueryMatch(DocumentModel documentModel,\r
504                         String subjectCsid,\r
505                         String predicate,\r
506                         String objectCsid) throws ClientException {\r
507                 boolean result = true;\r
508                 \r
509                 block: {\r
510                         if (subjectCsid != null) {\r
511                                 if (isSubjectOfRelation(subjectCsid, documentModel) == false) {\r
512                                         result = false;\r
513                                         break block;\r
514                                 }\r
515                         }\r
516                         if (predicate != null) {\r
517                                 if (isPredicateOfRelation(predicate, documentModel) == false) {\r
518                                         result = false;\r
519                                         break block;\r
520                                 }\r
521                         }\r
522                         if (objectCsid != null) {\r
523                                 if (isObjectOfRelation(objectCsid, documentModel) == false) {\r
524                                         result = false;\r
525                                         break block;\r
526                                 }\r
527                         }\r
528                 }\r
529                 \r
530                 return result;\r
531         }\r
532     private static String getRelURL(String repo, String uuid) {\r
533         return '/' + repo + '/' + uuid;\r
534     }   \r
535         \r
536 }\r