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