org.eclipse.buckminster.p2.remote.client.RemoteRepositoryFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.p2.remote.client.RemoteRepositoryFactory.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2008, Cloudsmith Inc.
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the copyright holder
 * listed above, as the Initial Contributor under such license. The text of
 * such license is available at www.eclipse.org.
 ******************************************************************************/

package org.eclipse.buckminster.p2.remote.client;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.eclipse.buckminster.p2.remote.IRepositoryFacade;
import org.eclipse.buckminster.p2.remote.IRepositoryServer;
import org.eclipse.buckminster.runtime.BuckminsterException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException;
import org.eclipse.osgi.util.NLS;
import org.jabsorb.client.HTTPSession;

/**
 * @author Thomas Hallgren
 */
public abstract class RemoteRepositoryFactory {
    protected static final String PROP_CHANGE_NUMBER = "remote.changenumber";

    private static final Map<URI, IRepositoryServer> s_servers = new HashMap<URI, IRepositoryServer>();

    public static IRepositoryServer connect(URI location) throws ProvisionException {
        synchronized (s_servers) {
            IRepositoryServer server = s_servers.get(location);
            if (server != null)
                return server;

            HttpClient client = new HttpClient();
            HttpState httpState = new HttpState();
            client.setState(httpState);

            GetMethod method = null;
            String locationStr = location.toString();
            try {
                method = new GetMethod(locationStr);
                int status = client.executeMethod(method);
                if (status != HttpStatus.SC_OK)
                    throw new IOException("Setup did not succeed");

                HTTPSession session = (HTTPSession) Activator.getRegistry().createSession(location.toString());
                session.setState(httpState);
                Client jsonClient = Client.create(session);
                server = (IRepositoryServer) jsonClient.openProxy(IRepositoryServer.SERVICE_NAME,
                        IRepositoryServer.class);
                s_servers.put(location, server);
                return server;
            } catch (Exception e) {
                throw new ProvisionException(BuckminsterException.createStatus(e));
            } finally {
                if (method != null)
                    method.releaseConnection();
            }
        }
    }

    protected static String getRepositoryName(URI repoURI) {
        return repoURI.getFragment();
    }

    protected static URI getServerURI(URI repoURI) {
        try {
            return new URI(repoURI.getScheme(), repoURI.getAuthority(), repoURI.getPath(), repoURI.getQuery(),
                    null);
        } catch (URISyntaxException e) {
            return repoURI;
        }
    }

    protected File getCacheLocation(URI location) {
        File cacheArea = new File(org.eclipse.buckminster.p2.remote.Activator.getAgentLocation(), "cache");
        cacheArea.mkdir();
        UUID uuid;
        try {
            uuid = UUID.nameUUIDFromBytes(location.toASCIIString().getBytes("US-ASCII"));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return new File(cacheArea, uuid.toString());
    }

    protected abstract IRepositoryFacade getFacadeFromServer(IRepositoryServer server, String repoName)
            throws ProvisionException;

    protected IRepositoryFacade getRepositoryFacade(URI repoURI, IProgressMonitor monitor)
            throws ProvisionException {
        try {
            String repoName = getRepositoryName(repoURI);
            if (repoName == null)
                throw new FileNotFoundException(repoURI.toString());

            IRepositoryServer repoServer = connect(getServerURI(repoURI));
            return getFacadeFromServer(repoServer, repoName);
        } catch (ProvisionException e) {
            throw e;
        } catch (FileNotFoundException e) {
            String msg = NLS.bind(Messages.io_failedRead, repoURI);
            throw new ProvisionException(
                    new Status(IStatus.ERROR, Activator.ID, ProvisionException.REPOSITORY_NOT_FOUND, msg, e));
        }
    }
}