/*******************************************************************************
* Copyright (c) 2012 OpenLegacy Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* OpenLegacy Inc. - initial API and implementation
*******************************************************************************/
package org.openlegacy.terminal.utils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openlegacy.exceptions.EntityNotAccessibleException;
import org.openlegacy.terminal.ScreenPojoFieldAccessor;
import org.openlegacy.terminal.TerminalField;
import org.openlegacy.terminal.TerminalSnapshot;
import org.openlegacy.utils.ProxyUtil;
import org.openlegacy.utils.StringUtil;
import org.springframework.beans.DirectFieldAccessor;
import java.text.MessageFormat;
public class SimpleScreenPojoFieldAccessor implements ScreenPojoFieldAccessor {
private DirectFieldAccessor directFieldAccessor;
private Object target;
protected static final String FIELD_SUFFIX = "Field";
private final static Log logger = LogFactory.getLog(SimpleScreenPojoFieldAccessor.class);
private static final String TERMINAL_SNAPSHOT = "terminalSnapshot";
private static final String FOCUS_FIELD = "focusField";
public SimpleScreenPojoFieldAccessor(Object target) {
target = ProxyUtil.getTargetObject(target);
directFieldAccessor = new DirectFieldAccessor(target);
this.target = target;
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#isReadableProperty(java.lang.String)
*/
public boolean isExists(String fieldName) {
return directFieldAccessor.isReadableProperty(getFieldPojoName(fieldName));
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#isWritableProperty(java.lang.String)
*/
public boolean isWritable(String fieldName) {
return directFieldAccessor.isWritableProperty(getFieldPojoName(fieldName));
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#setTerminalField(java.lang.String,
* org.openlegacy.terminal.TerminalField)
*/
public void setTerminalField(String fieldName, TerminalField terminalField) {
fieldName = getFieldPojoName(fieldName);
String terminalFieldName = fieldName + FIELD_SUFFIX;
if (directFieldAccessor.isReadableProperty(terminalFieldName)) {
directFieldAccessor.setPropertyValue(terminalFieldName, terminalField);
if (logger.isDebugEnabled()) {
logger.debug(MessageFormat.format("Terminal Field {0} was set", fieldName, terminalField));
}
}
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#setFieldValue(java.lang.String, java.lang.Object)
*/
public void setFieldValue(String fieldName, Object value) {
try {
directFieldAccessor.setPropertyValue(getFieldPojoName(fieldName), value);
} catch (Exception e) {
throw (new EntityNotAccessibleException(MessageFormat.format("Unable to update screen entity field: {0}.{1}",
target.getClass().getSimpleName(), fieldName), e));
}
if (logger.isDebugEnabled()) {
if (value instanceof String) {
String message = MessageFormat.format("Field {0} was set with value \"{1}\"", fieldName, value);
if (!StringUtils.isEmpty(((String)value))) {
logger.debug(message);
} else {
// print empty value assignment only in trace mode
logger.trace(message);
}
} else {
String message = MessageFormat.format("Field {0} was set with value \"{1}\"", fieldName, value);
logger.debug(message);
}
}
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#setTerminalSnapshot(org.openlegacy.terminal.TerminalSnapshot)
*/
public void setTerminalSnapshot(TerminalSnapshot terminalSnapshot) {
if (directFieldAccessor.isWritableProperty(TERMINAL_SNAPSHOT)) {
directFieldAccessor.setPropertyValue(TERMINAL_SNAPSHOT, terminalSnapshot);
}
if (logger.isDebugEnabled()) {
logger.debug("Terminal screen was set to screen entity");
}
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#getFieldType(java.lang.String)
*/
public Class<?> getFieldType(String fieldName) {
return directFieldAccessor.getPropertyType(fieldName);
}
/*
* (non-Javadoc)
*
* @see org.openlegacy.terminal.utils.ScreenEntityFieldAccessor#getFieldValue(java.lang.String)
*/
public Object getFieldValue(String fieldName) {
return directFieldAccessor.getPropertyValue(getFieldPojoName(fieldName));
}
private static String getFieldPojoName(String fieldName) {
return StringUtil.removeNamespace(fieldName);
}
public void setFocusField(String fieldName) {
if (directFieldAccessor.isWritableProperty(FOCUS_FIELD)) {
directFieldAccessor.setPropertyValue(FOCUS_FIELD, fieldName);
}
}
}