blob: 604c086710890638c606fbc983c0e1ea0097580f [file] [log] [blame]
/*******************************************************************************
* 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:
* Otto von Wesendonk - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.util;
import java.io.IOException;
import java.text.MessageFormat;
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.internal.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.internal.client.model.Workspace;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.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 {
final ResourceSetImpl resourceSet = new ResourceSetImpl();
final Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName));
if (options != null) {
resource.load(options);
} else {
ModelUtil.loadResource(resource, WorkspaceUtil.getResourceLogger());
}
final EList<EObject> directContents = resource.getContents();
// sanity check
if (directContents.size() != 1 && !type.isInstance(directContents.get(0))) {
throw new IOException(
MessageFormat.format(
Messages.ResourceHelper_CorruptFile, type.getName()));
}
final T object = (T) directContents.get(index);
// make sure object has no resource
resource.getContents().remove(object);
return object;
}
/**
* 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 {
final ResourceSetImpl resourceSet = new ResourceSetImpl();
final Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName));
resource.getContents().add(element);
ModelUtil.saveResource(resource, WorkspaceUtil.getResourceLogger());
}
/**
* 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 {
final ResourceSetImpl resourceSet = new ResourceSetImpl();
final Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName));
resource.getContents().add(element);
if (resource instanceof XMIResource) {
final XMIResource xmiResource = (XMIResource) resource;
for (final EObject modelElement : project.getAllModelElements()) {
final String modelElementId = project.getModelElementId(modelElement).getId();
xmiResource.setID(modelElement, modelElementId);
}
}
ModelUtil.saveResource(resource, WorkspaceUtil.getResourceLogger());
}
/**
* 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 {
final ResourceSetImpl resourceSet = new ResourceSetImpl();
final Resource resource = resourceSet.createResource(URI.createFileURI(absoluteFileName));
resource.getContents().add(workSpace);
if (resource instanceof XMIResource) {
final XMIResource xmiResource = (XMIResource) resource;
for (final ProjectSpace projectSpace : workSpace.getProjectSpaces()) {
final Project project = projectSpace.getProject();
final TreeIterator<EObject> it = project.eAllContents();
while (it.hasNext()) {
final EObject modelElement = it.next();
final String modelElementId = project.getModelElementId(modelElement).getId();
xmiResource.setID(modelElement, modelElementId);
}
}
}
ModelUtil.saveResource(resource, WorkspaceUtil.getResourceLogger());
}
}