catch up with development Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.jpa.services/src/org/eclipse/osbp/jpa/services/history/HistorizedReferenceQueryRedirector.java b/org.eclipse.osbp.jpa.services/src/org/eclipse/osbp/jpa/services/history/HistorizedReferenceQueryRedirector.java new file mode 100644 index 0000000..90cabc9 --- /dev/null +++ b/org.eclipse.osbp.jpa.services/src/org/eclipse/osbp/jpa/services/history/HistorizedReferenceQueryRedirector.java
@@ -0,0 +1,74 @@ +package org.eclipse.osbp.jpa.services.history; + +import org.eclipse.osbp.runtime.common.annotations.HistReference; +import org.eclipse.osbp.runtime.common.util.BeanUtils; +import org.eclipse.persistence.descriptors.ClassDescriptor; +import org.eclipse.persistence.expressions.Expression; +import org.eclipse.persistence.expressions.ExpressionBuilder; +import org.eclipse.persistence.internal.identitymaps.CacheId; +import org.eclipse.persistence.internal.sessions.AbstractRecord; +import org.eclipse.persistence.internal.sessions.AbstractSession; +import org.eclipse.persistence.internal.sessions.EmptyRecord; +import org.eclipse.persistence.mappings.DatabaseMapping; +import org.eclipse.persistence.queries.DatabaseQuery; +import org.eclipse.persistence.queries.QueryRedirector; +import org.eclipse.persistence.queries.ReadObjectQuery; +import org.eclipse.persistence.sessions.Record; +import org.eclipse.persistence.sessions.Session; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Manages references to historized and timedependent entities. + */ +@SuppressWarnings("serial") +public class HistorizedReferenceQueryRedirector implements QueryRedirector { + protected static Logger logger = LoggerFactory.getLogger(HistorizedReferenceQueryRedirector.class); + + @Override + public Object invokeQuery(DatabaseQuery query, Record arguments, Session session) { + if (query instanceof ReadObjectQuery) { + ReadObjectQuery readQuery = (ReadObjectQuery) query; + DatabaseMapping mapping = readQuery.getSourceMapping(); + if (mapping != null) { + ClassDescriptor descriptor = mapping.getDescriptor(); + String att = mapping.getAttributeName(); + Class<?> targetEntity = descriptor.getJavaClass(); + if (!BeanUtils.isAnnotationPresent(targetEntity, att, HistReference.class)) { + return getCurrentManaged(readQuery, (AbstractRecord) arguments, mapping.getReferenceDescriptor(), + (AbstractSession) session); + } + } + } + query.setDoNotRedirect(true); + return query.execute((AbstractSession) session, (AbstractRecord) arguments); + + } + + private Object getCurrentManaged(ReadObjectQuery readQuery, AbstractRecord arguments, + ClassDescriptor targetDescriptor, AbstractSession session) { + + HistorizedObjectWrapper wrapper = new HistorizedObjectWrapper(targetDescriptor, null); + Object objId = null; + CacheId id = (CacheId) readQuery.getSelectionId(); + if (id != null) { + Object[] pk = id.getPrimaryKey(); + objId = pk[0]; + } else { + ClassDescriptor sourceDescriptor = readQuery.getSourceMapping().getDescriptor(); + String refAttName = readQuery.getSourceMapping().getAttributeAccessor().getAttributeName(); + DatabaseMapping id_idMapping = sourceDescriptor.getMappingForAttributeName(refAttName); + objId = arguments.get(id_idMapping.getFields().get(0)); + } + + ReadObjectQuery rq = new ReadObjectQuery(targetDescriptor.getJavaClass()); + rq.conformResultsInUnitOfWork(); + + ExpressionBuilder eb = rq.getExpressionBuilder(); + Expression exp = eb.get(wrapper.getIdAttName()).get(wrapper.getId_IdAttName()).equal(objId) + .and(eb.get(wrapper.getCurrentHistAttName()).equal(true)); + rq.setSelectionCriteria(exp); + rq.setDoNotRedirect(true); + return rq.execute(session, EmptyRecord.getEmptyRecord()); + } +}