Hi Jacques,
I haven't reviewed the actual logic but a few comments inline.
Regards
Scott
HotWax Media
http://www.hotwaxmedia.com
On 27/12/2009, at 12:21 AM, [email protected] wrote:
Author: jleroux
Date: Sat Dec 26 11:21:21 2009
New Revision: 893961
URL: http://svn.apache.org/viewvc?rev=893961&view=rev
Log:
* Introduces a new createUpdatePartyRelationshipAndRoles service
* Cleans imports of PartyHelper.java
* A new getActivePartyRelationships method in new PartyRelationshipHelper class
* A new checkPartyType method in new PartyTypeHelper class
Added:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
(with props)
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
(with props)
Modified:
ofbiz/trunk/applications/party/servicedef/services.xml
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyHelper.java
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipServices.java
Modified: ofbiz/trunk/applications/party/servicedef/services.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/servicedef/services.xml?rev=893961&r1=893960&r2=893961&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/party/servicedef/services.xml Sat Dec 26 11:21:21
2009
@@ -351,6 +351,22 @@
<auto-attributes include="nonpk" mode="IN" optional="true"/>
<override name="partyRelationshipName" optional="false"/>
</service>
+
+ <service name="createUpdatePartyRelationshipAndRoles" engine="java"
default-entity-name="PartyRelationship"
+ location="org.ofbiz.party.party.PartyRelationshipServices"
invoke="createUpdatePartyRelationshipAndRoles" auth="true">
+ <description>
+ Create or update both parties roles and parties relationship,
partyRelationshipTypeId being mandatory.
+ The relationship is considered from one side or another (partyId
is checked internally against partyIdFrom)
+ If a type of parties relationship exists PartyIdTo or PartyIdFrom
are updated.
+ The history is maintained, allowing to track changes.
+ </description>
+ <auto-attributes include="pk" mode="IN" optional="false"/>
+ <auto-attributes include="nonpk" mode="IN" optional="true"/>
+ <attribute name="partyId" type="String" mode="IN" optional="false"/>
+ <override name="partyId" optional="false"/>
This partyId override seems redundant
+ <override name="fromDate" optional="true"/>
+ </service>
+
<service name="createPartyRelationshipContactAccount" engine="simple"
location="component://party/script/org/ofbiz/party/party/PartyServices.xml"
invoke="createPartyRelationshipContactAccount" auth="true">
Modified:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyHelper.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyHelper.java?rev=893961&r1=893960&r2=893961&view=diff
==============================================================================
--- ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyHelper.java
(original)
+++ ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyHelper.java
Sat Dec 26 11:21:21 2009
@@ -19,20 +19,13 @@
package org.ofbiz.party.party;
-import java.util.Locale;
-import java.util.Map;
-
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilFormatOut;
import org.ofbiz.base.util.UtilMisc;
-import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.model.ModelEntity;
-import org.ofbiz.security.Security;
-import org.ofbiz.service.ModelService;
-import org.ofbiz.service.ServiceUtil;
/**
* PartyHelper
Added:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java?rev=893961&view=auto
==============================================================================
---
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
(added)
+++
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
Sat Dec 26 11:21:21 2009
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+
+package org.ofbiz.party.party;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+
+import javolution.util.FastList;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilDateTime;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.condition.EntityOperator;
+
+/**
+ * PartyRelationshipHelper
+ */
+public class PartyRelationshipHelper {
+
+ public static final String module =
PartyRelationshipHelper.class.getName();
+
+ /** Return A List of the active Party Relationships (ie with valid from
and thru dates)
+ *...@param delegator needed Delegator
+ *...@param partyRelationshipValues Map containing the input parameters
(primaries keys + partyRelationshipTypeId)
+ *...@return List of the active Party Relationships
+ */
+ public static List<GenericValue> getActivePartyRelationships(Delegator delegator, Map<String, ?> partyRelationshipValues)
{
+ String partyIdFrom = (String)
partyRelationshipValues.get("partyIdFrom") ;
+ String partyIdTo = (String) partyRelationshipValues.get("partyIdTo") ;
+ String roleTypeIdFrom = (String)
partyRelationshipValues.get("roleTypeIdFrom") ;
+ String roleTypeIdTo = (String)
partyRelationshipValues.get("roleTypeIdTo") ;
+ String partyRelationshipTypeId = (String)
partyRelationshipValues.get("partyRelationshipTypeId") ;
+ Timestamp fromDate = UtilDateTime.nowTimestamp();
+
+ List<EntityCondition> condList = FastList.newInstance();
+ condList.add(EntityCondition.makeCondition("partyIdFrom",
partyIdFrom));
+ condList.add(EntityCondition.makeCondition("partyIdTo", partyIdTo));
+ condList.add(EntityCondition.makeCondition("roleTypeIdFrom",
roleTypeIdFrom));
+ condList.add(EntityCondition.makeCondition("roleTypeIdTo",
roleTypeIdTo));
+ condList.add(EntityCondition.makeCondition("partyRelationshipTypeId",
partyRelationshipTypeId));
+ condList.add(EntityCondition.makeCondition("fromDate",
EntityOperator.LESS_THAN_EQUAL_TO, fromDate));
+ EntityCondition thruCond =
EntityCondition.makeCondition(UtilMisc.toList(
+ EntityCondition.makeCondition("thruDate", null),
+ EntityCondition.makeCondition("thruDate",
EntityOperator.GREATER_THAN, fromDate)),
+ EntityOperator.OR);
+ condList.add(thruCond);
EntityUtil has some methods for filtering by fromDate/thruDate which makes this
a bit easier
+ EntityCondition condition = EntityCondition.makeCondition(condList);
+
+ List<GenericValue> partyRelationships = null;
+ try {
+ partyRelationships = delegator.findList("PartyRelationship",
condition, null, null, null, false);
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "Problem finding PartyRelationships. ", module);
+ return null;
+ }
+ if (UtilValidate.isNotEmpty(partyRelationships)) {
+ return partyRelationships;
+ } else {
+ return null;
+ }
+ }
+}
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipServices.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipServices.java?rev=893961&r1=893960&r2=893961&view=diff
==============================================================================
---
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipServices.java
(original)
+++
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyRelationshipServices.java
Sat Dec 26 11:21:21 2009
@@ -1,15 +1,15 @@
/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
+ * Licensed partyIdTo the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
+ * partyIdTo you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing,
+ * Unless required by applicable law or agreed partyIdTo in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
Unintended changes in the license?
@@ -19,20 +19,27 @@
package org.ofbiz.party.party;
+import java.util.List;
import java.util.Map;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.security.Security;
import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
+
/**
* Services for Party Relationship maintenance
*/
@@ -52,7 +59,7 @@
Security security = ctx.getSecurity();
GenericValue userLogin = (GenericValue) context.get("userLogin");
- String partyId = ServiceUtil.getPartyIdCheckSecurity(userLogin, security, context, result,
"PARTYMGR", "_CREATE");
+ ServiceUtil.getPartyIdCheckSecurity(userLogin, security, context, result,
"PARTYMGR", "_CREATE");
if (result.size() > 0)
return result;
@@ -85,4 +92,68 @@
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
return result;
}
+
+ /** Creates and updates a PartyRelationship creating related PartyRoles if
needed.
+ * A side of the relationship is checked to maintain history
+ *...@param ctx The DispatchContext that this service is operating in
+ *...@param context Map containing the input parameters
+ *...@return Map with the result of the service, the output parameters
+ */
+ public static Map<String, Object> createUpdatePartyRelationshipAndRoles(DispatchContext ctx, Map<String, ? extends Object>
context) {
+ Map<String, Object> result = FastMap.newInstance();
+ Delegator delegator = ctx.getDelegator();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ try {
+ List<GenericValue> partyRelationShipList = PartyRelationshipHelper.getActivePartyRelationships(delegator,
context);
Ship in relationship shouldn't be camel cased
+ if (UtilValidate.isEmpty(partyRelationShipList)) { // If already exists and active nothing to do: keep the current
one
+ String partyId = (String) context.get("partyId") ;
+ String partyIdFrom = (String) context.get("partyIdFrom") ;
+ String partyIdTo = (String) context.get("partyIdTo") ;
+ String roleTypeIdFrom = (String) context.get("roleTypeIdFrom")
;
+ String roleTypeIdTo = (String) context.get("roleTypeIdTo") ;
+ String partyRelationshipTypeId = (String)
context.get("partyRelationshipTypeId") ;
+
+ // Before creating the partyRelationShip, create the
partyRoles if they don't exist
+ GenericValue partyToRole = null;
+ partyToRole = delegator.findOne("PartyRole", UtilMisc.toMap("partyId", partyIdTo, "roleTypeId", roleTypeIdTo),
false);
+ if (partyToRole == null) {
+ partyToRole = delegator.makeValue("PartyRole", UtilMisc.toMap("partyId", partyIdTo, "roleTypeId",
roleTypeIdTo));
+ partyToRole.create();
You should always use the services provided to create entities and not create
the records yourself
+ }
+
+ GenericValue partyFromRole= null;
+ partyFromRole = delegator.findOne("PartyRole", UtilMisc.toMap("partyId", partyIdFrom, "roleTypeId",
roleTypeIdFrom), false);
+ if (partyFromRole == null) {
+ partyFromRole = delegator.makeValue("PartyRole", UtilMisc.toMap("partyId", partyIdFrom, "roleTypeId",
roleTypeIdFrom));
+ partyFromRole.create();
+ }
+
+ // Check if there is already a partyRelationship of that type
with another party from the side indicated
+ String sideChecked = partyIdFrom.equals(partyId)? "partyIdFrom" :
"partyIdTo";
+ partyRelationShipList =
delegator.findByAnd("PartyRelationship", UtilMisc.toMap(sideChecked, partyId,
+ "roleTypeIdFrom", roleTypeIdFrom,
+ "roleTypeIdTo", roleTypeIdTo,
+ "partyRelationshipTypeId", partyRelationshipTypeId));
+ // We consider the last one (in time) as sole active (we try to maintain a unique relationship and keep
changes history)
+ partyRelationShipList =
EntityUtil.filterByDate(partyRelationShipList);
+ GenericValue oldPartyRelationShip =
EntityUtil.getFirst(partyRelationShipList);
+ if (UtilValidate.isNotEmpty(oldPartyRelationShip)) {
+ oldPartyRelationShip.setFields(UtilMisc.toMap("thruDate", UtilDateTime.nowTimestamp())); // Current
becomes inactive
+ oldPartyRelationShip.store();
Should be using the crud services but this also seems strange, it looks like your expiring the existing PartyRelationship by
only considering one party rather than both?
+ }
+ try {
+ dispatcher.runSync("createPartyRelationship", context); //
Create new one
I'm guessing this will fail if a partyId was supplied to the calling service since createPartyRelationship doesn't take a
parameter named partyId. If you want to do a passthru you should really get the service model and call the makeValid instance
method.
+ } catch (GenericServiceException e) {
+ Debug.logWarning(e.getMessage(), module);
+ return ServiceUtil.returnError("Could not create party
relationship (write failure): " + e.getMessage());
+ }
+ }
+ } catch (GenericEntityException e) {
+ Debug.logWarning(e.getMessage(), module);
+ return ServiceUtil.returnError("Could not create party relationship
(write failure): " + e.getMessage());
+ }
+ result.put(ModelService.RESPONSE_MESSAGE,
ModelService.RESPOND_SUCCESS);
+ return result;
+ }
}
Added:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java?rev=893961&view=auto
==============================================================================
---
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
(added)
+++
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
Sat Dec 26 11:21:21 2009
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+
+package org.ofbiz.party.party;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityTypeUtil;
+
+/**
+ * PartyTypeHelper
+ */
+public class PartyTypeHelper {
+
+ public static final String module = PartyTypeHelper.class.getName();
+
+ /** Check if a related party is of the right party type (PERSON or
PARTY_GROUP)
+ *...@param delegator needed Delegator
+ *...@param partyId a a valid Party Id string
+ *...@param checkedPartyType a string in {PERSON, PARTY_GROUP}
+ *...@return Boolean, false in case of error
+ */
+ public static Boolean checkPartyType(Delegator delegator, String partyId,
String checkedPartyType) {
+ GenericValue party = null;
+ GenericValue partyType = null;
+ GenericValue checkedTypeOfParty = null;
+ try {
+ party = delegator.findOne("Party", UtilMisc.toMap("partyId",
partyId), false);
The cache could be used here since Party.partyType is unlikely to change
+ partyType = party.getRelatedOneCache("PartyType");
+ checkedTypeOfParty = delegator.findOne("PartyType",
UtilMisc.toMap("partyTypeId", checkedPartyType), true);
+ } catch (GenericEntityException e) {
+ Debug.logWarning(e, module);
+ return false;
+ }
+ return EntityTypeUtil.isType(partyType, checkedTypeOfParty);
+ }
+}
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange:
ofbiz/trunk/applications/party/src/org/ofbiz/party/party/PartyTypeHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain