dflorey     2004/06/10 09:14:12

  Modified:    
proposals/projector/src/java/org/apache/slide/projector/processor/security
                        Login.java
               proposals/projector/src/java/org/apache/slide/projector
                        SystemContext.java Constants.java Context.java
               proposals/projector/src/java/org/apache/slide/projector/connector/webdav
                        WebdavConnector.java
               proposals/projector/src/java/org/apache/slide/projector/processor/core
                        CachedContent.java Thread.java
               proposals/projector/src/java/org/apache/slide/projector/application
                        ApplicationManager.java
               proposals/projector/src/java/org/apache/slide/projector/processor/form
                        FormHandler.java Trigger.java
               proposals/projector/src/java/org/apache/slide/projector/engine
                        Scheduler.java Job.java
               proposals/projector/src/java/org/apache/slide/projector/connector
                        Connector.java
  Added:       
proposals/projector/src/java/org/apache/slide/projector/processor/security
                        Authenticated.java Logout.java
  Removed:     proposals/projector/src/java/org/apache/slide/projector/engine
                        JobDefinition.java
  Log:
  Started to work on admin demo application
  
  Revision  Changes    Path
  1.3       +11 -13    
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/security/Login.java
  
  Index: Login.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/security/Login.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Login.java        1 Jun 2004 07:49:58 -0000       1.2
  +++ Login.java        10 Jun 2004 16:14:12 -0000      1.3
  @@ -1,12 +1,13 @@
   package org.apache.slide.projector.processor.security;
   
  +import org.apache.commons.httpclient.Credentials;
  +import org.apache.slide.projector.connector.ConnectorFactory;
   import org.apache.slide.projector.descriptor.*;
   import org.apache.slide.projector.i18n.DefaultMessage;
   import org.apache.slide.projector.i18n.ErrorMessage;
   import org.apache.slide.projector.i18n.ParameterMessage;
   import org.apache.slide.projector.Information;
   import org.apache.slide.projector.*;
  -import org.apache.slide.projector.value.StringValue;
   
   import java.util.Map;
   
  @@ -18,8 +19,7 @@
   public class Login implements Processor {
       private final static String USERNAME = "username";
       private final static String PASSWORD = "password";
  -    private final static String INTERESTS = "interests";
  -
  +    
       private final static String LOGIN_OK = "loginOk";
       private final static String LOGIN_FAILED = "loginFailed";
       public final static String ERRORS = "errors";
  @@ -27,21 +27,19 @@
       public Result process(Map parameter, Context context) throws Exception {
           String username = parameter.get(USERNAME).toString();
           String password = parameter.get(PASSWORD).toString();
  -        if ( username.equals("Daniel") && password.equals("test") ) {
  -            return new Result(LOGIN_OK);
  -        }
  -        context.addInformation(new Information(Information.ERROR, new 
ErrorMessage("login/invalidLogin"), new String[] { USERNAME, PASSWORD }));
  -        if ( password.equals("aaaa") ) {
  -            context.addInformation(new Information(Information.ERROR, new 
ErrorMessage("login/invalidPassword"), new String[] { PASSWORD }));
  +        Credentials credentials = ConnectorFactory.getConnector().login(username, 
password);
  +        if ( credentials == null ) {
  +            context.addInformation(new Information(Information.ERROR, new 
ErrorMessage("login/invalidLogin"), new String[] { USERNAME, PASSWORD }));
  +            return new Result(LOGIN_FAILED);
           }
  -        return new Result(LOGIN_FAILED);
  +        context.setCredentials(credentials);
  +        return new Result(LOGIN_OK);
       }
   
       public ParameterDescriptor[] getParameterDescriptors() {
           return new ParameterDescriptor[] {
  -            new ParameterDescriptor(USERNAME, new ParameterMessage("login/user"), 
new StringValueDescriptor(), new StringValue("Daniel")),
  +            new ParameterDescriptor(USERNAME, new ParameterMessage("login/user"), 
new StringValueDescriptor(1,20)),
               new ParameterDescriptor(PASSWORD, new 
ParameterMessage("login/password"), new StringValueDescriptor(4,12)),
  -            new ParameterDescriptor(INTERESTS, new 
ParameterMessage("person/interests"), new ArrayValueDescriptor(new 
StringValueDescriptor(new String[] { "sport", "musik", "fernsehen", "tanzen", 
"springen", "schreien"})))
           };
       }
   
  
  
  
  1.1                  
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/security/Authenticated.java
  
  Index: Authenticated.java
  ===================================================================
  package org.apache.slide.projector.processor.security;
  
  import org.apache.slide.projector.descriptor.*;
  import org.apache.slide.projector.i18n.DefaultMessage;
  import org.apache.slide.projector.*;
  
  import java.util.Map;
  
  /**
   * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
   * @version $Revision: 1.1 $
   */
  
  public class Authenticated implements Processor {
      private final static String TRUE = "true";
      private final static String FALSE = "false";
  
      private final static ParameterDescriptor[] parameterDescriptors = new 
ParameterDescriptor[0];
      private final static ResultDescriptor resultDescirptor = new 
ResultDescriptor(new StateDescriptor[] {
              new StateDescriptor(TRUE, new 
DefaultMessage("authenticated/state/true")),
              new StateDescriptor(FALSE, new 
DefaultMessage("authenticated/state/false"))
           });
  
      public Result process(Map parameter, Context context) throws Exception {
          if ( context.getCredentials() == Constants.CREDENTIALS ) {
                return new Result(FALSE);
          }
          return new Result(TRUE);
      }
  
      public ParameterDescriptor[] getParameterDescriptors() {
          return parameterDescriptors;
      }
  
      public ResultDescriptor getResultDescriptor() {
        return resultDescirptor;
      }
  }
  
  
  1.1                  
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/security/Logout.java
  
  Index: Logout.java
  ===================================================================
  package org.apache.slide.projector.processor.security;
  
  import org.apache.slide.projector.descriptor.*;
  import org.apache.slide.projector.*;
  
  import java.util.Map;
  
  /**
   * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
   * @version $Revision: 1.1 $
   */
  
  public class Logout implements Processor {
      private final static ParameterDescriptor[] parameterDescriptors = new 
ParameterDescriptor[0];
      private final static ResultDescriptor resultDescirptor = new 
ResultDescriptor(new StateDescriptor[] {
              StateDescriptor.OK_DESCRIPTOR
           });
  
      public Result process(Map parameter, Context context) throws Exception {
          context.setCredentials(Constants.CREDENTIALS);
          return Result.OK;
      }
  
      public ParameterDescriptor[] getParameterDescriptors() {
          return parameterDescriptors;
      }
  
      public ResultDescriptor getResultDescriptor() {
        return resultDescirptor;
      }
  }
  
  
  1.3       +6 -1      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/SystemContext.java
  
  Index: SystemContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/SystemContext.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SystemContext.java        3 Jun 2004 14:53:14 -0000       1.2
  +++ SystemContext.java        10 Jun 2004 16:14:12 -0000      1.3
  @@ -10,6 +10,7 @@
   public class SystemContext extends AbstractContext {
        protected final static String BOOKMARK = "_bookmark_";
        
  +     private Credentials credentials = Constants.CREDENTIALS;
       private Cache contextStore = new Cache();
        private RepositoryStore repositoryStore = new RepositoryStore(this);
       private ProcessStore transientProcessStore = new 
ProcessStore(Cache.getInstance());
  @@ -36,8 +37,12 @@
           return null;
       }
   
  +    public void setCredentials(Credentials credentials) {
  +     this.credentials = credentials;
  +    }
  +    
       public Credentials getCredentials() {
  -        return Constants.CREDENTIALS;
  +        return credentials;
       }
   
       public void setProcessId(String processId) {
  
  
  
  1.12      +4 -5      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Constants.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Constants.java    8 Jun 2004 14:43:15 -0000       1.11
  +++ Constants.java    10 Jun 2004 16:14:12 -0000      1.12
  @@ -12,7 +12,7 @@
   
       public final static String REPOSITORY_DOMAIN = "/slide";
       public final static String REPOSITORY_HOST = "localhost";
  -    public final static int REPOSITORY_PORT = 8080;
  +    public final static int REPOSITORY_PORT = 9080;
       public final static String REPOSITORY_USER = "root";
       public final static String REPOSITORY_PASSWORD = "root";
       public final static Protocol REPOSITORY_PROTOCOL = Protocol.getProtocol("http");
  @@ -38,15 +38,14 @@
        
        public final static int NOTIFICATION_METHOD = UDP;
       public final static String NOTIFICATION_HOST = "192.168.105.64";
  -    public final static int NOTIFICATION_PORT = 4444;
  +    public final static int NOTIFICATION_PORT = 4445;
       public final static int POLL_INTERVAL = 60000000; // milliseconds
       public final static int SUBSCRIPTION_LIFETIME = 3600;
   
       public final static int NOTIFICATION_DELAY = 0;
   
  -    public final static String DOMAIN = REPOSITORY_DOMAIN+"/files/";
  -    
  -    public final static String PROJECTOR_DIR = DOMAIN + "projector/";
  +    public final static String DOMAIN = "/files/";
  +    public final static String PROJECTOR_DIR = DOMAIN+"projector/";
       public final static String APPLICATIONS_DIR = PROJECTOR_DIR + "applications/";
       public final static String WORK_DIR = PROJECTOR_DIR + "work/";
        // FIXME: Use Classpath from applications
  
  
  
  1.4       +2 -0      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Context.java
  
  Index: Context.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/Context.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Context.java      6 May 2004 12:54:11 -0000       1.3
  +++ Context.java      10 Jun 2004 16:14:12 -0000      1.4
  @@ -30,6 +30,8 @@
       
       String getStep();
       
  +    void setCredentials(Credentials credentials);
  +    
       Credentials getCredentials();
   
       void addInformation(Information information);
  
  
  
  1.10      +15 -0     
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/webdav/WebdavConnector.java
  
  Index: WebdavConnector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/webdav/WebdavConnector.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- WebdavConnector.java      2 Jun 2004 15:35:39 -0000       1.9
  +++ WebdavConnector.java      10 Jun 2004 16:14:12 -0000      1.10
  @@ -4,6 +4,7 @@
   import org.apache.commons.httpclient.HttpConnection;
   import org.apache.commons.httpclient.HttpState;
   import org.apache.commons.httpclient.HttpStatus;
  +import org.apache.commons.httpclient.UsernamePasswordCredentials;
   import org.apache.commons.httpclient.methods.DeleteMethod;
   import org.apache.commons.httpclient.methods.GetMethod;
   import org.apache.commons.httpclient.methods.PutMethod;
  @@ -36,6 +37,20 @@
           return webdavConnector;
       }
   
  +    public Credentials login(String username, String password) throws IOException {
  +     String url = Constants.REPOSITORY_DOMAIN+Constants.PROJECTOR_DIR; 
  +     GetMethod getMethod = new GetMethod(url);
  +        getMethod.setDoAuthentication(true);
  +        Credentials credentials = new UsernamePasswordCredentials(username, 
password);
  +        HttpState httpState = new HttpState();
  +        httpState.setCredentials(null, Constants.REPOSITORY_HOST, credentials);
  +        int state = getMethod.execute(httpState, new 
HttpConnection(Constants.REPOSITORY_HOST, Constants.REPOSITORY_PORT, 
Constants.REPOSITORY_PROTOCOL));
  +        if ( state == HttpStatus.SC_OK ) {
  +            return credentials;
  +        }
  +        return null;
  +    }
  +    
       public Value getResource(URI uri, Credentials credentials) throws IOException {
           String url = uri.toString();
           GetMethod getMethod = new GetMethod(url);
  
  
  
  1.3       +4 -3      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/core/CachedContent.java
  
  Index: CachedContent.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/core/CachedContent.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CachedContent.java        8 Jun 2004 09:48:24 -0000       1.2
  +++ CachedContent.java        10 Jun 2004 16:14:12 -0000      1.3
  @@ -3,7 +3,7 @@
   import org.apache.slide.projector.*;
   import org.apache.slide.projector.connector.ConnectorFactory;
   import org.apache.slide.projector.descriptor.*;
  -import org.apache.slide.projector.engine.JobDefinition;
  +import org.apache.slide.projector.engine.Job;
   import org.apache.slide.projector.engine.ProcessorManager;
   import org.apache.slide.projector.engine.Scheduler;
   import org.apache.slide.projector.expression.EventExpression;
  @@ -49,7 +49,8 @@
               EventExpression expression = new EventExpression("Update");
               expression.addProperty(EventExpression.DEPTH, "0");
               expression.addProperty(EventExpression.URI, uri.toString());
  -            Scheduler.getInstance().registerJobDefinition(new 
JobDefinition(expression, new URIValue("dispose"), jobParameter, false, false));
  +            Scheduler.getInstance().registerJob(new 
Job(context.getProcessId()+":"+context.getStep(), new URIValue("dispose"), expression, 
expression, jobParameter, false, false));
  +                     Scheduler.getInstance().saveJobs();
           }
           resultEntries.put(SimpleProcessor.OUTPUT, output);
           // build url to activate this processor on top level
  
  
  
  1.3       +23 -5     
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/core/Thread.java
  
  Index: Thread.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/core/Thread.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Thread.java       8 Jun 2004 09:48:24 -0000       1.2
  +++ Thread.java       10 Jun 2004 16:14:12 -0000      1.3
  @@ -33,7 +33,6 @@
   import org.apache.slide.projector.descriptor.URIValueDescriptor;
   import org.apache.slide.projector.descriptor.XMLValueDescriptor;
   import org.apache.slide.projector.engine.Job;
  -import org.apache.slide.projector.engine.JobDefinition;
   import org.apache.slide.projector.engine.ProcessorManager;
   import org.apache.slide.projector.engine.Scheduler;
   import org.apache.slide.projector.expression.Expression;
  @@ -42,7 +41,9 @@
   import org.apache.slide.projector.util.ProcessorHelper;
   import org.apache.slide.projector.value.BooleanValue;
   import org.apache.slide.projector.value.MapValue;
  +import org.apache.slide.projector.value.NullValue;
   import org.apache.slide.projector.value.URIValue;
  +import org.apache.slide.projector.value.Value;
   import org.apache.slide.projector.value.XMLValue;
   
   /**
  @@ -53,6 +54,7 @@
        public final static String PROCESSOR = "processor";
        public final static String REPEAT = "repeat";
        public final static String CONDITION = "condition";
  +     public final static String REMAINING_CONDITION = "remainingCondition";
        public final static String PARAMETERS = "parameters";
        public final static String PERSISTENT = "persistent";
        
  @@ -61,6 +63,7 @@
                        new ParameterDescriptor(REPEAT, new 
ParameterMessage("job/parameter/repeat"), new BooleanValueDescriptor(), 
BooleanValue.FALSE),
                        new ParameterDescriptor(PERSISTENT, new 
ParameterMessage("job/parameter/persistent"), new BooleanValueDescriptor(), 
BooleanValue.TRUE),
                        new ParameterDescriptor(CONDITION, new 
ParameterMessage("job/parameter/condition"), new XMLValueDescriptor()),
  +                     new ParameterDescriptor(REMAINING_CONDITION, new 
ParameterMessage("job/parameter/remainingCondition"), new XMLValueDescriptor(), 
NullValue.NULL),
                        new ParameterDescriptor(PARAMETERS, new 
ParameterMessage("job/parameter/parameters"), new MapValueDescriptor())
        };
        
  @@ -71,14 +74,29 @@
        public Result process(Map parameters, Context context) throws Exception {
                        Map jobParameters = 
((MapValue)parameters.get(PARAMETERS)).getMap();
                        URI jobUri = (URIValue)parameters.get(PROCESSOR);
  -                     XMLValue condition = (XMLValue)parameters.get(CONDITION);
  +                     XMLValue initialCondition = 
(XMLValue)parameters.get(CONDITION);
                        boolean repeatJob = 
((BooleanValue)parameters.get(REPEAT)).booleanValue();
  +                     Value remainingConditionValue = 
(Value)parameters.get(REMAINING_CONDITION);
  +                     XMLValue remainingCondition = null;
  +                     if ( remainingConditionValue == NullValue.NULL ) {
  +                             remainingCondition = initialCondition;
  +                     } else {
  +                             remainingCondition = (XMLValue)remainingConditionValue;
  +                     }
                        boolean persistentJob = 
((BooleanValue)parameters.get(PERSISTENT)).booleanValue();
  -                     Expression expression = 
ExpressionFactory.create(condition.getRootElement());
  +                     Expression remainingExpression = 
ExpressionFactory.create(remainingCondition.getRootElement());
  +                     Expression initialExpression = 
ExpressionFactory.create(initialCondition.getRootElement());
                        Processor jobProcessor = 
ProcessorManager.getInstance().getProcessor(jobUri);
                        
ProcessorHelper.validate(jobProcessor.getParameterDescriptors(), jobParameters, 
context);
  -                     JobDefinition jobDefinition = new JobDefinition(expression, 
jobUri, jobParameters, repeatJob, persistentJob); 
  -                     Scheduler.getInstance().registerJobDefinition(jobDefinition);
  +                     String processorId = context.getProcessId();
  +                     Job job;
  +                     if ( processorId == null ) {
  +                             job = new Job(context.getStep(), jobUri, 
initialExpression, remainingExpression, jobParameters, repeatJob, persistentJob); 
  +                     } else {
  +                             job = new 
Job(context.getProcessId()+":"+context.getStep(), jobUri, initialExpression, 
remainingExpression, jobParameters, repeatJob, persistentJob); 
  +                     }
  +                     Scheduler.getInstance().registerJob(job);
  +                     Scheduler.getInstance().saveJobs();
                        return Result.OK;
        }
        
  
  
  
  1.8       +31 -24    
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/application/ApplicationManager.java
  
  Index: ApplicationManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/application/ApplicationManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ApplicationManager.java   8 Jun 2004 14:43:16 -0000       1.7
  +++ ApplicationManager.java   10 Jun 2004 16:14:12 -0000      1.8
  @@ -42,14 +42,14 @@
       
       private ApplicationManager() {
           logger.log(Level.INFO, "Starting projector...");
  -     ConnectorFactory.getConnector().subscribe("Update/newmember", new 
URIValue(Constants.APPLICATIONS_DIR), 1, Constants.SUBSCRIPTION_LIFETIME, 
Constants.NOTIFICATION_DELAY, 
  +     ConnectorFactory.getConnector().subscribe("Update/newmember", new 
URIValue(Constants.REPOSITORY_DOMAIN+Constants.APPLICATIONS_DIR), 1, 
Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
                        new Subscriber() {
                public void notify(URI uri, Map information) {
                        logger.log(Level.INFO, "Package manager received add event");
                        applicationManager.installApplications();
                }
        }, context.getCredentials());
  -     ConnectorFactory.getConnector().subscribe("Delete", new 
URIValue(Constants.APPLICATIONS_DIR), 1, Constants.SUBSCRIPTION_LIFETIME, 
Constants.NOTIFICATION_DELAY, 
  +     ConnectorFactory.getConnector().subscribe("Delete", new 
URIValue(Constants.REPOSITORY_DOMAIN+Constants.APPLICATIONS_DIR), 1, 
Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
                        new Subscriber() {
                public void notify(URI uri, Map information) {
                        logger.log(Level.INFO, "Package manager received delete 
event");
  @@ -58,8 +58,8 @@
        }, context.getCredentials());
        applicationListeners.add(ProcessorManager.getInstance());
        applicationListeners.add(MessageManager.getInstance());
  +     applicationListeners.add(Scheduler.getInstance());
        installApplications();
  -     Scheduler.getInstance().install(new URIValue(Constants.WORK_DIR + 
Scheduler.JOBS), false);
       }
   
       private synchronized void installApplications() {
  @@ -69,7 +69,7 @@
        try {
                List removedApplications = new ArrayList();
                removedApplications.addAll(installedApplications.keySet());
  -             applicationUris = 
((ArrayValue)ConnectorFactory.getConnector().getChildren(new 
URIValue(Constants.APPLICATIONS_DIR), context.getCredentials())).getArray();
  +             applicationUris = 
((ArrayValue)ConnectorFactory.getConnector().getChildren(new 
URIValue(Constants.REPOSITORY_DOMAIN+Constants.APPLICATIONS_DIR), 
context.getCredentials())).getArray();
                for ( int i = 0; i < applicationUris.length; i++ ) {
                        String applicationUri = applicationUris[i].toString();
                        if ( !applicationUri.endsWith("/") ) {
  @@ -96,8 +96,21 @@
                List sortedApplications = sortApplications(applicationsToInstall);
                for ( Iterator i = sortedApplications.iterator(); i.hasNext(); ) {
                        Application application = (Application)i.next();
  -                     install(application);
  +             ConnectorFactory.getConnector().subscribe("Update", new 
URIValue(Constants.REPOSITORY_DOMAIN+application.getUri().toString()), 0, 
Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
  +                             new Subscriber() {
  +                     public void notify(URI uri, Map information) {
  +                             applicationManager.updateApplication(new 
URIValue(uri.toString().substring(Constants.REPOSITORY_DOMAIN.length()+1)));
  +                     }
  +             }, context.getCredentials());
  +                     install(Application.MESSAGES, application);
  +                     install(Application.PROCESSORS, application);
                }
  +             Scheduler.getInstance().install(new URIValue(Constants.WORK_DIR + 
Scheduler.JOBS), true);
  +             for ( Iterator i = sortedApplications.iterator(); i.hasNext(); ) {
  +                     Application application = (Application)i.next();
  +                     install(Application.JOBS, application);
  +             }
  +             Scheduler.getInstance().saveJobs();
        } catch (IOException e) {
                logger.log(Level.SEVERE, "Could not determine installed 
applications!", e);
        }
  @@ -224,28 +237,22 @@
           }
        }       
   
  -     private void install(Application application) {
  -        logger.log(Level.INFO, "Installing application '"+application.getUri()+"'");
  -     ConnectorFactory.getConnector().subscribe("Update", new 
URIValue(Constants.REPOSITORY_DOMAIN+application.getUri().toString()), 0, 
Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY, 
  -                     new Subscriber() {
  -             public void notify(URI uri, Map information) {
  -                     applicationManager.updateApplication(new 
URIValue(uri.toString().substring(Constants.REPOSITORY_DOMAIN.length()+1)));
  +     private void install(String type, Application application) {
  +        logger.log(Level.INFO, "Installing "+type+" of application 
'"+application.getUri()+"'");
  +     List contents = (List)application.getContent().get(type);
  +     if ( contents != null ) {
  +             for ( Iterator j = contents.iterator(); j.hasNext(); ) {
  +                     URI uri = (URI)j.next();
  +                     for ( Iterator k = applicationListeners.iterator(); 
k.hasNext(); ) {
  +                             ((ApplicationListener)k.next()).install(type, 
application.getUri(), uri);
  +                     }
                }
  -     }, context.getCredentials());
  -             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(); ) {
  -                             URI uri = (URI)j.next();
  -                             for ( Iterator k = applicationListeners.iterator(); 
k.hasNext(); ) {
  -                                     
((ApplicationListener)k.next()).install((String)entry.getKey(), application.getUri(), 
uri);
  -                             }
  -                     }
  -             }
  -             installedApplications.put(application.getUri(), application);
  +     }
  +     installedApplications.put(application.getUri(), application);
        }
        
  -     private void uninstall(Application application) {
  -        logger.log(Level.INFO, "Uninstall application '"+application.getUri()+"'");
  +     private void uninstall(String type, Application application) {
  +        logger.log(Level.INFO, "Uninstall "+type+" of application 
'"+application.getUri()+"'");
                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.12      +7 -4      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormHandler.java
  
  Index: FormHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/FormHandler.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- FormHandler.java  8 Jun 2004 09:04:05 -0000       1.11
  +++ FormHandler.java  10 Jun 2004 16:14:12 -0000      1.12
  @@ -56,6 +56,7 @@
                StringTokenizer tokenizer = new 
StringTokenizer(StringValueDescriptor.toString(parameter.get(INSTRUCTION_IDENTIFIER+trigger)),
 ";");
                URI actionURI = new URIValue(tokenizer.nextToken());
                boolean validate = 
Boolean.valueOf(tokenizer.nextToken()).booleanValue();
  +             boolean wizard = Boolean.valueOf(tokenizer.nextToken()).booleanValue();
                String lastStep = tokenizer.nextToken();
                String targetStep = tokenizer.nextToken();
                URI bookmarkUri = new URIValue(tokenizer.nextToken());
  @@ -90,9 +91,11 @@
                        map.put(parameterName, 
ProcessorHelper.validate(parameterDescriptors[i], parameter.get(parameterName), 
context));
                    }
                }
  -             // Don't validate target step form
  -             map.put(ControlComposer.VALIDATE, BooleanValue.FALSE);
  -             } catch ( ValidationException exception ) {
  +             if ( wizard ) { 
  +                     // Don't validate target step form
  +                     map.put(ControlComposer.VALIDATE, BooleanValue.FALSE);
  +             }
  +         } catch ( ValidationException exception ) {
                // 3. Go back to form step if validation failes
                        map.put(Process.STEP, new StringValue(lastStep));
                }
  
  
  
  1.10      +7 -3      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Trigger.java
  
  Index: Trigger.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/processor/form/Trigger.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Trigger.java      8 Jun 2004 09:04:05 -0000       1.9
  +++ Trigger.java      10 Jun 2004 16:14:12 -0000      1.10
  @@ -30,6 +30,7 @@
        public final static String INSTRUCTION = "instruction";
       public final static String ACTION = "action";
       public final static String VALIDATE = "validate";
  +    public final static String WIZARD = "wizard";
        public final static String BOOKMARK = "bookmark";
        public final static String INVOLVED_PARAMETERS = "involved-parameters";
        public final char SEPARATOR = ';';
  @@ -48,9 +49,10 @@
        StringValue []involvedParameters = 
(StringValue[])((ArrayValue)parameter.get(INVOLVED_PARAMETERS)).getArray();
        String targetStep = parameter.get(Process.STEP).toString();
        BooleanValue validate = (BooleanValue)parameter.get(VALIDATE);
  +     BooleanValue wizard = (BooleanValue)parameter.get(WIZARD);
        URI actionUri = (URI)parameter.get(ACTION);
                StringBuffer buffer = new StringBuffer(128);
  -             
buffer.append(actionUri).append(SEPARATOR).append(validate).append(SEPARATOR).append(context.getStep()).append(SEPARATOR).append(targetStep).append(SEPARATOR).append(bookmark).append(SEPARATOR).append(context.getProcess());
  +             
buffer.append(actionUri).append(SEPARATOR).append(validate).append(SEPARATOR).append(wizard).append(SEPARATOR).append(context.getStep()).append(SEPARATOR).append(targetStep).append(SEPARATOR).append(bookmark).append(SEPARATOR).append(context.getProcess());
        if ( validate.booleanValue() ) {
                for ( int i = 0; i < involvedParameters.length; i++ ) {
                        buffer.append(SEPARATOR).append(involvedParameters[i]);
  @@ -64,7 +66,7 @@
       public void configure(StreamableValue config) throws ConfigurationException {
           super.configure(config);
           ParameterDescriptor[] parentParameterDescriptors = 
super.getParameterDescriptors();
  -        parameterDescriptors = new 
ParameterDescriptor[parentParameterDescriptors.length + 4];
  +        parameterDescriptors = new 
ParameterDescriptor[parentParameterDescriptors.length + 5];
           int counter = 0;
           for ( int i = 0; i < parentParameterDescriptors.length; i++ ) {
               if (!parentParameterDescriptors[i].getName().equals(FRAGMENT)) {
  @@ -82,6 +84,8 @@
               new ParameterDescriptor(BOOKMARK, new 
ParameterMessage("trigger/bookmark"), new URIValueDescriptor(), NullValue.NULL );
           parameterDescriptors[parentParameterDescriptors.length + 3] =
               new ParameterDescriptor(INVOLVED_PARAMETERS, new 
ParameterMessage("trigger/involvedParameters"), new ArrayValueDescriptor(new 
StringValueDescriptor()));
  +        parameterDescriptors[parentParameterDescriptors.length + 4] =
  +            new ParameterDescriptor(WIZARD, new ParameterMessage("trigger/wizard"), 
new BooleanValueDescriptor(), BooleanValue.FALSE);
       }
   
       public ParameterDescriptor[] getParameterDescriptors() {
  
  
  
  1.10      +44 -55    
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Scheduler.java
  
  Index: Scheduler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Scheduler.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Scheduler.java    8 Jun 2004 14:43:15 -0000       1.9
  +++ Scheduler.java    10 Jun 2004 16:14:12 -0000      1.10
  @@ -22,12 +22,14 @@
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
  -public class Scheduler {
  +public class Scheduler implements ApplicationListener {
       private final static Logger logger = 
Logger.getLogger(Scheduler.class.getName());
   
       public final static String JOBS = "jobs.xml";
       public final static String JOB_DEFINITIONS = "jobDefinitions.xml";
   
  +    private final static String STARTUP_IDENTIFIER = "startup:";
  +
       private final Context context = new SystemContext();
   
       private static Scheduler scheduler = new Scheduler();
  @@ -35,7 +37,8 @@
       private static Timer timer = new Timer();
   
       private List jobs = new ArrayList();
  -    private List jobDefinitions = new ArrayList();
  +    private List restoredJobs = new ArrayList();
  +    private List installedJobNames = new ArrayList();
   
       private Map installedJobs = new HashMap();
       
  @@ -46,57 +49,72 @@
           return scheduler;
       }
   
  -    public void install(String type, URI configurationUri) {
  +    public void install(String type, URI applicationUri, URI configurationUri) {
        if ( type == Application.JOBS ) {
  -             install(configurationUri, true);
  +             install(configurationUri, false);
        }
       }
       
  -    public void uninstall(String type, URI configurationUri) {
  +    public void uninstall(String type, URI applicationUri, URI configurationUri) {
        if ( type == Application.JOBS ) {
                uninstall(configurationUri);
        }
       }
       
  -    public void update(String type, URI configurationUri) {
  +    public void update(String type, URI applicationUri, URI configurationUri) {
        if ( type == Application.JOBS ) {
                update(configurationUri);
        }
       }
       
  -    public void install(URI jobsUri, boolean listen) {
  +    public void install(URI jobsUri, boolean restoreRunningJobs) {
        logger.log(Level.INFO, "Installing scheduled jobs of application 
'"+jobsUri+"'");
        try {
  -             Map applicationJobs = new HashMap();
  -             StreamableValue jobsResource = 
(StreamableValue)ConnectorFactory.getConnector().getResource(jobsUri, 
Constants.CREDENTIALS);
  +             List applicationJobs = new ArrayList();
  +             StreamableValue jobsResource = 
(StreamableValue)ConnectorFactory.getConnector().getResource(new 
URIValue(Constants.REPOSITORY_DOMAIN+jobsUri), Constants.CREDENTIALS);
  +             // FIXME: Beautify the code...
                if ( jobsResource != null ) {
                        DocumentValue documentResource = new 
DocumentValue(jobsResource);
                        Document document = documentResource.getDocument();
                        Element rootElement = document.getRootElement();
                        List jobElements = 
XPath.newInstance("/jobs/job").selectNodes(rootElement);
  +                     List configuredJobs = new ArrayList();
                        for ( Iterator i = jobElements.iterator(); i.hasNext(); ) {
                                Element jobElement = (Element)i.next();
                                Step job = new Step();
                                job.configure(jobElement);
  +                             if ( 
!installedJobNames.contains(STARTUP_IDENTIFIER+job.getName()) ) {
  +                                     configuredJobs.add(job);
  +                                     installedJobNames.add(job.getName());
  +                             }
  +                     }
  +                     // Note: starting jobs after reading all, to avoid writing to 
configuration files while reading...
  +                     for ( Iterator i = configuredJobs.iterator(); i.hasNext(); ) { 
  +                             Step job = (Step)i.next();
  +                             if ( job.getName().startsWith(STARTUP_IDENTIFIER) ) {
  +                                     context.setStep(job.getName());
  +                             } else {
  +                                     
context.setStep(STARTUP_IDENTIFIER+job.getName());
  +                             }
                                Processor processor = 
ProcessorManager.getInstance().getProcessor(job.getProcessorURI());
                                Map processorParameters = Process.loadParameters(job, 
processor, new HashMap(), null, context);
                                
ProcessorHelper.validate(processor.getParameterDescriptors(), processorParameters, 
context);
                                processor.process(processorParameters, context);
  -                     }
  -                     if ( listen ) {
  -                             ConnectorFactory.getConnector().subscribe("Update", 
jobsUri,
  -                                             0, Constants.SUBSCRIPTION_LIFETIME, 
Constants.NOTIFICATION_DELAY,
  -                                                     new Subscriber() {
  -                                     public void notify(URI uri, Map information) {
  -                                             update(uri);
  -                                     }
  -                             }, Constants.CREDENTIALS);
  +                             if ( !restoreRunningJobs ) {
  +                                     
ConnectorFactory.getConnector().subscribe("Update", new 
URIValue(Constants.REPOSITORY_DOMAIN+jobsUri),
  +                                                     0, 
Constants.SUBSCRIPTION_LIFETIME, Constants.NOTIFICATION_DELAY,
  +                                                             new Subscriber() {
  +                                             public void notify(URI uri, Map 
information) {
  +                                                     update(uri);
  +                                             }
  +                                     }, Constants.CREDENTIALS);
  +                             }
                        }
                } else {
                        logger.log(Level.INFO, "Configured jobs resource '"+jobsUri+"' 
not found!");
                }
  -             jobs.addAll(applicationJobs.values());
  -            installedJobs.put(jobsUri, applicationJobs.keySet());
  +             // FIXME: How to handle deinstallation of running jobs belonging to an 
application
  +             installedJobs.put(jobsUri, applicationJobs);
           } catch (Exception exception) {
               logger.log(Level.SEVERE, "Error while parsing messages", exception);
           }
  @@ -126,11 +144,12 @@
        }
   
        public void notify(final Job job) {
  -             if ( job.getExpression().evaluate() ) {
  +             if ( job.getRemainingCondition().evaluate() ) {
                        job.launch();
                        jobs.remove(job);
                        if ( job.repeat() ) {
  -             activateJob(new Job(job.getDefinition()));
  +                             job.restart();
  +                             registerJob(job);
               }
                }
           if ( job.isPersistent() ) {
  @@ -138,20 +157,10 @@
           }
        }
   
  -     public void registerJobDefinition(JobDefinition jobDefinition) {
  -             if ( jobDefinition.isPersistent() ) {
  -                     jobDefinitions.add(jobDefinition);
  -                     saveJobDefinitions();
  -             }
  -             activateJob(new Job(jobDefinition));
  -     }
  -     
  -    public void activateJob(Job job) {
  +    public void registerJob(Job job) {
        synchronized ( jobs ) {
               jobs.add(job);
  -        }
  -     if ( job.isPersistent() ) {
  -            saveJobs();
  +             job.activate();
           }
       }
   
  @@ -180,27 +189,7 @@
           }
           writer.writeEndTag(XMLWriter.createEndTag("jobs"));
           try {
  -            ConnectorFactory.getConnector().setResource(new 
URIValue(Constants.WORK_DIR + JOBS), new StringValue(writer.toString()), 
Constants.CREDENTIALS);
  -        } catch (IOException exception) {
  -            logger.log(Level.SEVERE, "Exception occured while writing jobs to 
repository", exception);
  -        }
  -    }
  -     
  -     public void saveJobDefinitions() {
  -        XMLStringWriter writer = XMLStringWriter.create();
  -        writer.writeXMLDeclaration();
  -        writer.writeStartTag(XMLWriter.createStartTag("job-definitions"));
  -        synchronized ( jobs ) {
  -             for ( Iterator i = jobDefinitions.iterator(); i.hasNext(); ) {
  -                JobDefinition jobDefinition = (JobDefinition)i.next();
  -                if (jobDefinition.isPersistent()) {
  -                     jobDefinition.save(writer);
  -                }
  -            }
  -        }
  -        writer.writeEndTag(XMLWriter.createEndTag("job-definitions"));
  -        try {
  -            ConnectorFactory.getConnector().setResource(new 
URIValue(Constants.WORK_DIR + JOB_DEFINITIONS), new StringValue(writer.toString()), 
Constants.CREDENTIALS);
  +            ConnectorFactory.getConnector().setResource(new 
URIValue(Constants.REPOSITORY_DOMAIN+Constants.WORK_DIR + JOBS), new 
StringValue(writer.toString()), Constants.CREDENTIALS);
           } catch (IOException exception) {
               logger.log(Level.SEVERE, "Exception occured while writing jobs to 
repository", exception);
           }
  
  
  
  1.4       +109 -13   
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Job.java
  
  Index: Job.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/engine/Job.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Job.java  8 Jun 2004 14:43:15 -0000       1.3
  +++ Job.java  10 Jun 2004 16:14:12 -0000      1.4
  @@ -19,40 +19,136 @@
    */
   package org.apache.slide.projector.engine;
   
  -import java.util.HashMap;
  +import java.io.IOException;
  +import java.util.Iterator;
  +import java.util.Map;
   import java.util.logging.Level;
   import java.util.logging.Logger;
   
   import org.apache.slide.projector.Context;
   import org.apache.slide.projector.Processor;
   import org.apache.slide.projector.SystemContext;
  +import org.apache.slide.projector.URI;
  +import org.apache.slide.projector.expression.Expression;
  +import org.apache.slide.projector.value.Value;
   
  -public class Job extends JobDefinition implements Runnable {
  +import de.zeigermann.xml.XMLStringWriter;
  +import de.zeigermann.xml.XMLWriter;
  +
  +public class Job implements Runnable {
       private final static Logger logger = Logger.getLogger(Job.class.getName());
   
  -    private JobDefinition definition;
  +    protected Expression initialCondition, remainingCondition;
  +    protected Map parameters;
  +    private URI processorUri;
  +    private boolean repeat, persistent;
  +    private String id;
       
  -    public Job(JobDefinition definition) {
  -     super(definition.getExpression(), definition.getProcessorUri(), new HashMap(), 
definition.repeat(), definition.isPersistent());
  -     this.definition = definition;
  -     this.expression = getExpression().activate(this); 
  -             this.parameter.putAll(definition.getParameter());
  +    public Job(String id, URI processorUri, Expression initalCondition, Expression 
remainingCondition, Map parameters, boolean repeat, boolean persistent) {
  +     this.id = id;
  +     this.initialCondition = initalCondition;
  +     this.remainingCondition = remainingCondition;
  +     this.parameters = parameters;
  +     this.processorUri = processorUri;
  +     this.repeat = repeat;
  +     this.persistent = persistent;
       }
   
  -    public JobDefinition getDefinition() {
  -     return definition;
  -    }
  -    
       public void run() {
           try {
               Processor processor = 
ProcessorManager.getInstance().getProcessor(getProcessorUri());
               logger.log(Level.INFO, "Launching scheduled process 
'"+getProcessorUri()+"'");
               Context context = new SystemContext();
               Scheduler.setContext(context);
  -            processor.process(getParameter(), context);
  +            processor.process(getParameters(), context);
           } catch ( Exception e ) {
               logger.log(Level.SEVERE, "Scheduled process '"+getProcessorUri()+"' 
failed", e);
           }
  +    }
  +
  +    public Expression getInitialCondition() {
  +        return initialCondition;
  +    }
  +
  +    public Expression getRemainingCondition() {
  +        return remainingCondition;
  +    }
  +
  +    public URI getProcessorUri() {
  +        return processorUri;
  +    }
  +
  +    public Map getParameters() {
  +        return parameters;
  +    }
  +
  +    public boolean repeat() {
  +        return repeat;
  +    }
  +
  +    public boolean isPersistent() {
  +        return persistent;
  +    }
  +    
  +    public void restart() {
  +     remainingCondition = initialCondition;
  +    }
  +    
  +    public void activate() {
  +     remainingCondition = remainingCondition.activate(this);
  +    }
  +    
  +    public void save(XMLStringWriter writer) {
  +     writer.writeStartTag(XMLWriter.createStartTag("job", new String[] { "id", 
"processor" }, new String[] { id, ProcessorManager.THREAD.toString() }));
  +             writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"parameters"));
  +             writer.writeStartTag(XMLWriter.createStartTag("map"));
  +        for ( Iterator i = getParameters().entrySet().iterator(); i.hasNext(); ) {
  +            Map.Entry entry = (Map.Entry)i.next();
  +            String key = (String)entry.getKey(); 
  +            writer.writeStartTag(XMLWriter.createStartTag("entry", new String[][] { 
{"key", key } }));
  +             ((Value)entry.getValue()).save(writer);
  +            writer.writeEndTag(XMLWriter.createEndTag("entry"));
  +        }
  +             writer.writeEndTag(XMLWriter.createEndTag("map"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +             writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"condition"));
  +        writer.writeStartTag(XMLWriter.createStartTag("value"));
  +        try {
  +             writer.write("<![CDATA[");
  +             getInitialCondition().save(writer);
  +             writer.write("]]>");
  +        } catch ( IOException exception ) {
  +             // ignore
  +        }
  +        writer.writeEndTag(XMLWriter.createEndTag("value"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +        writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"remainingCondition"));
  +        writer.writeStartTag(XMLWriter.createStartTag("value"));
  +        try {
  +             writer.write("<![CDATA[");
  +             getRemainingCondition().save(writer);
  +             writer.write("]]>");
  +        } catch ( IOException exception ) {
  +             // ignore
  +        }
  +        writer.writeEndTag(XMLWriter.createEndTag("value"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +             writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"repeat"));
  +        writer.writeStartTag(XMLWriter.createStartTag("value"));
  +             writer.writeCData(String.valueOf(repeat));
  +        writer.writeEndTag(XMLWriter.createEndTag("value"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +             writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"persistent"));
  +        writer.writeStartTag(XMLWriter.createStartTag("value"));
  +             writer.writeCData(String.valueOf(persistent));
  +        writer.writeEndTag(XMLWriter.createEndTag("value"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +             writer.writeStartTag(XMLWriter.createStartTag("load", "parameter", 
"processor"));
  +        writer.writeStartTag(XMLWriter.createStartTag("value"));
  +             writer.writeCData(getProcessorUri().toString());
  +        writer.writeEndTag(XMLWriter.createEndTag("value"));
  +        writer.writeEndTag(XMLWriter.createEndTag("load"));
  +        writer.writeEndTag(XMLWriter.createEndTag("job"));
       }
   
       public void launch() {
  
  
  
  1.6       +3 -1      
jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/Connector.java
  
  Index: Connector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/proposals/projector/src/java/org/apache/slide/projector/connector/Connector.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Connector.java    1 Jun 2004 07:49:58 -0000       1.5
  +++ Connector.java    10 Jun 2004 16:14:12 -0000      1.6
  @@ -15,7 +15,9 @@
    * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
    */
   public interface Connector {
  -    public Value getResource(URI uri, Credentials credentials) throws IOException;
  +     public Credentials login(String user, String password) throws IOException;
  +             
  +     public Value getResource(URI uri, Credentials credentials) throws IOException;
   
       public ArrayValue getProperties(URI uri, Credentials credentials) throws 
IOException;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to