Search in sources :

Example 16 with InvalidForeignKeyException

use of org.jaffa.datatypes.exceptions.InvalidForeignKeyException in project jaffa-framework by jaffa-projects.

the class AuditTransactionField method findAuditTransactionObjectObject.

/**
 * Finds the related foreign AuditTransactionObject object.
 * If checkExistenceOnly is false, then the foreign object will be fetched and assigned to the corresponding member variable of this class.
 * If checkExistenceOnly is true, then a mere existence check is performed for the foreign object, as oppposed to fetching all the values for that object.
 */
private void findAuditTransactionObjectObject(boolean checkExistenceOnly) throws ValidationException, FrameworkException {
    UOW uow = getUOW();
    boolean localUow = false;
    try {
        if (m_auditTransactionObjectObject == null && getObjectId() != null) {
            Criteria criteria = new Criteria();
            criteria.setTable(AuditTransactionObjectMeta.getName());
            criteria.addCriteria(AuditTransactionObjectMeta.OBJECT_ID, getObjectId());
            if (checkExistenceOnly)
                criteria.addFunction(Criteria.FUNCTION_COUNT, null, Criteria.ID_FUNCTION_COUNT);
            Number count = null;
            if (uow == null || !uow.isActive()) {
                uow = new UOW();
                localUow = true;
            }
            Iterator itr = uow.query(criteria).iterator();
            if (itr.hasNext()) {
                if (checkExistenceOnly)
                    count = (Number) ((Map) itr.next()).get(Criteria.ID_FUNCTION_COUNT);
                else
                    m_auditTransactionObjectObject = (AuditTransactionObject) itr.next();
            }
            if (m_auditTransactionObjectObject == null && (count == null || count.intValue() <= 0))
                throw new InvalidForeignKeyException(AuditTransactionFieldMeta.META_OBJECT_ID.getLabelToken(), new Object[] { AuditTransactionObjectMeta.getLabelToken(), AuditTransactionObjectMeta.META_OBJECT_ID.getLabelToken() });
        }
    } finally {
        if (localUow && uow != null)
            uow.rollback();
    }
}
Also used : InvalidForeignKeyException(org.jaffa.datatypes.exceptions.InvalidForeignKeyException) AuditTransactionObject(org.jaffa.components.audit.domain.AuditTransactionObject) AuditTransactionObject(org.jaffa.components.audit.domain.AuditTransactionObject)

Example 17 with InvalidForeignKeyException

use of org.jaffa.datatypes.exceptions.InvalidForeignKeyException in project jaffa-framework by jaffa-projects.

the class BeanMoulder method moldFromDomain.

