You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2005/03/14 10:31:01 UTC

svn commit: r157414 - in lenya/trunk/src/java/org/apache/lenya/cms/usecase: AbstractUsecase.java DocumentUsecase.java Usecase.java UsecaseCronJob.java scheduling/ scheduling/UsecaseCronJob.java scheduling/UsecaseScheduler.java scheduling/UsecaseSchedulerImpl.java

Author: andreas
Date: Mon Mar 14 01:30:55 2005
New Revision: 157414

URL: http://svn.apache.org/viewcvs?view=rev&rev=157414
Log:
introduced UsecaseScheduler

Added:
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseCronJob.java
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseScheduler.java
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseSchedulerImpl.java
Removed:
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/UsecaseCronJob.java
Modified:
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/DocumentUsecase.java
    lenya/trunk/src/java/org/apache/lenya/cms/usecase/Usecase.java

Modified: lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java?view=diff&r1=157413&r2=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/AbstractUsecase.java Mon Mar 14 01:30:55 2005
@@ -27,16 +27,7 @@
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.ContextException;
 import org.apache.avalon.framework.context.Contextualizable;
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.cocoon.components.ContextHelper;
-import org.apache.cocoon.components.cron.CronJob;
-import org.apache.cocoon.components.cron.JobScheduler;
-import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.Session;
 import org.apache.cocoon.servlet.multipart.Part;
-import org.apache.lenya.ac.Identity;
-import org.apache.lenya.ac.Machine;
-import org.apache.lenya.ac.User;
 import org.apache.lenya.cms.publication.DocumentManager;
 
 /**
@@ -63,10 +54,9 @@
     private String sourceUrl = null;
 
     /**
-     * Returns the source URL.
-     * @return A string.
+     * @see org.apache.lenya.cms.usecase.Usecase#getSourceURL()
      */
