bibr...@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.

Reply via email to