/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.cocoon.acting; import org.apache.bsf.BSFManager; import org.apache.bsf.util.IOUtils; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Redirector; import org.apache.cocoon.environment.SourceResolver; import org.apache.excalibur.source.Source; import java.io.InputStreamReader; import java.io.Reader; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * A simple action that executes any script that can be run by the BSF * * @author <a href="mailto:jafoster@uwaterloo.ca">Jason Foster</a> * @version CVS $Id$ */ public class ScriptAction extends ServiceableAction implements ThreadSafe { public Map act( Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters par ) throws Exception { Source src = null; try { // Figure out what script to open. A missing script name is caught // by the resolver/SystemId grouping later on and causes an exception String scriptName = source; // Locate the appropriate file on the filesytem src = resolver.resolveURI(scriptName); String systemID = src.getURI(); if (this.getLogger().isDebugEnabled()) { getLogger().debug("script source [" + scriptName + "]"); getLogger().debug("script resolved to [" + systemID + "]"); } Reader in = new InputStreamReader(src.getInputStream()); // Set up the BSF manager and register relevant helper "beans" BSFManager mgr = new BSFManager(); HashMap actionMap = new HashMap(); // parameters to act(...) mgr.registerBean("resolver", resolver); mgr.registerBean("objectModel", objectModel); mgr.registerBean("parameters", par); // ScriptAction housekeeping mgr.registerBean("actionMap", actionMap); // helpers mgr.registerBean("logger", getLogger()); mgr.registerBean("request", ( ObjectModelHelper.getRequest(objectModel) ) ); mgr.registerBean("scriptaction", this ); mgr.registerBean("manager", this.manager ); if (this.getLogger().isDebugEnabled()) { getLogger().debug("BSFManager execution begining"); } // Execute the script mgr.exec(BSFManager.getLangFromFilename(systemID), systemID, 0, 0, IOUtils.getStringFromReader(in)); if (this.getLogger().isDebugEnabled()) { getLogger().debug("BSFManager execution complete"); } // Figure out what to return // TODO: decide on a more robust communication method if ( actionMap.containsKey( "scriptaction-continue" )) { return ( Collections.unmodifiableMap(actionMap) ); } else { return (null); } } catch (Exception e) { throw new ProcessingException( "Exception in ScriptAction.act()", e); } finally { resolver.release( src ); } // try/catch } // public Map act(...) } // public class ScriptAction