2 * This document is a part of the source code and related artifacts
3 * for CollectionSpace, an open source collections management system
4 * for museums and related institutions:
6 * http://www.collectionspace.org
7 * http://wiki.collectionspace.org
9 * Copyright 2009 University of California at Berkeley
11 * Licensed under the Educational Community License (ECL), Version 2.0.
12 * You may not use this file except in compliance with this License.
14 * You may obtain a copy of the ECL 2.0 License at
16 * https://source.collectionspace.org/collection-space/LICENSE.txt
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
24 package org.collectionspace.services.common.vocabulary.nuxeo;
26 import java.util.ArrayList;
27 import java.util.Collection;
28 import java.util.HashMap;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.ListIterator;
34 import org.collectionspace.services.client.AuthorityClient;
35 import org.collectionspace.services.client.PayloadInputPart;
36 import org.collectionspace.services.client.PayloadOutputPart;
37 import org.collectionspace.services.client.PoxPayloadIn;
38 import org.collectionspace.services.client.PoxPayloadOut;
39 import org.collectionspace.services.client.RelationClient;
40 //import org.collectionspace.services.common.authority.AuthorityItemRelations;
41 import org.collectionspace.services.common.api.CommonAPI;
42 import org.collectionspace.services.common.api.RefName;
43 import org.collectionspace.services.common.api.Tools;
44 import org.collectionspace.services.common.context.MultipartServiceContext;
45 import org.collectionspace.services.common.context.ServiceContext;
46 import org.collectionspace.services.common.document.DocumentWrapper;
47 import org.collectionspace.services.common.relation.IRelationsManager;
48 import org.collectionspace.services.common.service.ObjectPartType;
49 import org.collectionspace.services.common.vocabulary.AuthorityItemJAXBSchema;
50 import org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl;
51 import org.collectionspace.services.nuxeo.util.NuxeoUtils;
52 import org.collectionspace.services.relation.RelationResource;
53 import org.collectionspace.services.relation.RelationsCommon;
54 import org.collectionspace.services.relation.RelationsCommonList;
55 import org.collectionspace.services.relation.RelationsDocListItem;
56 import org.collectionspace.services.relation.RelationshipType;
57 import org.nuxeo.ecm.core.api.DocumentModel;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
61 import javax.management.relation.Relation;
62 import javax.ws.rs.core.MultivaluedMap;
63 import javax.ws.rs.core.UriInfo;
66 * AuthorityItemDocumentModelHandler
68 * $LastChangedRevision: $
71 public abstract class AuthorityItemDocumentModelHandler<AICommon, AICommonList>
72 extends RemoteDocumentModelHandlerImpl<AICommon, AICommonList> {
74 private final Logger logger = LoggerFactory.getLogger(AuthorityItemDocumentModelHandler.class);
76 private String authorityItemCommonSchemaName;
78 //private final Logger logger = LoggerFactory.getLogger(AuthorityItemDocumentModelHandler.class);
80 * item is used to stash JAXB object to use when handle is called
81 * for Action.CREATE, Action.UPDATE or Action.GET
83 protected AICommon item;
85 * itemList is stashed when handle is called
88 protected AICommonList itemList;
91 * inVocabulary is the parent Authority for this context
93 protected String inAuthority;
94 protected String authorityRefNameBase;
96 public AuthorityItemDocumentModelHandler(String authorityItemCommonSchemaName) {
97 this.authorityItemCommonSchemaName = authorityItemCommonSchemaName;
100 public String getInAuthority() {
104 public void setInAuthority(String inAuthority) {
105 this.inAuthority = inAuthority;
108 /** Subclasses may override this to customize the URI segment. */
109 public String getAuthorityServicePath(){
110 return getServiceContext().getServiceName().toLowerCase(); // Laramie20110510 CSPACE-3932
114 public String getUri(DocumentModel docModel) {
115 // Laramie20110510 CSPACE-3932
116 String authorityServicePath = getAuthorityServicePath();
117 return "/"+authorityServicePath+'/'+inAuthority+'/'+ AuthorityClient.ITEMS+'/'+getCsid(docModel);
120 public String getAuthorityRefNameBase(){
121 return this.authorityRefNameBase;
124 public void setAuthorityRefNameBase(String value){
125 this.authorityRefNameBase = value;
129 * @see org.collectionspace.services.nuxeo.client.java.DocumentModelHandler#handleCreate(org.collectionspace.services.common.document.DocumentWrapper)
132 public void handleCreate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
133 // first fill all the parts of the document
134 super.handleCreate(wrapDoc);
135 handleInAuthority(wrapDoc.getWrappedObject());
136 // Uncomment once debugged and App layer is read to integrate
137 //handleDisplayNameAsShortIdentifier(wrapDoc.getWrappedObject(), authorityItemCommonSchemaName);
138 //updateRefnameForAuthorityItem(wrapDoc, authorityItemCommonSchemaName, getAuthorityRefNameBase()); //CSPACE-3178
141 private void handleDisplayNameAsShortIdentifier(DocumentModel docModel, String schemaName) throws Exception {
142 String shortIdentifier = (String)docModel.getProperty(schemaName, AuthorityItemJAXBSchema.SHORT_IDENTIFIER);
143 String displayName = (String)docModel.getProperty(schemaName, AuthorityItemJAXBSchema.DISPLAY_NAME);
144 if (Tools.isEmpty(shortIdentifier) && Tools.notEmpty(displayName)){
145 String cookedShortIdentifier = Tools.squeeze(displayName)+'-'+Tools.now().toString();
146 docModel.setProperty(schemaName , AuthorityItemJAXBSchema.SHORT_IDENTIFIER, cookedShortIdentifier);
150 protected void updateRefnameForAuthorityItem(DocumentWrapper<DocumentModel> wrapDoc,
152 String authorityRefBaseName) throws Exception {
153 DocumentModel docModel = wrapDoc.getWrappedObject();
154 String shortIdentifier = (String)docModel.getProperty(schemaName, AuthorityItemJAXBSchema.SHORT_IDENTIFIER);
155 String displayName = (String)docModel.getProperty(schemaName, AuthorityItemJAXBSchema.DISPLAY_NAME);
156 if (Tools.isEmpty(authorityRefBaseName)){
157 throw new Exception("updateRefnameForAuthorityItem requires an authorityRefBaseName, but none was supplied.");
159 RefName.Authority authority = RefName.Authority.parse(authorityRefBaseName);
160 String refName = RefName.buildAuthorityItem(authority, shortIdentifier, displayName).toString();
161 docModel.setProperty(schemaName , AuthorityItemJAXBSchema.REF_NAME, refName);
165 * Check the logic around the parent pointer. Note that we only need do this on
166 * create, since we have logic to make this read-only on update.
170 * @throws Exception the exception
172 private void handleInAuthority(DocumentModel docModel) throws Exception {
173 docModel.setProperty(authorityItemCommonSchemaName,
174 AuthorityItemJAXBSchema.IN_AUTHORITY, inAuthority);
179 * getCommonPart get associated item
183 public AICommon getCommonPart() {
188 public void setCommonPart(AICommon item) {
193 * getCommonPartList get associated item (for index/GET_ALL)
197 public AICommonList getCommonPartList() {
202 public void setCommonPartList(AICommonList itemList) {
203 this.itemList = itemList;
207 public AICommon extractCommonPart(DocumentWrapper<DocumentModel> wrapDoc)
209 throw new UnsupportedOperationException();
213 public void fillCommonPart(AICommon itemObject, DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
214 throw new UnsupportedOperationException();
218 * @see org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl#extractPart(org.nuxeo.ecm.core.api.DocumentModel, java.lang.String, org.collectionspace.services.common.service.ObjectPartType)
221 protected Map<String, Object> extractPart(DocumentModel docModel, String schema, ObjectPartType partMeta)
223 Map<String, Object> unQObjectProperties = super.extractPart(docModel, schema, partMeta);
225 // Add the CSID to the common part
226 if (partMeta.getLabel().equalsIgnoreCase(authorityItemCommonSchemaName)) {
227 String csid = getCsid(docModel);//NuxeoUtils.extractId(docModel.getPathAsString());
228 unQObjectProperties.put("csid", csid);
231 return unQObjectProperties;
235 * Filters out AuthorityItemJAXBSchema.IN_AUTHORITY, to ensure that
236 * the parent link remains untouched.
237 * @param objectProps the properties parsed from the update payload
238 * @param partMeta metadata for the object to fill
241 public void filterReadOnlyPropertiesForPart(
242 Map<String, Object> objectProps, ObjectPartType partMeta) {
243 super.filterReadOnlyPropertiesForPart(objectProps, partMeta);
244 objectProps.remove(AuthorityItemJAXBSchema.IN_AUTHORITY);
245 objectProps.remove(AuthorityItemJAXBSchema.CSID);
249 public void extractAllParts(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
250 MultipartServiceContext ctx = (MultipartServiceContext) getServiceContext();
251 super.extractAllParts(wrapDoc);
253 String showSiblings = ctx.getQueryParams().getFirst(CommonAPI.showSiblings_QP);
254 if (Tools.isTrue(showSiblings)) {
255 showSiblings(wrapDoc, ctx);
256 return; // actual result is returned on ctx.addOutputPart();
259 String showRelations = ctx.getQueryParams().getFirst(CommonAPI.showRelations_QP);
260 if (Tools.isTrue(showRelations)) {
261 showRelations(wrapDoc, ctx);
262 return; // actual result is returned on ctx.addOutputPart();
265 String showAllRelations = ctx.getQueryParams().getFirst(CommonAPI.showAllRelations_QP);
266 if (Tools.isTrue(showAllRelations)) {
267 showAllRelations(wrapDoc, ctx);
268 return; // actual result is returned on ctx.addOutputPart();
272 /** @return null on parent not found
274 protected String getParentCSID(String thisCSID) throws Exception {
275 String parentCSID = null;
277 String predicate = RelationshipType.HAS_BROADER.value();
278 RelationsCommonList parentListOuter = getRelations(thisCSID, null, predicate);
279 List<RelationsCommonList.RelationListItem> parentList = parentListOuter.getRelationListItem();
280 if (parentList != null) {
281 RelationsCommonList.RelationListItem relationListItem = parentList.get(0);
282 parentCSID = relationListItem.getObjectCsid();
285 } catch (Exception e) {
286 logger.error("Could not find parent for this: "+thisCSID, e);
291 public void showRelations(DocumentWrapper<DocumentModel> wrapDoc,
292 MultipartServiceContext ctx) throws Exception {
293 String thisCSID = NuxeoUtils.getCsid(wrapDoc.getWrappedObject());
295 String predicate = RelationshipType.HAS_BROADER.value();
296 RelationsCommonList parentListOuter = getRelations(thisCSID, null, predicate);
297 List<RelationsCommonList.RelationListItem> parentList = parentListOuter.getRelationListItem();
299 RelationsCommonList childrenListOuter = getRelations(null, thisCSID, predicate);
300 List<RelationsCommonList.RelationListItem> childrenList = childrenListOuter.getRelationListItem();
302 //Assume that there are more children than parents. Will be true for parent/child, but maybe not for other relations.
303 //Now add all parents to our childrenList, to be able to return just one list of consolidated results.
304 //Not optimal, but that's the current design spec.
306 for (RelationsCommonList.RelationListItem parent : parentList) {
307 childrenList.add(parent);
310 long childrenSize = childrenList.size();
311 childrenListOuter.setTotalItems(childrenSize);
312 childrenListOuter.setItemsInPage(childrenListOuter.getItemsInPage()+added);
314 PayloadOutputPart relationsPart = new PayloadOutputPart(RelationClient.SERVICE_COMMON_LIST_NAME, childrenListOuter);
315 ctx.addOutputPart(relationsPart);
318 public void showSiblings(DocumentWrapper<DocumentModel> wrapDoc,
319 MultipartServiceContext ctx) throws Exception {
320 String thisCSID = NuxeoUtils.getCsid(wrapDoc.getWrappedObject());
321 String parentCSID = getParentCSID(thisCSID);
322 if (parentCSID == null){
323 logger.warn("~~~~~\r\n~~~~ Could not find parent for this: "+thisCSID);
327 String predicate = RelationshipType.HAS_BROADER.value();
328 RelationsCommonList siblingListOuter = getRelations(null, parentCSID, predicate);
329 List<RelationsCommonList.RelationListItem> siblingList = siblingListOuter.getRelationListItem();
331 List<RelationsCommonList.RelationListItem> toRemoveList = newList();
334 RelationsCommonList.RelationListItem item = null;
335 for (RelationsCommonList.RelationListItem sibling : siblingList) {
336 if (thisCSID.equals(sibling.getSubjectCsid())){
337 toRemoveList.add(sibling); //IS_A copy of the main item, i.e. I have a parent that is my parent, so I'm in the list from the above query.
340 //rather than create an immutable iterator, I'm just putting the items to remove on a separate list, then looping over that list and removing.
341 for (RelationsCommonList.RelationListItem self : toRemoveList) {
342 removeFromList(siblingList, self);
345 long siblingSize = siblingList.size();
346 siblingListOuter.setTotalItems(siblingSize);
347 siblingListOuter.setItemsInPage(siblingSize);
349 PayloadOutputPart relationsPart = new PayloadOutputPart(RelationClient.SERVICE_COMMON_LIST_NAME,siblingListOuter);
350 ctx.addOutputPart(relationsPart);
353 public void showAllRelations(DocumentWrapper<DocumentModel> wrapDoc, MultipartServiceContext ctx) throws Exception {
354 String thisCSID = NuxeoUtils.getCsid(wrapDoc.getWrappedObject());
356 RelationsCommonList subjectListOuter = getRelations(thisCSID, null, null); // nulls are wildcards: predicate=*, and object=*
357 List<RelationsCommonList.RelationListItem> subjectList = subjectListOuter.getRelationListItem();
359 RelationsCommonList objectListOuter = getRelations(null, thisCSID, null); // nulls are wildcards: subject=*, and predicate=*
360 List<RelationsCommonList.RelationListItem> objectList = objectListOuter.getRelationListItem();
363 subjectList.addAll(objectList);
365 //now subjectList actually has records BOTH where thisCSID is subject and object.
366 long relatedSize = subjectList.size();
367 subjectListOuter.setTotalItems(relatedSize);
368 subjectListOuter.setItemsInPage(relatedSize);
370 PayloadOutputPart relationsPart = new PayloadOutputPart(RelationClient.SERVICE_COMMON_LIST_NAME,subjectListOuter);
371 ctx.addOutputPart(relationsPart);
374 public void fillAllParts(DocumentWrapper<DocumentModel> wrapDoc, Action action) throws Exception {
375 super.fillAllParts(wrapDoc, action);
376 ServiceContext ctx = getServiceContext();
377 PoxPayloadIn input = (PoxPayloadIn)ctx.getInput();
378 DocumentModel documentModel = (wrapDoc.getWrappedObject());
379 String itemCsid = documentModel.getName();
381 //UPDATE and CREATE will call. Updates relations part
382 RelationsCommonList relationsCommonList = updateRelations(itemCsid, input, wrapDoc);
384 PayloadOutputPart payloadOutputPart = new PayloadOutputPart(RelationClient.SERVICE_COMMON_LIST_NAME, relationsCommonList);
385 ctx.setProperty(RelationClient.SERVICE_COMMON_LIST_NAME, payloadOutputPart);
388 public void completeUpdate(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {
389 super.completeUpdate(wrapDoc);
390 //now we add part for relations list
391 ServiceContext ctx = getServiceContext();
392 PayloadOutputPart foo = (PayloadOutputPart)ctx.getProperty(RelationClient.SERVICE_COMMON_LIST_NAME);
393 ((PoxPayloadOut)ctx.getOutput()).addPart(foo);
396 public RelationsCommonList updateRelations(String itemCSID, PoxPayloadIn input, DocumentWrapper<DocumentModel> wrapDoc)
398 PayloadInputPart part = input.getPart(RelationClient.SERVICE_COMMON_LIST_NAME); //input.getPart("relations_common");
400 return null; //nothing to do--they didn't send a list of relations.
402 RelationsCommonList relationsCommonListBody = (RelationsCommonList) part.getBody();
404 ServiceContext ctx = getServiceContext();
405 UriInfo uriInfo = ctx.getUriInfo();
406 MultivaluedMap queryParams = uriInfo.getQueryParameters();
408 String predicate = RelationshipType.HAS_BROADER.value();
409 queryParams.putSingle(IRelationsManager.PREDICATE_QP, predicate);
410 queryParams.putSingle(IRelationsManager.SUBJECT_QP, null);
411 queryParams.putSingle(IRelationsManager.SUBJECT_TYPE_QP, null);
412 queryParams.putSingle(IRelationsManager.OBJECT_QP, itemCSID);
413 queryParams.putSingle(IRelationsManager.OBJECT_TYPE_QP, null);
415 RelationsCommonList childListOuter = (new RelationResource()).getList(ctx.getUriInfo()); //magically knows all query params because they are in the context.
417 //Leave predicate, swap subject and object.
418 queryParams.putSingle(IRelationsManager.PREDICATE_QP, predicate);
419 queryParams.putSingle(IRelationsManager.SUBJECT_QP, itemCSID);
420 queryParams.putSingle(IRelationsManager.OBJECT_QP, null);
422 RelationsCommonList parentListOuter = (new RelationResource()).getList(ctx.getUriInfo());
424 go through inboundList, remove anything from childList that matches from childList
425 go through inboundList, remove anything from parentList that matches from parentList
426 go through parentList, delete all remaining
427 go through childList, delete all remaining
428 go through actionList, add all remaining.
429 check for duplicate children
430 check for more than one parent.
432 inboundList parentList childList actionList
433 ---------------- --------------- ---------------- ----------------
434 child-a parent-c child-a child-b
435 child-b parent-d child-c
438 String HAS_BROADER = RelationshipType.HAS_BROADER.value();
440 List<RelationsCommonList.RelationListItem> inboundList = relationsCommonListBody.getRelationListItem();
441 List<RelationsCommonList.RelationListItem> actionList = newList();
442 List<RelationsCommonList.RelationListItem> childList = childListOuter.getRelationListItem();
443 List<RelationsCommonList.RelationListItem> parentList = parentListOuter.getRelationListItem();
445 DocumentModel docModel = wrapDoc.getWrappedObject();
447 for (RelationsCommonList.RelationListItem inboundItem : inboundList) {
448 if (inboundItem.getObject().getCsid().equalsIgnoreCase(CommonAPI.AuthorityItemCSID_REPLACE)){
449 inboundItem.setObjectCsid(itemCSID);
450 inboundItem.getObject().setCsid(itemCSID);
451 inboundItem.getObject().setUri(getUri(docModel));
453 if (inboundItem.getSubject().getCsid().equalsIgnoreCase(CommonAPI.AuthorityItemCSID_REPLACE)){
454 inboundItem.setSubjectCsid(itemCSID);
455 inboundItem.getSubject().setCsid(itemCSID);
456 inboundItem.getSubject().setUri(getUri(docModel));
458 if (inboundItem.getObject().getCsid().equals(itemCSID) && inboundItem.getPredicate().equals(HAS_BROADER)) {
459 //then this is an item that says we have a child.
460 RelationsCommonList.RelationListItem childItem = findInList(childList, inboundItem);
461 if (childItem != null){
462 removeFromList(childList, childItem); //exists, just take it off delete list
464 actionList.add(inboundItem); //doesn't exist as a child, but is a child. Add to additions list
466 } else if (inboundItem.getSubject().getCsid().equals(itemCSID) && inboundItem.getPredicate().equals(HAS_BROADER)) {
467 //then this is an item that says we have a parent
468 RelationsCommonList.RelationListItem parentItem = findInList(parentList, inboundItem);
469 if (parentItem != null){
470 removeFromList(parentList, parentItem); //exists, just take it off delete list
472 actionList.add(inboundItem); //doesn't exist as a parent, but is a parent. Add to additions list
476 System.out.println("\r\n\r\n================\r\n Element didn't match parent or child, but may have partial fields that match. inboundItem: "+inboundItem);
477 //not dealing with: hasNarrower or any other predicate.
480 deleteRelations(parentList, ctx); //todo: there are items appearing on both lists....april 20.
481 deleteRelations(childList, ctx);
482 createRelations(actionList, ctx);
483 //We return all elements on the inbound list, since we have just worked to make them exist in the system
484 // and be non-redundant, etc. That list came from relationsCommonListBody, so it is still attached to it, just pass that back.
485 return relationsCommonListBody;
488 // this method calls the RelationResource to have it create the relations and persist them.
489 private void createRelations(List<RelationsCommonList.RelationListItem> inboundList, ServiceContext ctx){
490 for (RelationsCommonList.RelationListItem item : inboundList) {
491 RelationsCommon rc = new RelationsCommon();
492 //rc.setCsid(item.getCsid());
493 //todo: assignTo(item, rc);
494 RelationsDocListItem itemSubject = item.getSubject();
495 RelationsDocListItem itemObject = item.getObject();
497 String subjectCsid = itemSubject.getCsid();
498 rc.setDocumentId1(subjectCsid);
499 rc.setSubjectCsid(subjectCsid);
501 String objCsid = item.getObject().getCsid();
502 rc.setDocumentId2(objCsid);
503 rc.setObjectCsid(objCsid);
505 rc.setRelationshipType(item.getPredicate());
506 //RelationshipType foo = (RelationshipType.valueOf(item.getPredicate())) ;
507 //rc.setPredicate(foo); //this must be one of the type found in the enum in services/jaxb/src/main/resources/relations_common.xsd
509 rc.setDocumentType1(itemSubject.getDocumentType());
510 rc.setDocumentType2(itemObject.getDocumentType());
512 rc.setSubjectUri(itemSubject.getUri());
513 rc.setObjectUri(itemObject.getUri());
516 PoxPayloadOut payloadOut = new PoxPayloadOut(RelationClient.SERVICE_PAYLOAD_NAME);
517 PayloadOutputPart outputPart = new PayloadOutputPart(RelationClient.SERVICE_COMMONPART_NAME, rc);
518 payloadOut.addPart(outputPart);
519 //System.out.println("\r\n==== TO CREATE: "+rc.getDocumentId1()+"==>"+rc.getPredicate()+"==>"+rc.getDocumentId2());
520 RelationResource relationResource = new RelationResource();
521 Object res = relationResource.create(ctx.getUriInfo(), payloadOut.toXML()); //NOTE ui recycled from above to pass in unknown query params.
524 private void deleteRelations(List<RelationsCommonList.RelationListItem> list,ServiceContext ctx){
526 for (RelationsCommonList.RelationListItem inboundItem : list) {
527 RelationResource relationResource = new RelationResource();
528 //System.out.println("\r\n==== TO DELETE: "+inboundItem.getCsid());
529 Object res = relationResource.delete(inboundItem.getCsid());
531 } catch (Throwable t){
532 String msg = "Unable to deleteRelations: "+ Tools.errorToString(t, true);
537 private List<RelationsCommonList.RelationListItem> newList(){
538 List<RelationsCommonList.RelationListItem> result = new ArrayList<RelationsCommonList.RelationListItem>();
541 protected List<RelationsCommonList.RelationListItem> cloneList(List<RelationsCommonList.RelationListItem> inboundList){
542 List<RelationsCommonList.RelationListItem> result = newList();
543 for (RelationsCommonList.RelationListItem item: inboundList){
548 private RelationsCommonList.RelationListItem findInList(List<RelationsCommonList.RelationListItem> list, RelationsCommonList.RelationListItem item){
549 for (RelationsCommonList.RelationListItem listItem : list) {
550 if (itemsEqual(listItem, item)){ //equals must be defined, else
557 private boolean itemsEqual(RelationsCommonList.RelationListItem item, RelationsCommonList.RelationListItem item2){
558 if (item==null || item2==null){
561 RelationsDocListItem subj1 = item.getSubject();
562 RelationsDocListItem subj2 = item2.getSubject();
563 RelationsDocListItem obj1 = item.getObject();
564 RelationsDocListItem obj2 = item2.getObject();
566 return (subj1.getCsid().equals(subj2.getCsid()))
567 && (obj1.getCsid().equals(obj1.getCsid()))
568 && ( (item.getPredicate().equals(item2.getPredicate()))
569 && (item.getRelationshipType().equals(item2.getRelationshipType())) )
570 && (obj1.getDocumentType().equals(obj2.getDocumentType()))
571 && (subj1.getDocumentType().equals(subj2.getDocumentType())) ;
574 private void removeFromList(List<RelationsCommonList.RelationListItem> list, RelationsCommonList.RelationListItem item){
577 //================= TODO: move this to common, refactoring this and CollectionObjectResource.java
579 public RelationsCommonList getRelations(String subjectCSID, String objectCSID, String predicate) throws Exception {
580 ServiceContext ctx = getServiceContext();
581 MultivaluedMap queryParams = ctx.getQueryParams();
582 queryParams.putSingle(IRelationsManager.PREDICATE_QP, predicate);
583 queryParams.putSingle(IRelationsManager.SUBJECT_QP, subjectCSID);
584 queryParams.putSingle(IRelationsManager.OBJECT_QP, objectCSID);
586 RelationResource relationResource = new RelationResource();
587 RelationsCommonList relationsCommonList = relationResource.getList(ctx.getUriInfo());
588 return relationsCommonList;
591 //============================= END refactor ==========================