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;
}
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());
}
}
}
}
}
}
}
Aggregations