blob: 1e08725643ce8eb67b54565f4ecdfb68a1e70233 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.platform.uri;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.egf.common.helper.BundleHelper;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ContentHandler;
import org.eclipse.emf.ecore.resource.URIHandler;
import org.eclipse.emf.ecore.resource.impl.ArchiveURIHandlerImpl;
import org.eclipse.emf.ecore.resource.impl.EFSURIHandlerImpl;
import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl;
import org.eclipse.emf.ecore.resource.impl.FileURIHandlerImpl;
import org.eclipse.emf.ecore.resource.impl.PlatformResourceURIHandlerImpl;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.IPluginModelListener;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.PluginModelDelta;
/**
* @author Xavier Maysonnave
*
*/
public class TargetPlatformURIConverter extends ExtensibleURIConverterImpl implements IPluginModelListener {
/**
* The global default read only list of URI handlers.
*/
private static List<URIHandler> getDefaultHandlers() {
return Collections.unmodifiableList(Arrays.asList(new URIHandler[] { new PlatformResourceURIHandlerImpl(), new FileURIHandlerImpl(), new EFSURIHandlerImpl(), new ArchiveURIHandlerImpl(), new TargetPlatformURIHandlerImpl() }));
}
// Use a lock object, this will prevent us against
// a lock against the PlatformManager instance
private Object __lock = new Object();
public TargetPlatformURIConverter() {
super(getDefaultHandlers(), ContentHandler.Registry.INSTANCE.contentHandlers());
PDECore.getDefault().getModelManager().addPluginModelListener(this);
getURIMap().putAll(initializeURIMap());
}
public void modelsChanged(PluginModelDelta event) {
// Lock PlatformURIConverter
synchronized (__lock) {
loadURIMap();
}
}
@Override
public URI normalize(URI uri) {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.normalize(uri);
}
}
@Override
public OutputStream createOutputStream(URI uri, Map<?, ?> options) throws IOException {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.createOutputStream(uri, options);
}
}
@Override
public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.createInputStream(uri, options);
}
}
@Override
public void delete(URI uri, Map<?, ?> options) throws IOException {
// Lock PlatformURIConverter
synchronized (__lock) {
super.delete(uri, options);
}
}
@Override
public Map<String, ?> contentDescription(URI uri, Map<?, ?> options) throws IOException {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.contentDescription(uri, options);
}
}
@Override
public boolean exists(URI uri, Map<?, ?> options) {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.exists(uri, options);
}
}
@Override
public Map<String, ?> getAttributes(URI uri, Map<?, ?> options) {
// Lock PlatformURIConverter
synchronized (__lock) {
return super.getAttributes(uri, options);
}
}
@Override
public void setAttributes(URI uri, Map<String, ?> attributes, Map<?, ?> options) throws IOException {
// Lock PlatformURIConverter
synchronized (__lock) {
super.setAttributes(uri, attributes, options);
}
}
/**
* Returns the internal version of the URI map.
* This version do not delegate to the emf global registry
*
* @return the internal version of the URI map.
*/
// @Override
// protected URIMap getInternalURIMap() {
// if (uriMap == null) {
// URIMappingRegistryImpl mappingRegistryImpl = new URIMappingRegistryImpl();
// uriMap = (URIMap) mappingRegistryImpl.map();
// }
// return uriMap;
// }
/**
* Dispose.
*/
public void dispose() {
// Lock PlatformURIConverter
synchronized (__lock) {
PDECore.getDefault().getModelManager().removePluginModelListener(this);
getURIMap().clear();
}
}
private void loadURIMap() {
getURIMap().clear();
getURIMap().putAll(initializeURIMap());
}
private Map<URI, URI> initializeURIMap() {
Map<URI, URI> urimap = new HashMap<URI, URI>();
for (IPluginModelBase base : PluginRegistry.getActiveModels(true)) {
if (base == null) {
continue;
}
String bundleId = BundleHelper.getBundleId(base);
if (bundleId == null) {
continue;
}
if (base.getUnderlyingResource() == null) {
urimap.put(URI.createPlatformResourceURI(bundleId + "/", false), URI.createPlatformPluginURI(bundleId + "/", false)); //$NON-NLS-1$ //$NON-NLS-2$
// System.out.println(URI.createPlatformResourceURI(bundleId + "/", false) + " --> " + URI.createPlatformPluginURI(bundleId + "/", false));
} else {
urimap.put(URI.createPlatformPluginURI(bundleId + "/", false), URI.createPlatformResourceURI(bundleId + "/", false)); //$NON-NLS-1$ //$NON-NLS-2$
// System.out.println(URI.createPlatformPluginURI(bundleId + "/", false) + " --> " + URI.createPlatformResourceURI(bundleId + "/", false));
}
}
return urimap;
}
}