/******************************************************************************* * Copyright (c) 2010 The Eclipse Foundation 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: * Yatta Solutions GmbH - initial API and implementation *******************************************************************************/ package org.eclipse.epp.mpc.tests.service; import java.io.FileNotFoundException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Collections; import java.util.Dictionary; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.epp.internal.mpc.core.MarketplaceClientCorePlugin; import org.eclipse.epp.internal.mpc.core.transport.httpclient.HttpClientTransport; import org.eclipse.epp.internal.mpc.core.transport.httpclient.HttpClientTransportFactory; import org.eclipse.epp.internal.mpc.core.util.FallbackTransportFactory; import org.eclipse.epp.internal.mpc.core.util.JavaPlatformTransportFactory; import org.eclipse.epp.mpc.core.service.ITransport; import org.eclipse.epp.mpc.core.service.ITransportFactory; import org.eclipse.epp.mpc.core.service.ServiceHelper; import org.eclipse.epp.mpc.core.service.ServiceUnavailableException; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; public class MappedTransportFactory implements ITransportFactory { private final Map<URI, URI> mapping = new HashMap<URI, URI>(); private ServiceRegistration<ITransportFactory> registration; private ITransportFactory delegate; public ITransport getTransport() { return new ITransport() { private final ITransport delegateTransport = delegate.getTransport(); public InputStream stream(URI location, IProgressMonitor monitor) throws FileNotFoundException, ServiceUnavailableException, CoreException { URI mapped = mapping.get(location); if (mapped == null) { if (location.getQuery() != null || location.getFragment() != null) { try { URI stripped = new URI(location.getScheme(), location.getHost(), location.getPath(), null); mapped = mapping.get(stripped); } catch (URISyntaxException e) { } } } if (mapped == null) { mapped = location; } else if (!mapped.getScheme().toLowerCase().startsWith("http")) { ITransport nonHttpTransport = getNonHttpTransport(delegate, delegateTransport); if (nonHttpTransport != null) { return nonHttpTransport.stream(mapped, monitor); } } return delegateTransport.stream(mapped, monitor); } private ITransport getNonHttpTransport(ITransportFactory delegate, ITransport delegateTransport) { ITransport nonHttpTransport = delegateTransport; if (delegate instanceof HttpClientTransportFactory) { FallbackTransportFactory fallbackFactory = new FallbackTransportFactory(); fallbackFactory.setPrimaryFactory(delegate); delegate = fallbackFactory; } if (delegate instanceof FallbackTransportFactory) { FallbackTransportFactory fallbackFactory = (FallbackTransportFactory) delegate; ITransportFactory primaryFactory = fallbackFactory.getPrimaryFactory(); if (primaryFactory instanceof HttpClientTransportFactory) { ITransportFactory secondaryFactory = fallbackFactory.getFallbackFactory(); if (secondaryFactory != null) { nonHttpTransport = secondaryFactory.getTransport(); } } } if (nonHttpTransport instanceof HttpClientTransport) { nonHttpTransport = new JavaPlatformTransportFactory().getTransport(); } return nonHttpTransport; } }; } public MappedTransportFactory map(URI url, URI mapped) { mapping.put(url, mapped); return this; } public MappedTransportFactory map(String url, String mapped) { try { mapping.put(new URI(url), new URI(mapped)); } catch (URISyntaxException e) { throw new IllegalArgumentException(e.getMessage()); } return this; } public Map<URI, URI> getMapping() { return mapping; } public ITransportFactory getDelegate() { return delegate; } public void setDelegate(ITransportFactory delegate) { this.delegate = delegate; } public void register() throws IllegalStateException { ITransportFactory transportFactory = ServiceHelper.getTransportFactory(); if (transportFactory != this) { unregister(); ITransportFactory delegate = transportFactory; if (delegate instanceof MappedTransportFactory) { delegate = ((MappedTransportFactory) delegate).getDelegate(); } this.delegate = delegate; Dictionary<String, Object> maxServiceRanking = new Hashtable<String, Object>(Collections .singletonMap(Constants.SERVICE_RANKING, Integer.MAX_VALUE)); registration = MarketplaceClientCorePlugin.getBundle().getBundleContext().registerService( ITransportFactory.class, this, maxServiceRanking); transportFactory = ServiceHelper.getTransportFactory(); if (transportFactory != this) { throw new IllegalStateException("Factory not selected after registration"); } } } public void unregister() { if (registration != null) { registration.unregister(); registration = null; } } public static synchronized MappedTransportFactory get() { ITransportFactory transportFactory = ServiceHelper.getTransportFactory(); if (transportFactory instanceof MappedTransportFactory) { return (MappedTransportFactory) transportFactory; } MappedTransportFactory factory = new MappedTransportFactory(); factory.register(); return factory; } }