/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.model;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.ui.PlatformUI;
import org.rf.ide.core.fileWatcher.RedFileWatcher;
public final class RobotModelManager {
private static class ModelSynchronizer implements IResourceChangeListener {
@Override
public void resourceChanged(final IResourceChangeEvent event) {
List<RobotElementChange> changes = null;
if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
changes = InstanceHolder.INSTANCE.getModel().removeProject((IProject) event.getResource());
notifyAboutChanges(changes);
} else if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
changes = InstanceHolder.INSTANCE.getModel().synchronizeChanges(event.getDelta());
notifyAboutChanges(changes);
} else if (event.getType() == IResourceChangeEvent.PRE_DELETE) {
RedFileWatcher.getInstance().closeWatchService();
}
}
private void notifyAboutChanges(final List<RobotElementChange> changes) {
final IEventBroker eventBroker = (IEventBroker) PlatformUI.getWorkbench().getService(IEventBroker.class);
for (final RobotElementChange change : changes) {
eventBroker.post(RobotModelEvents.EXTERNAL_MODEL_CHANGE, change);
}
}
}
private static class InstanceHolder {
private static final RobotModelManager INSTANCE = new RobotModelManager();
}
private RobotModel model = new RobotModel();
private final IResourceChangeListener resourceListener;
private RobotModelManager() {
if (PlatformUI.isWorkbenchRunning()) {
resourceListener = new ModelSynchronizer();
ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener);
} else {
resourceListener = null;
}
}
public static RobotModelManager getInstance() {
return InstanceHolder.INSTANCE;
}
public RobotProject createProject(final IProject project) {
return model.createRobotProject(project);
}
public RobotSuiteFile createSuiteFile(final IFile file) {
return model.createSuiteFile(file);
}
public RobotModel getModel() {
return model;
}
public void dispose() {
if (PlatformUI.isWorkbenchRunning()) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
}
model = new RobotModel();
}
}