View Javadoc
1   package org.argeo.people.util;
2   
3   import javax.jcr.Node;
4   import javax.jcr.NodeIterator;
5   import javax.jcr.RepositoryException;
6   import javax.jcr.Session;
7   import javax.jcr.query.Query;
8   import javax.jcr.query.QueryManager;
9   import javax.jcr.query.QueryResult;
10  import javax.jcr.query.qom.Constraint;
11  import javax.jcr.query.qom.DynamicOperand;
12  import javax.jcr.query.qom.QueryObjectModel;
13  import javax.jcr.query.qom.QueryObjectModelFactory;
14  import javax.jcr.query.qom.Selector;
15  import javax.jcr.query.qom.StaticOperand;
16  
17  import org.argeo.connect.util.XPathUtils;
18  import org.argeo.people.PeopleException;
19  import org.argeo.people.PeopleNames;
20  import org.argeo.people.PeopleTypes;
21  
22  /**
23   * Static utility methods to manage CRM organisation concepts in JCR. Rather use
24   * these methods than direct JCR queries in order to ease model evolution.
25   */
26  public class OrgJcrUtils implements PeopleNames {
27  
28  	/* PAYMENT MANAGEMENT */
29  	public static NodeIterator getPaymentAccounts(Node entity) {
30  		try {
31  			if (entity.hasNode(PEOPLE_PAYMENT_ACCOUNTS))
32  				return entity.getNode(PEOPLE_PAYMENT_ACCOUNTS).getNodes();
33  			else
34  				return null;
35  		} catch (RepositoryException e) {
36  			throw new PeopleException("Error while getting " + "payment accounts for node " + entity, e);
37  		}
38  	}
39  
40  	public static Node getPrimaryPaymentAccount(Node entity) {
41  		NodeIterator nit = getPaymentAccounts(entity);
42  		if (nit == null || nit.getSize() == 0)
43  			return null;
44  		else if (nit.getSize() > 1)
45  			throw new PeopleException("Unable to get primary payment accounts for " + entity
46  					+ ". Multiple accounts is not implemented and " + nit.getSize() + " accounts has been found.");
47  		else
48  			return nit.nextNode();
49  	}
50  
51  	public static Node createPaymentAccount(Node entity, String nodeType, String name) {
52  		try {
53  			Node accounts = null;
54  			if (entity.hasNode(PEOPLE_PAYMENT_ACCOUNTS))
55  				accounts = entity.getNode(PEOPLE_PAYMENT_ACCOUNTS);
56  			else
57  				accounts = entity.addNode(PEOPLE_PAYMENT_ACCOUNTS);
58  			return accounts.addNode(name, nodeType);
59  		} catch (RepositoryException e) {
60  			throw new PeopleException("Error while creating new payment account for node " + entity, e);
61  		}
62  	}
63  
64  	// IMPORTS AND DEMO UTILS
65  	/**
66  	 * Mainly used during imports to provide a key to a given organisation. Do
67  	 * not rely on this for production purposes. *
68  	 */
69  	public static Node getOrgWithWebSite(Session session, String website) throws RepositoryException {
70  		String xpathQueryStr = "//element(*, " + PeopleTypes.PEOPLE_ORG + ")";
71  		xpathQueryStr += "[" + XPathUtils.getPropertyEquals(PeopleNames.PEOPLE_PURL, website) + "]";
72  		Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
73  		NodeIterator ni = xpathQuery.execute().getNodes();
74  		Node orga = null;
75  		if (ni.hasNext())
76  			orga = ni.nextNode();
77  		return orga;
78  	}
79  
80  	/**
81  	 * Mainly used during imports to provide a key to a given organisation. Do
82  	 * not rely on this for production purposes.
83  	 */
84  	public static Node getOrgByName(Session session, String name) throws RepositoryException {
85  		QueryManager queryManager = session.getWorkspace().getQueryManager();
86  		QueryObjectModelFactory factory = queryManager.getQOMFactory();
87  		Selector source = factory.selector(PeopleTypes.PEOPLE_ORG, PeopleTypes.PEOPLE_ORG);
88  
89  		DynamicOperand dynOp = factory.propertyValue(source.getSelectorName(), PeopleNames.PEOPLE_LEGAL_NAME);
90  		StaticOperand statOp = factory.literal(session.getValueFactory().createValue(name));
91  		Constraint defaultC = factory.comparison(dynOp, QueryObjectModelFactory.JCR_OPERATOR_EQUAL_TO, statOp);
92  
93  		QueryObjectModel query = factory.createQuery(source, defaultC, null, null);
94  		QueryResult result = query.execute();
95  		NodeIterator ni = result.getNodes();
96  
97  		long resultNb = ni.getSize();
98  
99  		if (resultNb == 0)
100 			return null;
101 		else if (resultNb == 1)
102 			return ni.nextNode();
103 		else
104 			throw new PeopleException("More than 1 org with name " + name + " has been found.");
105 	}
106 }