package ilarkesto.persistence; import ilarkesto.auth.AUserDao; import ilarkesto.base.OverrideExpectedException; import ilarkesto.search.Searchable; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * Base class for classes with persistent data. */ public abstract class ADatob implements Searchable { // --- dependencies --- protected static AUserDao userDao; public static void setUserDao(AUserDao userDao) { ADatob.userDao = userDao; } // --- --- protected abstract ADatobManager getManager(); public abstract void updateProperties(Map<?, ?> properties); protected final void fireModified(String comment) { ADatobManager manager = getManager(); if (manager == null) return; manager.onDatobModified(this, comment); } protected final void repairMissingMaster() { ADatobManager manager = getManager(); if (manager == null) return; manager.onMissingMaster(this); } public boolean matchesKey(String key) { return false; } protected void repairDeadReferences(String entityId) {} public void ensureIntegrity() {} @Override public String toString() { return getClass().getSimpleName(); } // --- properties as map --- public final Map createPropertiesMap() { Map properties = new HashMap(); storeProperties(properties); return properties; } protected void storeProperties(Map properties) {} // public final void updateProperties(Map<?, ?> properties) { // for (Map.Entry entry : properties.entrySet()) { // updateProperty((String) entry.getKey(), entry.getValue()); // } // } // // public final void updateProperty(String property, Object value) { // if ("id".equals(property)) return; // // Class type = Reflect.getPropertyType(this, property); // if (type == null && property.endsWith("Id")) { // property = Str.removeSuffix(property, "Id"); // type = Reflect.getPropertyType(this, property); // if (type == null || !AEntity.class.isAssignableFrom(type)) // throw new RuntimeException("Unsupported property: " + property); // value = ((AEntity) this).getDaoService().getById((String) value); // } // // if (value != null) { // if (Date.class.equals(type)) value = new Date((String) value); // } // Reflect.setProperty(this, property, value); // } // --- helper --- protected static void repairDeadReferencesOfValueObjects(Collection<? extends ADatob> valueObjects, String entityId) { for (ADatob vo : valueObjects) vo.repairDeadReferences(entityId); } protected final <S extends AStructure> Set<S> cloneValueObjects(Collection<S> strucktures, StructureManager<S> manager) { Set<S> ret = new HashSet<S>(); for (S s : strucktures) { ret.add((S) s.clone(manager)); } return ret; } protected static Set<String> getIdsAsSet(Collection<? extends AEntity> entities) { Set<String> result = new HashSet<String>(entities.size()); for (AEntity entity : entities) result.add(entity.getId()); return result; } protected static List<String> getIdsAsList(Collection<? extends AEntity> entities) { List<String> result = new ArrayList<String>(entities.size()); for (AEntity entity : entities) result.add(entity.getId()); return result; } protected static boolean matchesKey(Object object, String key) { if (object == null) return false; if (object instanceof Searchable) { return ((Searchable) object).matchesKey(key); } return object.toString().toLowerCase().indexOf(key) >= 0; } protected static boolean matchesKey(Collection objects, String key) { for (Iterator iter = objects.iterator(); iter.hasNext();) { if (matchesKey(iter.next(), key)) return true; } return false; } protected void repairDeadDatob(ADatob datob) { throw new OverrideExpectedException(); } public class StructureManager<D extends ADatob> extends ADatobManager<D> { @Override public void onDatobModified(D datob, String comment) { fireModified(comment); } @Override public void onMissingMaster(D datob) { repairDeadDatob(datob); } public void ensureIntegrityOfStructures(Collection<? extends AStructure> structures) { for (AStructure structure : structures) { structure.setManager(this); structure.ensureIntegrity(); } } } }