You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by bi...@apache.org on 2010/02/15 16:14:36 UTC

svn commit: r910235 - in /ofbiz/trunk/framework/common: servicedef/services_test.xml src/org/ofbiz/common/CommonServices.java

Author: bibryam
Date: Mon Feb 15 15:14:32 2010
New Revision: 910235

URL: http://svn.apache.org/viewvc?rev=910235&view=rev
Log:
Added a generic cascadeDelete service which can be used for data deletion. It uses recursion to delete all the related data entries.

Modified:
    ofbiz/trunk/framework/common/servicedef/services_test.xml
    ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java

Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=910235&r1=910234&r2=910235&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/servicedef/services_test.xml (original)
+++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon Feb 15 15:14:32 2010
@@ -210,4 +210,11 @@
         <description>Test Ping Service</description>
         <attribute name="message" type="String" mode="INOUT" optional="true"/>
     </service>
+
+    <service name="cascadeDelete" engine="java"
+        location="org.ofbiz.common.CommonServices" invoke="cascadeDelete">
+        <description>Remove generic value and its related values</description>
+        <attribute name="entityName" type="String" mode="IN"/>
+        <attribute name="pkFields" type="Map" mode="IN"/>
+    </service>    
 </services>

Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=910235&r1=910234&r2=910235&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
+++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Mon Feb 15 15:14:32 2010
@@ -45,6 +45,7 @@
 import org.apache.log4j.Logger;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilDateTime;
+import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilValidate;
 
 import static org.ofbiz.base.util.UtilGenerics.checkList;
@@ -54,6 +55,8 @@
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.entity.model.ModelEntity;
+import org.ofbiz.entity.model.ModelRelation;
+import org.ofbiz.entity.model.ModelViewEntity;
 import org.ofbiz.entity.transaction.TransactionUtil;
 import org.ofbiz.service.DispatchContext;
 import org.ofbiz.service.GenericServiceException;
@@ -534,5 +537,42 @@
             return ServiceUtil.returnError("Invalid count returned from database");
         }
     }
+    
+    public static Map<String, Object> cascadeDelete(DispatchContext dctx, Map<String, Object> context) {
+        Delegator delegator = dctx.getDelegator();
+        String entityName = (String) context.get("entityName");
+        Map<String, Object> pkFields = UtilGenerics.checkMap(context.get("pkFields"));
+        
+        try {
+            GenericValue value = delegator.findByPrimaryKey(entityName, pkFields);
+            ModelEntity modelEntity = delegator.getModelEntity(entityName);
+            List<ModelRelation> relations = modelEntity.getRelationsManyList();
+            
+            if (value == null || modelEntity instanceof ModelViewEntity) {             
+                return ServiceUtil.returnSuccess();
+            }
+            
+            for (ModelRelation relation : relations) {
+                String combinedName = relation.getCombinedName();
+                List<GenericValue> relatedValues = value.getRelated(combinedName);
+                for (GenericValue relatedValue : relatedValues) {
+                    pkFields = relatedValue.getPrimaryKey().getAllFields();
+                    entityName = relatedValue.getEntityName();
+                    Map<String, Object> newContext = UtilMisc.toMap("entityName", entityName, "pkFields", pkFields);
+                    Map<String, Object>result = CommonServices.cascadeDelete(dctx, newContext);
+                    if (ServiceUtil.isError(result)) {
+                        return result;
+                    }
+                }
+            }
+            
+            Debug.logInfo("Removing value: " + value , module);
+            delegator.removeValue(value);
+        } catch (GenericEntityException e) {
+            return ServiceUtil.returnError(e.getMessage());
+        }
+ 
+        return ServiceUtil.returnSuccess();
+    }    
 
 }



Re: svn commit: r910235 - in /ofbiz/trunk/framework/common: servicedef/services_test.xml src/org/ofbiz/common/CommonServices.java

