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