/******************************************************************************* * 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.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import java.util.zip.GZIPInputStream; import org.eclipse.buckminster.p2.remote.IRepositoryDataStream; import org.eclipse.buckminster.p2.remote.IRepositoryFacade; import org.eclipse.buckminster.p2.remote.IRepositoryServer; import org.eclipse.buckminster.p2.remote.change.RepositoryChange; import org.eclipse.buckminster.p2.remote.change.SynchronizationBlock; import org.eclipse.buckminster.runtime.BuckminsterException; import org.eclipse.buckminster.runtime.IOUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository; import org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryIO; import org.eclipse.equinox.internal.p2.metadata.repository.URLMetadataRepository; import org.eclipse.equinox.internal.provisional.p2.core.ProvisionException; import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepository; import org.eclipse.equinox.internal.provisional.spi.p2.metadata.repository.IMetadataRepositoryFactory; import org.eclipse.osgi.util.NLS; /** * @author Thomas Hallgren */ public class RemoteMetadataRepositoryFactory extends RemoteRepositoryFactory implements IMetadataRepositoryFactory { @SuppressWarnings("unchecked") public IMetadataRepository create(URL location, String name, String type, Map properties) { // TODO Auto-generated method stub return null; } public IMetadataRepository load(URL locationURL, IProgressMonitor monitor) throws ProvisionException { URI location = IOUtils.uri(locationURL); File localRepoCache = getCacheLocation(location); URI localRepoLoc = localRepoCache.toURI(); File realLocation = LocalMetadataRepository.getActualLocation(IOUtils.url(localRepoLoc)); MetadataRepositoryIO repositoryIO = new MetadataRepositoryIO(); IMetadataRepository result; IRepositoryDataStream rds = null; IRepositoryFacade facade = getRepositoryFacade(location, monitor); InputStream input = null; try { try { input = new BufferedInputStream(new FileInputStream(realLocation)); result = repositoryIO.read(IOUtils.url(realLocation), input, monitor); } catch(FileNotFoundException e) { rds = facade.getRepositoryData(); input = new GZIPInputStream(new BufferedInputStream(new RemoteInputStream(rds))); result = repositoryIO.read(IOUtils.url(realLocation), input, monitor); } } catch(IOException e) { String msg = NLS.bind(Messages.io_failedRead, location); throw new ProvisionException(new Status(IStatus.ERROR, Activator.ID, ProvisionException.REPOSITORY_FAILED_READ, msg, e)); } finally { IOUtils.close(input); } if(result instanceof LocalMetadataRepository) ((LocalMetadataRepository)result).initializeAfterLoad(IOUtils.url(localRepoLoc)); else if(result instanceof URLMetadataRepository) ((URLMetadataRepository)result).initializeAfterLoad(IOUtils.url(localRepoLoc)); if(rds != null) result.setProperty(PROP_CHANGE_NUMBER, Long.toString(rds.getLastChangeNumber())); else { // We found a cache so let's refresh it. // Object cns = result.getProperties().get(PROP_CHANGE_NUMBER); long cn = cns == null ? 0L : Long.parseLong(cns.toString()); SynchronizationBlock sb = facade.getChanges(cn); for(RepositoryChange c : sb.getChanges()) c.apply(result); result.setProperty(PROP_CHANGE_NUMBER, Long.toString(sb.getLastChangeNumber())); } return result; } public IStatus validate(URL location, IProgressMonitor monitor) { try { getRepositoryFacade(location.toURI(), monitor); return Status.OK_STATUS; } catch(CoreException e) { return e.getStatus(); } catch(URISyntaxException e) { return BuckminsterException.createStatus(e); } } @Override protected IRepositoryFacade getFacadeFromServer(IRepositoryServer server, String repoName) throws ProvisionException { return server.getMetadataRepositoryFacade(repoName); } }