Posted by Adam Heath <do...@brainfood.com>.
Bilgin Ibryam wrote:
> Adrian Crum wrote:
>> Adam Heath wrote:
>>> bibryam@apache.org wrote:
>>>> Author: bibryam
>>>> Date: Mon Feb 15 15:14:32 2010
>>>> New Revision: 910235
>>>>
>>>> URL: http://svn.apache.org/viewvc?rev=910235&view=rev
>>>> Log:
>>>> Added a generic cascadeDelete service which can be used for data
>>>> deletion. It uses recursion to delete all the related data entries.
>>>>
>>>> Modified:
>>>>     ofbiz/trunk/framework/common/servicedef/services_test.xml
>>>>    
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>>
>>>> Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=910235&r1=910234&r2=910235&view=diff
>>>>
>>>> ==============================================================================
>>>>
>>>> --- ofbiz/trunk/framework/common/servicedef/services_test.xml
>>>> (original)
>>>> +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon
>>>> Feb 15 15:14:32 2010
>>>> @@ -210,4 +210,11 @@
>>>>          <description>Test Ping Service</description>
>>>>          <attribute name="message" type="String" mode="INOUT"
>>>> optional="true"/>
>>>>      </service>
>>>> +
>>>> +    <service name="cascadeDelete" engine="java"
>>>> +        location="org.ofbiz.common.CommonServices"
>>>> invoke="cascadeDelete">
>>>> +        <description>Remove generic value and its related
>>>> values</description>
>>>> +        <attribute name="entityName" type="String" mode="IN"/>
>>>> +        <attribute name="pkFields" type="Map" mode="IN"/>
>>>> +    </service>     </services>
>>>>
>>>> Modified:
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> URL:
>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=910235&r1=910234&r2=910235&view=diff
>>>>
>>>> ==============================================================================
>>>>
>>>> ---
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> (original)
>>>> +++
>>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>> Mon Feb 15 15:14:32 2010
>>>> @@ -45,6 +45,7 @@
>>>>  import org.apache.log4j.Logger;
>>>>  import org.ofbiz.base.util.Debug;
>>>>  import org.ofbiz.base.util.UtilDateTime;
>>>> +import org.ofbiz.base.util.UtilGenerics;
>>>>  import org.ofbiz.base.util.UtilValidate;
>>>>  
>>>>  import static org.ofbiz.base.util.UtilGenerics.checkList;
>>>> @@ -54,6 +55,8 @@
>>>>  import org.ofbiz.entity.GenericEntityException;
>>>>  import org.ofbiz.entity.GenericValue;
>>>>  import org.ofbiz.entity.model.ModelEntity;
>>>> +import org.ofbiz.entity.model.ModelRelation;
>>>> +import org.ofbiz.entity.model.ModelViewEntity;
>>>>  import org.ofbiz.entity.transaction.TransactionUtil;
>>>>  import org.ofbiz.service.DispatchContext;
>>>>  import org.ofbiz.service.GenericServiceException;
>>>> @@ -534,5 +537,42 @@
>>>>              return ServiceUtil.returnError("Invalid count returned
>>>> from database");
>>>>          }
>>>>      }
>>>> +    +    public static Map<String, Object>
>>>> cascadeDelete(DispatchContext dctx, Map<String, Object> context) {
>>>> +        Delegator delegator = dctx.getDelegator();
>>>> +        String entityName = (String) context.get("entityName");
>>>> +        Map<String, Object> pkFields =
>>>> UtilGenerics.checkMap(context.get("pkFields"));
>>>> +        +        try {
>>>> +            GenericValue value =
>>>> delegator.findByPrimaryKey(entityName, pkFields);
>>>> +            ModelEntity modelEntity =
>>>> delegator.getModelEntity(entityName);
>>>> +            List<ModelRelation> relations =
>>>> modelEntity.getRelationsManyList();
>>>> +            +            if (value == null || modelEntity
>>>> instanceof ModelViewEntity) {             +                return
>>>> ServiceUtil.returnSuccess();
>>>> +            }
>>>> +            +            for (ModelRelation relation : relations) {
>>>> +                String combinedName = relation.getCombinedName();
>>>> +                List<GenericValue> relatedValues =
>>>> value.getRelated(combinedName);
>>>> +                for (GenericValue relatedValue : relatedValues) {
>>>> +                    pkFields =
>>>> relatedValue.getPrimaryKey().getAllFields();
>>>> +                    entityName = relatedValue.getEntityName();
>>>> +                    Map<String, Object> newContext =
>>>> UtilMisc.toMap("entityName", entityName, "pkFields", pkFields);
>>>> +                    Map<String, Object>result =
>>>> CommonServices.cascadeDelete(dctx, newContext);
>>>> +                    if (ServiceUtil.isError(result)) {
>>>> +                        return result;
>>>> +                    }
>>>> +                }
>>>> +            }
>>>> +
>>>> +            Debug.logInfo("Removing value: " + value , module);
>>>> +            delegator.removeValue(value);
>>>> +        } catch (GenericEntityException e) {
>>>> +            return ServiceUtil.returnError(e.getMessage());
>>>> +        }
>>>> + +        return ServiceUtil.returnSuccess();
>>>> +    }      }
>>>
>>> No, don't do this.  This is very bad.
>>>
>>> UserLogin->Party->Person->PartyContactMech->ContactMechType->ContactMech(all)->PartyContactMech(all)->Party(all)
>>>
>>>
>>> You could end up removing everything from the database so easily.
>>> Please remove this service, it's too dangerous.
>>
>> I agree. This type of thing has been deliberately left out of the
>> project for that reason.
>>
> Thanks for your review guys, I appreciate that. I agree that it is
> dangerous(as ant clean-all ;) and I was not sure to commit it or not. 
> But I'm just curious how can this service end up removing everything
> from the database?
> Also the example you gave is not correct because the service would
> delete only the ContactMech of the given party, not all the
> ContactMechs, so then not all the Parties.