/**
 * Mould data from domain object and its related objects into a new JavaBean based
 * domain object graph, based on the defined mapping rules.
 * @param source Source object to mould data from, typically extends Persistent
 * @param target Target object to mould data to, typically extends DomainDAO
 * @param graph The mapping class with the rules of how to map this source object
 * @param filter Filter object that it is used to control what fields are populated or the target objects
 * @param objectPath  The path of this object being processed. This identifies possible parent
 * and/or indexed entries where this object is contained.
 * @param includeKeys true if key fields should be included in results regardless of the filters
 * @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 moldFromDomain(Object source, Object target, GraphMapping graph, MappingFilter filter, String objectPath, boolean includeKeys) throws ApplicationExceptions, FrameworkException {
    if (graph == null)
        graph = MappingFactory.getInstance(target);
    // throw new InstantiationException("A GraphMapping must be supplied");
    if (filter == null)
        filter = new MappingFilter(graph);
    try {
        // get list of target fileds to populate
        String[] tFields = graph.getDataFieldNames();
        if (tFields != null && tFields.length != 0)
            for (int i = 0; i < tFields.length; i++) {
                // Try to map a source to a target
                String tName = tFields[i];
                String fullName = tName;
                if (objectPath != null)
                    fullName = objectPath + "." + fullName;
                if (filter == null || filter.isFieldIncluded(fullName) || (includeKeys && graph.isKeyField(tName))) {
                    String sName = graph.getDomainFieldName(tName);
                    PropertyDescriptor tDesc = graph.getDataFieldDescriptor(tName);
                    PropertyDescriptor sDesc = graph.getDomainFieldDescriptor(tName);
                    // DAO descriptor with a setter, and a DO descriptor with a getter
                    if (sDesc == null)
                        log.error("No Getter for " + tName + " in path " + fullName);
                    // incase getter is not public, make it available
                    Method sm = sDesc.getReadMethod();
                    if (!sm.isAccessible())
                        sm.setAccessible(true);
                    // get the setter, and make is available if needed
                    Method tm = tDesc.getWriteMethod();
                    if (!tm.isAccessible())
                        tm.setAccessible(true);
                    // Set the value if the source and target are the same datatype
                    Class tClass = tDesc.getPropertyType();
                    Class sClass = sDesc.getPropertyType();
                    if (tClass.isAssignableFrom(sClass)) {
                        // Get the value being copied
                        Object sValue = sm.invoke(source, (Object[]) null);
                        if (sValue != null) {
                            tm.invoke(target, new Object[] { sValue });
                            log.debug("Set " + tName + " = " + sValue);
                        } else
                            log.debug(tName + " no set, NULL value");
                    // See if there is a datatype mapper for these classes
                    } else if (DataTypeMapper.instance().isMappable(sClass, tClass)) {
                        // Get the value being copied
                        Object sValue = sm.invoke(source, (Object[]) null);
                        if (sValue != null) {
                            sValue = DataTypeMapper.instance().map(sValue, tClass);
                            tm.invoke(target, new Object[] { sValue });
                            log.debug("Set " + tName + " = " + sValue);
                        } else
                            log.debug(tName + " no set, NULL value");
                    // See if target is a DAO, this could be a foreign object or one-to-one relationship...
                    } else if (DomainDAO.class.isAssignableFrom(tClass) && IPersistent.class.isAssignableFrom(sClass)) {
                        // Get the mapper for the related DAO, if it has keys, it must be a foriegn object
                        if (graph.isForeignField(tName)) {
                            // look at foreign key fields, and make sure they are not null
                            List foreignKeys = graph.getForeignKeys(tName);
                            List foreignKeyValues = new ArrayList();
                            boolean nullKey = false;
                            for (Iterator k = foreignKeys.iterator(); k.hasNext(); ) {
                                String doProp = (String) k.next();
                                Object value = null;
                                PropertyDescriptor doPd = graph.getRealDomainFieldDescriptor(doProp);
                                if (doPd != null && doPd.getReadMethod() != null) {
                                    Method m = doPd.getReadMethod();
                                    if (!m.isAccessible())
                                        m.setAccessible(true);
                                    value = m.invoke(source, new Object[] {});
                                    if (value == null)
                                        nullKey = true;
                                    foreignKeyValues.add(value);
                                } else {
                                    throw new MouldException(MouldException.INVALID_FK_MAPPING, objectPath, doProp, graph.getDomainClassShortName());
                                }
                            }
                            if (nullKey) {
                                log.debug("Did not create skeleton object '" + tClass.getName() + "': one or more foreign key values missing.");
                            } else {
                                // Create the foreign object
                                log.debug("Creating foreign object - " + tClass.getName());
                                Object newDAO = newDAO(tClass);
                                boolean createSkeleton = true;
                                // Only retrieve related domain object and introspect if need
                                if (filter.areSubFieldsIncluded(fullName)) {
                                    // read object and introspect all
                                    log.debug("Read foreign object '" + fullName + "' and mold");
                                    try {
                                        Object sValue = sm.invoke(source, (Object[]) null);
                                        if (sValue != null) {
                                            BeanMoulder.moldFromDomain(sValue, newDAO, null, filter, fullName, true);
                                            createSkeleton = false;
                                        }
                                    } catch (InvocationTargetException e) {
                                        // If the foreign object is not found, warn and create the skeleton
                                        if (e.getCause() != null && e.getCause() instanceof InvalidForeignKeyException)
                                            log.warn("All foreign keys present, but foreign object does not exist");
                                        else
                                            throw e;
                                    }
                                }
                                if (createSkeleton) {
                                    // just set foreign keys from current object
                                    log.debug("Set keys on skeleton foreign object only");
                                    GraphMapping graph2 = MappingFactory.getInstance(newDAO);
                                    Set keys = graph2.getKeyFields();
                                    if (keys == null || keys.size() != foreignKeyValues.size()) {
                                        throw new MouldException(MouldException.MISMATCH_FK_MAPPING, objectPath, target.getClass().getName(), newDAO.getClass().getName());
                                    }
                                    int k2 = 0;
                                    // Look through all the foreign keys on the skeleton object
                                    for (Iterator k = keys.iterator(); k.hasNext(); k2++) {
                                        String keyField = (String) k.next();
                                        Object keyValue = foreignKeyValues.get(k2);
                                        PropertyDescriptor pd = graph2.getDataFieldDescriptor(keyField);
                                        if (pd != null && pd.getWriteMethod() != null) {
                                            Method m = pd.getWriteMethod();
                                            if (!m.isAccessible())
                                                m.setAccessible(true);
                                            m.invoke(newDAO, new Object[] { keyValue });
                                        } else {
                                            throw new MouldException(MouldException.CANT_SET_KEY_FIELD, objectPath, keyField, newDAO.getClass().getName());
                                        }
                                    }
                                }
                                tm.invoke(target, new Object[] { newDAO });
                                log.debug("Set " + tName + " = " + newDAO);
                            }
                        } else {
                            // This is not a foreign object, must be a related object
                            if (filter.areSubFieldsIncluded(fullName)) {
                                // Create the related object
                                log.debug("Creating One-To-One object - " + tClass.getName());
                                Object newDAO = newDAO(tClass);
                                // read object and introspect all
                                log.debug("Read related object '" + fullName + "' and mold");
                                Object sValue = sm.invoke(source, (Object[]) null);
                                if (sValue != null) {
                                    BeanMoulder.moldFromDomain(sValue, newDAO, null, filter, fullName, true);
                                } else {
                                    log.debug("Related object '" + fullName + "' not found. Ignore it!");
                                }
                                tm.invoke(target, new Object[] { newDAO });
                                log.debug("Set " + tName + " = " + newDAO);
                            } else
                                log.debug("No subfields for object " + fullName + " included. Object not retrieved");
                        }
                    // END-related object
                    // See if Target may be an array of DAO's
                    } else if (tClass.isArray() && DomainDAO.class.isAssignableFrom(tClass.getComponentType()) && filter.areSubFieldsIncluded(fullName)) {
                        log.debug("Target is an array of DAO's");
                        log.debug("Read related objects '" + fullName + "' and mold");
                        Object sValue = sm.invoke(source, (Object[]) null);
                        if (sClass.isArray() && IPersistent.class.isAssignableFrom(sClass.getComponentType())) {
                            log.debug("Source is an array of Persistent Objects");
                            Object[] sArray = (Object[]) sValue;
                            if (sArray.length > 0) {
                                Object[] tArray = (Object[]) Array.newInstance(tClass.getComponentType(), sArray.length);
                                log.debug("Translate Array of Size " + sArray.length);
                                for (int j = 0; j < sArray.length; j++) {
                                    Object newDAO = newDAO(tClass.getComponentType());
                                    BeanMoulder.moldFromDomain(sArray[j], newDAO, null, filter, fullName, false);
                                    tArray[j] = newDAO;
                                    log.debug("Add to array [" + j + "] : " + newDAO);
                                }
                                tm.invoke(target, new Object[] { (Object) tArray });
                                log.debug("Set Array " + tName);
                            } else
                                log.debug("Source Array is empty! Do Nothing");
                        }
                    // source is DO array
                    // Error... No way to map property
                    } else {
                        String err = "Can't Mold Property " + fullName + " from " + sClass.getName() + " to " + tClass.getName();
                        log.error(err);
                        throw new RuntimeException(err);
                    }
                }
            // is included in filtered fields
            }
        // Clear changed fields on updated DAO
        if (target != null && target instanceof DomainDAO)
            ((DomainDAO) target).clearChanges();
    } catch (IllegalAccessException e) {
        MouldException me = new MouldException(MouldException.ACCESS_ERROR, objectPath, 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) {
                ApplicationExceptions aes = new ApplicationExceptions();
                aes.add((ApplicationException) e.getCause());
                throw aes;
            }
        }
        MouldException me = new MouldException(MouldException.INVOCATION_ERROR, objectPath, e);
        log.error(me.getLocalizedMessage(), me.getCause());
        throw me;
    } catch (InstantiationException e) {
        MouldException me = new MouldException(MouldException.INSTANTICATION_ERROR, objectPath, e.getMessage());
        log.error(me.getLocalizedMessage(), e);
        throw me;
    }
}
Also used : Set(java.util.Set) ArrayList(java.util.ArrayList) MappingFilter(org.jaffa.beans.moulding.mapping.MappingFilter) IPersistent(org.jaffa.persistence.IPersistent) Iterator(java.util.Iterator) DomainDAO(org.jaffa.beans.moulding.data.domain.DomainDAO) ArrayList(java.util.ArrayList) List(java.util.List) ApplicationExceptions(org.jaffa.exceptions.ApplicationExceptions) PropertyDescriptor(java.beans.PropertyDescriptor) FrameworkException(org.jaffa.exceptions.FrameworkException) InvalidForeignKeyException(org.jaffa.datatypes.exceptions.InvalidForeignKeyException) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) ApplicationException(org.jaffa.exceptions.ApplicationException) GraphMapping(org.jaffa.beans.moulding.mapping.GraphMapping)

Example 18 with InvalidForeignKeyException

use of org.jaffa.datatypes.exceptions.InvalidForeignKeyException in project jaffa-framework by jaffa-projects.

the class Asset method findConditionObject.

/**
 * Finds the related foreign Condition object.
 * If checkExistenceOnly is false, then the foreign object will be fetched and assigned to the corresponding member variable of this class.
 * If checkExistenceOnly is true, then a mere existence check is performed for the foreign object, as oppposed to fetching all the values for that object.
 */
