cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Patrick Hess <patrick.h...@ish.de>
Subject CLI-style publishing from webapp
Date Sat, 17 Jan 2004 14:23:21 GMT

Hi there,

I already asked some questions about this on the users list. What I want 
to do: Inside my webapp I would like to create an action or something 
like an action to call Cocoon in CLI-style. Simplest way would be 
calling the "cocoon cli" script but that's to ugly... So my next 
approach was trying to use the CocoonBean inside of an action. I know 
this creates a complete second instance of Cocoon but that seems more 
acceptable to me than the "external-execute" approach.

Some basic infos: I'm using Cocoon 2.1.3 / Sun JVM 1.4.1 / Win2000 and
Tomcat 4.1.24 as servlet container. Cocoon was compiled as webapp.

I wrote some test code and played a bit and create a publish() method 
based on code in org.apache.cocoon.Main which sets up a CocoonBean and 
exports some Uris...

Using the java code (below) it's possible to call the publish() method
from the main() method or as action inside of Cocoon. It's setting up a 
CocoonBean and exporting 2 URIs defined in my sitemap.

Calling publish() through main() from CLI works like expected but 
calling the action from the sitemap fails with this message:

BROKEN: Environment stack has not been cleaned up properly. Please 
report this (if possible together with a test case) to the Cocoon 
developers.

Maybe it's related to 'abuse' of CocoonBean in my code? :) Maybe someone 
can help me getting this topic clearer...

- it it possible to run to instances of Coccon in the same JVM?
- is there something missing in my CocoonBean setup that causes
   the message above that can be fixed?
- is there a better way to use Cocoon CLI from a Cocoon webapp?

Thanks,
   Patrick


Output when calling publish() through action from Cocoon webapp:

------------------------------------------------------------------------
cocoon 2.1.3
Copyright (c) 1999-2003 Apache Software Foundation. All rights reserved.
------------------------------------------------------------------------


- Quartz scheduler 'Cocoon
- Quartz scheduler version: 1.2.3
- Scheduler Cocoon_$_Sat_Jan_17_15:10:07_CET_2004 started.
X [0]                                     test/data2.html	BROKEN: 
Environment stack has not been cleaned up properly. Please report this 
(if possible together with a test case) to the Cocoon developers.
X [0]                                     test/data1.html	BROKEN: 
Environment stack has not been cleaned up properly. Please report this 
(if possible together with a test case) to the Cocoon developers.
Total time: 0 minutes 2 seconds,  Site size: 0 Site pages: 0





Output when calling publish() from command line using main():

------------------------------------------------------------------------
cocoon 2.1.3
Copyright (c) 1999-2003 Apache Software Foundation. All rights reserved.
------------------------------------------------------------------------


* [1/1]     [0/0]     1.942s 3.8Kb   test/data2.html
* [2/0]     [0/0]     0.311s 4.3Kb   test/data1.html
Total time: 0 minutes 7 seconds,  Site size: 8.380 Site pages: 2





Java code used for testing, publish() method contains main code and is 
called from main()/command line or act()/as action:


package de.posi.cocoon.action;

import java.util.HashMap;
import java.util.Map;

import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.bean.CocoonBean;
import org.apache.cocoon.bean.helpers.OutputStreamListener;
import org.apache.cocoon.environment.Context;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.SourceResolver;

public class MyAction implements Action {

	
	public Map act (Redirector redirector, SourceResolver resolver,
			Map objectModel, String source,	
			Parameters parameters) {

		Context context =
			ObjectModelHelper.getContext(objectModel);

		String contextPath = context.getRealPath("/");
		
		if (publish (contextPath)) {
			return new HashMap();
		}
		
		return null;
	}

	private boolean publish (String contextPath) {

		boolean result = false;
		
		CocoonBean cocoon = new CocoonBean();
		OutputStreamListener listener
			= new OutputStreamListener (System.out);

		cocoon.addListener(listener);
		cocoon.setContextDir (contextPath);

		cocoon.setLogKit (contextPath +
					"/WEB-INF/logkit.xconf");
		cocoon.setConfigFile (contextPath +
					"/WEB-INF/cocoon.xconf");

		String destDir = contextPath + "/dest";
		cocoon.addTarget ("test/data1.html", destDir);
		cocoon.addTarget ("test/data2.html", destDir);

		listener.messageGenerated(CocoonBean.getProlog());
			
		try {
			
			cocoon.initialize();
			cocoon.process();
			result = true;

		} catch (Exception e) {
			e.printStackTrace();
		}

		cocoon.dispose();
		listener.complete();
		
		return result;
	}

	public static void main (String args[]) {

		MyAction ma = new MyAction();
		ma.publish ("C:\\Cocoon\\testapp");		
	}
}


Sitemap used for testing the action:

<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
  <map:components>
   <map:actions>
    <map:action name="publish" src="de.posi.cocoon.action.MyAction"/>
   </map:actions>
  </map:components>

  <map:pipelines>
   <map:pipeline>
    <map:match pattern="publish">

     <map:act type="publish">
      <map:redirect-to uri="http://www.google.com" />
     </map:act>
     <map:redirect-to uri="http://www.yahoo.com" />
    </map:match>

   </map:pipeline>
  </map:pipelines>
</map:sitemap>






Mime
View raw message