But on each ContactMech, there is a relation, ContactMechType, and on
that, a relation ContactMech, which would include all the contact
mechs for that particular type.  Once you have all contact mechs, you
very quickly get all other rows in the database.

Let me be more forceful.  No please.  Remove this service.

> 
> I was planning to use this service in deleteWorkEffort service which
> uses hard coded values for removing related entities, and it doesn't
> work correct because some of the related entities are not deleted.




> 
> 


Re: svn commit: r910235 - in /ofbiz/trunk/framework/common: servicedef/services_test.xml src/org/ofbiz/common/CommonServices.java

Posted by Bilgin Ibryam <bi...@gmail.com>.
Adrian Crum wrote:
> Adam Heath wrote:
>> bibryam@apache.org wrote:
>>> Author: bibryam
>>> Date: Mon Feb 15 15:14:32 2010
>>> New Revision: 910235
>>>
>>> URL: http://svn.apache.org/viewvc?rev=910235&view=rev
>>> Log:
>>> Added a generic cascadeDelete service which can be used for data 
>>> deletion. It uses recursion to delete all the related data entries.
>>>
>>> Modified:
>>>     ofbiz/trunk/framework/common/servicedef/services_test.xml
>>>     
>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>>
>>> Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
>>> URL: 
>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=910235&r1=910234&r2=910235&view=diff 
>>>
>>> ============================================================================== 
>>>
>>> --- ofbiz/trunk/framework/common/servicedef/services_test.xml 
>>> (original)
>>> +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon 
>>> Feb 15 15:14:32 2010
>>> @@ -210,4 +210,11 @@
>>>          <description>Test Ping Service</description>
>>>          <attribute name="message" type="String" mode="INOUT" 
>>> optional="true"/>
>>>      </service>
>>> +
>>> +    <service name="cascadeDelete" engine="java"
>>> +        location="org.ofbiz.common.CommonServices" 
>>> invoke="cascadeDelete">
>>> +        <description>Remove generic value and its related 
>>> values</description>
>>> +        <attribute name="entityName" type="String" mode="IN"/>
>>> +        <attribute name="pkFields" type="Map" mode="IN"/>
>>> +    </service>     </services>
>>>
>>> Modified: 
>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>> URL: 
>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=910235&r1=910234&r2=910235&view=diff 
>>>
>>> ============================================================================== 
>>>
>>> --- 
>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java 
>>> (original)
>>> +++ 
>>> ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java 
>>> Mon Feb 15 15:14:32 2010
>>> @@ -45,6 +45,7 @@
>>>  import org.apache.log4j.Logger;
>>>  import org.ofbiz.base.util.Debug;
>>>  import org.ofbiz.base.util.UtilDateTime;
>>> +import org.ofbiz.base.util.UtilGenerics;
>>>  import org.ofbiz.base.util.UtilValidate;
>>>  
>>>  import static org.ofbiz.base.util.UtilGenerics.checkList;
>>> @@ -54,6 +55,8 @@
>>>  import org.ofbiz.entity.GenericEntityException;
>>>  import org.ofbiz.entity.GenericValue;
>>>  import org.ofbiz.entity.model.ModelEntity;
>>> +import org.ofbiz.entity.model.ModelRelation;
>>> +import org.ofbiz.entity.model.ModelViewEntity;
>>>  import org.ofbiz.entity.transaction.TransactionUtil;
>>>  import org.ofbiz.service.DispatchContext;
>>>  import org.ofbiz.service.GenericServiceException;
>>> @@ -534,5 +537,42 @@
>>>              return ServiceUtil.returnError("Invalid count returned 
>>> from database");
>>>          }
>>>      }
>>> +    +    public static Map<String, Object> 
>>> cascadeDelete(DispatchContext dctx, Map<String, Object> context) {
>>> +        Delegator delegator = dctx.getDelegator();
>>> +        String entityName = (String) context.get("entityName");
>>> +        Map<String, Object> pkFields = 
>>> UtilGenerics.checkMap(context.get("pkFields"));
>>> +        +        try {
>>> +            GenericValue value = 
>>> delegator.findByPrimaryKey(entityName, pkFields);
>>> +            ModelEntity modelEntity = 
>>> delegator.getModelEntity(entityName);
>>> +            List<ModelRelation> relations = 
>>> modelEntity.getRelationsManyList();
>>> +            +            if (value == null || modelEntity 
>>> instanceof ModelViewEntity) {             +                return 
>>> ServiceUtil.returnSuccess();
>>> +            }
>>> +            +            for (ModelRelation relation : relations) {
>>> +                String combinedName = relation.getCombinedName();
>>> +                List<GenericValue> relatedValues = 
>>> value.getRelated(combinedName);
>>> +                for (GenericValue relatedValue : relatedValues) {
>>> +                    pkFields = 
>>> relatedValue.getPrimaryKey().getAllFields();
>>> +                    entityName = relatedValue.getEntityName();
>>> +                    Map<String, Object> newContext = 
>>> UtilMisc.toMap("entityName", entityName, "pkFields", pkFields);
>>> +                    Map<String, Object>result = 
>>> CommonServices.cascadeDelete(dctx, newContext);
>>> +                    if (ServiceUtil.isError(result)) {
>>> +                        return result;
>>> +                    }
>>> +                }
>>> +            }
>>> +
>>> +            Debug.logInfo("Removing value: " + value , module);
>>> +            delegator.removeValue(value);
>>> +        } catch (GenericEntityException e) {
>>> +            return ServiceUtil.returnError(e.getMessage());
>>> +        }
>>> + +        return ServiceUtil.returnSuccess();
>>> +    }     
>>>  }
>>
>> No, don't do this.  This is very bad.
>>
>> UserLogin->Party->Person->PartyContactMech->ContactMechType->ContactMech(all)->PartyContactMech(all)->Party(all) 
>>
>>
>> You could end up removing everything from the database so easily.
>> Please remove this service, it's too dangerous.
>
> I agree. This type of thing has been deliberately left out of the 
> project for that reason.
>
Thanks for your review guys, I appreciate that. I agree that it is 
dangerous(as ant clean-all ;) and I was not sure to commit it or not.  
But I'm just curious how can this service end up removing everything 
from the database?
Also the example you gave is not correct because the service would 
delete only the ContactMech of the given party, not all the 
ContactMechs, so then not all the Parties.

