blob: 791cdf6ac6c82a21075db1ab784e075096e4dbfc [file] [log] [blame]
/*
* 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.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericPK;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.security.Security;
import org.ofbiz.entity.model.ModelReader;
import org.ofbiz.entity.model.ModelEntity;
import org.ofbiz.entity.model.ModelField;
import org.ofbiz.entity.model.ModelFieldType;
import org.ofbiz.entity.model.ModelRelation;
import org.ofbiz.entity.model.ModelKeyMap;
import org.ofbiz.base.util.UtilFormatOut;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import java.sql.Timestamp;
import java.sql.Date;
import java.sql.Time;
import javolution.util.FastList;
import javolution.util.FastMap;
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 = FastList.newInstance();
Iterator fieldIterator = entity.getFieldsIterator();
while (fieldIterator.hasNext()) {
Map mapField = FastMap.newInstance();
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 = FastList.newInstance();
pkIterator = entity.getPksIterator();
while (pkIterator.hasNext()) {
Map mapField = FastMap.newInstance();
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 = FastList.newInstance();
Iterator noPkIterator = entity.getNopksIterator();
while (noPkIterator.hasNext()) {
Map mapField = FastMap.newInstance();
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 = FastList.newInstance();
for (int relIndex = 0; relIndex < entity.getRelationsSize(); relIndex++) {
Map mapRelation = FastMap.newInstance();
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 = FastList.newInstance();
Iterator relFieldIterator = relatedEntity.getFieldsIterator();
while (relFieldIterator.hasNext()) {
Map mapRelatedFields = FastMap.newInstance();
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);