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 [EMAIL PROTECTED]
  - *
  - * 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to