I was planning to use this service in deleteWorkEffort service which 
uses hard coded values for removing related entities, and it doesn't 
work correct because some of the related entities are not deleted.
 


Re: svn commit: r910235 - in /ofbiz/trunk/framework/common: servicedef/services_test.xml src/org/ofbiz/common/CommonServices.java

Posted by Adrian Crum <ad...@hlmksw.com>.
Adam Heath wrote:
> bibryam@apache.org wrote:
>> Author: bibryam
>> Date: Mon Feb 15 15:14:32 2010
>> New Revision: 910235
>>
>> URL: http://svn.apache.org/viewvc?rev=910235&view=rev
>> Log:
>> Added a generic cascadeDelete service which can be used for data deletion. It uses recursion to delete all the related data entries.
>>
>> Modified:
>>     ofbiz/trunk/framework/common/servicedef/services_test.xml
>>     ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>>
>> Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=910235&r1=910234&r2=910235&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/common/servicedef/services_test.xml (original)
>> +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon Feb 15 15:14:32 2010
>> @@ -210,4 +210,11 @@
>>          <description>Test Ping Service</description>
>>          <attribute name="message" type="String" mode="INOUT" optional="true"/>
>>      </service>
>> +
>> +    <service name="cascadeDelete" engine="java"
>> +        location="org.ofbiz.common.CommonServices" invoke="cascadeDelete">
>> +        <description>Remove generic value and its related values</description>
>> +        <attribute name="entityName" type="String" mode="IN"/>
>> +        <attribute name="pkFields" type="Map" mode="IN"/>
>> +    </service>    
>>  </services>
>>
>> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=910235&r1=910234&r2=910235&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
>> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Mon Feb 15 15:14:32 2010
>> @@ -45,6 +45,7 @@
>>  import org.apache.log4j.Logger;
>>  import org.ofbiz.base.util.Debug;
>>  import org.ofbiz.base.util.UtilDateTime;
>> +import org.ofbiz.base.util.UtilGenerics;
>>  import org.ofbiz.base.util.UtilValidate;
>>  
>>  import static org.ofbiz.base.util.UtilGenerics.checkList;
>> @@ -54,6 +55,8 @@
>>  import org.ofbiz.entity.GenericEntityException;
>>  import org.ofbiz.entity.GenericValue;
>>  import org.ofbiz.entity.model.ModelEntity;
>> +import org.ofbiz.entity.model.ModelRelation;
>> +import org.ofbiz.entity.model.ModelViewEntity;
>>  import org.ofbiz.entity.transaction.TransactionUtil;
>>  import org.ofbiz.service.DispatchContext;
>>  import org.ofbiz.service.GenericServiceException;
>> @@ -534,5 +537,42 @@
>>              return ServiceUtil.returnError("Invalid count returned from database");
>>          }
>>      }
>> +    
>> +    public static Map<String, Object> cascadeDelete(DispatchContext dctx, Map<String, Object> context) {
>> +        Delegator delegator = dctx.getDelegator();
>> +        String entityName = (String) context.get("entityName");
>> +        Map<String, Object> pkFields = UtilGenerics.checkMap(context.get("pkFields"));
>> +        
>> +        try {
>> +            GenericValue value = delegator.findByPrimaryKey(entityName, pkFields);
>> +            ModelEntity modelEntity = delegator.getModelEntity(entityName);
>> +            List<ModelRelation> relations = modelEntity.getRelationsManyList();
>> +            
>> +            if (value == null || modelEntity instanceof ModelViewEntity) {             
>> +                return ServiceUtil.returnSuccess();
>> +            }
>> +            
>> +            for (ModelRelation relation : relations) {
>> +                String combinedName = relation.getCombinedName();
>> +                List<GenericValue> relatedValues = value.getRelated(combinedName);
>> +                for (GenericValue relatedValue : relatedValues) {
>> +                    pkFields = relatedValue.getPrimaryKey().getAllFields();
>> +                    entityName = relatedValue.getEntityName();
>> +                    Map<String, Object> newContext = UtilMisc.toMap("entityName", entityName, "pkFields", pkFields);
>> +                    Map<String, Object>result = CommonServices.cascadeDelete(dctx, newContext);
>> +                    if (ServiceUtil.isError(result)) {
>> +                        return result;
>> +                    }
>> +                }
>> +            }
>> +
>> +            Debug.logInfo("Removing value: " + value , module);
>> +            delegator.removeValue(value);
>> +        } catch (GenericEntityException e) {
>> +            return ServiceUtil.returnError(e.getMessage());
>> +        }
>> + 
>> +        return ServiceUtil.returnSuccess();
>> +    }    
>>  
>>  }
> 
> No, don't do this.  This is very bad.
> 
> UserLogin->Party->Person->PartyContactMech->ContactMechType->ContactMech(all)->PartyContactMech(all)->Party(all)
> 
> You could end up removing everything from the database so easily.
> Please remove this service, it's too dangerous.

