package org.easysoa.registry.utils; import java.io.Serializable; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuxeo.ecm.core.api.ClientException; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.core.api.impl.DocumentModelListImpl; import org.nuxeo.ecm.platform.relations.api.Node; import org.nuxeo.ecm.platform.relations.api.QNameResource; import org.nuxeo.ecm.platform.relations.api.RelationManager; import org.nuxeo.ecm.platform.relations.api.Resource; import org.nuxeo.ecm.platform.relations.api.ResourceAdapter; import org.nuxeo.ecm.platform.relations.api.Statement; import org.nuxeo.ecm.platform.relations.api.impl.ResourceImpl; import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl; import org.nuxeo.ecm.platform.relations.api.util.RelationConstants; import org.nuxeo.runtime.api.Framework; /** * * @author mkalam-alami * */ public class RelationsHelper { private static final Log log = LogFactory.getLog(RelationsHelper.class); public static DocumentModelList getOutgoingRelations(CoreSession documentManager, DocumentModel documentModel, String predicate) { return getRelations(documentManager, documentModel, predicate, true); } public static DocumentModelList getIncomingRelations(CoreSession documentManager, DocumentModel documentModel, String predicate) { return getRelations(documentManager, documentModel, predicate, false); } private static DocumentModelList getRelations(CoreSession documentManager, DocumentModel documentModel, String predicate, boolean outgoing) { try { RelationManager relations = Framework.getService(RelationManager.class); QNameResource documentResource = getDocumentResource(relations, documentModel); Resource predicateResource = new ResourceImpl(predicate); return getDocuments(relations, documentManager, documentResource, predicateResource, outgoing); } catch (Exception e) { log.error("Failed to get document relations", e); return null; } } public static boolean createRelation(CoreSession documentManager, DocumentModel fromModel, String predicate, DocumentModel toModel) { try { RelationManager relations = Framework.getService(RelationManager.class); QNameResource obj = getDocumentResource(relations, fromModel); QNameResource subject = getDocumentResource(relations, toModel); Resource predicateResource = new ResourceImpl(predicate); Statement stmt = new StatementImpl(obj, predicateResource, subject); relations.getGraphByName(RelationConstants.GRAPH_NAME).add(stmt); return true; } catch (Exception e) { log.error("Failed to create document relation", e); return false; } } public static boolean deleteRelation(CoreSession documentManager, DocumentModel fromModel, String predicate, DocumentModel toModel) { try { RelationManager relations = Framework.getService(RelationManager.class); QNameResource obj = getDocumentResource(relations, fromModel); QNameResource subject = getDocumentResource(relations, toModel); Resource predicateResource = new ResourceImpl(predicate); Statement stmt = new StatementImpl(obj, predicateResource, subject); relations.getGraphByName(RelationConstants.GRAPH_NAME).remove(stmt); return true; } catch (Exception e) { log.error("Failed to delete document relation", e); return false; } } public static boolean deleteOutgoingRelations(CoreSession documentManager, DocumentModel fromModel, String predicate) { try { RelationManager relations = Framework.getService(RelationManager.class); QNameResource subject = getDocumentResource(relations, fromModel); Resource predicateResource = new ResourceImpl(predicate); List<Statement> outgoingStatements = getOutgoingStatements(relations, subject, predicateResource); relations.getGraphByName(RelationConstants.GRAPH_NAME).remove(outgoingStatements); return true; } catch (Exception e) { log.error("Failed to delete document relations", e); return false; } } public static boolean deleteIncomingRelations(CoreSession documentManager, DocumentModel fromModel, String predicate) { try { RelationManager relations = Framework.getService(RelationManager.class); QNameResource subject = getDocumentResource(relations, fromModel); Resource predicateResource = new ResourceImpl(predicate); List<Statement> incomingStatements = getIncomingStatements(relations, subject, predicateResource); relations.getGraphByName(RelationConstants.GRAPH_NAME).remove(incomingStatements); return true; } catch (Exception e) { log.error("Failed to delete document relations", e); return false; } } // Methods copied from GetRelations/CreateRelation automation operations private static QNameResource getDocumentResource(RelationManager relations, DocumentModel document) throws ClientException { return (QNameResource) relations.getResource( RelationConstants.DOCUMENT_NAMESPACE, document, null); } private static DocumentModelList getDocuments(RelationManager relations, CoreSession session, QNameResource res, Resource predicate, boolean outgoing) throws ClientException { if (outgoing) { List<Statement> statements = getOutgoingStatements(relations, res, predicate); DocumentModelList docs = new DocumentModelListImpl( statements.size()); for (Statement st : statements) { DocumentModel dm = getDocumentModel(session, relations, st.getObject()); if (dm != null) { docs.add(dm); } } return docs; } else { List<Statement> statements = getIncomingStatements(relations, res, predicate); DocumentModelList docs = new DocumentModelListImpl( statements.size()); for (Statement st : statements) { DocumentModel dm = getDocumentModel(session, relations, st.getSubject()); if (dm != null) { docs.add(dm); } } return docs; } } private static List<Statement> getIncomingStatements(RelationManager relations, QNameResource res, Resource predicate) throws ClientException { return relations.getGraphByName(RelationConstants.GRAPH_NAME).getStatements(null, predicate, res); } private static List<Statement> getOutgoingStatements(RelationManager relations, QNameResource res, Resource predicate) throws ClientException { return relations.getGraphByName(RelationConstants.GRAPH_NAME).getStatements(res, predicate, null); } private static DocumentModel getDocumentModel(CoreSession session, RelationManager relations, Node node) throws ClientException { if (node.isQNameResource()) { QNameResource resource = (QNameResource) node; Map<String, Serializable> context = new HashMap<String, Serializable>(); context.put(ResourceAdapter.CORE_SESSION_ID_CONTEXT_KEY, session.getSessionId()); Object o = relations.getResourceRepresentation( resource.getNamespace(), resource, context); if (o instanceof DocumentModel) { return (DocumentModel) o; } } return null; } }