-    protected String getSourceURL() {
+    public String getSourceURL() {
         return this.sourceUrl;
     }
 
@@ -410,51 +400,6 @@
      */
     public boolean isInteractive() {
         return true;
-    }
-
-    protected void schedule(Date date) {
-
-        JobScheduler scheduler = null;
-        try {
-            scheduler = (JobScheduler) this.manager.lookup(JobScheduler.ROLE);
-
-            Parameters parameters = new Parameters();
-            String[] names = getParameterNames();
-            for (int i = 0; i < names.length; i++) {
-                parameters.setParameter(names[i], getParameterAsString(names[i]));
-            }
-
-            Map objects = new HashMap();
-            objects.put(UsecaseCronJob.USECASE_NAME, getName());
-            objects.put(UsecaseCronJob.SOURCE_URL, getSourceURL());
-
-            Request request = ContextHelper.getRequest(this.context);
-            Session session = request.getSession(false);
-            if (session != null) {
-                Identity identity = (Identity) session.getAttribute(Identity.class.getName());
-                if (identity != null) {
-                    User user = identity.getUser();
-                    if (user != null) {
-                        objects.put(UsecaseCronJob.USER_ID, user.getId());
-                    }
-                    Machine machine = identity.getMachine();
-                    if (machine != null) {
-                        objects.put(UsecaseCronJob.MACHINE_IP, machine.getIp());
-                    }
-                }
-            }
-
-            String role = CronJob.class.getName() + "/usecase";
-            scheduler.fireJobAt(date, "foo", role, parameters, objects);
-
-        } catch (Exception e) {
-            getLogger().error("Could not create job: ", e);
-            throw new RuntimeException(e);
-        } finally {
-            if (scheduler != null) {
-                this.manager.release(scheduler);
-            }
-        }
     }
 
     private String name;

Modified: lenya/trunk/src/java/org/apache/lenya/cms/usecase/DocumentUsecase.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/DocumentUsecase.java?view=diff&r1=157413&r2=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/DocumentUsecase.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/DocumentUsecase.java Mon Mar 14 01:30:55 2005
@@ -131,7 +131,7 @@
     /**
      * @see org.apache.lenya.cms.usecase.AbstractUsecase#getSourceURL()
      */
-    protected String getSourceURL() {
+    public String getSourceURL() {
         if (this.sourceDocument == null) {
             return super.getSourceURL();
         }

Modified: lenya/trunk/src/java/org/apache/lenya/cms/usecase/Usecase.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/Usecase.java?view=diff&r1=157413&r2=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/Usecase.java (original)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/Usecase.java Mon Mar 14 01:30:55 2005
@@ -127,6 +127,11 @@
      *             system.
      */
     void execute() throws UsecaseException;
+    
+    /**
+     * @return The web application URL the usecase was invoked on.
+     */
+    String getSourceURL();
 
     /**
      * Returns the webapp URL which should be redirected to after the usecase is

Added: lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseCronJob.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseCronJob.java?view=auto&rev=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseCronJob.java (added)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseCronJob.java Mon Mar 14 01:30:55 2005
@@ -0,0 +1,283 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.usecase.scheduling;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.cocoon.Cocoon;
+import org.apache.cocoon.components.CocoonComponentManager;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.components.cron.ConfigurableCronJob;
+import org.apache.cocoon.components.cron.ServiceableCronJob;
+import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Session;
+import org.apache.cocoon.environment.commandline.CommandLineRequest;
+import org.apache.lenya.ac.AccessControlException;
+import org.apache.lenya.ac.AccessController;
+import org.apache.lenya.ac.AccessControllerResolver;
+import org.apache.lenya.ac.Identifiable;
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.ac.Machine;
+import org.apache.lenya.ac.User;
+import org.apache.lenya.ac.UserManager;
+import org.apache.lenya.ac.impl.DefaultAccessController;
+import org.apache.lenya.cms.usecase.Usecase;
+import org.apache.lenya.cms.usecase.UsecaseResolver;
+
+/**
+ * Job to schedule usecase execution.
+ * 
+ * @version $Id:$
+ */
+public class UsecaseCronJob extends ServiceableCronJob implements ConfigurableCronJob,
+        Contextualizable {
+
+    /**
+     * Initializes the job.
+     * @param usecase The usecase.
+     */
+    public void setup(Usecase usecase) {
+        this.usecaseName = usecase.getName();
+        String[] keys = usecase.getParameterNames();
+        for (int i = 0; i < keys.length; i++) {
+            this.parameters.put(keys[i], usecase.getParameter(keys[i]));
+        }
+    }
+
+    private String usecaseName;
+    private String sourceUrl;
+    private String userId;
+    private String machineIp;
+
+    private Map parameters = new HashMap();
+
+    protected static final String USECASE_NAME = "usecaseName";
+    protected static final String SOURCE_URL = "sourceUrl";
+    protected static final String USER_ID = "userId";
+    protected static final String MACHINE_IP = "machineIp";
+
+    protected String getUsecaseName() {
+        return this.usecaseName;
+    }
+
+    protected String getSourceURL() {
+        return this.sourceUrl;
+    }
+
+    protected Map getParameters() {
+        return Collections.unmodifiableMap(this.parameters);
+    }
+
+    /**
+     * @see org.apache.cocoon.components.cron.CronJob#execute(java.lang.String)
+     */
+    public void execute(String jobname) {
+        UsecaseResolver resolver = null;
+        Usecase usecase = null;
+        try {
+
+            setupOriginalRequest();
+
+            authorizeRequest();
+
+            resolver = (UsecaseResolver) this.manager.lookup(UsecaseResolver.ROLE);
+            usecase = resolver.resolve(getSourceURL(), getUsecaseName());
+
+            usecase.setSourceURL(getSourceURL());
+            usecase.setName(getUsecaseName());
+
+            passParameters(usecase);
+
+            usecase.checkPreconditions();
+            List errorMessages = usecase.getErrorMessages();
+            if (!errorMessages.isEmpty()) {
+                logErrorMessages("Pre condition messages:", errorMessages);
+            } else {
+                usecase.checkExecutionConditions();
+                errorMessages = usecase.getErrorMessages();
+                if (!errorMessages.isEmpty()) {
+                    logErrorMessages("Execution condition messages:", errorMessages);
+                } else {
+                    usecase.execute();
+                    logErrorMessages("Execution messages:", usecase.getErrorMessages());
+                    usecase.checkPostconditions();
+                    logErrorMessages("Post condition messages:", usecase.getErrorMessages());
+                }
+            }
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (resolver != null) {
+                if (usecase != null) {
+                    try {
+                        resolver.release(usecase);
+                    } catch (ServiceException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+                this.manager.release(resolver);
+            }
+        }
+    }
+
+    /**
+     * Creates a new request object based on the information from the original request which
+     * triggered the usecase.
+     */
+    protected void setupOriginalRequest() {
+        Environment env = CocoonComponentManager.getCurrentEnvironment();
+
+        Request request = ContextHelper.getRequest(this.context);
+        Map attributes = new HashMap();
+        for (Enumeration e = request.getAttributeNames(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            attributes.put(key, request.getAttribute(key));
+        }
+
+        Map requestParameters = new HashMap();
+        for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            requestParameters.put(key, request.getParameter(key));
+        }
+
+        Map objectModel = ContextHelper.getObjectModel(this.context);
+        objectModel.put(ObjectModelHelper.REQUEST_OBJECT, new CommandLineRequest(env, request
+                .getContextPath(), request.getServletPath(), getSourceURL(), attributes,
+                requestParameters));
+    }
+
+    /**
+     * Initializes the session with the access control information.
+     * @throws AccessControlException if an error occurs.
+     * @throws ServiceException if the access controller resolver could not be created.
+     */
+    protected void authorizeRequest() throws AccessControlException, ServiceException {
+
+        ServiceSelector selector = null;
+        AccessControllerResolver acResolver = null;
+        AccessController controller = null;
+        try {
+            selector = (ServiceSelector) this.manager.lookup(AccessControllerResolver.ROLE
+                    + "Selector");
+            acResolver = (AccessControllerResolver) selector
+                    .select(AccessControllerResolver.DEFAULT_RESOLVER);
+            controller = acResolver.resolveAccessController(getSourceURL());
+
+            getLogger().debug("Add identity to session");
+            getLogger().debug("User ID: [" + this.userId + "]");
+            getLogger().debug("Machine: [" + this.machineIp + "]");
+
+            Request request = ContextHelper.getRequest(this.context);
+            ((DefaultAccessController) controller).setupIdentity(request);
+            Session session = request.getSession(false);
+            Identity identity = (Identity) session.getAttribute(Identity.class.getName());
+            Identifiable[] identifiables = identity.getIdentifiables();
+            for (int i = 0; i < identifiables.length; i++) {
+                identity.removeIdentifiable(identifiables[i]);
+            }
+
+            UserManager userManager = ((DefaultAccessController) controller)
+                    .getAccreditableManager().getUserManager();
+            if (this.userId != null) {
+                User user = userManager.getUser(this.userId);
+
+                if (user == null) {
+                    throw new RuntimeException("User [" + this.userId + "] does not exist!");
+                }
+
+                identity.addIdentifiable(user);
+            }
+            if (this.machineIp != null) {
+                Machine machine = new Machine(this.machineIp);
+                identity.addIdentifiable(machine);
+            }
+
+            controller.authorize(request, getSourceURL());
+
+        } finally {
+            if (selector != null) {
+                if (acResolver != null) {
+                    if (controller != null) {
+                        acResolver.release(controller);
+                    }
+                    selector.release(acResolver);
+                }
+                this.manager.release(selector);
+            }
+        }
+
+    }
+
+    /**
+     * @param headline The headline of the messages.
+     * @param errorMessages The messages to log.
+     */
+    protected void logErrorMessages(String headline, List errorMessages) {
+        getLogger().error("Usecase [" + getUsecaseName() + "] - " + headline);
+        for (Iterator i = errorMessages.iterator(); i.hasNext();) {
+            getLogger().error((String) i.next());
+        }
+    }
+
+    /**
+     * @param usecase The usecase to pass the parameters to.
+     */
+    protected void passParameters(Usecase usecase) {
+        Map parameters = getParameters();
+        for (Iterator i = parameters.keySet().iterator(); i.hasNext();) {
+            String key = (String) i.next();
+            Object value = parameters.get(key);
+            usecase.setParameter(key, value);
+        }
+    }
+
+    /**
+     * @see org.apache.cocoon.components.cron.ConfigurableCronJob#setup(org.apache.avalon.framework.parameters.Parameters,
+     *      java.util.Map)
+     */
+    public void setup(Parameters parameters, Map objects) {
+        this.parameters.putAll(Parameters.toProperties(parameters));
+        this.usecaseName = (String) objects.get(USECASE_NAME);
+        this.sourceUrl = (String) objects.get(SOURCE_URL);
+        this.userId = (String) objects.get(USER_ID);
+        this.machineIp = (String) objects.get(MACHINE_IP);
+    }
+
+    private Context context;
+
+    /**
+     * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
+     */
+    public void contextualize(Context context) throws ContextException {
+        this.context = context;
+    }
+
+}
\ No newline at end of file

Added: lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseScheduler.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseScheduler.java?view=auto&rev=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseScheduler.java (added)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseScheduler.java Mon Mar 14 01:30:55 2005
@@ -0,0 +1,42 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.usecase.scheduling;
+
+import java.util.Date;
+
+import org.apache.lenya.cms.usecase.Usecase;
+
+/**
+ * Service to schedule usecases.
+ * 
+ * @version $Id:$
+ */
+public interface UsecaseScheduler {
+    
+    /**
+     * The Avalon role.
+     */
+    String ROLE = UsecaseScheduler.class.getName();
+
+    /**
+     * Schedules a usecase at a certain date.
+     * @param usecase The usecase.
+     * @param date The invocation date.
+     */
+    void schedule(Usecase usecase, Date date);
+    
+}

Added: lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseSchedulerImpl.java
URL: http://svn.apache.org/viewcvs/lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseSchedulerImpl.java?view=auto&rev=157414
==============================================================================
--- lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseSchedulerImpl.java (added)
+++ lenya/trunk/src/java/org/apache/lenya/cms/usecase/scheduling/UsecaseSchedulerImpl.java Mon Mar 14 01:30:55 2005
@@ -0,0 +1,115 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.usecase.scheduling;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.components.cron.CronJob;
+import org.apache.cocoon.components.cron.JobScheduler;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Session;
+import org.apache.lenya.ac.Identity;
+import org.apache.lenya.ac.Machine;
+import org.apache.lenya.ac.User;
+import org.apache.lenya.cms.usecase.Usecase;
+
+/**
+ * Usecase scheduler implementation.
+ * 
+ * @version $Id:$
+ */
+public class UsecaseSchedulerImpl extends AbstractLogEnabled implements UsecaseScheduler,
+        Serviceable, Contextualizable {
+
+    /**
+     * @see org.apache.lenya.cms.usecase.scheduling.UsecaseScheduler#schedule(org.apache.lenya.cms.usecase.Usecase,
+     *      java.util.Date)
+     */
+    public void schedule(Usecase usecase, Date date) {
+        JobScheduler scheduler = null;
+        try {
+            scheduler = (JobScheduler) this.manager.lookup(JobScheduler.ROLE);
+
+            Parameters parameters = new Parameters();
+            String[] names = usecase.getParameterNames();
+            for (int i = 0; i < names.length; i++) {
+                parameters.setParameter(names[i], usecase.getParameterAsString(names[i]));
+            }
+
+            Map objects = new HashMap();
+            objects.put(UsecaseCronJob.USECASE_NAME, usecase.getName());
+            objects.put(UsecaseCronJob.SOURCE_URL, usecase.getSourceURL());
+
+            Request request = ContextHelper.getRequest(this.context);
+            Session session = request.getSession(false);
+            if (session != null) {
+                Identity identity = (Identity) session.getAttribute(Identity.class.getName());
+                if (identity != null) {
+                    User user = identity.getUser();
+                    if (user != null) {
+                        objects.put(UsecaseCronJob.USER_ID, user.getId());
+                    }
+                    Machine machine = identity.getMachine();
+                    if (machine != null) {
+                        objects.put(UsecaseCronJob.MACHINE_IP, machine.getIp());
+                    }
+                }
+            }
+
+            String role = CronJob.class.getName() + "/usecase";
+            scheduler.fireJobAt(date, "foo", role, parameters, objects);
+
+        } catch (Exception e) {
+            getLogger().error("Could not create job: ", e);
+            throw new RuntimeException(e);
+        } finally {
+            if (scheduler != null) {
+                this.manager.release(scheduler);
+            }
+        }
+    }
+    
+    protected ServiceManager manager;
+
+    /**
+     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+     */
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+    }
+    
+    private Context context;
+
+    /**
+     * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
+     */
+    public void contextualize(Context context) throws ContextException {
+        this.context = context;
+    }
+
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org