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>







Reply via email to