/****************************************************************************
* Copyright (c) 2008 Versant Corp. 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:
* Versant Corp. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.discovery.ui.model.provider;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.discovery.ui.model.ModelPlugin;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
public class DiscoveryEditingDomainProvider implements IEditingDomainProvider {
public static DiscoveryEditingDomainProvider eINSTANCE = new DiscoveryEditingDomainProvider();
/**
* This keeps track of the editing domain that is used to track all changes to the model.
*/
private AdapterFactoryEditingDomain editingDomain;
/**
* This is the one adapter factory used for providing views of the model.
*/
private ComposedAdapterFactory adapterFactory;
private BasicCommandStack commandStack;
public void load() {
// Create an adapter factory that yields item providers.
adapterFactory = new ComposedAdapterFactory();
adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ModelItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
// Create the command stack that will notify this editor as commands are executed.
commandStack = new BasicCommandStack();
// Create the editing domain with a special command stack.
editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap());
// Load the resource through the editing domain.
URI resourceURI = URI.createURI("service://");
try {
getEditingDomain().getResourceSet().getResource(resourceURI, true);
}
catch (Exception e) {
getEditingDomain().getResourceSet().getResource(resourceURI, false);
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
*/
public EditingDomain getEditingDomain() {
return editingDomain;
}
public void addCommandStackListener(CommandStackListener csl) {
// Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus.
commandStack.addCommandStackListener(csl);
}
public void removeCommandStackListener(CommandStackListener csl) {
commandStack.removeCommandStackListener(csl);
}
/**
* @return the adapterFactory
*/
public ComposedAdapterFactory getAdapterFactory() {
return adapterFactory;
}
/**
*
*/
public void save() {
for (Iterator itr = editingDomain.getResourceSet().getResources().iterator(); itr.hasNext();) {
Resource resource = (Resource) itr.next();
if (!resource.getContents().isEmpty() && !editingDomain.isReadOnly(resource)) {
try {
resource.save(Collections.EMPTY_MAP);
// resource.save(System.out, Collections.EMPTY_MAP);
} catch(UnsupportedOperationException e) {
ModelPlugin.getDefault().getLog().log(
new Status(IStatus.WARNING, ModelPlugin.PLUGIN_ID, "Saving " + resource.toString() + " isn't supported yet"));
} catch (IOException e) {
ModelPlugin.getDefault().getLog().log(
new Status(IStatus.ERROR, ModelPlugin.PLUGIN_ID, e.getMessage(), e));
}
}
}
}
}