/* * 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. */ import org.apache.ofbiz.entity.Delegator import org.apache.ofbiz.entity.GenericPK import org.apache.ofbiz.entity.GenericValue import org.apache.ofbiz.security.Security import org.apache.ofbiz.entity.model.ModelReader import org.apache.ofbiz.entity.model.ModelEntity import org.apache.ofbiz.entity.model.ModelField import org.apache.ofbiz.entity.model.ModelFieldType import org.apache.ofbiz.entity.model.ModelRelation import org.apache.ofbiz.entity.model.ModelKeyMap import org.apache.ofbiz.base.util.UtilFormatOut import org.apache.ofbiz.base.util.UtilMisc import org.apache.ofbiz.base.util.UtilValidate import java.sql.Timestamp import java.sql.Date import java.sql.Time String entityName = parameters.get("entityName") context.put("entityName", entityName) ModelReader reader = delegator.getModelReader() ModelEntity entity = reader.getModelEntity(entityName) context.put("entity", entity) context.put("plainTableName", entity.getPlainTableName()) boolean hasAllView = security.hasEntityPermission("ENTITY_DATA", "_VIEW", session) boolean hasAllCreate = security.hasEntityPermission("ENTITY_DATA", "_CREATE", session) boolean hasAllUpdate = security.hasEntityPermission("ENTITY_DATA", "_UPDATE", session) boolean hasAllDelete = security.hasEntityPermission("ENTITY_DATA", "_DELETE", session) boolean hasViewPermission = hasAllView || security.hasEntityPermission(entity.getPlainTableName(), "_VIEW", session) boolean hasCreatePermission = hasAllCreate || security.hasEntityPermission(entity.getPlainTableName(), "_CREATE", session) boolean hasUpdatePermission = hasAllUpdate || security.hasEntityPermission(entity.getPlainTableName(), "_UPDATE", session) boolean hasDeletePermission = hasAllDelete || security.hasEntityPermission(entity.getPlainTableName(), "_DELETE", session) context.put("hasAllView", hasAllView) context.put("hasAllCreate", hasAllCreate) context.put("hasAllUpdate", hasAllUpdate) context.put("hasAllDelete", hasAllDelete) context.put("hasViewPermission", hasViewPermission) context.put("hasCreatePermission", hasCreatePermission) context.put("hasUpdatePermission", hasUpdatePermission) context.put("hasDeletePermission" , hasDeletePermission) boolean useValue = true String curFindString = "entityName=" + entityName GenericPK findByPK = delegator.makePK(entityName) Iterator pkIterator = entity.getPksIterator() while (pkIterator.hasNext()) { ModelField field = pkIterator.next() ModelFieldType type = delegator.getEntityFieldType(entity, field.getType()) String fval = parameters.get(field.getName()) if (UtilValidate.isNotEmpty(fval)) { curFindString = curFindString + "&" + field.getName() + "=" + fval findByPK.setString(field.getName(), fval) } } context.put("findByPk", findByPK.toString()) curFindString = UtilFormatOut.encodeQuery(curFindString) context.put("curFindString", curFindString) GenericValue value = null //only try to find it if this is a valid primary key... if (findByPK.isPrimaryKey()) { value = delegator.findOne(findByPK.getEntityName(), findByPK, false) } context.put("value", value) if (value == null) { useValue = false } if (value != null) { List fieldList = [] Iterator fieldIterator = entity.getFieldsIterator() while (fieldIterator.hasNext()) { Map mapField = [:] ModelField field = fieldIterator.next() ModelFieldType type = delegator.getEntityFieldType(entity, field.getType()) String fieldValue = "" if (type.getJavaType().equals("Timestamp") || type.getJavaType().equals("java.sql.Timestamp")) { Timestamp dtVal = value.getTimestamp(field.getName()) fieldValue = (dtVal == null) ? "" : dtVal.toString() } else if (type.getJavaType().equals("Date") || type.getJavaType().equals("java.sql.Date")) { Date dateVal = value.getDate(field.getName()) fieldValue = (dateVal == null) ? "" : dateVal.toString() } else if (type.getJavaType().equals("Time") || type.getJavaType().equals("java.sql.Time")) { Time timeVal = value.getTime(field.getName()) fieldValue = (timeVal == null) ? "" : timeVal.toString() } else if (type.getJavaType().indexOf("Integer") >= 0) { fieldValue = UtilFormatOut.safeToString((Integer)value.get(field.getName())) } else if (type.getJavaType().indexOf("Long") >= 0) { fieldValue = UtilFormatOut.safeToString((Long)value.get(field.getName())) } else if (type.getJavaType().indexOf("Double") >= 0) { fieldValue = UtilFormatOut.safeToString((Double)value.get(field.getName())) } else if (type.getJavaType().indexOf("Float") >= 0) { fieldValue = UtilFormatOut.safeToString((Float)value.get(field.getName())) } else if (type.getJavaType().indexOf("BigDecimal") >= 0) { fieldValue = UtilFormatOut.safeToString((BigDecimal)value.get(field.getName())) } else if (type.getJavaType().indexOf("String") >= 0) { fieldValue = UtilFormatOut.checkNull((String)value.get(field.getName())) } mapField.put("name", field.getName()) mapField.put("value", fieldValue) fieldList.add(mapField) } context.put("fields", fieldList) } GenericValue valueSave = value boolean pkNotFound = false if (value == null && (findByPK.getAllFields().size() > 0)) { pkNotFound = true } context.put("pkNotFound", pkNotFound) String lastUpdateMode = parameters.get("UPDATE_MODE") if ((session.getAttribute("_ERROR_MESSAGE_") != null || request.getAttribute("_ERROR_MESSAGE_") != null) && lastUpdateMode != null && !lastUpdateMode.equals("DELETE")) { //if we are updating and there is an error, do not use the entity data for the fields, use parameters to get the old value useValue = false } context.put("useValue", useValue) List newFieldPkList = [] pkIterator = entity.getPksIterator() while (pkIterator.hasNext()) { Map mapField = [:] ModelField field = pkIterator.next() ModelFieldType type = delegator.getEntityFieldType(entity, field.getType()) String fieldValue = "" String fieldType = "" String stringLength = "" if (type.getJavaType().equals("Timestamp") || type.getJavaType().equals("java.sql.Timestamp")) { String dateTimeString = null if (findByPK != null && useValue) { Timestamp dtVal = findByPK.getTimestamp(field.getName()) if (dtVal != null) { dateTimeString = dtVal.toString() } } else if (!useValue) { dateTimeString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(dateTimeString) fieldType = "DateTime" } else if (type.getJavaType().equals("Date") || type.getJavaType().equals("java.sql.Date")) { String dateString = null if (findByPK != null && useValue) { Date dateVal = findByPK.getDate(field.getName()) dateString = (dateVal == null) ? "" : dateVal.toString() } else if (!useValue) { dateString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(dateString) fieldType = "Date" } else if (type.getJavaType().equals("Time") || type.getJavaType().equals("java.sql.Time")) { String timeString = null if (findByPK != null && useValue) { Time timeVal = findByPK.getTime(field.getName()) timeString = (timeVal == null) ? "" : timeVal.toString() } else if (!useValue) { timeString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(timeString) fieldType = "Time" } else if (type.getJavaType().indexOf("Integer") >= 0) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.safeToString((Integer)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "Integer" } else if (type.getJavaType().indexOf("Long") >= 0) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.safeToString((Long)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "Long" } else if (type.getJavaType().indexOf("Double") >= 0) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.safeToString((Double)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "Double" } else if (type.getJavaType().indexOf("Float") >= 0) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.safeToString((Float)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "Float" } else if (type.getJavaType().indexOf("String") >= 0) { if (type.stringLength() <= 80) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.checkNull((String)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "StringOneRow" } else if (type.stringLength() <= 255) { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.checkNull((String)findByPK.get(field.getName())) : (useValue ? "" : UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "String" } else { fieldValue = (findByPK != null && useValue) ? UtilFormatOut.checkNull((String)findByPK.get(field.getName())):(useValue?"":UtilFormatOut.checkNull(parameters.get(field.getName()))) fieldType = "Textarea" } stringLength = type.stringLength().toString() } mapField.put("name", field.getName()) mapField.put("value", fieldValue) mapField.put("fieldType", fieldType) mapField.put("stringLength", stringLength) newFieldPkList.add(mapField) } context.put("newFieldPkList", newFieldPkList) List newFieldNoPkList = [] Iterator noPkIterator = entity.getNopksIterator() while (noPkIterator.hasNext()) { Map mapField = [:] ModelField field = noPkIterator.next() ModelFieldType type = delegator.getEntityFieldType(entity, field.getType()) String fieldValue = "" String fieldType = "" String stringLength = "" if (type.getJavaType().equals("Timestamp") || type.getJavaType().equals("java.sql.Timestamp")) { String dateTimeString = null if (value != null && useValue) { Timestamp dtVal = value.getTimestamp(field.getName()) if (dtVal != null) { dateTimeString = dtVal.toString() } } else if (!useValue) { dateTimeString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(dateTimeString) fieldType = "DateTime" } else if (type.getJavaType().equals("Date") || type.getJavaType().equals("java.sql.Date")) { String dateString = null if (value != null && useValue) { Date dateVal = value.getDate(field.getName()) dateString = (dateVal == null) ? "" : dateVal.toString() } else if (!useValue) { dateString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(dateString) fieldType = "Date" } else if (type.getJavaType().equals("Time") || type.getJavaType().equals("java.sql.Time")) { String timeString = null if (value != null && useValue) { Time timeVal = value.getTime(field.getName()) timeString = (timeVal == null) ? "" : timeVal.toString() } else if (!useValue) { timeString = parameters.get(field.getName()) } fieldValue = UtilFormatOut.checkNull(timeString) fieldType = "Time" } else if (type.getJavaType().indexOf("Integer") >= 0) { fieldValue = (value != null && useValue) ? UtilFormatOut.safeToString((Integer)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "Integer" } else if (type.getJavaType().indexOf("Long") >= 0) { fieldValue = (value != null && useValue) ? UtilFormatOut.safeToString((Long)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "Long" } else if (type.getJavaType().indexOf("Double") >= 0) { fieldValue = (value != null && useValue) ? UtilFormatOut.safeToString((Double)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "Double" } else if (type.getJavaType().indexOf("Float") >= 0) { fieldValue = (value != null && useValue) ? UtilFormatOut.safeToString((Float)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "Float" } else if (type.getJavaType().indexOf("BigDecimal") >= 0) { fieldValue = (value != null && useValue) ? UtilFormatOut.safeToString((BigDecimal)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "BigDecimal" } else if (type.getJavaType().indexOf("String") >= 0) { if (type.stringLength() <= 80) { fieldValue = (value != null && useValue) ? UtilFormatOut.checkNull((String)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "StringOneRow" } else if (type.stringLength() <= 255) { fieldValue = (value != null && useValue) ? UtilFormatOut.checkNull((String)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "String" } else { fieldValue = (value != null && useValue) ? UtilFormatOut.checkNull((String)value.get(field.getName())):UtilFormatOut.checkNull(parameters.get(field.getName())) fieldType = "Textarea" } stringLength = type.stringLength().toString() } mapField.put("name", field.getName()) mapField.put("value", fieldValue) mapField.put("fieldType", fieldType) mapField.put("stringLength", stringLength) newFieldNoPkList.add(mapField) } context.put("newFieldNoPkList", newFieldNoPkList) List relationFieldList = [] for (int relIndex = 0; relIndex < entity.getRelationsSize(); relIndex++) { Map mapRelation = [:] ModelRelation relation = entity.getRelation(relIndex) ModelEntity relatedEntity = reader.getModelEntity(relation.getRelEntityName()) boolean relCreate = false if (security.hasEntityPermission(relatedEntity.getPlainTableName(), "_CREATE", session)) { relCreate = true } mapRelation.put("type", relation.getType()) mapRelation.put("title", relation.getTitle()) mapRelation.put("relEntityName", relation.getRelEntityName()) mapRelation.put("sortName", relation.getTitle() + relation.getRelEntityName()) mapRelation.put("relatedTable", relatedEntity.getEntityName()) mapRelation.put("relCreate", relCreate) if ("one".equals(relation.getType()) || "one-nofk".equals(relation.getType())) { if (value != null) { if (hasAllView || security.hasEntityPermission(relatedEntity.getPlainTableName(), "_VIEW", session)) { Iterator tempIter = UtilMisc.toIterator(value.getRelated(relation.getTitle() + relatedEntity.getEntityName(), null, null, false)) GenericValue valueRelated = null if (tempIter != null && tempIter.hasNext()) { valueRelated = (GenericValue) tempIter.next() } List relatedFieldsList = [] Iterator relFieldIterator = relatedEntity.getFieldsIterator() while (relFieldIterator.hasNext()) { Map mapRelatedFields = [:] ModelField field = relFieldIterator.next() ModelFieldType type = delegator.getEntityFieldType(entity, field.getType()) String fieldValue = "" String fieldType = "" if (type.getJavaType().equals("Timestamp") || type.getJavaType().equals("java.sql.Timestamp")) { Timestamp dtVal = null if (valueRelated != null) { dtVal = valueRelated.getTimestamp(field.getName()) } fieldValue = (dtVal == null) ? "" : dtVal.toString() fieldType = "DateTime" } else if (type.getJavaType().equals("Date") || type.getJavaType().equals("java.sql.Date")) { Date dateVal = null if (valueRelated != null) { dateVal = valueRelated.getDate(field.getName()) } fieldValue = (dateVal == null) ? "" : dateVal.toString() fieldType = "Date" } else if (type.getJavaType().equals("Time") || type.getJavaType().equals("java.sql.Time")) { Time timeVal = null if (valueRelated != null) { timeVal = valueRelated.getTime(field.getName()) } fieldValue = (timeVal == null) ? "" : timeVal.toString() fieldType = "Time" } else if (type.getJavaType().indexOf("Integer") >= 0) { if (valueRelated != null) { fieldValue = UtilFormatOut.safeToString((Integer)valueRelated.get(field.getName())) } fieldType = "Integer" } else if (type.getJavaType().indexOf("Long") >= 0) { if (valueRelated != null) { fieldValue = UtilFormatOut.safeToString((Long)valueRelated.get(field.getName())) } fieldType = "Long" } else if (type.getJavaType().indexOf("Double") >= 0) { if (valueRelated != null) { fieldValue = UtilFormatOut.safeToString((Double)valueRelated.get(field.getName())) } fieldType = "Double" } else if (type.getJavaType().indexOf("Float") >= 0) { if (valueRelated != null) { fieldValue = UtilFormatOut.safeToString((Float)valueRelated.get(field.getName())) } fieldType = "Float" } else if (type.getJavaType().indexOf("String") >= 0) { if (valueRelated != null) { fieldValue = UtilFormatOut.checkNull((String)valueRelated.get(field.getName())) } fieldType = "String" } mapRelatedFields.put("name", field.getName()) mapRelatedFields.put("type", fieldType) mapRelatedFields.put("value", fieldValue) relatedFieldsList.add(mapRelatedFields) } mapRelation.put("valueRelated", valueRelated) if (valueRelated != null) { mapRelation.put("valueRelatedPk", valueRelated.getPrimaryKey().toString()) } mapRelation.put("relatedFieldsList", relatedFieldsList) mapRelation.put("relType", "one") String findString = "entityName=" + relatedEntity.getEntityName() for (ModelKeyMap keyMap : relation.getKeyMaps()) { if (value.get(keyMap.getFieldName()) != null) { findString += "&" + keyMap.getRelFieldName() + "=" + value.get(keyMap.getFieldName()) } } String encodeFindString = UtilFormatOut.encodeQuery(findString) mapRelation.put("encodeRelatedEntityFindString", encodeFindString) relationFieldList.add(mapRelation) } } } else if (relation.getType().equalsIgnoreCase("many")) { if (value != null) { if (hasAllView || security.hasEntityPermission(relatedEntity.getPlainTableName(), "_VIEW", session)) { mapRelation.put("relType", "many") String findString = "entityName=" + relatedEntity.getEntityName() for (ModelKeyMap keyMap : relation.getKeyMaps()) { if (value.get(keyMap.getFieldName()) != null) { findString += "&" + keyMap.getRelFieldName() + "=" + value.get(keyMap.getFieldName()) } } String encodeFindString = UtilFormatOut.encodeQuery(findString) mapRelation.put("encodeRelatedEntityFindString", encodeFindString) relationFieldList.add(mapRelation) } } } } context.put("relationFieldList", UtilMisc.sortMaps(relationFieldList, UtilMisc.toList("sortName"))) context.put("relSize", relationFieldList.size() + 2)