8.DataMappingConfigurer
/*
* Created on Oct 8,2013
*
* Copyright 2006 ATPCO Confidential and Proprietary. All Rights Reserved.
*/
package net.atpco.dds.offline.filing.common.datamapper.binder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import net.atpco.dds.offline.filing.common.datamapper.parser.ClassConfig;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.omg.CORBA.portable.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.Resource;
import org.xml.sax.SAXException;
public class DataMappingConfigurer {
private static Logger LOGGER = Logger
.getLogger(DataMappingConfigurer.class);
@Autowired
@Qualifier("properties")
private transient Properties properties;
@Autowired
@Qualifier("dataLoadConfig")
private transient DataLoadConfig dataLoadConfig;
private transient Resource[] configPaths;
private transient final Resource schemaPath;
public DataMappingConfigurer(final Resource[] configPaths,
final Resource schemaPath) {
if (!ArrayUtils.isEmpty(configPaths)) {
this.configPaths = Arrays.copyOf(configPaths,configPaths.length);
}
this.schemaPath = schemaPath;
}
/**
* Load the configuration configured. Make sure the property exist in java
* object and table and columns exist in database.
*
* @param configPaths
* @throws ApplicationException
*/
@PostConstruct
public void load() throws Exception {
if (configPaths == null || configPaths.length == 0) {
return;
}
final List<String> identifiersList = new ArrayList<String>();
for (final Resource resource : configPaths) {
LOGGER.info("Processing the file ..." + resource.getFilename());
final ClassConfig config = parse(resource);
if (!identifiersList.contains(config.getId())) {
identifiersList.add(config.getId());
} else {
throw new Exception("Identifier " + config.getId()
+ " already exist:");
}
config.setSchemaName(properties.getProperty(config
.getSchemaPropName()));
// set the configuration in cache.
dataLoadConfig.setClassConfig(config.getId(),config);
LOGGER.info(config.toString());
}
}
/**
* parse the file and bind it using JAXB
*
* @return
*/
private ClassConfig parse(final Resource resource) {
final SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Exception exeception;
JAXBElement<ClassConfig> jaxElement = null;
try {
final StreamSource xmlSchema = new StreamSource(
schemaPath.getInputStream());
Schema schema = schemaFactory.newSchema(xmlSchema);
JAXBContext jaxbContext = JAXBContext
.newInstance(ClassConfig.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(schema);
final StreamSource xml = new StreamSource(resource.getInputStream());
jaxElement = unmarshaller.unmarshal(xml,ClassConfig.class);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
exeception = new Exception("IO");
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
exeception = new Exception("SAX");
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
exeception = new Exception("JAXB");
}
return jaxElement.getValue();
}
}
9.DDSDAO
package net.atpco.dds.offline.filing.common.datamapper.binder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
public abstract class DDSDAO {
@Autowired
protected transient NamedParameterJdbcTemplate namedJdbcTemplate;
protected JdbcTemplate getJdbcTemplate() {
return ((JdbcTemplate) this.namedJdbcTemplate.getJdbcOperations());
}
}
10.Invoker
package net.atpco.dds.offline.filing.common.datamapper.binder;
import java.lang.reflect.InvocationTargetException;
public interface Invoker {
Object invoke(Object target,Object[] args) throws IllegalAccessException,
InvocationTargetException;
}
11.MethodInvoker
package net.atpco.dds.offline.filing.common.datamapper.binder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Responsible for invoking the target methods.
*
* @author atp1axi
* @version 1.0
*
*/
public class MethodInvoker implements Invoker {
private transient final Method method;
public MethodInvoker(final Method method) {
this.method = method;
}
@Override
public Object invoke(final Object target,final Object[] args)
throws IllegalAccessException,InvocationTargetException {
return method.invoke(target,args);
}
}
12.Mode
package net.atpco.dds.offline.filing.common.datamapper.binder;
/**
* Defines the CRUD mode. Currently it supports only insert and update.
*
* @author atp1axi
* @version 1.0
*
*/
public enum Mode {
INSERT,UPDATE;
}
13.Preparable
package net.atpco.dds.offline.filing.common.datamapper.binder;
import net.atpco.dds.offline.filing.common.datamapper.parser.ClassConfig;
import org.springframework.jdbc.core.namedparam.MapsqlParameterSource;
/**
*Responsible for preparing the sql (insert/update)
*
* @author atp1axi
* @version 1.0
*
*/
public interface Preparable {
/**
* Prepare the sql based on the configuration and mode (Insert/update)
*/
String preparesql(ClassConfig config,Mode mode);
/**
* Prepared the parameter in the form of MapsqlParameterSource which has an option of setting
* the jdbc type.
*
* @param config
* @param object
* @return
*/
MapsqlParameterSource preparesqlParameter(final Mode mode,final ClassConfig config,final Object object);
}
14.PropertyAccessor
package net.atpco.dds.offline.filing.common.datamapper.binder;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/**
* Responsible for accessing the properties dynamically.
* It supports all java bean standard(getters and setters),chained method invocation,
* list,map,and arrays.
*
* @author atp1axi
* @version 1.0
*
*/
@Component(value="propertyAccessor")
public class PropertyAccessor {
private static final Object[] NO_ARGUMENTS = new Object[0];
@Autowired
@Qualifier("dataLoadConfig")
private transient DataLoadConfig dataLoadConfig;
/**
* Gets an Object property from a bean. If the property name
* has "." it should navigate to the next property to access the value
*
* @param object
* The bean
* @param name
* The property name
* @return The property value (as an Object)
*/
public Object getObject(final Object object,final String name) {
return getProperty(object,name);
}
/**
* Access the chained property or collections
* @param object
* @param name
* @return
*/
@SuppressWarnings("rawtypes")
private Object getProperty(final Object object,final String name) {
Object value = null;
if (name.indexOf('[') > -1) {
value = getIndexedProperty(object,name);
} else {
if (object instanceof Map) {
value = ((Map) object).get(name);
} else {
final ClassInfo classCache = dataLoadConfig.getClassInfo(object
.getClass());
final Invoker method = classCache.getGetInvoker(name);
try {
value = method.invoke(object,NO_ARGUMENTS);
} catch (final Exception e) {
}
}
}
return value;
}
/**
* Access the indexed property like List.
* @param object
* @param indexedName
* @return
*/
@SuppressWarnings("rawtypes")
private Object getIndexedProperty(final Object object,final String indexedName) {
Object value = null;
try {
final String name = indexedName.substring(0,indexedName.indexOf('['));
final int idx = Integer.parseInt(indexedName.substring(
indexedName.indexOf('[') + 1,indexedName.indexOf(']')));
final Object list = getProperty(object,name);
if (list instanceof List) {
value = ((List) list).get(idx);
} else if (list instanceof Object[]) {
value = ((Object[]) list)[idx];
} else if (list instanceof char[]) {
value = new Character(((char[]) list)[idx]);
} else if (list instanceof boolean[]) {
//value = new Boolean(((boolean[]) list)[i]);
value = Boolean.valueOf(((boolean[]) list)[idx]);
} else if (list instanceof byte[]) {
value = Byte.valueOf(((byte[]) list)[idx]);
} else if (list instanceof double[]) {
value = Double.valueOf(((double[]) list)[idx]);
} else if (list instanceof float[]) {
value = Float.valueOf(((float[]) list)[idx]);
} else if (list instanceof int[]) {
value = Integer.valueOf(((int[]) list)[idx]);
} else if (list instanceof long[]) {
value = Long.valueOf(((long[]) list)[idx]);
} else {
}
} catch (final Exception e) {
}
return value;
}
}
15.sqlPreparator
package net.atpco.dds.offline.filing.common.datamapper.binder;
import net.atpco.dds.offline.filing.common.datamapper.parser.ClassConfig;
import net.atpco.dds.offline.filing.common.datamapper.parser.PropertyConfig;
import org.apache.log4j.Logger;
import org.omg.CORBA.portable.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.sqlParameterValue;
import org.springframework.jdbc.core.namedparam.MapsqlParameterSource;
import org.springframework.stereotype.Component;
/**
* Responsible for preparing the sql and their values
*
* @author atp1axi
* @version 1.0
*
*/
@Component("sqlPreparator")
public class sqlPreparator implements Preparable {
private static Logger LOGGER = Logger.getLogger(sqlPreparator.class);
@Autowired
@Qualifier("propertyAccessor")
private transient PropertyAccessor propertyAccessor;
@Autowired
@Qualifier("dataLoadConfig")
private transient DataLoadConfig dataLoadConfig;
@Override
public String preparesql(final ClassConfig config,final Mode mode) {
String sql = null;
if (Mode.INSERT.equals(mode)) {
sql = prepareInsertsql(config);
} else if (Mode.UPDATE.equals(mode)) {
sql = prepareUpdatesql(config);
}
return sql;
}
/**
* Prepare the insert query. The values will be substituted with the
* property name prepended with colon on it.
*
* @param config
* @return
* @throws ApplicationException
*/
private String prepareInsertsql(final ClassConfig config) {
final StringBuilder sqlBuilder = new StringBuilder(512);
sqlBuilder.append(" INSERT INTO ")
.append(config.getTableName()).append(" ( ");
final StringBuilder keyBuilder = new StringBuilder(512);
final StringBuilder valueBuilder = new StringBuilder(512);
valueBuilder.append(" VALUES ( ");
for (final PropertyConfig pConfig : config.getPropertyConfigs()) {
keyBuilder.append(" ").append(pConfig.getColumnName()).append(",");
valueBuilder.append(":").append(pConfig.getName()).append(",");
}
keyBuilder.replace(keyBuilder.length() - 1,keyBuilder.length()," ) ");
valueBuilder.replace(valueBuilder.length() - 1,valueBuilder.length(),
" ) ");
sqlBuilder.append(keyBuilder).append(valueBuilder);
LOGGER.info("Query builder : " + sqlBuilder.toString());
return sqlBuilder.toString();
}
/**
* Prepare the update query. The values will be substituted with the
* property name prepended with colon on it.
*
* @param config
* @return
* @throws ApplicationException
*/
private String prepareUpdatesql(final ClassConfig config) {
final StringBuilder sqlBuilder = new StringBuilder(512);
sqlBuilder.append("UPDATE ").append(config.getSchemaName())
.append(config.getTableName()).append(" SET ");
final StringBuilder keyValueBuilder = new StringBuilder(512);
final StringBuilder whereClsBuilder = new StringBuilder(512);
whereClsBuilder.append(" WHERE ");
for (final PropertyConfig pConfig : config.getPropertyConfigs()) {
if ("true".equalsIgnoreCase(pConfig.getIncludeClause())) {
whereClsBuilder.append(" ").append(pConfig.getColumnName())
.append(" = ").append(":").append(pConfig.getName())
.append(" AND ");
} else if (!"CREATE_SYSTEM".equals(pConfig.getName())) {
keyValueBuilder.append(" ").append(pConfig.getColumnName())
.append(" = ").append(":").append(pConfig.getName())
.append(",");
}
}
// remove the comma
keyValueBuilder.delete(keyValueBuilder.length() - 1,
keyValueBuilder.length());
whereClsBuilder.delete(whereClsBuilder.length() - 4,
whereClsBuilder.length());
sqlBuilder.append(keyValueBuilder).append(whereClsBuilder);
return sqlBuilder.toString();
}
@Overridepublic MapsqlParameterSource preparesqlParameter(Mode mode,ClassConfig config,Object object) {final MapsqlParameterSource parameterSource = new MapsqlParameterSource();for (final PropertyConfig pConfig : config.getPropertyConfigs()) {if(Mode.INSERT.equals(mode) && ("CREATE_SYSTEM".equals(pConfig.getName()) ||"UPDATE_ID".equals(pConfig.getName()))) {final sqlParameterValue parameterValue = new sqlParameterValue(dataLoadConfig.getJdbcType(pConfig.getsqlType()),Util.getUserId());parameterSource.addValue(pConfig.getName(),parameterValue);continue;} else if (Mode.UPDATE.equals(mode)) {//Do not set the create audit column when trying to update.//Concentrate only to set the update audit column on update modeif("CREATE_SYSTEM".equals(pConfig.getName())) {continue;} else if("UPDATE_SYSTEM".equals(pConfig.getName())) {final sqlParameterValue parameterValue = new sqlParameterValue(dataLoadConfig.getJdbcType(pConfig.getsqlType()),"ATPSTYZ");parameterSource.addValue(pConfig.getName(),parameterValue);continue;}}Object obj = propertyAccessor.getObject(object,pConfig.getName());/*if (obj != null&& DatePart.class.getName().equals(pConfig.getJavaType())) {obj = ((DatePart) obj).convertTosqlDate();}*/final sqlParameterValue parameterValue = new sqlParameterValue(dataLoadConfig.getJdbcType(pConfig.getsqlType()),obj);parameterSource.addValue(pConfig.getName(),parameterValue);}return parameterSource;}}
原文链接:https://www.f2er.com/xml/296996.html