# HG changeset patch # User Raimund Renkert # Date 1427296714 -3600 # Node ID b2af88e8eb15fb1b19e399a9c2dd9712ae8c98ce # Parent ec13e741ec7127e9881a21d86c5da3850e65b50a Added concrete class to lock objects based on the tree_modified timestamp. diff -r ec13e741ec71 -r b2af88e8eb15 src/main/java/de/intevation/lada/lock/TimestampLocker.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/lock/TimestampLocker.java Wed Mar 25 16:18:34 2015 +0100 @@ -0,0 +1,94 @@ +package de.intevation.lada.lock; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.sql.Timestamp; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; + +import de.intevation.lada.model.land.LMessung; +import de.intevation.lada.model.land.LProbe; +import de.intevation.lada.util.annotation.RepositoryConfig; +import de.intevation.lada.util.data.Repository; +import de.intevation.lada.util.data.RepositoryType; +import de.intevation.lada.util.rest.Response; + +@LockConfig(type=LockType.TIMESTAMP) +public class TimestampLocker implements ObjectLocker { + + @Inject + private Logger logger; + + @Inject + @RepositoryConfig(type=RepositoryType.RO) + Repository repository; + + @Override + public boolean isLocked(Object o) { + if (o instanceof LProbe) { + LProbe newProbe = (LProbe)o; + LProbe oldProbe = (LProbe)repository.getById( + LProbe.class, + newProbe.getId(), + "land").getData(); + logger.debug("old: " + oldProbe.getTreeModified().getTime()); + logger.debug("new: " + newProbe.getTreeModified().getTime()); + if (oldProbe.getTreeModified().getTime() > + newProbe.getTreeModified().getTime()) { + return true; + } + } + else { + Method[] methods = o.getClass().getMethods(); + for (Method m: methods) { + if (m.getName().equals("getProbeId")) { + Integer id; + try { + id = (Integer) m.invoke(o); + } catch (IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + return true; + } + Response response = + repository.getById(LProbe.class, id, "land"); + LProbe probe = (LProbe)response.getData(); + return isNewer(o, probe.getTreeModified()); + } + if (m.getName().equals("getMessungsId")) { + Integer id; + try { + id = (Integer) m.invoke(o); + } catch (IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + return true; + } + Response mResponse = + repository.getById(LMessung.class, id, "land"); + LMessung messung = (LMessung)mResponse.getData(); + Response pResponse = + repository.getById(LProbe.class, messung.getProbeId(), "land"); + LProbe probe = (LProbe)pResponse.getData(); + boolean newerMessung = isNewer(o, messung.getTreeModified()); + boolean newerProbe = isNewer(o, probe.getTreeModified()); + return newerMessung || newerProbe; + } + } + } + return false; + } + + private boolean isNewer(Object o, Timestamp t) { + Method m; + try { + m = o.getClass().getMethod("getTreeModified"); + Timestamp ot = (Timestamp)m.invoke(o); + return t.getTime() > ot.getTime(); + } catch (NoSuchMethodException | SecurityException | + IllegalAccessException | IllegalArgumentException| + InvocationTargetException e) { + return true; + } + } +}