blob: d3a3f5d65b3dc9258f87f1c25eba949b36c8dbb5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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.equinox.internal.p2.update;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.equinox.internal.p2.reconciler.dropins.Activator;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.directorywatcher.DirectoryChangeListener;
import org.eclipse.equinox.p2.directorywatcher.DirectoryWatcher;
/**
* @since 1.0
*/
public class PlatformXmlListener extends DirectoryChangeListener {
private static final String PLATFORM_XML = "platform.xml"; //$NON-NLS-1$
private boolean changed = false;
private Map sites = new HashMap();
private File root;
public PlatformXmlListener(File file) throws ProvisionException {
super();
if (!PLATFORM_XML.equals(file.getName()))
throw new IllegalArgumentException();
this.root = file;
// don't need to set the "sites" variable since we will treat
// everything as "added" in the delta if it is null
process();
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#added(java.io.File)
*/
public boolean added(File file) {
changed = changed || PLATFORM_XML.equals(file.getName());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#changed(java.io.File)
*/
public boolean changed(File file) {
changed = changed || PLATFORM_XML.equals(file.getName());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#getSeenFile(java.io.File)
*/
public Long getSeenFile(File file) {
return new Long(0);
}
/*
* Parse the platform.xml file and return the list of sites.
*/
private Site[] parseConfiguration() throws ProvisionException {
return new ConfigurationParser().parse(root);
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.DirectoryChangeListener#isInterested(java.io.File)
*/
public boolean isInterested(File file) {
return file.getName().equals(PLATFORM_XML);
}
private Site[] getSites() {
List result = new ArrayList();
for (Iterator iter = sites.values().iterator(); iter.hasNext();) {
SiteInfo info = (SiteInfo) iter.next();
result.add(info.getSite());
}
return (Site[]) result.toArray(new Site[result.size()]);
}
/*
* This is where we reconcile the platform.xml and bundles.txt.
*/
private void process() throws ProvisionException {
SiteDelta delta = SiteDelta.create(getSites(), parseConfiguration());
if (delta.isEmpty())
return;
added(delta.added());
removed(delta.removed());
changed(delta.changed());
Activator.synchronize(getMetadataRepositories(), null); // TODO proper progress monitoring?
}
// iterate over the site listeners and collect the metadata repositories
public List getMetadataRepositories() {
List result = new ArrayList();
for (Iterator iter = sites.values().iterator(); iter.hasNext();) {
SiteInfo info = (SiteInfo) iter.next();
result.add(info.getListener().getMetadataRepository());
}
return result;
}
/*
* The given list of sites has been added so add directory
* watchers for each of them.
*/
private void added(Site[] added) throws ProvisionException {
if (added == null || added.length == 0)
return;
for (int i = 0; i < added.length; i++) {
Site site = added[i];
try {
URL url = new URL(site.getUrl());
try {
url = FileLocator.resolve(url);
} catch (IOException e) {
throw new ProvisionException("Exception while processing configuration.", e);
}
File file = new File(url.getFile(), "plugins");
DirectoryWatcher watcher = new DirectoryWatcher(file);
SiteListener listener = new SiteListener(site);
watcher.addListener(listener);
watcher.start();
sites.put(site.getUrl(), new SiteInfo(site, watcher, listener));
} catch (MalformedURLException e) {
throw new ProvisionException(e);
}
}
}
/*
* The given list of sites has been removed so act accordingly.
* Remove all the registered directory watchers.
*/
private void removed(Site[] removed) {
if (removed == null || removed.length == 0)
return;
for (int i = 0; i < removed.length; i++) {
Site site = removed[i];
SiteInfo info = (SiteInfo) sites.get(site.getUrl());
// TODO I think this should be an error?
if (info == null) {
//
}
info.getWatcher().stop();
sites.remove(site.getUrl());
}
}
/*
* The given set of sites has had their contents changed.
*/
private void changed(Site[] changed) {
// TODO
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#removed(java.io.File)
*/
public boolean removed(File file) {
changed = changed || PLATFORM_XML.equals(file.getName());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#startPoll()
*/
public void startPoll() {
changed = false;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.p2.directorywatcher.IDirectoryChangeListener#stopPoll()
*/
public void stopPoll() {
if (changed)
try {
process();
} catch (ProvisionException e) {
e.printStackTrace();
}
changed = false;
}
}