I agree. This type of thing has been deliberately left out of the 
project for that reason.


Re: svn commit: r910235 - in /ofbiz/trunk/framework/common: servicedef/services_test.xml src/org/ofbiz/common/CommonServices.java

Posted by Adam Heath <do...@brainfood.com>.
bibryam@apache.org wrote:
> Author: bibryam
> Date: Mon Feb 15 15:14:32 2010
> New Revision: 910235
> 
> URL: http://svn.apache.org/viewvc?rev=910235&view=rev
> Log:
> Added a generic cascadeDelete service which can be used for data deletion. It uses recursion to delete all the related data entries.
> 
> Modified:
>     ofbiz/trunk/framework/common/servicedef/services_test.xml
>     ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
> 
> Modified: ofbiz/trunk/framework/common/servicedef/services_test.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services_test.xml?rev=910235&r1=910234&r2=910235&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/servicedef/services_test.xml (original)
> +++ ofbiz/trunk/framework/common/servicedef/services_test.xml Mon Feb 15 15:14:32 2010
> @@ -210,4 +210,11 @@
>          <description>Test Ping Service</description>
>          <attribute name="message" type="String" mode="INOUT" optional="true"/>
>      </service>
> +
> +    <service name="cascadeDelete" engine="java"
> +        location="org.ofbiz.common.CommonServices" invoke="cascadeDelete">
> +        <description>Remove generic value and its related values</description>
> +        <attribute name="entityName" type="String" mode="IN"/>
> +        <attribute name="pkFields" type="Map" mode="IN"/>
> +    </service>    
>  </services>
> 
> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java?rev=910235&r1=910234&r2=910235&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java (original)
> +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/CommonServices.java Mon Feb 15 15:14:32 2010
> @@ -45,6 +45,7 @@
>  import org.apache.log4j.Logger;
>  import org.ofbiz.base.util.Debug;
>  import org.ofbiz.base.util.UtilDateTime;
> +import org.ofbiz.base.util.UtilGenerics;
>  import org.ofbiz.base.util.UtilValidate;
>  
>  import static org.ofbiz.base.util.UtilGenerics.checkList;
> @@ -54,6 +55,8 @@
>  import org.ofbiz.entity.GenericEntityException;
>  import org.ofbiz.entity.GenericValue;
>  import org.ofbiz.entity.model.ModelEntity;
> +import org.ofbiz.entity.model.ModelRelation;
> +import org.ofbiz.entity.model.ModelViewEntity;
>  import org.ofbiz.entity.transaction.TransactionUtil;
>  import org.ofbiz.service.DispatchContext;
>  import org.ofbiz.service.GenericServiceException;
> @@ -534,5 +537,42 @@
>              return ServiceUtil.returnError("Invalid count returned from database");
>          }
>      }
> +    
> +    public static Map<String, Object> cascadeDelete(DispatchContext dctx, Map<String, Object> context) {
> +        Delegator delegator = dctx.getDelegator();
> +        String entityName = (String) context.get("entityName");
> +        Map<String, Object> pkFields = UtilGenerics.checkMap(context.get("pkFields"));
> +        
> +        try {
> +            GenericValue value = delegator.findByPrimaryKey(entityName, pkFields);
> +            ModelEntity modelEntity = delegator.getModelEntity(entityName);
> +            List<ModelRelation> relations = modelEntity.getRelationsManyList();
> +            
> +            if (value == null || modelEntity instanceof ModelViewEntity) {             
> +                return ServiceUtil.returnSuccess();
> +            }
> +            
> +            for (ModelRelation relation : relations) {
> +                String combinedName = relation.getCombinedName();
> +                List<GenericValue> relatedValues = value.getRelated(combinedName);
> +                for (GenericValue relatedValue : relatedValues) {
> +                    pkFields = relatedValue.getPrimaryKey().getAllFields();
> +                    entityName = relatedValue.getEntityName();
> +                    Map<String, Object> newContext = UtilMisc.toMap("entityName", entityName, "pkFields", pkFields);
> +                    Map<String, Object>result = CommonServices.cascadeDelete(dctx, newContext);
> +                    if (ServiceUtil.isError(result)) {
> +                        return result;
> +                    }
> +                }
> +            }
> +
> +            Debug.logInfo("Removing value: " + value , module);
> +            delegator.removeValue(value);
> +        } catch (GenericEntityException e) {
> +            return ServiceUtil.returnError(e.getMessage());
> +        }
> + 
> +        return ServiceUtil.returnSuccess();
> +    }    
>  
>  }

No, don't do this.  This is very bad.

UserLogin->Party->Person->PartyContactMech->ContactMechType->ContactMech(all)->PartyContactMech(all)->Party(all)

You could end up removing everything from the database so easily.
Please remove this service, it's too dangerous.