package ilarkesto.gwt.client; import ilarkesto.core.logging.Log; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; public abstract class AGwtDao extends AComponent { private String entityIdBase; private int entityIdCounter; protected abstract Collection<Map<String, ? extends AGwtEntity>> getEntityMaps(); protected abstract void updateLocalEntity(String type, Map data); protected abstract void onEntityModifiedRemotely(AGwtEntity entity); protected abstract void onEntityDeletedRemotely(AGwtEntity entity); protected abstract void onEntityCreatedLocaly(AGwtEntity entity, Runnable successAction); protected abstract void onEntityDeletedLocaly(AGwtEntity entity); protected abstract void onEntityPropertyChangedLocaly(AGwtEntity entity, String property, Object value); public abstract Map<String, Integer> getEntityCounts(); public String getEntityIdBase() { return entityIdBase; } public int getEntityIdCounter() { return entityIdCounter; } String getNewEntityId() { if (entityIdBase == null) throw new RuntimeException("No entityIdBase received yet."); return entityIdBase + "-" + ++entityIdCounter; } public void handleDataFromServer(ADataTransferObject data) { if (data.entityIdBase != null) { entityIdBase = data.entityIdBase; log.debug("entityIdBase received:", data.entityIdBase); } if (data.containsEntities()) { for (Map entityData : data.getEntities()) { updateLocalEntity((String) entityData.get("@type"), entityData); } } if (data.containsDeletedEntities()) { List<String> deletedEntities = new ArrayList<String>(data.getDeletedEntities()); for (Map<String, ? extends AGwtEntity> map : getEntityMaps()) { for (String entityId : new ArrayList<String>(deletedEntities)) { AGwtEntity entity = map.remove(entityId); if (entity != null) { deletedEntities.remove(entityId); Log.DEBUG("deleted:", entity.getEntityType() + ":", entity); onEntityDeletedRemotely(entity); } } } } } protected final void entityCreated(AGwtEntity entity, Runnable successAction) { entity.setCreated(); onEntityCreatedLocaly(entity, successAction); } protected final void entityDeleted(AGwtEntity entity) { onEntityDeletedLocaly(entity); } public final void entityPropertyChanged(AGwtEntity entity, String property, Object value) { onEntityPropertyChangedLocaly(entity, property, value); } public final AGwtEntity getEntity(String id) { for (Map<String, ? extends AGwtEntity> entityMap : getEntityMaps()) { AGwtEntity entity = entityMap.get(id); if (entity != null) return entity; } throw new EntityDoesNotExistException(id); } }