private void findConditionObject(boolean checkExistenceOnly) throws ValidationException, FrameworkException {
    UOW uow = getUOW();
    boolean localUow = false;
    try {
        if (m_conditionObject == null && getCondition() != null) {
            Criteria criteria = new Criteria();
            criteria.setTable(ConditionMeta.getName());
            criteria.addCriteria(ConditionMeta.CONDITION, getCondition());
            if (checkExistenceOnly)
                criteria.addFunction(Criteria.FUNCTION_COUNT, null, Criteria.ID_FUNCTION_COUNT);
            Number count = null;
            if (uow == null || !uow.isActive()) {
                uow = new UOW();
                localUow = true;
            }
            Iterator itr = uow.query(criteria).iterator();
            if (itr.hasNext()) {
                if (checkExistenceOnly)
                    count = (Number) ((Map) itr.next()).get(Criteria.ID_FUNCTION_COUNT);
                else
                    m_conditionObject = (Condition) itr.next();
            }
            if (m_conditionObject == null && (count == null || count.intValue() <= 0))
                throw new InvalidForeignKeyException(AssetMeta.META_CONDITION.getLabelToken(), new Object[] { ConditionMeta.getLabelToken(), ConditionMeta.META_CONDITION.getLabelToken() });
        }
    } finally {
        if (localUow && uow != null)
            uow.rollback();
    }
}
Also used : Condition(org.jaffa.persistence.domainobjects.Condition) InvalidForeignKeyException(org.jaffa.datatypes.exceptions.InvalidForeignKeyException)

