blob: 482ab68d773aca5d3e32ed768547e370148be62a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.internal.mirror;
import java.io.*;
import java.net.*;
import org.eclipse.core.runtime.*;
import org.eclipse.update.core.*;
import org.eclipse.update.core.model.*;
import org.eclipse.update.internal.core.*;
import org.eclipse.update.internal.model.*;
import org.eclipse.update.standalone.*;
import org.xml.sax.*;
public class MirrorSiteFactory extends BaseSiteFactory {
/*
* @see SiteModelFactory#createSiteMapModel()
*/
public SiteModel createSiteMapModel() {
return new MirrorSite(this);
}
/*
* @see ISiteFactory#createSite(URL)
*/
public ISite createSite(URL url)
throws CoreException, InvalidSiteTypeException {
return createSite(new File(url.getFile()));
}
/*
* @see ISiteFactory#createSite(URL)
*/
public ISite createSite(File siteLocation)
throws CoreException, InvalidSiteTypeException {
InputStream siteStream = null;
if (!siteLocation.exists()) {
if (!siteLocation.mkdirs()) {
throw Utilities.newCoreException(
"Directory " //$NON-NLS-1$
+ siteLocation.getAbsolutePath()
+ " could not be created.", //$NON-NLS-1$
null);
}
}
if (!siteLocation.isDirectory() || !siteLocation.canWrite())
throw Utilities.newCoreException(
siteLocation.getAbsolutePath()
+ " is not a directory or is not writtable.", //$NON-NLS-1$
null);
MirrorSite site = null;
// parse public features
if (new File(siteLocation, Site.SITE_XML).exists()) {
try {
siteStream =
new FileInputStream(new File(siteLocation, Site.SITE_XML));
} catch (FileNotFoundException fnfe) {
}
site = (MirrorSite) parseSite(siteStream);
try {
if (siteStream != null)
siteStream.close();
} catch (IOException e) {
}
}
if (site == null) {
site = (MirrorSite) createSiteMapModel();
}
// parse downloaded plugins and fragments
parseDownloadedPluginsAndFragments(
site,
new File(siteLocation, Site.DEFAULT_PLUGIN_PATH));
// parse downloaded features
parseDownloadedFeatures(
site,
new File(siteLocation, Site.DEFAULT_FEATURE_PATH));
URL url;
try {
url = siteLocation.toURL();
} catch (MalformedURLException mue) {
throw Utilities.newCoreException(
"A URL for site " //$NON-NLS-1$
+ siteLocation.getAbsolutePath()
+ " could not be created.", //$NON-NLS-1$
mue);
}
SiteContentProvider contentProvider = null;
contentProvider = new SiteFileContentProvider(url);
site.setSiteContentProvider(contentProvider);
contentProvider.setSite(site);
try {
site.resolve(url, url);
} catch (MalformedURLException mue) {
throw Utilities.newCoreException(
"Unable to resolve URL " //$NON-NLS-1$
+ (url == null ? "" : url.toExternalForm()), //$NON-NLS-1$
mue);
}
return site;
}
/**
*
*/
private void parseDownloadedPluginsAndFragments(MirrorSite site,
File pluginDir) throws CoreException {
if (!pluginDir.exists()) {
return;
}
String[] dir = pluginDir.list(FeaturePackagedContentProvider.filter);
for (int i = 0; i < dir.length; i++) {
InputStream in = null;
try {
File file = new File(pluginDir, dir[i]);
JarContentReference jarReference = new JarContentReference(
null, file);
ContentReference ref = jarReference.peek("META-INF/MANIFEST.MF", null, null); //$NON-NLS-1$
if (ref != null) {
try {
in = ref.getInputStream();
}
catch (SecurityException e) {
// in case of an invalid signature in jar, we will catch
// and re-throw a little more specific message. Otherwise, it's
// impossible to tell which jar had the problem.
String filename = file.getName();
CoreException updateException = Utilities.newCoreException(filename,e);
throw updateException;
}
BundleManifest manifest = new BundleManifest(in);
if (manifest.exists()) {
site
.addDownloadedPluginEntry(manifest
.getPluginEntry());
continue;
}
}
ref = jarReference.peek("plugin.xml", null, null); //$NON-NLS-1$
if (ref == null) {
ref = jarReference.peek("fragment.xml", null, null); //$NON-NLS-1$
}
if (ref != null) {
in = ref.getInputStream();
PluginEntry entry = new DefaultPluginParser().parse(in);
site.addDownloadedPluginEntry(entry);
}
} catch (IOException e) {
StandaloneUpdateApplication.exceptionLogged();
UpdateCore.log(e);
} catch (SAXException e) {
StandaloneUpdateApplication.exceptionLogged();
UpdateCore.log(e);
} finally {
if(in !=null){
try{
in.close();
}catch(IOException ce){
}
}
}
}
}
/**
* Method parseFeature.
* @throws CoreException
*/
private void parseDownloadedFeatures(MirrorSite site, File featureDir)
throws CoreException {
if (featureDir.exists()) {
String[] dir;
SiteFeatureReferenceModel featureRef;
URL featureURL;
File currentFeatureFile;
String newFilePath = null;
try {
// only list JAR files
dir = featureDir.list(FeaturePackagedContentProvider.filter);
for (int index = 0; index < dir.length; index++) {
// check if the JAR file contains a feature.xml
currentFeatureFile = new File(featureDir, dir[index]);
JarContentReference ref =
new JarContentReference("", currentFeatureFile); //$NON-NLS-1$
ContentReference result = null;
try {
result = ref.peek(Feature.FEATURE_XML, null, null);
} catch (IOException e) {
UpdateCore.warn(
"Exception retrieving feature.xml in file:" //$NON-NLS-1$
+ currentFeatureFile,
e);
}
if (result == null) {
UpdateCore.warn(
"Unable to find feature.xml in file:" //$NON-NLS-1$
+ currentFeatureFile);
} else {
featureURL = currentFeatureFile.toURL();
featureRef = createFeatureReferenceModel();
featureRef.setSiteModel(site);
featureRef.setURLString(featureURL.toExternalForm());
featureRef.setType(ISite.DEFAULT_PACKAGED_FEATURE_TYPE);
featureRef.setFeatureIdentifier(
featureRef
.getVersionedIdentifier()
.getIdentifier());
featureRef.setFeatureVersion(
featureRef
.getVersionedIdentifier()
.getVersion()
.toString());
site.addDownloadedFeatureReferenceModel(featureRef);
}
}
} catch (MalformedURLException e) {
throw Utilities.newCoreException(
"Unable to create URL for file " + newFilePath + ".", //$NON-NLS-1$ //$NON-NLS-2$
e);
}
}
}
}