package scrum.client;
import ilarkesto.core.scope.Scope;
import ilarkesto.gwt.client.ADataTransferObject;
import ilarkesto.gwt.client.AGwtEntity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import scrum.client.admin.SystemConfig;
import scrum.client.calendar.SimpleEvent;
import scrum.client.collaboration.Chat;
import scrum.client.collaboration.ChatMessage;
import scrum.client.collaboration.Subject;
import scrum.client.collaboration.Wikipage;
import scrum.client.common.AScrumGwtEntity;
import scrum.client.core.ChangePropertiesServiceCall;
import scrum.client.core.CreateEntityServiceCall;
import scrum.client.core.DeleteEntityServiceCall;
import scrum.client.core.RequestEntityByReferenceServiceCall;
import scrum.client.files.File;
import scrum.client.files.FileUploadedEvent;
import scrum.client.impediments.Impediment;
import scrum.client.issues.Issue;
import scrum.client.journal.ChangeHistoryManager;
import scrum.client.pr.BlogEntry;
import scrum.client.project.Quality;
import scrum.client.project.Requirement;
import scrum.client.release.Release;
import scrum.client.risks.Risk;
import scrum.client.sprint.Sprint;
import scrum.client.sprint.Task;
import scrum.client.workspace.VisibleDataChangedEvent;
import com.google.gwt.user.client.Timer;
public class Dao extends GDao {
private static final Dao INSTANCE = new Dao();
private EntityChangeCache cache = new EntityChangeCache();
private ScrumGwtApplication app;
private Dao() {}
public void setApp(ScrumGwtApplication app) {
this.app = app;
}
public void clearProjectEntities() {
clearChatMessages();
clearImpediments();
clearQualitys();
clearRequirements();
clearRisks();
clearSprints();
clearTasks();
clearComments();
clearWikipages();
clearIssues();
clearSimpleEvents();
clearProjectUserConfigs();
clearProjectEvents();
}
public SystemConfig getSystemConfig() {
List<SystemConfig> configs = getSystemConfigs();
return configs.size() > 0 ? configs.get(0) : null;
}
public void requestEntityByReference(String reference) {
new RequestEntityByReferenceServiceCall(reference).execute();
}
public AScrumGwtEntity getEntityByReference(String reference) {
if (reference.length() > 4 && reference.startsWith("[[")) {
String pageName = reference.substring(2, reference.length() - 2);
for (Wikipage e : getWikipages()) {
if (e.isName(pageName)) return e;
}
return null;
}
int number = Integer.parseInt(reference.substring(Requirement.REFERENCE_PREFIX.length()));
if (reference.startsWith(Requirement.REFERENCE_PREFIX)) {
for (Requirement e : getRequirements()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Task.REFERENCE_PREFIX)) {
for (Task e : getTasks()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Quality.REFERENCE_PREFIX)) {
for (Quality e : getQualitys()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Issue.REFERENCE_PREFIX)) {
for (Issue e : getIssues()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Sprint.REFERENCE_PREFIX)) {
for (Sprint e : getSprints()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Risk.REFERENCE_PREFIX)) {
for (Risk e : getRisks()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Impediment.REFERENCE_PREFIX)) {
for (Impediment e : getImpediments()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(File.REFERENCE_PREFIX)) {
for (File e : getFiles()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Subject.REFERENCE_PREFIX)) {
for (Subject e : getSubjects()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(SimpleEvent.REFERENCE_PREFIX)) {
for (SimpleEvent e : getSimpleEvents()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(Release.REFERENCE_PREFIX)) {
for (Release e : getReleases()) {
if (e.isNumber(number)) return e;
}
return null;
} else if (reference.startsWith(BlogEntry.REFERENCE_PREFIX)) {
for (BlogEntry e : getBlogEntrys()) {
if (e.isNumber(number)) return e;
}
return null;
} else {
throw new RuntimeException("Unsupported entity reference: " + reference);
}
}
@Override
public void handleDataFromServer(ADataTransferObject data) {
super.handleDataFromServer(data);
if (data.containsEntities() || data.containsDeletedEntities()) {
new VisibleDataChangedEvent().fireInCurrentScope();
}
}
// --- remote events (incoming from server) ---
@Override
protected void onEntityModifiedRemotely(AGwtEntity entity) {
if (entity instanceof ChatMessage) {
Scope.get().getComponent(Chat.class).addChatMessage((ChatMessage) entity);
}
if (entity instanceof File) {
new FileUploadedEvent((File) entity).fireInCurrentScope();
}
}
@Override
protected void onEntityDeletedRemotely(AGwtEntity entity) {}
// --- local events ---
@Override
protected void onEntityCreatedLocaly(AGwtEntity entity, Runnable successAction) {
new CreateEntityServiceCall(entity.getEntityType(), entity.createPropertiesMap()).execute(successAction);
}
@Override
protected void onEntityDeletedLocaly(AGwtEntity entity) {
new DeleteEntityServiceCall(entity.getId()).execute();
}
@Override
protected void onEntityPropertyChangedLocaly(AGwtEntity entity, String property, Object value) {
cache.put(entity.getId(), property, value);
}
// --- ---
public static Dao get() {
return INSTANCE;
}
private class EntityChangeCache extends Timer {
private Map<String, Map> entityProperties = new HashMap<String, Map>(3);
public void put(String entityId, String property, Object value) {
Map entity = entityProperties.get(entityId);
if (entity == null) {
entity = new HashMap();
entityProperties.put(entityId, entity);
}
entity.put(property, value);
schedule(1000);
}
private void flush() {
if (!entityProperties.isEmpty()) {
ChangeHistoryManager changeHistoryManager = Scope.get().getComponent(ChangeHistoryManager.class);
if (changeHistoryManager != null) changeHistoryManager.deactivateChangeHistory();
}
for (Map.Entry<String, Map> entry : entityProperties.entrySet()) {
new ChangePropertiesServiceCall(entry.getKey(), entry.getValue()).execute();
}
entityProperties = new HashMap<String, Map>(3);
}
@Override
public void run() {
flush();
}
}
}