package gov.nasa.jpl.mbee.mdk.mms.sync.local;
import com.nomagic.magicdraw.core.Project;
import com.nomagic.magicdraw.core.project.ProjectEventListenerAdapter;
import com.nomagic.magicdraw.uml.transaction.MDTransactionManager;
import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by igomes on 6/28/16.
*/
public class LocalSyncProjectEventListenerAdapter extends ProjectEventListenerAdapter {
private static final Map<Project, LocalSyncProjectMapping> projectMappings = new ConcurrentHashMap<>();
@Override
public void projectCreated(Project project) {
projectOpened(project);
}
// Cannot rely on this being called when MagicDraw programmatically reloads a project, which makes the old Project stale.
// Mitigating by moving all logic to mapping constructor, but this leaves gaps where events may not be captured.
@Override
public void projectOpened(Project project) {
closeLocalCommitListener(project);
getProjectMapping(project);
}
@Override
public void projectClosed(Project project) {
closeLocalCommitListener(project);
projectMappings.remove(project);
}
@Override
public void projectReplaced(Project oldProject, Project newProject) {
projectClosed(oldProject);
projectOpened(newProject);
}
@Override
public void projectSaved(Project project, boolean savedInServer) {
LocalSyncProjectMapping localSyncProjectMapping = getProjectMapping(project);
LocalSyncTransactionCommitListener listener = localSyncProjectMapping.getLocalSyncTransactionCommitListener();
if (listener == null) {
projectOpened(project);
listener = LocalSyncProjectEventListenerAdapter.getProjectMapping(project).getLocalSyncTransactionCommitListener();
}
listener.getInMemoryLocalChangelog().clear();
}
private static void closeLocalCommitListener(Project project) {
LocalSyncProjectMapping localSyncProjectMapping = projectMappings.get(project);
if (localSyncProjectMapping != null && localSyncProjectMapping.getLocalSyncTransactionCommitListener() != null) {
project.getRepository().getTransactionManager().removeTransactionCommitListener(localSyncProjectMapping.getLocalSyncTransactionCommitListener());
}
}
public static LocalSyncProjectMapping getProjectMapping(Project project) {
LocalSyncProjectMapping localSyncProjectMapping = projectMappings.get(project);
if (localSyncProjectMapping == null) {
projectMappings.put(project, localSyncProjectMapping = new LocalSyncProjectMapping(project));
if (project.isRemote()) {
((MDTransactionManager) project.getRepository().getTransactionManager()).addTransactionCommitListenerIncludingUndoAndRedo(localSyncProjectMapping.getLocalSyncTransactionCommitListener());
}
}
return localSyncProjectMapping;
}
public static class LocalSyncProjectMapping {
private LocalSyncTransactionCommitListener localSyncTransactionCommitListener;
public LocalSyncProjectMapping (Project project) {
localSyncTransactionCommitListener = new LocalSyncTransactionCommitListener(project);
}
public LocalSyncTransactionCommitListener getLocalSyncTransactionCommitListener() {
return localSyncTransactionCommitListener;
}
}
}