blob: 05e921dc3ec9c3d5c7fc314612ecf6c3b75d6619 [file] [log] [blame]
/*
* 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.components.cron;
import org.apache.avalon.framework.CascadingRuntimeException;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
/**
* A simple CronJob which calls an internal cocoon:// pipeline.
*
* You must provide it with a <pipeline>pipeline/to/call</pipeline> parameter in cocoon.xconf
* Your supplied pipeline String will have "cocoon://" prepended to it.
* If you set info log enabled, this will write the output of the pipeline to the cron log
*
* @author <a href="mailto:giacomo@apache.org">Giacomo Pati</a>
* @author <a href="http://apache.org/~reinhard">Reinhard Poetz</a>
* @author <a href="http://apache.org/~jeremy/">Jeremy Quinn</a>
* @version $Id$
*
* @since 2.1.5
*/
public class CocoonPipelineCronJob extends ServiceableCronJob
implements Configurable, ConfigurableCronJob {
public static final String PIPELINE_PARAM = "pipeline";
private String configuredPipeline;
private String pipeline;
public void execute(String name) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("CocoonPipelineCronJob: " + name + ", calling pipeline: " + pipeline);
}
SourceResolver resolver = null;
Source src = null;
InputStream is = null;
InputStreamReader reader = null;
try {
boolean append = getLogger().isInfoEnabled();
resolver = (SourceResolver)this.manager.lookup(SourceResolver.ROLE);
src = resolver.resolveURI("cocoon://" + pipeline);
is = src.getInputStream();
reader = new InputStreamReader(is);
StringBuffer sb = new StringBuffer();
char[] b = new char[8192];
int n;
while ((n = reader.read (b)) > 0) {
if ( append ) {
sb.append(b, 0, n);
}
}
reader.close();
if (append) {
getLogger().info("CocoonPipelineCronJob: " + name + ", called pipeline: " +
pipeline + ", and received following content:\n" + sb.toString());
}
} catch (Exception e) {
throw new CascadingRuntimeException("CocoonPipelineCronJob: " + name + ", raised an exception: ", e);
} finally {
try {
if (reader != null) reader.close();
if (is != null) is.close();
} catch (IOException e) {
throw new CascadingRuntimeException("CocoonPipelineCronJob: " + name + ", raised an exception: ", e);
}
if (resolver != null) {
resolver.release(src);
this.manager.release(resolver);
resolver = null;
src = null;
}
}
}
public void configure(final Configuration config) throws ConfigurationException {
this.configuredPipeline = config.getChild(PIPELINE_PARAM).getValue(null);
}
/* (non-Javadoc)
* @see org.apache.cocoon.components.cron.ConfigurableCronJob#setup(org.apache.avalon.framework.parameters.Parameters, java.util.Map)
*/
public void setup(Parameters params, Map objects) {
if (params != null) {
pipeline = params.getParameter(PIPELINE_PARAM, configuredPipeline);
} else {
pipeline = configuredPipeline;
}
}
}