Example 19 with InvalidForeignKeyException

use of org.jaffa.datatypes.exceptions.InvalidForeignKeyException in project jaffa-framework by jaffa-projects.

the class Item method findPartObject.

/**
 * Finds the related foreign Part object.
 * If checkExistenceOnly is false, then the foreign object will be fetched and assigned to the corresponding member variable of this class.
 * If checkExistenceOnly is true, then a mere existence check is performed for the foreign object, as oppposed to fetching all the values for that object.
 */
private void findPartObject(boolean checkExistenceOnly) throws ValidationException, FrameworkException {
    UOW uow = getUOW();
    boolean localUow = false;
    try {
        if (m_partObject == null && getPart() != null) {
            Criteria criteria = new Criteria();
            criteria.setTable(PartMeta.getName());
            criteria.addCriteria(PartMeta.PART, getPart());
            if (checkExistenceOnly)
                criteria.addFunction(Criteria.FUNCTION_COUNT, null, Criteria.ID_FUNCTION_COUNT);
            Number count = null;
            if (uow == null || !uow.isActive()) {
                uow = new UOW();
                localUow = true;
            }
            Iterator itr = uow.query(criteria).iterator();
            if (itr.hasNext()) {
                if (checkExistenceOnly)
                    count = (Number) ((Map) itr.next()).get(Criteria.ID_FUNCTION_COUNT);
                else
                    m_partObject = (Part) itr.next();
            }
            if (m_partObject == null && (count == null || count.intValue() <= 0))
                throw new InvalidForeignKeyException(ItemMeta.META_PART.getLabelToken(), new Object[] { PartMeta.getLabelToken(), PartMeta.META_PART.getLabelToken() });
        }
    } finally {
        if (localUow && uow != null)
            uow.rollback();
    }
}
Also used : Part(org.jaffa.persistence.domainobjects.Part) InvalidForeignKeyException(org.jaffa.datatypes.exceptions.InvalidForeignKeyException)

