/*******************************************************************************
* Copyright (c) 2009 BestSolution.at and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.example.library.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EventObject;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.example.library.service.internal.SavePointEditingDomain;
import org.eclipse.emf.examples.extlibrary.EXTLibraryPackage;
public abstract class BaseLibraryPersistenceService implements
ILibraryPersistenceService {
private ISavePointEditingDomain editingDomain;
private ResourceSet resourceSet;
private boolean dirtyState = false;
private BasicCommandStack commandStack;
private Collection<Listener> listeners = new ArrayList<Listener>();
private class CommandStackListenerImpl implements CommandStackListener {
public void commandStackChanged(EventObject event) {
BasicCommandStack stack = (BasicCommandStack) event.getSource();
Command mostRecentCommand = stack.getMostRecentCommand();
if (mostRecentCommand != null) {
boolean newState = stack.isSaveNeeded();
if (newState != dirtyState) {
dirtyState = !dirtyState;
fireDirtyStateChanged();
}
}
}
}
public BaseLibraryPersistenceService() {
resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(EXTLibraryPackage.eNS_URI,
EXTLibraryPackage.eINSTANCE);
ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
// adapterFactory
// .addAdapterFactory(new ResourceItemProviderAdapterFactory());
// adapterFactory.addAdapterFactory(new
// SoccerItemProviderAdapterFactory());
// adapterFactory
// .addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
commandStack = new BasicCommandStack();
commandStack.addCommandStackListener(new CommandStackListenerImpl());
editingDomain = new SavePointEditingDomain(new AdapterFactoryEditingDomain(adapterFactory,
commandStack, resourceSet));
}
public ISavePointEditingDomain getEditingDomain() {
return editingDomain;
}
public IObservableList getLibraries() {
return EMFObservables.observeResourceContents(doGetResource());
}
private void fireDirtyStateChanged() {
for (Listener l : listeners) {
l.dirtyStateChanged(dirtyState);
}
}
public IStatus save() {
IStatus s = doSave();
if (s.isOK()) {
commandStack.saveIsDone();
dirtyState = false;
fireDirtyStateChanged();
}
return s;
}
protected final ResourceSet getResourceSet() {
return resourceSet;
}
public Resource getResource() {
return doGetResource();
}
protected abstract Resource doGetResource();
protected abstract IStatus doSave();
public void addListener(Listener listener) {
listeners.add(listener);
}
public void removeListener(Listener listener) {
listeners.remove(listener);
}
public boolean isDirty() {
return dirtyState;
}
}