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());
+ }
+}