/******************************************************************************* * Copyright (c) 2008-2011 Chair for Applied Software Engineering, * Technische Universitaet Muenchen. * 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: ******************************************************************************/ package org.eclipse.emf.emfstore.client.model.util; import java.io.IOException; import java.util.Map; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.XMIResource; import org.eclipse.emf.emfstore.client.model.ProjectSpace; import org.eclipse.emf.emfstore.client.model.Workspace; import org.eclipse.emf.emfstore.common.model.Project; import org.eclipse.emf.emfstore.common.model.util.ModelUtil; /** * Helper for resource operations. * * @author wesendon */ public final class ResourceHelper { private ResourceHelper() { // blub } /** * Gets an element from a resource. * * @param <T> type of element * @param absoluteFileName filepath of resource * @param type .class from type * @param options resource options * @param index index of element in resource * @return selected element * @throws IOException in case of failure */ @SuppressWarnings("unchecked") public static <T extends EObject> T getElementFromResource(String absoluteFileName, Class<T> type, Map<?, ?> options, int index) throws IOException { return getElementFromResource(URI.createFileURI(absoluteFileName), type, options, index); } /** * Gets an element from a resource. * * @param <T> type of element * @param uri URI of the resource * @param type .class from type * @param options resource options * @param index index of element in resource * @return selected element * @throws IOException in case of failure */ @SuppressWarnings("unchecked") public static <T extends EObject> T getElementFromResource(URI uri, Class<T> type, Map<?, ?> options, int index) throws IOException { ResourceSetImpl resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(uri); if (options != null) { resource.load(options); } else { resource.load(ModelUtil.getResourceLoadOptions()); } EList<EObject> directContents = resource.getContents(); // sanity check if (directContents.size() != 1 && (!type.isInstance(directContents.get(0)))) { throw new IOException("File is corrupt, does not contain a " + type.getName() + " ."); } T object = (T) directContents.get(index); resource.getContents().remove(object); return object; } /** * Gets an element from a resource. * * @param <T> type of element * @param uri uri of the resource * @param type .class from type * @param index index of element in resource * @return selected element * @throws IOException in case of failure */ public static <T extends EObject> T getElementFromResource(URI uri, Class<T> type, int index) throws IOException { return getElementFromResource(uri, type, null, index); } /** * Gets an element from a resource. * * @param <T> type of element * @param absoluteFileName filepath of resource * @param type .class from type * @param index index of element in resource * @return selected element * @throws IOException in case of failure */ public static <T extends EObject> T getElementFromResource(String absoluteFileName, Class<T> type, int index) throws IOException { return getElementFromResource(absoluteFileName, type, null, index); } /** * Puts an element into a new resource. * * @param <T> element type * @param element The element to be put * @param absoluteFileName filepath of resource * @throws IOException in case of failure */ public static <T extends EObject> void putElementIntoNewResource(String absoluteFileName, T element) throws IOException { ResourceSetImpl resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName)); resource.getContents().add(element); resource.save(null); } /** * Puts an element into a new resource. * * @param <T> element type * @param element The element to be put * @param absoluteFileName filepath of resource * @param project the associated project * @throws IOException in case of failure */ public static <T extends EObject> void putElementIntoNewResourceWithProject(String absoluteFileName, T element, Project project) throws IOException { ResourceSetImpl resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName)); resource.getContents().add(element); if (resource instanceof XMIResource) { XMIResource xmiResource = (XMIResource) resource; for (EObject modelElement : project.getAllModelElements()) { String modelElementId = project.getModelElementId(modelElement).getId(); xmiResource.setID(modelElement, modelElementId); } } resource.save(null); } /** * Puts an element into a new resource. * * @param <T> element type * @param workSpace the workspace to be put * @param absoluteFileName filepath of resource * @throws IOException in case of failure */ public static <T extends EObject> void putWorkspaceIntoNewResource(String absoluteFileName, Workspace workSpace) throws IOException { ResourceSetImpl resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName)); resource.getContents().add(workSpace); if (resource instanceof XMIResource) { XMIResource xmiResource = (XMIResource) resource; for (ProjectSpace projectSpace : workSpace.getProjectSpaces()) { Project project = projectSpace.getProject(); TreeIterator<EObject> it = project.eAllContents(); while (it.hasNext()) { EObject modelElement = it.next(); String modelElementId = project.getModelElementId(modelElement).getId(); xmiResource.setID(modelElement, modelElementId); } } } resource.save(null); } }