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/12 19:20:20 UTC

cvs commit: jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/i18n MessageManager.java

dflorey     2004/05/12 10:20:20

  Modified:    proposals/projector/src/java/org/apache/slide/projector/resource
                        MultipleStreamableResource.java
               proposals/projector/src/java/org/apache/slide/projector/engine
                        ProcessServlet.java ProcessorManager.java
               proposals/projector/src/java/org/apache/slide/projector/i18n
                        MessageManager.java
  Added:       proposals/projector/src/java/org/apache/slide/projector/engine
                        ApplicationListener.java Application.java
                        ApplicationManager.java
  Removed:     proposals/projector/src/java/org/apache/slide/projector/engine
                        PackageManager.java
  Log:
  Application management introduced
  
  Revision  Changes    Path
  1.2       +1 -64     jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/resource/MultipleStreamableResource.java
  
  Index: MultipleStreamableResource.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/resource/MultipleStreamableResource.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MultipleStreamableResource.java	3 May 2004 14:20:24 -0000	1.1
  +++ MultipleStreamableResource.java	12 May 2004 17:20:20 -0000	1.2
  @@ -1,66 +1,3 @@
  -/*
  - * $Header$
  - * $Revision$
  - * $Date$
  - *
  - * ====================================================================
  - *
  - * The Apache Software License, Version 1.1
  - *
  - * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  - * Redistribution and use in source and binary forms, with or without
  - * modification, are permitted provided that the following conditions
  - * are met:
  - *
  - * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer.
  - *
  - * 2. Redistributions in binary form must reproduce the above copyright
  - *    notice, this list of conditions and the following disclaimer in
  - *    the documentation and/or other materials provided with the
  - *    distribution.
  - *
  - * 3. The end-user documentation included with the redistribution, if
  - *    any, must include the following acknowlegement:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowlegement may appear in the software itself,
  - *    if and wherever such third-party acknowlegements normally appear.
  - *
  - * 4. The names "The Jakarta Project", "Slide", and "Apache Software
  - *    Foundation" must not be used to endorse or promote products derived
  - *    from this software without prior written permission. For written
  - *    permission, please contact apache@apache.org.
  - *
  - * 5. Products derived from this software may not be called "Apache"
  - *    nor may "Apache" appear in their names without prior written
  - *    permission of the Apache Group.
  - *
  - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  - * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  - * SUCH DAMAGE.
  - * ====================================================================
  - *
  - * This software consists of voluntary contributions made by many
  - * individuals on behalf of the Apache Software Foundation.  For more
  - * information on the Apache Software Foundation, please see
  - * <http://www.apache.org/>.
  - *
  - * [Additional notices, if required by prior licensing conditions]
  - *
  - */
  -
   package org.apache.slide.projector.resource;
   
   import org.apache.slide.projector.util.StreamHelper;
  
  
  
  1.4       +1 -0      jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ProcessServlet.java
  
  Index: ProcessServlet.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ProcessServlet.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ProcessServlet.java	11 May 2004 15:23:43 -0000	1.3
  +++ ProcessServlet.java	12 May 2004 17:20:20 -0000	1.4
  @@ -29,6 +29,7 @@
       private final static String allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
       
       public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  +    	ApplicationManager.getInstance();
       	Context context = new HttpContext(request, response);
           URI uri = new URIResource(request.getRequestURI().substring(request.getContextPath().length()+request.getServletPath().length()));
           try {
  
  
  
  1.4       +42 -13    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.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ProcessorManager.java	11 May 2004 15:23:43 -0000	1.3
  +++ ProcessorManager.java	12 May 2004 17:20:20 -0000	1.4
  @@ -31,7 +31,7 @@
    * They are reloaded if an event occurs that indicates, that the class or configuration has changed
    * or was updated.
    */
  -public class ProcessorManager {
  +public class ProcessorManager implements ApplicationListener {
       public final static URI BINARY = new URIResource("/image");
       public final static URI LOCALE_RESOLVER = new URIResource("/localeResolver");
       public final static URI URL = new URIResource("/url");
  @@ -41,36 +41,58 @@
       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 processorMap;
  +    private Map installedProcessors = new HashMap(); 
  +    private Map processorMap = new HashMap(256);
       private List processorDescriptors = new ArrayList();
  -    private List configuredProcessors;
  +    private List configuredProcessors = new ArrayList();
       private static ProcessorManager processorManager = new ProcessorManager();
       private ProcessorClassLoader processorClassLoader = new ProcessorClassLoader(this.getClass().getClassLoader(), new URIResource(Constants.CLASSES_DIR));
   
       private ProcessorManager() {
  -        configure();
       }
       	
  -    void configure() {
  -    	processorMap = new HashMap(256);
  -    	configuredProcessors = new ArrayList();
  -    	processorDescriptors = new ArrayList();
  +    public void install(final Application application) {
  +        logger.log(Level.INFO, "Installing processors of application '"+application.getApplicationUri()+"'");
       	try {
  -    		List processorConfigurations = PackageManager.getInstance().getProcessorConfigurations();
  +    		List processorConfigurations = application.getProcessors();
       		for ( Iterator i = processorConfigurations.iterator(); i.hasNext(); ) {
  +            	List processors = new ArrayList();
       			URI configurationUri = (URI)i.next();
       			InputStream configuration = ((StreamableResource)ConnectorFactory.getConnector().getResource(configurationUri, Constants.CREDENTIALS)).getInputStream();
       			SimpleImporter importer = new SimpleImporter();
  -    			ConfigurationHandler handler = new ConfigurationHandler();
  +    			ConfigurationHandler handler = new ConfigurationHandler(processors);
       			importer.addSimpleImportHandler(handler);
       			importer.parse(new InputSource(configuration));
  +        		installedProcessors.put(configurationUri, processors);
  +		        ConnectorFactory.getConnector().subscribe("Update", configurationUri.toString(), 0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY,
  +		                new Subscriber() {
  +		                    public void notify(Map information) {
  +								uninstall(application);
  +								install(application);
  +		                    }
  +		                }, Constants.CREDENTIALS);
       		}
       	} catch (Exception exception) {
       		logger.log(Level.SEVERE, "Error while parsing configuration", exception);
       	}
       }
  -
  +    
  +    public void uninstall(Application application) {
  +        logger.log(Level.INFO, "Uninstalling processors of application '"+application.getApplicationUri()+"'");
  +    	for ( Iterator i = application.getProcessors().iterator(); i.hasNext(); ) {
  +    		URI processorsUri = (URI)i.next();
  +        	List processors = (List)installedProcessors.get(processorsUri);
  +        	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);
  +        	}
  +    	}
  +    }
  +    
       public static ProcessorManager getInstance() {
           return processorManager;
       }
  @@ -192,7 +214,13 @@
       }
   
       public class ConfigurationHandler extends DefaultSimpleImportHandler {
  -        public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) {
  +    	List processors;
  +    		
  +    	public ConfigurationHandler(List processors) {
  +    		this.processors = processors;
  +    	}
  +    	
  +    	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");
  @@ -243,6 +271,7 @@
                       }
                       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);
                   }
  
  
  
  1.1                  jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ApplicationListener.java
  
  Index: ApplicationListener.java
  ===================================================================
  package org.apache.slide.projector.engine;
  
  public interface ApplicationListener {
  	public void install(Application application);
  	
  	public void uninstall(Application application);
  }
  
  
  
  1.1                  jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Application.java
  
  Index: Application.java
  ===================================================================
  /*
   * Created on 12.05.2004
   *
   * TODO To change the template for this generated file go to
   * Window - Preferences - Java - Code Generation - Code and Comments
   */
  package org.apache.slide.projector.engine;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.apache.slide.projector.URI;
  
  public final class Application {
  	private URI applicationUri;
  	private String displayName, vendor, description;
  	private List processors = new ArrayList();
  	private List messages = new ArrayList(); 
  	private List jobs = new ArrayList();
  
  	Application(URI applicationUri) {
  		this.applicationUri = applicationUri;
  	}
  	
  	public URI getApplicationUri() {
  		return applicationUri;
  	}
  	
  	String getDescription() {
  		return description;
  	}
  
  	void setDescription(String description) {
  		this.description = description;
  	}
  
  	String getDisplayName() {
  		return displayName;
  	}
  
  	void setDisplayName(String displayName) {
  		this.displayName = displayName;
  	}
  
  	void addJobs(URI jobsUri) {
  		jobs.add(jobsUri);
  	}
  
  	List getJobs() {
  		return jobs;
  	}
  
  	void addMessages(URI messagesUri) {
  		messages.add(messagesUri);
  	}
  
  	public List getMessages() {
  		return messages;
  	}
  
  	void addProcessors(URI processorsUri) {
  		processors.add(processorsUri);
  	}
  
  	List getProcessors() {
  		return processors;
  	}
  
  	String getVendor() {
  		return vendor;
  	}
  
  	void setVendor(String vendor) {
  		this.vendor = vendor;
  	}
  }
  
  
  1.1                  jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/ApplicationManager.java
  
  Index: ApplicationManager.java
  ===================================================================
  package org.apache.slide.projector.engine;
  
  import de.zeigermann.xml.simpleImporter.DefaultSimpleImportHandler;
  import de.zeigermann.xml.simpleImporter.SimpleImporter;
  import de.zeigermann.xml.simpleImporter.SimplePath;
  
  import org.apache.slide.projector.*;
  import org.apache.slide.projector.connector.ConnectorFactory;
  import org.apache.slide.projector.connector.Subscriber;
  import org.apache.slide.projector.i18n.MessageManager;
  import org.apache.slide.projector.resource.ArrayResource;
  import org.apache.slide.projector.resource.StreamableResource;
  import org.apache.slide.projector.resource.URIResource;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.helpers.AttributesImpl;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.*;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  import javax.xml.parsers.ParserConfigurationException;
  
  public class ApplicationManager {
      private final static Logger logger = Logger.getLogger(ApplicationManager.class.getName());
  
      private final static String APPLICATION_CONFIG = "application.xml";
  
      private static ApplicationManager applicationManager;
      private List applicationListeners = new ArrayList();
      private List applications = new ArrayList();
      
      private ApplicationManager() {
          logger.log(Level.INFO, "Starting projector...");
      	ConnectorFactory.getConnector().subscribe("Update/newmember", Constants.APPLICATIONS_DIR, 1, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
      			new Subscriber() {
      		public void notify(Map information) {
      			logger.log(Level.INFO, "Package manager received add event");
      			applicationManager.configure();
      		}
      	}, Constants.CREDENTIALS);
      	ConnectorFactory.getConnector().subscribe("Delete", Constants.APPLICATIONS_DIR, 1, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
      			new Subscriber() {
      		public void notify(Map information) {
      			logger.log(Level.INFO, "Package manager received delete event");
      			applicationManager.configure();
      		}
      	}, Constants.CREDENTIALS);
      	applicationListeners.add(ProcessorManager.getInstance());
      	applicationListeners.add(MessageManager.getInstance());
      	configure();
      }
  
  	private synchronized void configure() {
  		final Context context = new SystemContext();
          logger.log(Level.INFO, "Parsing application configurations");
  			Resource[] applicationUris;
  			try {
  				List removedApplications = new ArrayList();
  				removedApplications.addAll(applications);
  				applicationUris = ((ArrayResource)ConnectorFactory.getConnector().getChildren(new URIResource(Constants.APPLICATIONS_DIR), context.getCredentials())).getArray();
  				for ( int i = 0; i < applicationUris.length; i++ ) {
  					URI applicationUri = new URIResource(applicationUris[i]+"/"); 
  					if ( !isApplicationInstalled(applicationUri) ) {
  						SimpleImporter importer = new SimpleImporter();
  						URI applicationDefinition = new URIResource(applicationUri.toString()+APPLICATION_CONFIG);
  						StreamableResource applicationDefinitionResouce = ((StreamableResource)ConnectorFactory.getConnector().getResource(applicationDefinition, context.getCredentials())); 
  						if ( applicationDefinitionResouce != null ) {
  							try {
  								InputStream configuration = applicationDefinitionResouce.getInputStream();
  								ConfigurationHandler handler = new ConfigurationHandler(applicationUri);
  								importer.addSimpleImportHandler(handler);
  								importer.parse(new InputSource(configuration));
  								Application installedApplication = handler.getApplication(); 
  								install(installedApplication);
  							} catch (ParserConfigurationException e) {
  								logger.log(Level.SEVERE, "Exception while parsing application configuration. Skipping installation...", e);
  							} catch (SAXException e) {
  								logger.log(Level.SEVERE, "Exception while parsing application configuration. Skipping installation...", e);
  							}				
  						} else {
  							logger.log(Level.SEVERE, "Application definition (application.xml) not found in directory '"+applicationUri+"'. Application will not be installed!");
  						}
  					} else {
  				        logger.log(Level.INFO, "Application '"+applicationUri+"' already installed");
  						removedApplications.remove(getApplication(removedApplications, applicationUri));
  					}
  				}  
  				for ( Iterator i = removedApplications.iterator(); i.hasNext(); ) {
  					Application removedApplication = (Application)i.next();
  					uninstall(removedApplication);
  				}
  			} catch (IOException e) {
  				logger.log(Level.SEVERE, "Could not determine installed applications!", e);
  			}
  	}	
  
      public static ApplicationManager getInstance() {
      	if ( applicationManager == null ) {
      		applicationManager = new ApplicationManager(); 
      	}
          return applicationManager;
      }
      
      private Application getApplication(List applications, URI applicationUri) {
      	for ( Iterator i = applications.iterator(); i.hasNext(); ) {
      		Application application = (Application)i.next();
      		if ( application.getApplicationUri().equals(applicationUri) ) return application; 
      	}
      	return null;
      }
      
      private boolean isApplicationInstalled(URI applicationUri) {
      	for ( Iterator i = applications.iterator(); i.hasNext(); ) {
      		if ( ((Application)i.next()).getApplicationUri().equals(applicationUri) ) return true;
      	}
      	return false;
      }
  	
  	private void install(Application application) {
          logger.log(Level.INFO, "Install application '"+application.getApplicationUri()+"'");
  		for ( Iterator i = applicationListeners.iterator(); i.hasNext(); ) {
  			((ApplicationListener)i.next()).install(application);
  		}
  		applications.add(application);
  	}
  	
  	private void uninstall(Application application) {
          logger.log(Level.INFO, "Uninstall application '"+application.getApplicationUri()+"'");
  		for ( Iterator i = applicationListeners.iterator(); i.hasNext(); ) {
  			((ApplicationListener)i.next()).uninstall(application);
  		}
  		applications.remove(applications.indexOf(application));
  	}
  	
  	private void update(Application application) {
  		uninstall(application);
  		install(application);
  	}
      
      public List getProcessorConfigurations() {
      	List processorConfigurations = new ArrayList();
      	for ( Iterator i = applications.iterator(); i.hasNext(); ) {
      		Application application = (Application)i.next();
          	processorConfigurations.addAll(application.getProcessors());
      	}
      	return processorConfigurations;
      }
      
      static private final class ConfigurationHandler extends DefaultSimpleImportHandler {
  		private Application application;
  		private URI applicationUri;
  		
  		private ConfigurationHandler(URI applicationUri) {
  			this.applicationUri = applicationUri;
  		}
  
  		private Application getApplication() {
  			return application;
  		}
  		
  		public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) {
              if (path.matches("application")) {
  				application = new Application(applicationUri);
              } else if ( path.matches("display-name") ) {
  				application.setDisplayName(leadingCDdata);			
              } else if ( path.matches("vendor") ) {
  				application.setVendor(leadingCDdata);			
              } else if ( path.matches("description") ) {
  				application.setDescription(leadingCDdata);			
              } else if ( path.matches("content/processors") ) {
              	String uri = attributes.getValue("uri"); 
              	application.addProcessors(new URIResource(applicationUri+uri));			
              } else if ( path.matches("content/messages") ) {
  				application.addMessages(new URIResource(applicationUri+attributes.getValue("uri")));			
              } else if ( path.matches("content/jobs") ) {
  				application.addJobs(new URIResource(applicationUri+attributes.getValue("uri")));			
              }
          }
      }
  }
  
  
  1.2       +60 -27    jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/i18n/MessageManager.java
  
  Index: MessageManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/i18n/MessageManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MessageManager.java	3 May 2004 14:20:27 -0000	1.1
  +++ MessageManager.java	12 May 2004 17:20:20 -0000	1.2
  @@ -4,43 +4,44 @@
   import de.zeigermann.xml.simpleImporter.SimpleImporter;
   import de.zeigermann.xml.simpleImporter.SimplePath;
   import org.apache.slide.projector.Constants;
  +import org.apache.slide.projector.URI;
   import org.apache.slide.projector.connector.ConnectorFactory;
   import org.apache.slide.projector.connector.Subscriber;
  +import org.apache.slide.projector.engine.Application;
  +import org.apache.slide.projector.engine.ApplicationListener;
   import org.apache.slide.projector.resource.StreamableResource;
  -import org.apache.slide.projector.resource.URIResource;
   import org.xml.sax.InputSource;
   import org.xml.sax.helpers.AttributesImpl;
   
   import java.io.InputStream;
   import java.text.MessageFormat;
  +import java.util.Collection;
   import java.util.HashMap;
  +import java.util.Iterator;
  +import java.util.List;
   import java.util.Locale;
   import java.util.Map;
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
  -public class MessageManager {
  +public class MessageManager implements ApplicationListener {
       private static Logger logger = Logger.getLogger(MessageManager.class.getName());
   
       private final static String MESSAGES_CONFIG = "messages.xml";
   
       private final static String MESSAGES_NOT_FOUND_ID = "messageNotFound";
   
  -    private Map messages;
  +    private Map installedMessages = new HashMap();
  +    private Map messages = new HashMap();
       private static MessageManager messageManager = new MessageManager();
   
       private MessageManager() {
  -        ConnectorFactory.getConnector().subscribe("Update", Constants.CONFIG_DIR + MESSAGES_CONFIG,
  -                0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY,
  -                new Subscriber() {
  -                    public void notify(Map information) {
  -                        logger.log(Level.INFO, "Reloading message manager");
  -                        configure();
  -                    }
  -                }, Constants.CREDENTIALS);
  -        configure();
       }
   
  +    public static MessageManager getInstance() {
  +    	return messageManager;
  +    }
  +    
       public static String getText(String id, String entry, Object[] arguments, Locale locale, String defaultText) {
           Message message = messageManager.findMessage(id, locale);
           if (message != null) return messageManager.format(message.getEntry(entry), arguments);
  @@ -59,20 +60,52 @@
           return message.getEntries();
       }
   
  -    private void configure() {
  -        messages = new HashMap();
  +	public void install(final Application application) {
  +        logger.log(Level.INFO, "Installing messages of application '"+application.getApplicationUri()+"'");
           try {
  -            InputStream inputStream = ((StreamableResource)ConnectorFactory.getConnector().getResource(new URIResource(Constants.CONFIG_DIR + MESSAGES_CONFIG), Constants.CREDENTIALS)).getInputStream();
  -            SimpleImporter importer = new SimpleImporter();
  -            importer.setIncludeLeadingCDataIntoStartElementCallback(true);
  -            ConfigurationHandler handler = new ConfigurationHandler(messages);
  -            importer.addSimpleImportHandler(handler);
  -            importer.parse(new InputSource(inputStream));
  +        	List messageConfigurations = application.getMessages();
  +        	Map applicationMessages = new HashMap();
  +        	for ( Iterator i = messageConfigurations.iterator(); i.hasNext(); ) {
  +        		URI messagesUri = (URI)i.next();
  +        		StreamableResource messagesResource = (StreamableResource)ConnectorFactory.getConnector().getResource(messagesUri, Constants.CREDENTIALS);
  +        		if ( messagesResource != null ) {
  +        			InputStream inputStream = messagesResource.getInputStream();
  +        			SimpleImporter importer = new SimpleImporter();
  +        			importer.setIncludeLeadingCDataIntoStartElementCallback(true);
  +        			ConfigurationHandler handler = new ConfigurationHandler();
  +        			importer.addSimpleImportHandler(handler);
  +        			importer.parse(new InputSource(inputStream));
  +        			Map parsedMessages = handler.getMessages();
  +        			applicationMessages.putAll(parsedMessages);
  +        			ConnectorFactory.getConnector().subscribe("Update", messagesUri.toString(),
  +        					0, Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY,
  +							new Subscriber() {
  +        				public void notify(Map information) {
  +        					uninstall(application);
  +        					install(application);
  +        				}
  +        			}, Constants.CREDENTIALS);
  +        		} else {
  +                    logger.log(Level.INFO, "Configured messages resource '"+messagesUri+"' not found!");
  +        		}
  +        	}
  +            messages.putAll(applicationMessages);
  +            installedMessages.put(application.getApplicationUri(), applicationMessages.keySet());
           } catch (Exception exception) {
               logger.log(Level.SEVERE, "Error while parsing messages", exception);
           }
  -    }
  -
  +	}
  +	
  +	public void uninstall(Application application) {
  +        logger.log(Level.INFO, "Uninstalling messages of application '"+application.getApplicationUri()+"'");
  +		Collection messageKeys = (Collection)installedMessages.get(application.getApplicationUri());
  +		for ( Iterator i = messageKeys.iterator(); i.hasNext(); ) {
  +			String messageKey = (String)i.next();
  +			messages.remove(messageKey);
  +            logger.log(Level.INFO, "Removing message with key '"+messageKey+"'");
  +		}
  +	}
  +    
       private String format(String formatString, Object[] arguments) {
           if (formatString == null) return null;
           return MessageFormat.format(formatString, arguments);
  @@ -105,14 +138,10 @@
       }
   
       class ConfigurationHandler extends DefaultSimpleImportHandler {
  -        private Map messages;
  +        private Map messages = new HashMap();
           private String id;
           private Message message;
   
  -        public ConfigurationHandler(Map messages) {
  -            this.messages = messages;
  -        }
  -
           public void startElement(SimplePath path, String name, AttributesImpl attributes, String leadingCDdata) {
               if (path.matches("message")) {
                   id = attributes.getValue("id");
  @@ -131,6 +160,10 @@
               if (path.matches("message/locale")) {
                   messages.put(message.getKey(), message);
               }
  +        }
  +        
  +        Map getMessages() {
  +        	return messages;
           }
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org