You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by df...@apache.org on 2004/05/13 18:34:15 UTC
cvs commit: jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor ProcessorDescriptor.java Descriptor.java
dflorey 2004/05/13 09:34:15
Modified: proposals/projector/src/java/org/apache/slide/projector/engine
ProcessorManager.java ApplicationManager.java
proposals/projector/src/java/org/apache/slide/projector/connector/webdav
WebdavDispatcher.java
proposals/projector/src/java/org/apache/slide/projector/descriptor
ProcessorDescriptor.java Descriptor.java
Log:
Improved application handling
Parts of an application can be installed/uninstalled without dropping the whole application
Revision Changes Path
1.6 +137 -68 jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ProcessorManager.java
Index: ProcessorManager.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ProcessorManager.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ProcessorManager.java 13 May 2004 13:30:52 -0000 1.5
+++ ProcessorManager.java 13 May 2004 16:34:15 -0000 1.6
@@ -36,18 +36,20 @@
public final static URI LOCALE_RESOLVER = new URIResource("/localeResolver");
public final static URI URL = new URIResource("/url");
- private static Logger logger = Logger.getLogger(ProcessorManager.class.getName());
+ private final static Logger logger = Logger.getLogger(ProcessorManager.class.getName());
private final static String PROCESSOR_CONFIG = "processors.xml";
private final static URI SMALL_DEFAULT_ICON = new URIResource("/files/contelligent/images/process.jpg");
private final static URI LARGE_DEFAULT_ICON = new URIResource("/files/contelligent/images/process.jpg");
- private Map installedProcessors = new HashMap();
- private Map processorMap = new HashMap(256);
- private List processorDescriptors = new ArrayList();
- private List configuredProcessors = new ArrayList();
private static ProcessorManager processorManager = new ProcessorManager();
+
+ private Map installedProcessors = new HashMap();
+ private Map processorMap = new HashMap(256); // URI -> Processor
+ private Map configuredProcessors = new HashMap(128);
+ private Map configurationListeners = new HashMap(128);
+ private Map processorDescriptors = new HashMap(256); // URI -> ProcessorDescriptor
private ProcessorClassLoader processorClassLoader = new ProcessorClassLoader(this.getClass().getClassLoader(), new URIResource(Constants.CLASSES_DIR));
-
+
private ProcessorManager() {
}
@@ -72,13 +74,21 @@
private void install(final URI configurationUri) {
logger.log(Level.INFO, "Installing processors '"+configurationUri+"'");
try {
- List processors = new ArrayList();
InputStream configuration = ((StreamableResource)ConnectorFactory.getConnector().getResource(configurationUri, Constants.CREDENTIALS)).getInputStream();
SimpleImporter importer = new SimpleImporter();
- ConfigurationHandler handler = new ConfigurationHandler(processors);
+ List alreadyInstalledProcessors = (List)installedProcessors.get(configurationUri);
+ if ( alreadyInstalledProcessors == null ) alreadyInstalledProcessors = new ArrayList();
+ ConfigurationHandler handler = new ConfigurationHandler(alreadyInstalledProcessors);
importer.addSimpleImportHandler(handler);
importer.parse(new InputSource(configuration));
- installedProcessors.put(configurationUri, processors);
+ List removedProcessors = new ArrayList();
+ alreadyInstalledProcessors.addAll(handler.getAddedProcessors());
+ for ( Iterator i = handler.getRemovedProcessors().iterator(); i.hasNext(); ) {
+ URI removedProcessorUri = (URI)i.next();
+ uninstallProcessor(removedProcessorUri);
+ alreadyInstalledProcessors.remove(removedProcessorUri);
+ }
+ installedProcessors.put(configurationUri, alreadyInstalledProcessors);
ConnectorFactory.getConnector().subscribe("Update", configurationUri, 0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, this, Constants.CREDENTIALS);
} catch (Exception exception) {
logger.log(Level.SEVERE, "Error while parsing configuration", exception);
@@ -90,18 +100,28 @@
List processors = (List)installedProcessors.get(configurationUri);
for ( Iterator j = processors.iterator(); j.hasNext(); ) {
URI processorUri = (URI)j.next();
- processorMap.remove(processorUri);
- ProcessorDescriptor processorDescriptor = getProcessorDescriptor(processorUri);
- processorDescriptors.remove(processorDescriptor);
- configuredProcessors.remove(processorDescriptor.getConfiguration());
- logger.log(Level.INFO, "Removing processor: "+processorUri);
+ uninstallProcessor(processorUri);
}
installedProcessors.remove(configurationUri);
ConnectorFactory.getConnector().unsubscribe(configurationUri, this, Constants.CREDENTIALS);
}
+ private void uninstallProcessor(URI processorUri) {
+ processorMap.remove(processorUri);
+ ProcessorDescriptor processorDescriptor = getProcessorDescriptor(processorUri);
+ URI processorConfiguration = processorDescriptor.getConfiguration();
+ if ( processorConfiguration != null ) {
+ configuredProcessors.remove(processorConfiguration);
+ Subscriber subscriber = (Subscriber)configurationListeners.get(processorConfiguration);
+ ConnectorFactory.getConnector().unsubscribe(new URIResource(Constants.REPOSITORY_DOMAIN+processorConfiguration), subscriber, Constants.CREDENTIALS);
+ configurationListeners.remove(processorConfiguration);
+ }
+ processorDescriptors.remove(processorUri);
+ logger.log(Level.INFO, "Removing processor: "+processorUri);
+ }
+
private void update(final URI configurationUri) {
- uninstall(configurationUri);
+ ConnectorFactory.getConnector().unsubscribe(configurationUri, this, Constants.CREDENTIALS);
install(configurationUri);
}
@@ -189,15 +209,11 @@
}
public ProcessorDescriptor getProcessorDescriptor(URI uri) {
- for ( Iterator i = processorDescriptors.iterator(); i.hasNext(); ) {
- ProcessorDescriptor processorDescriptor = (ProcessorDescriptor)i.next();
- if ( processorDescriptor.getUri().equals(uri) ) return processorDescriptor;
- }
- return null;
+ return (ProcessorDescriptor)processorDescriptors.get(uri);
}
public ProcessorDescriptor getProcessorDescriptor(Processor processor) {
- for ( Iterator i = processorDescriptors.iterator(); i.hasNext(); ) {
+ for ( Iterator i = processorDescriptors.values().iterator(); i.hasNext(); ) {
ProcessorDescriptor processorDescriptor = (ProcessorDescriptor)i.next();
if ( processorDescriptor.getProcessor() == processor ) return processorDescriptor;
}
@@ -205,9 +221,6 @@
}
private void registerProcessor(URI uri, Processor processor) {
- logger.log(Level.INFO, "Registering processor with URI=" + uri);
- // build index for fast retrieval of ProcessorMapping via URI of configuration resource
- processorMap.put(uri, processor);
}
private static int countRequiredParameters(ParameterDescriptor[] descriptors) {
@@ -230,71 +243,127 @@
}
public class ConfigurationHandler extends DefaultSimpleImportHandler {
- List processors;
+ List addedProcessors = new ArrayList();
+ List removedProcessors = new ArrayList();
- public ConfigurationHandler(List processors) {
- this.processors = processors;
+ public ConfigurationHandler(List installedProcessors) {
+ removedProcessors.addAll(installedProcessors);
}
public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) {
if (path.matches("processor")) {
- final URI uri = new URIResource(attributes.getValue("uri"));
- final String configURI = attributes.getValue("config-uri");
+ boolean modified = false, added = false;
+ URI uri = new URIResource(attributes.getValue("uri"));
+ removedProcessors.remove(uri);
+ String configURI = attributes.getValue("config-uri");
String processorName = attributes.getValue("name");
String descriptionKey = attributes.getValue("description");
String smallIcon = attributes.getValue("small-icon");
String largeIcon = attributes.getValue("large-icon");
String clazz = attributes.getValue("class");
String page = attributes.getValue("page");
+ Processor processor = (Processor)processorMap.get(uri);
+ ProcessorDescriptor processorDescriptor = (ProcessorDescriptor)processorDescriptors.get(uri);
try {
- final Processor processor = (Processor)processorClassLoader.loadClass(clazz).getConstructor(new Class[0]).newInstance(new Object[0]);
- if ( processorName == null ) processorName = uri.toString();
- DefaultMessage description = null;
- if ( descriptionKey == null ) {
- description = new DefaultMessage("processorManager/noProcessorDescriptionAvailable");
- } else {
- description = new DefaultMessage(descriptionKey);
+ if ( processor == null ) {
+ processor = (Processor)processorClassLoader.loadClass(clazz).getConstructor(new Class[0]).newInstance(new Object[0]);
+ added = true;
+ modified = true;
+ }
+ if ( processorDescriptor == null ) {
+ processorDescriptor = new ProcessorDescriptor(uri);
+ modified = true;
+ }
+ if ( processorName == null ) processorName = uri.toString();
+ if ( processorDescriptor.getName() == null || !processorDescriptor.getName().equals(processorName) ) {
+ processorDescriptor.setName(processorName);
+ modified = true;
+ }
+ if ( descriptionKey == null ) {
+ descriptionKey = "processorManager/noProcessorDescriptionAvailable";
+ }
+ DefaultMessage description = null;
+ if ( processorDescriptor.getDescription() == null || !processorDescriptor.getDescription().getId().equals(descriptionKey) ) {
+ description = new DefaultMessage(descriptionKey);
+ processorDescriptor.setDescription(description);
+ modified = true;
+ }
+ if ( processorDescriptor.getProcessor() != processor ) {
+ processorDescriptor.setProcessor(processor);
+ modified = true;
+ }
+ URI smallIconUri = SMALL_DEFAULT_ICON, largeIconUri = LARGE_DEFAULT_ICON;
+ if ( smallIcon != null ) smallIconUri = new URIResource(smallIcon);
+ if ( largeIcon != null ) largeIconUri = new URIResource(largeIcon);
+ if ( processorDescriptor.getSmallIcon() == null || !processorDescriptor.getSmallIcon().equals(smallIconUri) ) {
+ processorDescriptor.setSmallIcon(smallIconUri);
+ modified = true;
+ }
+ if ( processorDescriptor.getLargeIcon() == null || !processorDescriptor.getLargeIcon().equals(largeIconUri) ) {
+ processorDescriptor.setLargeIcon(largeIconUri);
+ modified = true;
+ }
+ if ( page != null ) {
+ boolean bookmark = Boolean.valueOf(page).booleanValue();
+ if ( processorDescriptor.isBookmark() != bookmark ) {
+ processorDescriptor.setBookmark(bookmark);
+ modified = true;
+ }
+ }
+ if ( processor instanceof ConfigurableProcessor && configURI != null ) {
+ URI configurationUri = new URIResource(configURI);
+ if ( processorDescriptor.getConfiguration() == null || !processorDescriptor.getConfiguration().equals(configurationUri) ) {
+ logger.log(Level.INFO, "Configuring processor with config-URI=" + configURI);
+ processorDescriptor.setConfiguration(configurationUri);
+ StreamableResource config = (StreamableResource)ConnectorFactory.getConnector().getResource(new URIResource(Constants.REPOSITORY_DOMAIN+configURI), Constants.CREDENTIALS);
+ ((ConfigurableProcessor)processor).configure(config);
+ // listen for configuration changes
+ Subscriber subscriber = new ConfigurationListener();
+ ConnectorFactory.getConnector().subscribe("Update", new URIResource(Constants.REPOSITORY_DOMAIN+configURI), 0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, subscriber, Constants.CREDENTIALS);
+ configurationListeners.put(configurationUri, subscriber);
+ configuredProcessors.put(configurationUri, processor);
+ modified = true;
+ }
+ }
+ if ( added ) {
+ logger.log(Level.INFO, "Adding processor with URI=" + uri);
+ addedProcessors.add(uri);
}
- ProcessorDescriptor processorDescriptor = new ProcessorDescriptor(processorName, description, uri);
- processorDescriptor.setProcessor(processor);
- URI smallIconUri = SMALL_DEFAULT_ICON, largeIconUri = LARGE_DEFAULT_ICON;
- if ( smallIcon != null ) smallIconUri = new URIResource(smallIcon);
- if ( largeIcon != null ) largeIconUri = new URIResource(largeIcon);
- processorDescriptor.setSmallIcon(smallIconUri);
- processorDescriptor.setLargeIcon(largeIconUri);
- if ( page != null ) processorDescriptor.setBookmark(Boolean.valueOf(page).booleanValue());
- if ( processor instanceof ConfigurableProcessor && configURI != null ) {
- processorDescriptor.setConfiguration(new URIResource(configURI));
- logger.log(Level.INFO, "Configuring processor with config-URI=" + configURI);
- configuredProcessors.add(new ConfiguredProcessor(configURI, uri));
- StreamableResource config = (StreamableResource)ConnectorFactory.getConnector().getResource(new URIResource(Constants.REPOSITORY_DOMAIN+configURI), Constants.CREDENTIALS);
- ((ConfigurableProcessor)processor).configure(config);
- // listen for configuration changes
- ConnectorFactory.getConnector().subscribe("Update", new URIResource(Constants.REPOSITORY_DOMAIN+configURI), 0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY,
- new Subscriber() {
- public void notify(URI uri, Map information) {
- logger.log(Level.INFO, "Reloading processor with URI='"+uri+"', configuration URI='"+configURI+"'");
- try {
- StreamableResource config = (StreamableResource)ConnectorFactory.getConnector().getResource(new URIResource(Constants.REPOSITORY_DOMAIN+configURI), Constants.CREDENTIALS);
- ((ConfigurableProcessor)processor).configure(config);
- } catch ( IOException e ) {
- logger.log(Level.SEVERE, "Configuration resource with URI='"+configURI+"' could not be loaded!", e);
- } catch ( ConfigurationException e ) {
- logger.log(Level.SEVERE, "Processor with URI='" + uri + "' could not be reloaded! Configuration resource with URI='"+configURI+"' might be invalid!", e);
- }
- }
- }, Constants.CREDENTIALS);
+ if ( modified ) {
+ logger.log(Level.INFO, "Updating processor with URI=" + uri);
+ processorMap.put(uri, processor);
+ processorDescriptors.put(uri, processorDescriptor);
}
- registerProcessor(uri, processor);
- processorDescriptors.add(processorDescriptor);
- processors.add(uri);
} catch (Exception e) {
logger.log(Level.SEVERE, "Processor " + clazz + " could not be created or configured!", e);
}
}
}
+
+ List getAddedProcessors() {
+ return addedProcessors;
+ }
+
+ List getRemovedProcessors() {
+ return removedProcessors;
+ }
}
+ class ConfigurationListener implements Subscriber {
+ public void notify(URI uri, Map information) {
+ Processor processor = (Processor)configuredProcessors.get(uri);
+ logger.log(Level.INFO, "Reloading processor with configuration URI='"+uri+"'");
+ try {
+ StreamableResource config = (StreamableResource)ConnectorFactory.getConnector().getResource(uri, Constants.CREDENTIALS);
+ ((ConfigurableProcessor)processor).configure(config);
+ } catch ( IOException e ) {
+ logger.log(Level.SEVERE, "Configuration resource with URI='"+uri+"' could not be loaded!", e);
+ } catch ( ConfigurationException e ) {
+ logger.log(Level.SEVERE, "Processor with configuration URI='" + uri + "' could not be reloaded! Configuration resource might be invalid!", e);
+ }
+ }
+ }
+
class ConfiguredProcessor {
private String configUri;
private URI processorUri;
1.3 +0 -1 jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ApplicationManager.java
Index: ApplicationManager.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ApplicationManager.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ApplicationManager.java 13 May 2004 13:30:52 -0000 1.2
+++ ApplicationManager.java 13 May 2004 16:34:15 -0000 1.3
@@ -175,7 +175,6 @@
private void uninstall(Application application) {
logger.log(Level.INFO, "Uninstall application '"+application.getUri()+"'");
- // FIXME: Unsubscribe application listeners
for ( Iterator i = application.getContent().entrySet().iterator(); i.hasNext(); ) {
Map.Entry entry = (Map.Entry)i.next();
for ( Iterator j = ((List)entry.getValue()).iterator(); j.hasNext(); ) {
1.3 +4 -4 jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/webdav/WebdavDispatcher.java
Index: WebdavDispatcher.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/webdav/WebdavDispatcher.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- WebdavDispatcher.java 13 May 2004 13:30:52 -0000 1.2
+++ WebdavDispatcher.java 13 May 2004 16:34:15 -0000 1.3
@@ -175,7 +175,7 @@
}
}
}
- logger.log(Level.SEVERE, "Listener not subscribed!");
+ logger.log(Level.SEVERE, "Listener not unsubscribed!");
}
public void fireEvent(Map information, Credentials credentials) throws IOException {
1.2 +11 -3 jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/ProcessorDescriptor.java
Index: ProcessorDescriptor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/ProcessorDescriptor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ProcessorDescriptor.java 3 May 2004 14:20:21 -0000 1.1
+++ ProcessorDescriptor.java 13 May 2004 16:34:15 -0000 1.2
@@ -14,11 +14,19 @@
private Processor processor;
private boolean bookmark;
- public ProcessorDescriptor(String name, LocalizedMessage description, URI uri) {
- super(name, description);
+ public ProcessorDescriptor(URI uri) {
+ super(null, null);
this.uri = uri;
}
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDescription(LocalizedMessage description) {
+ this.description = description;
+ }
+
public Processor getProcessor() {
return processor;
}
1.2 +2 -2 jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/Descriptor.java
Index: Descriptor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/descriptor/Descriptor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Descriptor.java 3 May 2004 14:20:21 -0000 1.1
+++ Descriptor.java 13 May 2004 16:34:15 -0000 1.2
@@ -3,8 +3,8 @@
import org.apache.slide.projector.i18n.LocalizedMessage;
public class Descriptor {
- private String name;
- private LocalizedMessage description;
+ protected String name;
+ protected LocalizedMessage description;
public Descriptor(String name, LocalizedMessage description) {
this.name = name;
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org