Search in sources :

Example 11 with ModelParam

use of org.apache.ofbiz.service.ModelParam in project ofbiz-framework by apache.

the class EntityAutoEngine method invokeCreate.

private static Map<String, Object> invokeCreate(DispatchContext dctx, Map<String, Object> parameters, ModelService modelService, ModelEntity modelEntity, boolean allPksInOnly, List<String> pkFieldNameOutOnly) throws GeneralException {
    Locale locale = (Locale) parameters.get("locale");
    GenericValue newEntity = dctx.getDelegator().makeValue(modelEntity.getEntityName());
    boolean isSinglePk = modelEntity.getPksSize() == 1;
    boolean isDoublePk = modelEntity.getPksSize() == 2;
    Iterator<ModelField> pksIter = modelEntity.getPksIterator();
    ModelField singlePkModeField = isSinglePk ? pksIter.next() : null;
    ModelParam singlePkModelParam = isSinglePk ? modelService.getParam(singlePkModeField.getName()) : null;
    boolean isSinglePkIn = isSinglePk ? singlePkModelParam.isIn() : false;
    boolean isSinglePkOut = isSinglePk ? singlePkModelParam.isOut() : false;
    ModelParam doublePkPrimaryInParam = null;
    ModelParam doublePkSecondaryOutParam = null;
    ModelField doublePkSecondaryOutField = null;
    if (isDoublePk) {
        ModelField firstPkField = pksIter.next();
        ModelParam firstPkParam = modelService.getParam(firstPkField.getName());
        ModelField secondPkField = pksIter.next();
        ModelParam secondPkParam = modelService.getParam(secondPkField.getName());
        if (firstPkParam.isIn() && secondPkParam.isOut()) {
            doublePkPrimaryInParam = firstPkParam;
            doublePkSecondaryOutParam = secondPkParam;
            doublePkSecondaryOutField = secondPkField;
        } else if (firstPkParam.isOut() && secondPkParam.isIn()) {
            doublePkPrimaryInParam = secondPkParam;
            doublePkSecondaryOutParam = firstPkParam;
            doublePkSecondaryOutField = firstPkField;
        } else {
        // we don't have an IN and an OUT... so do nothing and leave them null
        }
    }
    if (isSinglePk && isSinglePkOut && !isSinglePkIn) {
        /*
             **** primary sequenced primary key ****
             *
            <auto-attributes include="pk" mode="OUT" optional="false"/>
             *
            <make-value entity-name="Example" value-name="newEntity"/>
            <sequenced-id-to-env sequence-name="Example" env-name="newEntity.exampleId"/> <!-- get the next sequenced ID -->
            <field-to-result field-name="newEntity.exampleId" result-name="exampleId"/>
            <set-nonpk-fields map-name="parameters" value-name="newEntity"/>
            <create-value value-name="newEntity"/>
             *
             */
        String sequencedId = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName());
        newEntity.set(singlePkModeField.getName(), sequencedId);
    } else if (isSinglePk && isSinglePkOut && isSinglePkIn) {
        /*
             **** primary sequenced key with optional override passed in ****
             *
            <auto-attributes include="pk" mode="INOUT" optional="true"/>
             *
            <make-value value-name="newEntity" entity-name="Product"/>
            <set-nonpk-fields map-name="parameters" value-name="newEntity"/>
            <set from-field="parameters.productId" field="newEntity.productId"/>
            <if-empty field="newEntity.productId">
                <sequenced-id-to-env sequence-name="Product" env-name="newEntity.productId"/>
            <else>
                <check-id field-name="productId" map-name="newEntity"/>
                <check-errors/>
            </else>
            </if-empty>
            <field-to-result field-name="productId" map-name="newEntity" result-name="productId"/>
            <create-value value-name="newEntity"/>
             *
             */
        Object pkValue = parameters.get(singlePkModelParam.name);
        if (UtilValidate.isEmpty(pkValue)) {
            pkValue = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName());
        } else {
            if (pkValue instanceof String) {
                StringBuffer errorDetails = new StringBuffer();
                if (!UtilValidate.isValidDatabaseId((String) pkValue, errorDetails)) {
                    return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ServiceParameterValueNotValid", UtilMisc.toMap("parameterName", singlePkModelParam.name, "errorDetails", errorDetails), locale));
                }
            }
        }
        newEntity.set(singlePkModeField.getName(), pkValue);
        GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, parameters, dctx.getDelegator(), false, true, null, null);
        if (lookedUpValue != null) {
            return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ServiceValueFound", UtilMisc.toMap("pkFields", newEntity.getPkShortValueString()), locale));
        }
    } else if (isDoublePk && doublePkPrimaryInParam != null && doublePkSecondaryOutParam != null) {
        /*
             **** secondary sequenced primary key ****
             *
            <auto-attributes include="pk" mode="IN" optional="false"/>
            <override name="exampleItemSeqId" mode="OUT"/> <!-- make this OUT rather than IN, we will automatically generate the next sub-sequence ID -->
             *
            <make-value entity-name="ExampleItem" value-name="newEntity"/>
            <set-pk-fields map-name="parameters" value-name="newEntity"/>
            <make-next-seq-id value-name="newEntity" seq-field-name="exampleItemSeqId"/> <!-- this finds the next sub-sequence ID -->
            <field-to-result field-name="newEntity.exampleItemSeqId" result-name="exampleItemSeqId"/>
            <set-nonpk-fields map-name="parameters" value-name="newEntity"/>
            <create-value value-name="newEntity"/>
             */
        newEntity.setPKFields(parameters, true);
        dctx.getDelegator().setNextSubSeqId(newEntity, doublePkSecondaryOutField.getName(), 5, 1);
    } else if (allPksInOnly) {
        /*
             **** plain specified primary key ****
             *
            <auto-attributes include="pk" mode="IN" optional="false"/>
             *
            <make-value entity-name="Example" value-name="newEntity"/>
            <set-pk-fields map-name="parameters" value-name="newEntity"/>
            <set-nonpk-fields map-name="parameters" value-name="newEntity"/>
            <create-value value-name="newEntity"/>
             *
             */
        newEntity.setPKFields(parameters, true);
        // with all pks present on parameters, check if the entity is not already exists.
        GenericValue lookedUpValue = PrimaryKeyFinder.runFind(modelEntity, parameters, dctx.getDelegator(), false, true, null, null);
        if (lookedUpValue != null) {
            return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ServiceValueFound", UtilMisc.toMap("pkFields", newEntity.getPkShortValueString()), locale));
        }
    } else {
        /* We haven't all Pk and their are 3 or more, now check if isn't a associate entity with own sequence
            <set-pk-fields map="parameters" value-field="newEntity"/>
            <sequenced-id sequence-name="ExempleItemAssoc" field="newEntity.exempleItemAssocId"/>
            <create-value value-field="newEntity"/>
             */
        if (pkFieldNameOutOnly != null && pkFieldNameOutOnly.size() == 1) {
            newEntity.setPKFields(parameters, true);
            String pkFieldName = pkFieldNameOutOnly.get(0);
            // if it's a fromDate, don't update it now, it's will be done next step
            if (!"fromDate".equals(pkFieldName)) {
                String pkValue = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName());
                newEntity.set(pkFieldName, pkValue);
            }
        } else {
            throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the create invoke option: " + "could not find a valid combination of primary key settings to do a known create operation; options include: " + "1. a single OUT pk for primary auto-sequencing, " + "2. a single INOUT pk for primary auto-sequencing with optional override, " + "3. a 2-part pk with one part IN (existing primary pk) and one part OUT (the secondary pk to sub-sequence), " + "4. a N-part pk with N-1 part IN and one party OUT only (missing pk is a sub-sequence mainly for entity assoc), " + "5. all pk fields are IN for a manually specified primary key");
        }
    }
    // handle the case where there is a fromDate in the pk of the entity, and it is optional or undefined in the service def, populate automatically
    ModelField fromDateField = modelEntity.getField("fromDate");
    if (fromDateField != null && fromDateField.getIsPk()) {
        ModelParam fromDateParam = modelService.getParam("fromDate");
        if (fromDateParam == null || parameters.get("fromDate") == null) {
            newEntity.set("fromDate", UtilDateTime.nowTimestamp());
        }
    }
    newEntity.setNonPKFields(parameters, true);
    if (modelEntity.getField("createdDate") != null) {
        newEntity.set("createdDate", UtilDateTime.nowTimestamp());
        if (modelEntity.getField("createdByUserLogin") != null) {
            GenericValue userLogin = (GenericValue) parameters.get("userLogin");
            if (userLogin != null) {
                newEntity.set("createdByUserLogin", userLogin.get("userLoginId"));
                if (modelEntity.getField("lastModifiedByUserLogin") != null) {
                    newEntity.set("lastModifiedByUserLogin", userLogin.get("userLoginId"));
                } else if (modelEntity.getField("changedByUserLogin") != null) {
                    newEntity.set("changedByUserLogin", userLogin.get("userLoginId"));
                }
            }
        }
        if (modelEntity.getField("lastModifiedDate") != null) {
            newEntity.set("lastModifiedDate", UtilDateTime.nowTimestamp());
        } else if (modelEntity.getField("changedDate") != null) {
            newEntity.set("changedDate", UtilDateTime.nowTimestamp());
        }
    }
    if (modelEntity.getField("changeByUserLoginId") != null) {
        GenericValue userLogin = (GenericValue) parameters.get("userLogin");
        if (userLogin != null) {
            newEntity.set("changeByUserLoginId", userLogin.get("userLoginId"));
        } else {
            throw new GenericServiceException("You call a creation on entity that require the userLogin to track the activity, please controle that your service definition has auth='true'");
        }
        // Oh changeByUserLoginId detected, check if an EntityStatus concept
        if (modelEntity.getEntityName().endsWith("Status")) {
            if (modelEntity.getField("statusDate") != null && parameters.get("statusDate") == null) {
                newEntity.set("statusDate", UtilDateTime.nowTimestamp());
                // if a statusEndDate is present, resolve the last EntityStatus to store this value on the previous element
                if (modelEntity.getField("statusEndDate") != null) {
                    ModelEntity relatedEntity = dctx.getDelegator().getModelEntity(modelEntity.getEntityName().replaceFirst("Status", ""));
                    if (relatedEntity != null) {
                        Map<String, Object> conditionRelatedPkFieldMap = new HashMap<>();
                        for (String pkRelatedField : relatedEntity.getPkFieldNames()) {
                            conditionRelatedPkFieldMap.put(pkRelatedField, parameters.get(pkRelatedField));
                        }
                        GenericValue previousStatus = EntityQuery.use(newEntity.getDelegator()).from(modelEntity.getEntityName()).where(conditionRelatedPkFieldMap).orderBy("-statusDate").queryFirst();
                        if (previousStatus != null) {
                            previousStatus.put("statusEndDate", newEntity.get("statusDate"));
                            previousStatus.store();
                        }
                    }
                }
            }
        }
    }
    newEntity.create();
    Map<String, Object> result = ServiceUtil.returnSuccess(UtilProperties.getMessage("ServiceUiLabels", "EntityCreatedSuccessfully", UtilMisc.toMap("entityName", modelEntity.getEntityName()), locale));
    result.put("crudValue", newEntity);
    return result;
}
Also used : Locale(java.util.Locale) GenericValue(org.apache.ofbiz.entity.GenericValue) HashMap(java.util.HashMap) ModelParam(org.apache.ofbiz.service.ModelParam) ModelField(org.apache.ofbiz.entity.model.ModelField) GenericServiceException(org.apache.ofbiz.service.GenericServiceException) ModelEntity(org.apache.ofbiz.entity.model.ModelEntity)

