if (!canHandlePersistence(populateValueRequest, instance)) {
return FieldProviderResponse.NOT_HANDLED;
}
boolean dirty = false;
try {
Property prop = populateValueRequest.getProperty();
Object origValue = populateValueRequest.getFieldManager().getFieldValue(instance, prop.getName());
switch (populateValueRequest.getMetadata().getFieldType()) {
case BOOLEAN:
boolean v = Boolean.valueOf(populateValueRequest.getRequestedValue());
prop.setOriginalValue(String.valueOf(origValue));
prop.setOriginalDisplayValue(prop.getOriginalValue());
try {
dirty = checkDirtyState(populateValueRequest, instance, v);
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), v);
} catch (IllegalArgumentException e) {
char c = v ? 'Y' : 'N';
dirty = checkDirtyState(populateValueRequest, instance, c);
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), c);
}
break;
case DATE:
Date date = (Date) populateValueRequest.getFieldManager().getFieldValue(instance, populateValueRequest.getProperty().getName());
String oldValue = null;
if (date != null) {
oldValue = populateValueRequest.getDataFormatProvider().getSimpleDateFormatter().format(date);
}
prop.setOriginalValue(oldValue);
prop.setOriginalDisplayValue(prop.getOriginalValue());
dirty = !StringUtils.equals(oldValue, populateValueRequest.getRequestedValue());
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), populateValueRequest.getDataFormatProvider().
getSimpleDateFormatter().parse(populateValueRequest.getRequestedValue()));
break;
case DECIMAL:
if (origValue != null) {
prop.setOriginalValue(String.valueOf(origValue));
prop.setOriginalDisplayValue(prop.getOriginalValue());
}
if (BigDecimal.class.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, new BigDecimal(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), new BigDecimal(populateValueRequest.getRequestedValue()));
} else {
dirty = checkDirtyState(populateValueRequest, instance, new Double(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance, populateValueRequest.getProperty().getName(), new Double(populateValueRequest.getRequestedValue()));
}
break;
case MONEY:
if (origValue != null) {
prop.setOriginalValue(String.valueOf(origValue));
prop.setOriginalDisplayValue(prop.getOriginalValue());
}
if (BigDecimal.class.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, new BigDecimal(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance, populateValueRequest.getProperty().getName(), new BigDecimal(populateValueRequest.getRequestedValue()));
} else if (Double.class.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, new BigDecimal(populateValueRequest.getRequestedValue()));
LOG.warn("The requested Money field is of type double and could result in a loss of precision." +
" Broadleaf recommends that the type of all Money fields are 'BigDecimal' in order to avoid" +
" this loss of precision that could occur.");
populateValueRequest.getFieldManager().setFieldValue(instance, populateValueRequest.getProperty().getName(), new Double(populateValueRequest.getRequestedValue()));
} else {
dirty = checkDirtyState(populateValueRequest, instance, new BigDecimal(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance, populateValueRequest.getProperty().getName(), new Money(new BigDecimal(populateValueRequest.getRequestedValue())));
}
break;
case INTEGER:
if (origValue != null) {
prop.setOriginalValue(String.valueOf(origValue));
prop.setOriginalDisplayValue(prop.getOriginalValue());
}
if (int.class.isAssignableFrom(populateValueRequest.getReturnType()) || Integer.class
.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, Integer.valueOf(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), Integer.valueOf(populateValueRequest
.getRequestedValue()));
} else if (byte.class.isAssignableFrom(populateValueRequest.getReturnType()) || Byte.class
.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, Byte.valueOf(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), Byte.valueOf(populateValueRequest
.getRequestedValue()));
} else if (short.class.isAssignableFrom(populateValueRequest.getReturnType()) || Short.class
.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, Short.valueOf(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), Short.valueOf(populateValueRequest
.getRequestedValue()));
} else if (long.class.isAssignableFrom(populateValueRequest.getReturnType()) || Long.class
.isAssignableFrom(populateValueRequest.getReturnType())) {
dirty = checkDirtyState(populateValueRequest, instance, Long.valueOf(populateValueRequest.getRequestedValue()));
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), Long.valueOf(populateValueRequest
.getRequestedValue()));
}
break;
case CODE:
// **NOTE** We want to fall through in this case, do not break.
setNonDisplayableValues(populateValueRequest);
case STRING:
case HTML_BASIC:
case HTML:
case EMAIL:
if (origValue != null) {
prop.setOriginalValue(String.valueOf(origValue));
prop.setOriginalDisplayValue(prop.getOriginalValue());
}
dirty = checkDirtyState(populateValueRequest, instance, populateValueRequest.getRequestedValue());
populateValueRequest.getFieldManager().setFieldValue(instance, populateValueRequest.getProperty()
.getName(), populateValueRequest.getRequestedValue());
break;
case FOREIGN_KEY: {
if (origValue != null) {
prop.setOriginalValue(String.valueOf(origValue));
}
Serializable foreignInstance;
if (StringUtils.isEmpty(populateValueRequest.getRequestedValue())) {
foreignInstance = null;
} else {
if (SupportedFieldType.INTEGER.toString().equals(populateValueRequest.getMetadata()
.getSecondaryType().toString())) {
foreignInstance = populateValueRequest.getPersistenceManager().getDynamicEntityDao()
.retrieve(Class.forName(populateValueRequest.getMetadata().getForeignKeyClass()),
Long.valueOf(populateValueRequest.getRequestedValue()));
} else {
foreignInstance = populateValueRequest.getPersistenceManager().getDynamicEntityDao()
.retrieve(Class.forName(populateValueRequest.getMetadata().getForeignKeyClass()),
populateValueRequest.getRequestedValue());
}
}
if (Collection.class.isAssignableFrom(populateValueRequest.getReturnType())) {
Collection collection;
try {
collection = (Collection) populateValueRequest.getFieldManager().getFieldValue(instance,
populateValueRequest.getProperty().getName());
} catch (FieldNotAvailableException e) {
throw new IllegalArgumentException(e);
}
if (!collection.contains(foreignInstance)) {
collection.add(foreignInstance);
dirty = true;
}
} else if (Map.class.isAssignableFrom(populateValueRequest.getReturnType())) {
throw new IllegalArgumentException("Map structures are not supported for foreign key fields.");
} else {
dirty = checkDirtyState(populateValueRequest, instance, foreignInstance);
populateValueRequest.getFieldManager().setFieldValue(instance,
populateValueRequest.getProperty().getName(), foreignInstance);
}
break;
}
case ADDITIONAL_FOREIGN_KEY: {
Serializable foreignInstance;
if (StringUtils.isEmpty(populateValueRequest.getRequestedValue())) {
foreignInstance = null;
} else {
if (SupportedFieldType.INTEGER.toString().equals(populateValueRequest.getMetadata()
.getSecondaryType().toString())) {
foreignInstance = populateValueRequest.getPersistenceManager().getDynamicEntityDao()
.retrieve(Class.forName(populateValueRequest.getMetadata().getForeignKeyClass()),
Long.valueOf(populateValueRequest.getRequestedValue()));
} else {
foreignInstance = populateValueRequest.getPersistenceManager().getDynamicEntityDao()
.retrieve(Class.forName(populateValueRequest.getMetadata().getForeignKeyClass()),
populateValueRequest.getRequestedValue());
}
}
// Best guess at grabbing the original display value
String fkProp = populateValueRequest.getMetadata().getForeignKeyDisplayValueProperty();
Object origDispVal = null;
if (origValue != null) {
if (AdminMainEntity.MAIN_ENTITY_NAME_PROPERTY.equals(fkProp)) {
if (origValue instanceof AdminMainEntity) {
origDispVal = ((AdminMainEntity) origValue).getMainEntityName();
}
} else {
origDispVal = populateValueRequest.getFieldManager().getFieldValue(origValue, fkProp);
}
}
if (origDispVal != null) {
prop.setOriginalDisplayValue(String.valueOf(origDispVal));
Session session = populateValueRequest.getPersistenceManager().getDynamicEntityDao().getStandardEntityManager().unwrap(Session.class);
prop.setOriginalValue(String.valueOf(session.getIdentifier(foreignInstance)));
}
if (Collection.class.isAssignableFrom(populateValueRequest.getReturnType())) {
Collection collection;
try {