| /******************************************************************************* |
| * Copyright (c) 2007, 2018 Borland Software Corporation and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * Borland Software Corporation - initial API and implementation |
| * Ed Willink - bug 533155 |
| * Christopher Gerking - bug 537041 |
| *******************************************************************************/ |
| package org.eclipse.m2m.internal.qvt.oml.emf.util.urimap;
|
|
|
| import java.io.IOException;
|
| import java.util.HashMap;
|
| import java.util.Map;
|
|
|
| import org.eclipse.core.resources.IFile;
|
| import org.eclipse.core.resources.IProject;
|
| import org.eclipse.core.resources.IResource;
|
| import org.eclipse.core.runtime.CoreException;
|
| import org.eclipse.core.runtime.IStatus;
|
| import org.eclipse.core.runtime.Status;
|
| import org.eclipse.emf.common.util.URI;
|
| import org.eclipse.emf.ecore.EObject;
|
| import org.eclipse.emf.ecore.EPackage;
|
| 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.ecore.util.EcoreUtil;
|
| import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtilPlugin;
|
| import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.IMetamodelProvider;
|
| import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.MetamodelRegistry;
|
| import org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry.ProjectMetamodelProvider;
|
|
|
| public class MetamodelURIMappingHelper {
|
|
|
| private static final String MAPPING_CONTAINER = ".settings"; //$NON-NLS-1$
|
|
|
| private static final String MMODEL_URI_MAPPING_FILENAME = "org.eclipse.m2m.qvt.oml.mmodel.urimap"; //$NON-NLS-1$
|
|
|
|
|
| private MetamodelURIMappingHelper() {
|
| super();
|
| }
|
|
|
| public static IFile getMappingFileHandle(IProject project) {
|
| return project.getFolder(MAPPING_CONTAINER).getFile(MMODEL_URI_MAPPING_FILENAME);
|
| }
|
|
|
| /**
|
| * Persists the given metamodel URI mappings for the given project.
|
| *
|
| * @param project the project to which to associate the mappings
|
| * @param mappings container of mappings to be persisted
|
| * @param merge indicate whether the passed mappings should be merged with
|
| * existing if any or overwrite them.
|
| *
|
| * @return the resulting status of the save mappings operation
|
| * @throws IllegalArgumentException if <code>project<code> or <code>mappings</code> is <code>null</code>
|
| */
|
| public static IStatus saveMappings(IProject project, MappingContainer mappings, boolean merge) {
|
| if(mappings == null || project == null) {
|
| throw new IllegalArgumentException();
|
| }
|
|
|
| try {
|
| Resource resource = null;
|
|
|
| if(hasMappingResource(project) && merge) {
|
| MappingContainer result = loadMappings(project);
|
| resource = result.eResource();
|
| // merge with existing mappings
|
| Map<String, URIMapping> currentMap = new HashMap<String, URIMapping>();
|
| for (URIMapping nextMapping : result.getMapping()) {
|
| if(nextMapping.getSourceURI() != null) {
|
| currentMap.put(nextMapping.getSourceURI(), nextMapping);
|
| }
|
| }
|
|
|
| for (URIMapping newMapping : mappings.getMapping()) {
|
| URIMapping oldMapping = currentMap.get(newMapping.getSourceURI());
|
| if(oldMapping != null) {
|
| oldMapping.setTargetURI(newMapping.getTargetURI());
|
| } else {
|
| result.getMapping().add((URIMapping)EcoreUtil.copy(newMapping));
|
| }
|
| }
|
|
|
| } else {
|
| resource = createMappingResource(project);
|
| resource.getContents().add(mappings);
|
| }
|
|
|
| resource.save(null);
|
|
|
| } catch (IOException e) {
|
| return new Status(IStatus.ERROR, EmfUtilPlugin.ID, "Failed to save metamodel URI mappings", e); //$NON-NLS-1$
|
| } finally {
|
| try {
|
| project.refreshLocal(IResource.DEPTH_INFINITE, null);
|
| } catch (CoreException e) {
|
| // well, not much we can do here
|
| }
|
| }
|
|
|
| return Status.OK_STATUS;
|
| }
|
|
|
| public static Resource createMappingResource(IProject project) {
|
| // ensure mapping package gets into registry before loading
|
| MModelURIMapPackage.eINSTANCE.getNsURI();
|
|
|
| IFile file = getMappingFileHandle(project);
|
| URI mapFileUri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
|
|
|
| ResourceSet rs = new ResourceSetImpl();
|
| Resource res = rs.getResource(mapFileUri, false);
|
| if(res == null) {
|
| res = rs.createResource(mapFileUri);
|
| }
|
|
|
| return res;
|
| }
|
|
|
| public static MappingContainer loadMappings(IProject project) throws IOException {
|
| Resource res = createMappingResource(project);
|
| res.load(null);
|
| return getMappings(res);
|
| }
|
|
|
| public static boolean hasMappingResource(IProject project) {
|
| return getMappingFileHandle(project).exists();
|
| }
|
|
|
| public static MappingContainer getMappings(Resource resource) {
|
| for (EObject root : resource.getContents()) {
|
| if(root instanceof MappingContainer) {
|
| return (MappingContainer) root;
|
| }
|
| }
|
|
|
| return null;
|
| }
|
|
|
| public static MappingContainer createNewMappings(Resource resource) {
|
| if(getMappings(resource) != null) {
|
| throw new IllegalArgumentException("Resource already has mappings"); //$NON-NLS-1$
|
| }
|
|
|
| MappingContainer container = MModelURIMapFactory.eINSTANCE.createMappingContainer();
|
| resource.getContents().add(container);
|
| return container;
|
| }
|
|
|
| public static EPackage.Registry mappingsToEPackageRegistry(final IProject project, ResourceSet resourceSet) {
|
| if (!hasMappingResource(project)) {
|
| return null;
|
| }
|
|
|
| IMetamodelProvider provider = new ProjectMetamodelProvider(project, MetamodelRegistry.getDefaultMetamodelProvider(),
|
| resourceSet);
|
|
|
| return provider.getPackageRegistry();
|
| }
|
|
|
| } |