Example 12 with ModelParam

use of org.apache.ofbiz.service.ModelParam in project ofbiz-framework by apache.

the class LabelReferences method getAutoFieldsServiceTag.

private void getAutoFieldsServiceTag(Element element, Set<String> fieldNames) throws GenericServiceException {
    String serviceName = UtilFormatOut.checkNull(element.getAttribute("service-name"));
    String defaultFieldType = UtilFormatOut.checkNull(element.getAttribute("default-field-type"));
    if (UtilValidate.isNotEmpty(serviceName) && (!("hidden".equals(defaultFieldType)))) {
        ModelService modelService = dispatchContext.getModelService(serviceName);
        List<ModelParam> modelParams = modelService.getInModelParamList();
        Iterator<ModelParam> modelParamIter = modelParams.iterator();
        while (modelParamIter.hasNext()) {
            ModelParam modelParam = modelParamIter.next();
            // skip auto params that the service engine populates...
            if ("userLogin".equals(modelParam.name) || "locale".equals(modelParam.name) || "timeZone".equals(modelParam.name)) {
                continue;
            }
            if (modelParam.formDisplay) {
                if (UtilValidate.isNotEmpty(modelParam.entityName) && UtilValidate.isNotEmpty(modelParam.fieldName)) {
                    ModelEntity modelEntity;
                    modelEntity = delegator.getModelEntity(modelParam.entityName);
                    if (modelEntity != null) {
                        ModelField modelField = modelEntity.getField(modelParam.fieldName);
                        if (modelField != null) {
                            fieldNames.add(modelField.getName());
                        }
                    }
                }
            }
        }
    }
}
Also used : ModelField(org.apache.ofbiz.entity.model.ModelField) ModelParam(org.apache.ofbiz.service.ModelParam) ModelEntity(org.apache.ofbiz.entity.model.ModelEntity) ModelService(org.apache.ofbiz.service.ModelService)

Aggregations

ModelParam (org.apache.ofbiz.service.ModelParam)12 GenericServiceException (org.apache.ofbiz.service.GenericServiceException)10 HashMap (java.util.HashMap)8 Locale (java.util.Locale)6 ModelService (org.apache.ofbiz.service.ModelService)6 GenericValue (org.apache.ofbiz.entity.GenericValue)5 ModelField (org.apache.ofbiz.entity.model.ModelField)5 Map (java.util.Map)4 ModelEntity (org.apache.ofbiz.entity.model.ModelEntity)4 LinkedList (java.util.LinkedList)3 DispatchContext (org.apache.ofbiz.service.DispatchContext)3 LocalDispatcher (org.apache.ofbiz.service.LocalDispatcher)3 List (java.util.List)2 TimeZone (java.util.TimeZone)2 HttpSession (javax.servlet.http.HttpSession)2 GeneralException (org.apache.ofbiz.base.util.GeneralException)2 ServiceAuthException (org.apache.ofbiz.service.ServiceAuthException)2 ServiceValidationException (org.apache.ofbiz.service.ServiceValidationException)2 RequestMap (org.apache.ofbiz.webapp.control.ConfigXMLReader.RequestMap)2 File (java.io.File)1