Example 20 with InvalidForeignKeyException

use of org.jaffa.datatypes.exceptions.InvalidForeignKeyException in project jaffa-framework by jaffa-projects.

the class Part method findCategoryOfInstrumentObject.

/**
 * Finds the related foreign CategoryOfInstrument object.
 * If checkExistenceOnly is false, then the foreign object will be fetched and assigned to the corresponding member variable of this class.
 * If checkExistenceOnly is true, then a mere existence check is performed for the foreign object, as oppposed to fetching all the values for that object.
 */
private void findCategoryOfInstrumentObject(boolean checkExistenceOnly) throws ValidationException, FrameworkException {
    UOW uow = getUOW();
    boolean localUow = false;
    try {
        if (m_categoryOfInstrumentObject == null && getCategoryInstrument() != null) {
            Criteria criteria = new Criteria();
            criteria.setTable(CategoryOfInstrumentMeta.getName());
            criteria.addCriteria(CategoryOfInstrumentMeta.CATEGORY_INSTRUMENT, getCategoryInstrument());
            if (checkExistenceOnly)
                criteria.addFunction(Criteria.FUNCTION_COUNT, null, Criteria.ID_FUNCTION_COUNT);
            Number count = null;
            if (uow == null || !uow.isActive()) {
                uow = new UOW();
                localUow = true;
            }
            Iterator itr = uow.query(criteria).iterator();
            if (itr.hasNext()) {
                if (checkExistenceOnly)
                    count = (Number) ((Map) itr.next()).get(Criteria.ID_FUNCTION_COUNT);
                else
                    m_categoryOfInstrumentObject = (CategoryOfInstrument) itr.next();
            }
            if (m_categoryOfInstrumentObject == null && (count == null || count.intValue() <= 0))
                throw new InvalidForeignKeyException(PartMeta.META_CATEGORY_INSTRUMENT.getLabelToken(), new Object[] { CategoryOfInstrumentMeta.getLabelToken(), CategoryOfInstrumentMeta.META_CATEGORY_INSTRUMENT.getLabelToken() });
        }
    } finally {
        if (localUow && uow != null)
            uow.rollback();
    }
}
Also used : CategoryOfInstrument(org.jaffa.persistence.domainobjects.CategoryOfInstrument) InvalidForeignKeyException(org.jaffa.datatypes.exceptions.InvalidForeignKeyException)

Aggregations

InvalidForeignKeyException (org.jaffa.datatypes.exceptions.InvalidForeignKeyException)30 Part (org.jaffa.persistence.domainobjects.Part)6 Method (java.lang.reflect.Method)3 PrinterOutputType (org.jaffa.modules.printing.domain.PrinterOutputType)3 Transaction (org.jaffa.transaction.domain.Transaction)3 PropertyDescriptor (java.beans.PropertyDescriptor)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 ArrayList (java.util.ArrayList)2 Iterator (java.util.Iterator)2 List (java.util.List)2 Set (java.util.Set)2 ApplicationException (org.jaffa.exceptions.ApplicationException)2 FrameworkException (org.jaffa.exceptions.FrameworkException)2 FormGroup (org.jaffa.modules.printing.domain.FormGroup)2 Criteria (org.jaffa.persistence.Criteria)2 IPersistent (org.jaffa.persistence.IPersistent)2 Condition (org.jaffa.persistence.domainobjects.Condition)2 JaffaRulesFrameworkException (org.jaffa.rules.JaffaRulesFrameworkException)2 Extension1 (org.jaffa.rules.testmodels.Extension1)2 AccessibleObject (java.lang.reflect.AccessibleObject)1