use of org.jaffa.beans.moulding.mapping.GraphMapping in project jaffa-framework by jaffa-projects.
the class BeanMoulder method deleteBean.
/**
* Take a source object and delete it or delete is children if it has any
* @param path The path of this object being processed. This identifies possible parent
* and/or indexed entries where this object is contained.
* @param source Source object to mould from, typically a DomainDAO
* @param uow Transaction handle all creates/update will be performed within.
* Throws an exception if null.
* @param handler Possible bean handler to be used when processing this source object graph
* @throws ApplicationExceptions Thrown if one or more application logic errors are generated during moulding
* @throws FrameworkException Thrown if any runtime moulding error has occured.
*/
public static void deleteBean(String path, DomainDAO source, UOW uow, MouldHandler handler) throws ApplicationExceptions, FrameworkException {
log.debug("Delete Bean " + path);
// Call custom validation code in the DAO
source.validate();
ApplicationExceptions aes = new ApplicationExceptions();
if (uow == null) {
String err = "UOW Required";
log.error(err);
throw new RuntimeException(err);
}
try {
IPersistent domainObject = null;
GraphMapping mapping = MappingFactory.getInstance(source);
Map keys = new LinkedHashMap();
Class doClass = mapping.getDomainClass();
// Get the key fields used in the domain object
boolean gotKeys = fillInKeys(path, source, mapping, keys);
// read DO based on key
if (gotKeys) {
// get the method on the DO to read via PK
Method[] ma = doClass.getMethods();
Method findByPK = null;
for (int i = 0; i < ma.length; i++) {
if (ma[i].getName().equals("findByPK")) {
if (ma[i].getParameterTypes().length == (keys.size() + 1) && (ma[i].getParameterTypes())[0] == UOW.class) {
// Found with name and correct no. of input params
findByPK = ma[i];
break;
}
}
}
if (findByPK == null) {
aes.add(new DomainObjectNotFoundException(doClass.getName()));
throw aes;
}
// Build input array
Object[] inputs = new Object[keys.size() + 1];
{
inputs[0] = uow;
int i = 1;
for (Iterator it = keys.values().iterator(); it.hasNext(); i++) {
inputs[i] = it.next();
}
}
// Find Object based on key
domainObject = (IPersistent) findByPK.invoke(null, inputs);
} else
log.debug("Object " + path + " has either missing or null key values - Assume Create is needed");
// Error if DO not found
if (domainObject == null) {
String label = doClass.getName();
// Try and use meta data to get domain objects label
try {
label = PersistentHelper.getLabelToken(doClass.getName());
} catch (Exception e) {
// ignore any problem trying to get the label!
}
aes.add(new DomainObjectNotFoundException(label + " (path=" + path + ")"));
throw aes;
}
// Process the delete, either on this DO, or a related DO if there is one
deleteBeanData(path, source, uow, handler, mapping, domainObject);
} catch (IllegalAccessException e) {
MouldException me = new MouldException(MouldException.ACCESS_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
if (e.getCause() instanceof FrameworkException)
throw (FrameworkException) e.getCause();
if (e.getCause() instanceof ApplicationExceptions)
throw (ApplicationExceptions) e.getCause();
if (e.getCause() instanceof ApplicationException) {
aes.add((ApplicationException) e.getCause());
throw aes;
}
}
MouldException me = new MouldException(MouldException.INVOCATION_ERROR, path, e);
log.error(me.getLocalizedMessage(), me.getCause());
throw me;
} catch (InstantiationException e) {
MouldException me = new MouldException(MouldException.INSTANTICATION_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
}
// } catch (Exception e) {
// throw handleException(e,aes);
// }
}
use of org.jaffa.beans.moulding.mapping.GraphMapping in project jaffa-framework by jaffa-projects.
the class BeanMoulder method deleteChildBean.
/**
* Take a source object and try and mold it back it its domain object.
* This is the same as updateParent, except from the way it retrieved the
* record, and the way it creates a new record.
*/
private static void deleteChildBean(String path, DomainDAO source, UOW uow, MouldHandler handler, IPersistent parentDomain, GraphMapping parentMapping, String parentField) throws ApplicationExceptions, FrameworkException {
log.debug("Delete Child Bean " + path);
// Call custom validation code in the DAO
source.validate();
ApplicationExceptions aes = new ApplicationExceptions();
if (uow == null) {
String err = "UOW Required";
log.error(err);
throw new RuntimeException(err);
}
String relationshipName = parentMapping.getDomainFieldName(parentField);
if (relationshipName.endsWith("Array"))
relationshipName = relationshipName.substring(0, relationshipName.length() - 5);
if (relationshipName.endsWith("Object"))
relationshipName = relationshipName.substring(0, relationshipName.length() - 6);
try {
IPersistent domainObject = null;
GraphMapping mapping = MappingFactory.getInstance(source);
Map keys = new LinkedHashMap();
Class doClass = mapping.getDomainClass();
boolean gotKeys = false;
if (mapping.getKeyFields() == null || mapping.getKeyFields().size() == 0) {
// No keys, must be one-to-one
log.debug("Find 'one-to-one' object - " + path);
// Just use the getXxxObject method to get the related domain object,
// if there is one...
domainObject = (IPersistent) getProperty(parentMapping.getDomainFieldDescriptor(parentField), parentDomain);
if (domainObject == null)
log.debug("Not Found - " + path);
} else {
// Get the key fields used in the domain object. Use the findXxxxxCriteria() method,
// then add the extra fields to the criteria object, to get the unique record.
gotKeys = fillInKeys(path, source, mapping, keys);
// read DO based on key
if (gotKeys) {
// get the method to get the PK criteria (i.e. public Criteria findVendorSiteCriteria(); )
Method findCriteria = null;
String methodName = "find" + StringHelper.getUpper1(relationshipName) + "Criteria";
try {
findCriteria = parentDomain.getClass().getMethod(methodName, new Class[] {});
} catch (NoSuchMethodException e) {
log.error("Find method '" + methodName + "' not found!");
}
if (findCriteria == null)
throw new MouldException(MouldException.METHOD_NOT_FOUND, path, methodName);
// Find Criteria For Related Object
Criteria criteria = (Criteria) findCriteria.invoke(parentDomain, new Object[] {});
// Add extra key info...
for (Iterator it = keys.keySet().iterator(); it.hasNext(); ) {
String keyField = (String) it.next();
Object value = keys.get(keyField);
keyField = StringHelper.getUpper1(mapping.getDomainFieldName(keyField));
criteria.addCriteria(keyField, value);
log.debug(path + "- Add to criteria:" + keyField + "=" + value);
}
// See if we get an object :-)
Iterator itr = uow.query(criteria).iterator();
if (itr.hasNext())
domainObject = (IPersistent) itr.next();
if (itr.hasNext()) {
// Error, multiple objects found
MultipleDomainObjectsFoundException m = new MultipleDomainObjectsFoundException(criteria.getTable() + " @ " + path);
aes.add(m);
throw aes;
}
}
}
// Error if DO not found
if (domainObject == null) {
aes.add(new DomainObjectNotFoundException(doClass.getName() + " @ " + path));
throw aes;
}
// Process the delete, either on this DO, or a related DO if there is one
deleteBeanData(path, source, uow, handler, mapping, domainObject);
} catch (IllegalAccessException e) {
MouldException me = new MouldException(MouldException.ACCESS_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
if (e.getCause() instanceof FrameworkException)
throw (FrameworkException) e.getCause();
if (e.getCause() instanceof ApplicationExceptions)
throw (ApplicationExceptions) e.getCause();
if (e.getCause() instanceof ApplicationException) {
aes.add((ApplicationException) e.getCause());
throw aes;
}
}
MouldException me = new MouldException(MouldException.INVOCATION_ERROR, path, e);
log.error(me.getLocalizedMessage(), me.getCause());
throw me;
} catch (InstantiationException e) {
MouldException me = new MouldException(MouldException.INSTANTICATION_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
}
}
use of org.jaffa.beans.moulding.mapping.GraphMapping in project jaffa-framework by jaffa-projects.
the class BeanMoulder method updateBean.
/**
* Take a source object and try and mold it back it its domain object
* @param path The path of this object being processed. This identifies possible parent
* and/or indexed entries where this object is contained.
* @param source Source object to mould from, typically a DomainDAO
* @param uow Transaction handle all creates/update will be performed within.
* Throws an exception if null.
* @param handler Possible bean handler to be used when processing this source object graph
* @throws ApplicationExceptions Thrown if one or more application logic errors are generated during moulding
* @throws FrameworkException Thrown if any runtime moulding error has occured.
*/
public static void updateBean(String path, DomainDAO source, UOW uow, MouldHandler handler) throws ApplicationExceptions, FrameworkException {
log.debug("Update Bean " + path);
// Call custom validation code in the DAO
source.validate();
ApplicationExceptions aes = new ApplicationExceptions();
if (uow == null) {
String err = "UOW Required";
log.error(err);
throw new RuntimeException(err);
}
try {
IPersistent domainObject = null;
GraphMapping mapping = MappingFactory.getInstance(source);
Map keys = new LinkedHashMap();
Class doClass = mapping.getDomainClass();
// Get the key fields used in the domain object
boolean gotKeys = fillInKeys(path, source, mapping, keys);
// read DO based on key
if (gotKeys) {
// get the method on the DO to read via PK
Method[] ma = doClass.getMethods();
Method findByPK = null;
for (int i = 0; i < ma.length; i++) {
if (ma[i].getName().equals("findByPK")) {
if (ma[i].getParameterTypes().length == (keys.size() + 1) && (ma[i].getParameterTypes())[0] == UOW.class) {
// Found with name and correct no. of input params
findByPK = ma[i];
break;
}
}
}
if (findByPK == null) {
aes.add(new DomainObjectNotFoundException(doClass.getName() + " @ " + path));
throw aes;
}
// Build input array
Object[] inputs = new Object[keys.size() + 1];
{
inputs[0] = uow;
int i = 1;
for (Iterator it = keys.values().iterator(); it.hasNext(); i++) {
inputs[i] = it.next();
}
}
// Find Object based on key
domainObject = (IPersistent) findByPK.invoke(null, inputs);
} else
log.debug("Object " + path + " has either missing or null key values - Assume Create is needed");
// Create object if not found
if (domainObject == null) {
// NEW OBJECT, create and reflect keys
log.debug("DO '" + mapping.getDomainClassShortName() + "' not found with key, create a new one...");
domainObject = (IPersistent) doClass.newInstance();
// set the key fields
for (Iterator it = keys.keySet().iterator(); it.hasNext(); ) {
String keyField = (String) it.next();
Object value = keys.get(keyField);
updateProperty(mapping.getDomainFieldDescriptor(keyField), value, domainObject);
}
} else {
log.debug("Found DO '" + mapping.getDomainClassShortName() + "' with key,");
}
// Now update all domain fields
updateBeanData(path, source, uow, handler, mapping, domainObject);
} catch (IllegalAccessException e) {
MouldException me = new MouldException(MouldException.ACCESS_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
if (e.getCause() instanceof FrameworkException)
throw (FrameworkException) e.getCause();
if (e.getCause() instanceof ApplicationExceptions)
throw (ApplicationExceptions) e.getCause();
if (e.getCause() instanceof ApplicationException) {
aes.add((ApplicationException) e.getCause());
throw aes;
}
}
MouldException me = new MouldException(MouldException.INVOCATION_ERROR, path, e);
log.error(me.getLocalizedMessage(), me.getCause());
throw me;
} catch (InstantiationException e) {
MouldException me = new MouldException(MouldException.INSTANTICATION_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
}
}
use of org.jaffa.beans.moulding.mapping.GraphMapping in project jaffa-framework by jaffa-projects.
the class BeanMoulder method updateBeanData.
private static void updateBeanData(String path, DomainDAO source, UOW uow, MouldHandler handler, GraphMapping mapping, IPersistent domainObject) throws InstantiationException, IllegalAccessException, InvocationTargetException, ApplicationExceptions, FrameworkException {
try {
// Fire 'startBean' handler
if (handler != null)
handler.startBean(path, source, domainObject);
// Reflect all normal fields
for (Iterator it = mapping.getFields().iterator(); it.hasNext(); ) {
String field = (String) it.next();
if (source.hasChanged(field)) {
Object value = getProperty(mapping.getDataFieldDescriptor(field), source);
// if(value!=null)
updateProperty(mapping.getDomainFieldDescriptor(field), value, domainObject);
}
}
// Reflect any foreign keys
for (Iterator it = mapping.getForeignFields().iterator(); it.hasNext(); ) {
String field = (String) it.next();
if (source.hasChanged(field)) {
Object value = getProperty(mapping.getDataFieldDescriptor(field), source);
if (value != null) {
// need to map foreign keys back
List targetKeys = mapping.getForeignKeys(field);
GraphMapping fMapping = MappingFactory.getInstance(mapping.getDataFieldDescriptor(field).getPropertyType());
Set sourceKeys = fMapping.getKeyFields();
int i = 0;
for (Iterator i2 = sourceKeys.iterator(); i2.hasNext(); i++) {
String sourceFld = (String) i2.next();
String targetFld = (String) targetKeys.get(i);
log.debug("Copy Foreign Key Field from " + sourceFld + " to " + targetFld);
Object value2 = getProperty(fMapping.getDataFieldDescriptor(sourceFld), value);
updateProperty(mapping.getRealDomainFieldDescriptor(targetFld), value2, domainObject);
}
}
}
}
// Store Record
if (domainObject.isDatabaseOccurence()) {
log.debug("UOW.Update Domain Object");
// Fire 'startBeanUpdate' handler
if (handler != null)
handler.startBeanUpdate(path, source, domainObject);
uow.update(domainObject);
// Fire 'endBeanUpdate' handler
if (handler != null)
handler.endBeanUpdate(path, source, domainObject);
} else {
log.debug("UOW.Add Domain Object");
// Fire 'startBeanAdd' handler
if (handler != null)
handler.startBeanAdd(path, source, domainObject);
uow.add(domainObject);
// Fire 'endBeanAdd' handler
if (handler != null)
handler.endBeanAdd(path, source, domainObject);
}
// Reflect any related objects
for (Iterator it = mapping.getRelatedFields().iterator(); it.hasNext(); ) {
String field = (String) it.next();
if (source.hasChanged(field)) {
// Only do the update if the source object was updated!
Object value = getProperty(mapping.getDataFieldDescriptor(field), source);
if (value != null) {
if (value.getClass().isArray()) {
// The related field is an array of objects (one-to-many)
Object[] values = (Object[]) value;
for (int i = 0; i < values.length; i++) {
// Assumes its a DAO....what else could it be?
DomainDAO dao = (DomainDAO) values[i];
if (dao != null) {
updateChildBean(path + "." + field + "[" + i + "]", dao, uow, handler, domainObject, mapping, field);
}
}
} else {
// Or a single Object (one-to-one)
// Assumes its a DAO....what else could it be?
DomainDAO dao = (DomainDAO) value;
updateChildBean(path + "." + field, dao, uow, handler, domainObject, mapping, field);
}
}
}
}
// Fire 'endBean' handler
if (handler != null)
handler.endBean(path, source, domainObject);
} catch (ApplicationException e) {
ApplicationExceptions aes = new ApplicationExceptions();
aes.add(e);
throw aes;
}
}
use of org.jaffa.beans.moulding.mapping.GraphMapping in project jaffa-framework by jaffa-projects.
the class BeanMoulder method updateChildBean.
/**
* Take a source object and try and mold it back it its domain object.
* This is the same as updateParent, except from the way it retrieved the
* record, and the way it creates a new record.
*/
private static void updateChildBean(String path, DomainDAO source, UOW uow, MouldHandler handler, IPersistent parentDomain, GraphMapping parentMapping, String parentField) throws ApplicationExceptions, FrameworkException {
log.debug("Update Child Bean " + path);
// Call custom validation code in the DAO
source.validate();
ApplicationExceptions aes = new ApplicationExceptions();
if (uow == null) {
String err = "UOW Required";
log.error(err);
throw new RuntimeException(err);
}
String relationshipName = parentMapping.getDomainFieldName(parentField);
if (relationshipName.endsWith("Array"))
relationshipName = relationshipName.substring(0, relationshipName.length() - 5);
if (relationshipName.endsWith("Object"))
relationshipName = relationshipName.substring(0, relationshipName.length() - 6);
try {
IPersistent domainObject = null;
GraphMapping mapping = MappingFactory.getInstance(source);
Map keys = new LinkedHashMap();
Class doClass = mapping.getDomainClass();
boolean gotKeys = false;
if (mapping.getKeyFields() == null || mapping.getKeyFields().size() == 0) {
// No keys, must be one-to-one
log.debug("Find 'one-to-one' object - " + path);
// Just use the getXxxObject method to get the related domain object,
// if there is one...
domainObject = (IPersistent) getProperty(parentMapping.getDomainFieldDescriptor(parentField), parentDomain);
if (domainObject == null)
log.debug("Not Found - " + path);
} else {
// Get the key fields used in the domain object. Use the findXxxxxCriteria() method,
// then add the extra fields to the criteria object, to get the unique record.
gotKeys = fillInKeys(path, source, mapping, keys);
// read DO based on key
if (gotKeys) {
// get the method to get the PK criteria (i.e. public Criteria findVendorSiteCriteria(); )
Method findCriteria = null;
String methodName = "find" + StringHelper.getUpper1(relationshipName) + "Criteria";
try {
findCriteria = parentDomain.getClass().getMethod(methodName, new Class[] {});
} catch (NoSuchMethodException e) {
log.error("Find method '" + methodName + "' not found!");
}
if (findCriteria == null) {
throw new MouldException(MouldException.METHOD_NOT_FOUND, path, methodName);
}
// Find Criteria For Related Object
Criteria criteria = (Criteria) findCriteria.invoke(parentDomain, new Object[] {});
// Add extra key info...
for (Iterator it = keys.keySet().iterator(); it.hasNext(); ) {
String keyField = (String) it.next();
Object value = keys.get(keyField);
keyField = StringHelper.getUpper1(mapping.getDomainFieldName(keyField));
criteria.addCriteria(keyField, value);
log.debug(path + "- Add to criteria:" + keyField + "=" + value);
}
// See if we get an object :-)
Iterator itr = uow.query(criteria).iterator();
if (itr.hasNext())
domainObject = (IPersistent) itr.next();
if (itr.hasNext()) {
// Error, multiple objects found
MultipleDomainObjectsFoundException m = new MultipleDomainObjectsFoundException(criteria.getTable() + " @ " + path);
aes.add(m);
throw aes;
}
} else {
log.debug("Object " + path + " has either missing or null key values - Assume Create is needed");
}
}
// Create object if not found
if (domainObject == null) {
// NEW OBJECT, create and reflect keys
log.debug("DO '" + mapping.getDomainClassShortName() + "' not found with key, create a new one...");
// find method on parent used to create object
Method newObject = null;
String methodName = "new" + StringHelper.getUpper1(relationshipName) + "Object";
try {
newObject = parentDomain.getClass().getMethod(methodName, new Class[] {});
} catch (NoSuchMethodException e) {
log.error("Method '" + methodName + "()' not found!");
}
if (newObject == null)
throw new MouldException(MouldException.METHOD_NOT_FOUND, path, methodName);
// Call method to create object
domainObject = (IPersistent) newObject.invoke(parentDomain, new Object[] {});
// Set the key fields
for (Iterator it = keys.keySet().iterator(); it.hasNext(); ) {
String keyField = (String) it.next();
Object value = keys.get(keyField);
updateProperty(mapping.getDomainFieldDescriptor(keyField), value, domainObject);
}
} else {
log.debug("Found DO '" + mapping.getDomainClassShortName() + "' with key,");
}
// Now update all domain fields
updateBeanData(path, source, uow, handler, mapping, domainObject);
} catch (IllegalAccessException e) {
MouldException me = new MouldException(MouldException.ACCESS_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
if (e.getCause() instanceof FrameworkException)
throw (FrameworkException) e.getCause();
if (e.getCause() instanceof ApplicationExceptions)
throw (ApplicationExceptions) e.getCause();
if (e.getCause() instanceof ApplicationException) {
aes.add((ApplicationException) e.getCause());
throw aes;
}
}
MouldException me = new MouldException(MouldException.INVOCATION_ERROR, path, e);
log.error(me.getLocalizedMessage(), me.getCause());
throw me;
} catch (InstantiationException e) {
MouldException me = new MouldException(MouldException.INSTANTICATION_ERROR, path, e.getMessage());
log.error(me.getLocalizedMessage(), e);
throw me;
}
}
Aggregations