Hi cactus team, I checked out the cactus source from the branch '1.7_CARGO', and tried to migrate the framework subproject to maven 2 (without the EJB, jetty and servlet samples, documentations, integration, and the aspectj code for logging). I saw in your mailing archive that you are also planning to use maven 2 for cactus, so I think this may interest you.
Here is my question in details: During the migration, the most difficult thing is that there are cross-dependencies among different components: share-12-13-14 depends on share-13-14 as well as j2ee-1x , while j2ee-1x depends on share-12-13-14 and share-13-14: the share-xxx component needs an implementation of, for example, AbstractHttpServletRequestWrapper, while such implementation, which varies depending on the servlet spec version, is provided in the j2ee-1xcomponent. So I wondered, why didn't you use a factory to create those wrapper instances, and thus get rid of those cross-dependencies? I wrote a factory class for share-12-13-14, which creates the concrete wrapper instances for HttpServletRequestWrapper, ServletContextWrapper, ServletConfigWrapper and PageContextWrapper via java reflection. I also replaced the following entries in share-12-13-14: Those entries are..........replaced by those ones. HttpServletRequestWrapper AbstractHttpServletWrapper ServletContextWrapper AbstractServletContextWrapper ServletConfigWrapper AbstractServletConfigWrapper PageContextWrapper AbstractPageContextWrapper In this way, the shared-12-13-14 component is completely decoupled from the other components, and it does no longer need to know the name of the implementation class for abstract wrappers: the implementations are configurable. After decoupled the components, I successfully migrated cactus framework to maven 2. I tested the migration and everything goes on well. But I am still not sure if I did things right. Maybe you have some strong reasons not doing what I have done... So I would like to list the source code of my factory class below, and listen to your opinions. Thanks in advance. /** ServerSideWrapperFactory.java */ package org.apache.cactus.server.factory; import java.lang.reflect.Constructor; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.PageContext; import org.apache.cactus.ServletURL; import org.apache.cactus.server.AbstractHttpServletRequestWrapper; import org.apache.cactus.server.AbstractPageContextWrapper; import org.apache.cactus.server.AbstractServletConfigWrapper; import org.apache.cactus.server.AbstractServletContextWrapper; import org.apache.cactus.util.ChainedRuntimeException; public class ServerSideWrapperFactory { private static final String PAGE_CONTEXT_WRAPPER_IMPL = "cactus.wrapper.impl.PageContextWrapper"; private static final String DEFAULT_PAGE_CONTEXT_WRAPPER_IMPL = "org.apache.cactus.server.PageContextWrapper"; private static final String SERVLET_CONFIG_WRAPPER_IMPL = "cactus.wrapper.impl.ServletConfigWrapper"; private static final String DEFAULT_SERVLET_CONFIG_WRAPPER_IMPL = "org.apache.cactus.server.ServletConfigWrapper"; private static final String SERVLET_CONTEXT_WRAPPER_IMPL = "cactus.wrapper.impl.ServletContextWrapper"; private static final String DEFAULT_SERVLET_CONTEXT_WRAPPER_IMPL = "org.apache.cactus.server.ServletContextWrapper"; private static final String HTTP_SERVLET_REQUEST_WRAPPER_IMPL = "cactus.wrapper.impl.HttpServletRequestWrapper"; private static final String DEFAULT_HTTP_SERVLET_REQUEST_WRAPPER_IMPL = "org.apache.cactus.server.HttpServletRequestWrapper"; /** Singleton factory instance. */ private static final ServerSideWrapperFactory FACTORY = new ServerSideWrapperFactory(); private ServerSideWrapperFactory() { // Do nothing. } public static ServerSideWrapperFactory getFactory() { return FACTORY; } // Public Factory Methods -------------------------------------------------- public AbstractPageContextWrapper createPageContextWrapper( PageContext originalContext, ServletURL servletUrl) throws ChainedRuntimeException { String implClassName = System.getProperty(PAGE_CONTEXT_WRAPPER_IMPL); if (implClassName == null || implClassName.trim().equals("")) { implClassName = DEFAULT_PAGE_CONTEXT_WRAPPER_IMPL; } AbstractPageContextWrapper wrapper = null; try { Class clazz = Class.forName(implClassName); Object[] args = new Object[] { originalContext, servletUrl }; Constructor constructor = clazz.getConstructor(new Class[] { PageContext.class, ServletURL.class } ); wrapper = (AbstractPageContextWrapper) constructor.newInstance(args); } catch (Throwable th) { throw new ChainedRuntimeException("Failed to create " + "JSP page context wrapper for Cactus.", th); } return wrapper; } public AbstractServletConfigWrapper createServletConfigWrapper( ServletConfig originalConfig) throws ChainedRuntimeException { String implClassName = System.getProperty(SERVLET_CONFIG_WRAPPER_IMPL); if (implClassName == null || implClassName.trim().equals("")) { implClassName = DEFAULT_SERVLET_CONFIG_WRAPPER_IMPL; } AbstractServletConfigWrapper wrapper = null; try { Class clazz = Class.forName(implClassName); Object[] args = new Object[] { originalConfig }; Constructor constructor = clazz.getConstructor( new Class[] { ServletConfig.class} ); wrapper = (AbstractServletConfigWrapper) constructor.newInstance(args); } catch (Throwable th) { throw new ChainedRuntimeException("Failed to create " + "servlet config wrapper for Cactus.", th); } return wrapper; } public AbstractServletContextWrapper createServletContextWrapper( ServletContext originalContext) throws ChainedRuntimeException { String implClassName = System.getProperty(SERVLET_CONTEXT_WRAPPER_IMPL); if (implClassName == null || implClassName.trim().equals("")) { implClassName = DEFAULT_SERVLET_CONTEXT_WRAPPER_IMPL; } AbstractServletContextWrapper wrapper = null; try { Class clazz = Class.forName(implClassName); Object[] args = new Object[] { originalContext }; Constructor constructor = clazz.getConstructor( new Class[] { ServletContext.class} ); wrapper = (AbstractServletContextWrapper) constructor.newInstance(args); } catch (Throwable th) { throw new ChainedRuntimeException("Failed to create " + "servlet context wrapper for Cactus.", th); } return wrapper; } public AbstractHttpServletRequestWrapper createHttpServletRequestWrapper( HttpServletRequest originalRequest, ServletURL servletUrl) throws ChainedRuntimeException { String implClassName = System.getProperty( HTTP_SERVLET_REQUEST_WRAPPER_IMPL); if (implClassName == null || implClassName.trim().equals("")) { implClassName = DEFAULT_HTTP_SERVLET_REQUEST_WRAPPER_IMPL; } AbstractHttpServletRequestWrapper wrapper = null; try { Class clazz = Class.forName(implClassName); Object[] args = new Object[] { originalRequest, servletUrl }; Constructor constructor = clazz.getConstructor(new Class[] { HttpServletRequest.class, ServletURL.class } ); wrapper = (AbstractHttpServletRequestWrapper) constructor.newInstance(args); } catch (Throwable th) { throw new ChainedRuntimeException("Failed to create " + "HTTP servlet request wrapper for Cactus.", th); } return wrapper; } } Best Regards. -- ZHENG Zhong 1 Avenue Alphand 75116 Paris, France +33 6 76 80 45 90 http://heavyz.sourceforge.net http://heavyz.blogspot.com http://spaces.msn.com/members/zhengzhong