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, jler...@apache.org 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.xmlofbiz/trunk/applications/party/src/org/ofbiz/party/party/ PartyHelper.java ofbiz/trunk/applications/party/src/org/ofbiz/party/party/ PartyRelationshipServices.javaModified: 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.javaURL: 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; /** * PartyHelperAdded: ofbiz/trunk/applications/party/src/org/ofbiz/party/party/ PartyRelationshipHelper.javaURL: 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 = nativePropchange: 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/plainModified: ofbiz/trunk/applications/party/src/org/ofbiz/party/party/ PartyRelationshipServices.javaURL: 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.javaURL: 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 = nativePropchange: 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
smime.p7s
Description: S/MIME cryptographic signature