Mercurial > lada > lada-server
view src/main/java/de/intevation/lada/lock/TimestampLocker.java @ 594:b2af88e8eb15
Added concrete class to lock objects based on the tree_modified timestamp.
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Wed, 25 Mar 2015 16:18:34 +0100 |
parents | |
children | 0a4f01951fc7 |
line wrap: on
line source
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; } } }