crafterm 2003/03/05 03:35:30
Modified: . blocks.properties gump.xml
Added: src/blocks/axis build.xml
src/blocks/axis/conf soapserver.xconf soapserver.xroles
src/blocks/axis/java/org/apache/cocoon/components/axis
SoapServer.java SoapServerImpl.java
src/blocks/axis/java/org/apache/cocoon/components/axis/providers
AvalonProvider.java
src/blocks/axis/java/org/apache/cocoon/reading
AxisRPCReader.java
src/blocks/axis/java/org/apache/cocoon/webservices
AbstractComposableService.java
AbstractLogEnabledService.java
src/blocks/axis/java/org/apache/cocoon/webservices/cache
DeploymentDescriptor.wsdd
src/blocks/axis/java/org/apache/cocoon/webservices/instrument
DeploymentDescriptor.wsdd
InstrumentationService.java
InstrumentationServiceImpl.java
instrumentation.xconf instrumentation.xroles
src/blocks/axis/java/org/apache/cocoon/webservices/memory
DeploymentDescriptor.wsdd Memory.java
src/blocks/axis/java/org/apache/cocoon/webservices/system
DeploymentDescriptor.wsdd System.java
src/blocks/axis/lib axis-1.0.jar axis-jaxrpc-1.0.jar
axis-saaj-1.0.jar commons-discovery.jar
excalibur-util-1.0.jar wsdl4j.jar
Removed: src/scratchpad/src/org/apache/cocoon/components/axis
SoapServer.java SoapServerImpl.java
soapserver.xconf soapserver.xroles
src/scratchpad/src/org/apache/cocoon/components/axis/providers
AvalonProvider.java
src/scratchpad/src/org/apache/cocoon/reading
AxisRPCReader.java
src/scratchpad/src/org/apache/cocoon/webservices
AbstractComposableService.java
AbstractLogEnabledService.java
src/scratchpad/src/org/apache/cocoon/webservices/cache
DeploymentDescriptor.wsdd
src/scratchpad/src/org/apache/cocoon/webservices/instrument
DeploymentDescriptor.wsdd
InstrumentationService.java
InstrumentationServiceImpl.java
instrumentation.xconf instrumentation.xroles
src/scratchpad/src/org/apache/cocoon/webservices/memory
DeploymentDescriptor.wsdd Memory.java
src/scratchpad/src/org/apache/cocoon/webservices/system
DeploymentDescriptor.wsdd System.java
Log:
Migrated Axis soap server from scratchpad to a block.
Revision Changes Path
1.10 +2 -1 xml-cocoon2/blocks.properties
Index: blocks.properties
===================================================================
RCS file: /home/cvs/xml-cocoon2/blocks.properties,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- blocks.properties 27 Feb 2003 14:42:55 -0000 1.9
+++ blocks.properties 5 Mar 2003 11:35:26 -0000 1.10
@@ -6,7 +6,7 @@
# corrisponding exclude property
# NOTE: don't modify this file directly but make a copy named
-# 'local.blocks.properties' and modify that. The build system will overwrite
+# 'local.blocks.properties' and modify that. The build system will override
# these properties with the ones in the 'local.blocks.properties' file.
# WARNING: due to the way Ant works, in order to to include a block you have
@@ -62,3 +62,4 @@
#exclude.block.asciiart=
#exclude.block.precept=
exclude.block.mail=
+#exclude.block.axis=
1.5 +19 -0 xml-cocoon2/gump.xml
Index: gump.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/gump.xml,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- gump.xml 3 Mar 2003 11:41:07 -0000 1.4
+++ gump.xml 5 Mar 2003 11:35:26 -0000 1.5
@@ -624,6 +624,25 @@
<nag from="Gump" to="[email protected]"/>
</project>
+ <project name="cocoon-block-axis" status="unstable">
+ <package>org.apache.cocoon</package>
+
+ <ant target="block">
+ <property name="block-name" value="axis"/>
+ </ant>
+
+ <depend project="xml-cocoon2"/>
+ <depend project="cocoon-block-axis"/>
+ <depend project="axis" version="supplied"/>
+
+ <work nested="tools/anttasks"/>
+ <home nested="build/cocoon"/>
+
+ <jar name="axis.jar"/>
+
+ <nag from="Gump" to="[email protected]"/>
+ </project>
+
<!--
********************************************
******** COCOON SUPPLIED PROJECTS ********
1.1 xml-cocoon2/src/blocks/axis/build.xml
Index: build.xml
===================================================================
<project default="main" basedir=".">
<target name="main">
<copy filtering="off" todir="${build.blocks}/axis/dest">
<fileset dir="${blocks}/axis/java">
<include name="**/*.wsdd" />
</fileset>
</copy>
</target>
</project>
1.1 xml-cocoon2/src/blocks/axis/conf/soapserver.xconf
Index: soapserver.xconf
===================================================================
<?xml version="1.0"?>
<xconf xpath="/cocoon" unless="[EMAIL
PROTECTED]'org.apache.cocoon.components.axis.SoapServer']">
<component role="org.apache.cocoon.components.axis.SoapServer"
class="org.apache.cocoon.components.axis.SoapServerImpl"
logger="core.source.soapserver">
<managed-services>
<descriptor
src="resource://org/apache/cocoon/webservices/memory/DeploymentDescriptor.wsdd"/>
<descriptor
src="resource://org/apache/cocoon/webservices/system/DeploymentDescriptor.wsdd"/>
<descriptor
src="resource://org/apache/cocoon/webservices/cache/DeploymentDescriptor.wsdd"/>
<descriptor
src="resource://org/apache/cocoon/webservices/instrument/DeploymentDescriptor.wsdd"/>
</managed-services>
</component>
</xconf>
1.1 xml-cocoon2/src/blocks/axis/conf/soapserver.xroles
Index: soapserver.xroles
===================================================================
<?xml version="1.0"?>
<!-- not yet used -->
<xroles xpath="/role-list" unless="[EMAIL
PROTECTED]'org.apache.cocoon.components.axis.SoapServer']">
<role name="org.apache.cocoon.components.axis.SoapServer"
shorthand="soap-server"
default-class="org.apache.cocoon.components.axis.SoapServerImpl"/>
</xroles>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/components/axis/SoapServer.java
Index: SoapServer.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.components.axis;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.component.Component;
import org.apache.axis.MessageContext;
/**
* <code>SoapServer</code> interface.
*
* <p>
* This interface describes the operations provided by any Axis
* Soap Server implementations.
* </p>
*
* <p>
* Example use:
*
* <pre>
* SoapServer server = (SoapServer) manager.lookup(SoapServer.ROLE);
* MessageContext message = server.createMessageContext(req, res, con);
* server.invoke(message);
* manager.release(server);
* // message sent back to sender
* </pre>
* </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: SoapServer.java,v 1.1 2003/03/05 11:35:27 crafterm Exp $
*/
public interface SoapServer extends Component, Startable
{
/**
* Component's ROLE definition
*/
String ROLE = SoapServer.class.getName();
/**
* Constant used to key message context entries for an avalon logger
*/
String LOGGER = "axis-message-context-logger";
/**
* Invoke a particular message context on this server. This method
* takes the given message, invokes it on the server and sets
* the response inside it for the caller to retrieve.
*
* @param message a <code>MessageContext</code> instance
* @exception Exception if an error occurs
*/
void invoke(MessageContext message)
throws Exception;
/**
* Method to create a new message context, based on this Axis
* server instance, and the caller's request, response, and
* context objects.
*
* @param req a <code>HttpServletRequest</code> instance
* @param res a <code>HttpServletResponse</code> instance
* @param con a <code>ServletContext</code> instance
* @return a <code>MessageContext</code> instance
*/
MessageContext createMessageContext(
HttpServletRequest req,
HttpServletResponse res,
ServletContext con
);
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/components/axis/SoapServerImpl.java
Index: SoapServerImpl.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.components.axis;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
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.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.axis.AxisEngine;
import org.apache.axis.Constants;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.configuration.FileProvider;
import org.apache.axis.deployment.wsdd.WSDDDeployment;
import org.apache.axis.deployment.wsdd.WSDDDocument;
import org.apache.axis.deployment.wsdd.WSDDService;
import org.apache.axis.security.servlet.ServletSecurityProvider;
import org.apache.axis.server.AxisServer;
import org.apache.axis.transport.http.HTTPConstants;
import org.apache.axis.transport.http.HTTPTransport;
import org.apache.axis.transport.http.ServletEndpointContextImpl;
import org.apache.axis.utils.XMLUtils;
import org.apache.cocoon.components.axis.providers.AvalonProvider;
import org.apache.cocoon.util.IOUtils;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
import org.apache.excalibur.xml.dom.DOMParser;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
/**
* SOAP Server Implementation
*
* <p>
* This server accepts a SOAP Request, and generates the resultant
* response as output. Essentially, this reader allows you to serve SOAP
* requests from your Cocoon application.
* </p>
*
* <p>
* Code originates from the Apache
* <a href="http://xml.apache.org/axis">AXIS</a> project,
* <code>org.apache.axis.http.transport.AxisServlet</code>.
* </p>
*
* Ported to Cocoon by:
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
*
* Original <code>AxisServlet</code> authors:
*
* @author <a href="mailto:">Steve Loughran</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Doug Davis</a>
*
* @version CVS $Id: SoapServerImpl.java,v 1.1 2003/03/05 11:35:27 crafterm
Exp $
*/
public class SoapServerImpl extends AbstractLogEnabled
implements SoapServer, Composable, Configurable, Contextualizable,
Initializable,
Startable, ThreadSafe
{
/**
* Constant describing the default location of the server configuration
file
*/
public static final String DEFAULT_SERVER_CONFIG
= "resource://org/apache/axis/server/server-config.wsdd";
// transport name
private String m_transportName;
// security provider reference
private ServletSecurityProvider m_securityProvider;
// JWS output directory
private String m_jwsClassDir;
// per-instance cache of the axis server
private AxisServer m_axisServer;
// axis server configuration
private FileProvider m_engineConfig;
// location of attachments
private String m_attachmentDir;
// server configuration
private Source m_serverWSDD;
// array containing locations to descriptors this reader should manage
private WSDDDocument[] m_descriptors;
// context reference
private Context m_context;
// component manager reference
private ComponentManager m_manager;
/**
* Contextualize this Reader.
*
* @param context a <code>Context</code> instance
* @exception ContextException if an error occurs
*/
public void contextualize(final Context context)
throws ContextException
{
m_context = context;
}
/**
* Compose this server
*
* @param manager a <code>ComponentManager</code> value
* @exception ComponentException if an error occurs
*/
public void compose(ComponentManager manager)
throws ComponentException
{
m_manager = manager;
}
/**
* Configures this reader.
*
* <p>
* Sets the following optional configuration settings:
*
* <ul>
* <li>Server WSDD configuration
* <li>Attachment directory
* <li>JWS directory
* <li>Security provider
* <li>Transport name
* <li>Mananged services
* </ul>
* </p>
*
* <p>
* The following format is used:
* <pre>
* <soap-server>
* <server-wsdd src="..."/>
* <attachment-dir src="..."/>
* <jws-dir src="..."/>
* <security-provider enabled="..."/>
* <transport name="..."/>
* <managed-services>
* <descriptor src="..."/>
* <descriptor src="..."/>
* </managed-services>
* </soap-server>
* </pre>
* </p>
*
* @param config a <code>Configuration</code> instance
* @exception ConfigurationException if an error occurs
*/
public void configure(final Configuration config)
throws ConfigurationException
{
try {
setServerConfig(config);
setAttachmentDir(config);
setJWSDir(config);
setSecurityProvider(config);
setTransportName(config);
setManagedServices(config);
if (getLogger().isDebugEnabled()) {
getLogger().debug("SoapServerImpl.configure() complete");
}
} catch (final Exception e) {
throw new ConfigurationException("Error during configuration", e);
}
}
/**
* Helper method to set the axis server configuration.
*
* @param config a <code>Configuration</code> instance
* @exception Exception if an error occurs
*/
public void setServerConfig(final Configuration config)
throws Exception
{
final Configuration wsdd = config.getChild("server-wsdd");
SourceResolver resolver = null;
try
{
resolver = (SourceResolver) m_manager.lookup(SourceResolver.ROLE);
m_serverWSDD =
resolver.resolveURI(
wsdd.getAttribute("src", DEFAULT_SERVER_CONFIG)
);
}
finally
{
if (resolver != null) m_manager.release(resolver);
}
}
/**
* Helper method to set the attachment dir. If no attachment directory has
* been specified, then its set up to operate out of the Cocoon workarea.
*
* @param config a <code>Configuration</code> instance
* @exception ConfigurationException if a configuration error occurs
* @exception ContextException if a context error occurs
*/
private void setAttachmentDir(final Configuration config)
throws ConfigurationException, ContextException
{
final Configuration dir = config.getChild("attachment-dir");
m_attachmentDir = dir.getAttribute("src", null);
if (m_attachmentDir == null)
{
File workDir =
(File)
m_context.get(org.apache.cocoon.Constants.CONTEXT_WORK_DIR);
File attachmentDir =
IOUtils.createFile(workDir, "attachments" + File.separator);
m_attachmentDir = IOUtils.getFullFilename(attachmentDir);
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("attachment directory = " + m_attachmentDir);
}
}
/**
* Helper method to set the JWS class dir. If no directory is specified
then
* the directory <i>axis-jws</i> is used, under the Cocoon workarea.
*
* @param config a <code>Configuration</code> instance
* @exception ConfigurationException if a configuration error occurs
* @exception ContextException if a context error occurs
*/
private void setJWSDir(final Configuration config)
throws ConfigurationException, ContextException
{
final Configuration dir = config.getChild("jws-dir");
m_jwsClassDir = dir.getAttribute("src", null);
if (m_jwsClassDir == null)
{
File workDir =
(File)
m_context.get(org.apache.cocoon.Constants.CONTEXT_WORK_DIR);
File jwsClassDir =
IOUtils.createFile(workDir, "axis-jws" + File.separator);
m_jwsClassDir = IOUtils.getFullFilename(jwsClassDir);
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("jws class directory = " + m_jwsClassDir);
}
}
/**
* Helper method to set the security provider.
*
* @param config a <code>Configuration</code> instance
* @exception ConfigurationException if an error occurs
*/
private void setSecurityProvider(final Configuration config)
throws ConfigurationException
{
final Configuration secProvider =
config.getChild("security-provider", false);
if (secProvider != null)
{
final String attr = secProvider.getAttribute("enabled");
final boolean providerIsEnabled =
"true".equalsIgnoreCase(attr) || "yes".equalsIgnoreCase(attr);
if (providerIsEnabled)
m_securityProvider = new ServletSecurityProvider();
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("security provider = " + m_securityProvider);
}
}
/**
* Helper method to set the transport name
*
* @param config a <code>Configuration</code> instance
* @exception ConfigurationException if an error occurs
*/
private void setTransportName(final Configuration config)
throws ConfigurationException
{
final Configuration name = config.getChild("transport");
m_transportName =
name.getAttribute("name", HTTPTransport.DEFAULT_TRANSPORT_NAME);
}
/**
* Helper method to obtain a list of managed services from the given
* configuration (ie. locations of deployement descriptors to be
* deployed).
*
* @param config a <code>Configuration</code> value
* @exception Exception if an error occurs
*/
private void setManagedServices(final Configuration config)
throws Exception
{
final Configuration m = config.getChild("managed-services", false);
final List descriptors = new ArrayList();
if (m != null)
{
SourceResolver resolver = null;
DOMParser parser = null;
try
{
final Configuration[] services = m.getChildren("descriptor");
resolver = (SourceResolver)
m_manager.lookup(SourceResolver.ROLE);
parser = (DOMParser) m_manager.lookup(DOMParser.ROLE);
for (int i = 0; i < services.length; ++i)
{
final String location = services[i].getAttribute("src");
Source source = resolver.resolveURI(location);
final Document d =
parser.parseDocument(
new InputSource(
new InputStreamReader(source.getInputStream())
)
);
descriptors.add(new WSDDDocument(d));
}
}
finally
{
if (resolver != null) m_manager.release(resolver);
if (parser != null) m_manager.release((Component)parser);
}
}
// convert the list of descriptors to an array, for easier iteration
m_descriptors =
(WSDDDocument[]) descriptors.toArray(new WSDDDocument[]{});
}
/**
* Initialize this reader, creates AXIS server engine.
*
* @exception Exception if an error occurs
*/
public void initialize()
throws Exception
{
m_axisServer = createEngine();
if (getLogger().isDebugEnabled())
{
getLogger().debug("SoapServerImpl.initialize() complete");
}
}
/**
* Starts this reader. Deploys all managed services as specified at
* configuration time.
*
* @exception Exception if an error occurs
*/
public void start()
throws Exception
{
// deploy all configured services
for (int i = 0; i < m_descriptors.length; ++i)
{
WSDDDeployment deployment = m_engineConfig.getDeployment();
m_descriptors[i].deploy(deployment);
if (getLogger().isDebugEnabled())
{
getLogger().debug(
"Deployed Descriptor:\n" +
XMLUtils.DocumentToString(m_descriptors[i].getDOMDocument())
);
}
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("SoapServerImpl.start() complete");
}
}
/**
* Stops this reader. Undeploys all managed services this reader
* currently manages (includes services dynamically added to the reader
* during runtime).
*
* @exception Exception if an error occurs
*/
public void stop()
throws Exception
{
WSDDDeployment deployment = m_engineConfig.getDeployment();
WSDDService[] services = deployment.getServices();
// undeploy all deployed services
for (int i = 0; i < services.length; ++i)
{
deployment.undeployService(services[i].getQName());
if (getLogger().isDebugEnabled())
{
getLogger().debug("Undeployed: " + services[i].toString());
}
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("SoapServerImpl.stop() complete");
}
}
public void invoke(MessageContext message)
throws Exception
{
m_axisServer.invoke(message);
}
/**
* Place the Request message in the MessagContext object - notice
* that we just leave it as a 'ServletRequest' object and let the
* Message processing routine convert it - we don't do it since we
* don't know how it's going to be used - perhaps it might not
* even need to be parsed.
*/
public MessageContext createMessageContext(
HttpServletRequest req,
HttpServletResponse res,
ServletContext con
)
{
MessageContext msgContext = new MessageContext(m_axisServer);
String webInfPath = con.getRealPath("/WEB-INF");
String homeDir = con.getRealPath("/");
// Set the Transport
msgContext.setTransportName(m_transportName);
// Add Avalon specifics to MessageContext
msgContext.setProperty(LOGGER, getLogger());
msgContext.setProperty(AvalonProvider.COMPONENT_MANAGER, m_manager);
// Save some HTTP specific info in the bag in case someone needs it
msgContext.setProperty(Constants.MC_JWS_CLASSDIR, m_jwsClassDir);
msgContext.setProperty(Constants.MC_HOME_DIR, homeDir);
msgContext.setProperty(Constants.MC_RELATIVE_PATH,
req.getServletPath());
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLET, this );
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST, req );
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETRESPONSE, res );
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETLOCATION,
webInfPath);
msgContext.setProperty(HTTPConstants.MC_HTTP_SERVLETPATHINFO,
req.getPathInfo() );
msgContext.setProperty(HTTPConstants.HEADER_AUTHORIZATION,
req.getHeader(HTTPConstants.HEADER_AUTHORIZATION));
msgContext.setProperty(Constants.MC_REMOTE_ADDR, req.getRemoteAddr());
// Set up a javax.xml.rpc.server.ServletEndpointContext
ServletEndpointContextImpl sec = new ServletEndpointContextImpl();
msgContext.setProperty(Constants.MC_SERVLET_ENDPOINT_CONTEXT, sec);
// Save the real path
String realpath = con.getRealPath(req.getServletPath());
if (realpath != null)
{
msgContext.setProperty(Constants.MC_REALPATH, realpath);
}
msgContext.setProperty(Constants.MC_CONFIGPATH, webInfPath);
if (m_securityProvider != null)
msgContext.setProperty("securityProvider", m_securityProvider);
// write out the contents of the message context for debugging
purposes
if (getLogger().isDebugEnabled())
{
debugMessageContext(msgContext);
}
return msgContext;
}
/**
* Helper method to log the contents of a given message context
*
* @param context a <code>MessageContext</code> instance
*/
private void debugMessageContext(final MessageContext context)
{
for (final Iterator i = context.getPropertyNames();
i.hasNext();
)
{
final String key = (String) i.next();
getLogger().debug(
"MessageContext: Key:" + key + ": Value: " +
context.getProperty(key)
);
}
}
/**
* This is a uniform method of initializing AxisServer in a servlet
* context.
*/
public AxisServer createEngine()
throws Exception
{
AxisServer engine = AxisServer.getServer(getEngineEnvironment());
if (getLogger().isDebugEnabled())
{
getLogger().debug("Axis engine created");
}
return engine;
}
protected Map getEngineEnvironment()
throws Exception
{
Map env = new HashMap();
// use FileProvider directly with a Avalon Source object instead of
going
// through the EngineConfigurationFactoryServlet class
m_engineConfig = new FileProvider(m_serverWSDD.getInputStream());
env.put(EngineConfiguration.PROPERTY_NAME, m_engineConfig);
env.put(AxisEngine.ENV_ATTACHMENT_DIR, m_attachmentDir);
// REVISIT(MC): JNDI Factory support ?
//env.put(AxisEngine.ENV_SERVLET_CONTEXT, context);
return env;
}
/**
* Helper method to convert a <code>Message</code> structure
* into a <code>String</code>.
*
* @param msg a <code>Message</code> value
* @return a <code>String</code> value
*/
private String messageToString(final Message msg)
{
try
{
OutputStream os = new ByteArrayOutputStream();
msg.writeTo(os);
return os.toString();
}
catch (Exception e)
{
if (getLogger().isWarnEnabled())
{
getLogger().warn(
"Warning, could not convert message (" + msg + ") into
string", e
);
}
return null;
}
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/components/axis/providers/AvalonProvider.java
Index: AvalonProvider.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Axis" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
// package org.apache.axis.providers.java;
// currently part of Cocoon until it's officially in Axis CVS (BZ#12903)
package org.apache.cocoon.components.axis.providers;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.providers.java.RPCProvider;
import org.apache.axis.handlers.soap.SOAPService;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import javax.xml.rpc.server.ServiceLifecycle;
/**
* Provider class which allows you to specify an Avalon <b>ROLE</b> for
* servicing Axis SOAP requests.
*
* <p>
* The specified <b>ROLE</b> corresponds to a particular implementation
* which is retrieved by a given Avalon <code>ComponentManager</code>.
* For more information about Avalon, see the Avalon.
* <a href="http://jakarta.apache.org/avalon">website</a>.
* </p>
*
* <p>
* To use this class, you need to add your Avalon
<code>ComponentManager</code>
* instance to the <code>MessageContext</code> that is Axis uses to process
* messages with.
* </p>
*
* <p>
* To do this you could for example subclass the AxisServlet and override the
* <code>createMessageContext()</code> method adding the ComponentManager,
eg:
*
* <pre>
* protected MessageContext createMessageContext(...)
* {
* MessageContext context = super.createMessageContext();
* context.setProperty(AvalonProvider.COMPONENT_MANAGER, m_manager);
* return context;
* }
* </pre>
*
* and appropriately add the AvalonProvider to the list of handlers in your
* server-config.wsdd (suggestions on how to improve this are welcomed)
* </p>
*
* <p>
* This provider will use that <code>ComponentManager</code> reference to
* retrieve objects.
* </p>
*
* <p>
* In your deployment descriptor use the following syntax:
*
* <pre>
* <service name="myservice" provider="java:Avalon">
* <parameter name="role" value="my.avalon.role.name"/>
* <parameter name="className"
value="my.avalon.roles.interface.name"/>
* <parameter name="allowedMethods" value="allowed.methods"/>
* </service>
* </pre>
*
* </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @revision CVS $Id: AvalonProvider.java,v 1.1 2003/03/05 11:35:27 crafterm
Exp $
*/
public class AvalonProvider extends RPCProvider
{
/**
* Constant used to retrieve the ComponentManager reference
* from the MessageContext object.
*/
public static final String COMPONENT_MANAGER = "component-manager";
/**
* Constant which represents the name of the ROLE this
* provider should <i>lookup</i> to service a request with. This is
* specified in the <parameter name="" value=""/> part of the
* deployment xml.
*/
public static final String ROLE = "role";
/**
* Returns the service object.
*
* @param msgContext the message context
* @param role the Avalon ROLE to lookup to find the service object
implementation
* @return an object that implements the service
* @exception Exception if an error occurs
*/
protected Object makeNewServiceObject(
MessageContext msgContext, String role
)
throws Exception
{
ComponentManager manager =
(ComponentManager) msgContext.getProperty(COMPONENT_MANAGER);
if (manager == null)
throw new AxisFault("Could not access Avalon ComponentManager");
return decorate(manager.lookup(role), manager);
}
/**
* Helper method for decorating a <code>Component</code> with a Handler
* proxy (see below).
*
* @param object a <code>Component</code> instance
* @param manager a <code>ComponentManager</code> instance
* @return the <code>Proxy</code> wrapped <code>Component</code> instance
* @exception Exception if an error occurs
*/
private Object decorate(final Component object, final ComponentManager
manager)
throws Exception
{
// obtain a list of all interfaces this object implements
Class[] interfaces = object.getClass().getInterfaces();
// add ServiceLifecycle to it
Class[] adjusted = new Class[ interfaces.length + 1 ];
System.arraycopy(interfaces, 0, adjusted, 0, interfaces.length);
adjusted[interfaces.length] = ServiceLifecycle.class;
// create a proxy implementing those interfaces
Object proxy =
Proxy.newProxyInstance(
this.getClass().getClassLoader(),
adjusted,
new Handler(object, manager)
);
// return the proxy
return proxy;
}
/**
* Return the option in the configuration that contains the service class
* name. In the Avalon case, it is the ROLE name to lookup.
*/
protected String getServiceClassNameOptionName()
{
return ROLE;
}
/**
* Get the service class description
*
* @param role the Avalon ROLE name
* @param service a <code>SOAPService</code> instance
* @param msgContext the message context
* @return service class description
* @exception AxisFault if an error occurs
*/
protected Class getServiceClass(
String role, SOAPService service, MessageContext msgContext
)
throws AxisFault
{
// Assuming ExcaliburComponentManager semantics the ROLE name is
// actually the class name, potentially with a variant following
// the class name with a '/' separator
try
{
int i;
if ((i = role.indexOf('/')) != -1)
{
return Class.forName(role.substring(0, i));
}
else
{
return Class.forName(role);
}
}
catch (ClassNotFoundException e)
{
throw new AxisFault("Couldn't create class object for role " +
role, e);
}
}
/**
* <code>InvocationHandler</code> class for managing Avalon
* <code>Components</code>.
*
* <p>
* Components retrieved from an Avalon ComponentManager must be
* returned to the manager when they are no longer required.
* </p>
*
* <p>
* The returning of Components to their ComponentManager is handled
* by a Proxy class which uses the following InvocationHandler.
* </p>
*
* <p>
* Each Component returned by this Provider is wrapped inside a
* Proxy class which implements all of the Component's interfaces
* including javax.xml.rpc.server.ServiceLifecycle.
* </p>
*
* <p>
* When Axis is finished with the object returned by this provider,
* it invokes ServiceLifecycle.destroy(). This is intercepted by the
* InvocationHandler and the Component is returned at this time back
* to the ComponentManager it was retrieved from.
* </p>
*
* <p>
* <b>Note</b>, when Axis invokes ServiceLifecycle.destroy() is dependant
* on the scope of the service (ie. Request, Session & Application).
* </p>
*/
final class Handler implements InvocationHandler
{
// Constants describing the ServiceLifecycle.destroy method
private final String SL_DESTROY = "destroy";
private final Class SL_CLASS = ServiceLifecycle.class;
// Component & ComponentManager references
private final Component m_object;
private final ComponentManager m_manager;
/**
* Simple constructor, sets all internal references
*
* @param object a <code>Component</code> instance
* @param manager a <code>ComponentManager</code> instance
* @param log a <code>Logger</code> instance
*/
public Handler(final Component object, final ComponentManager manager)
{
m_object = object;
m_manager = manager;
}
/**
* <code>invoke</code> method, handles all method invocations for this
* particular proxy.
*
* <p>
* Usually the invocation is passed through to the
* actual component the proxy wraps, unless the method belongs to
* the <code>ServiceLifecycle</code> interface where it is handled
* locally.
* </p>
*
* @param proxy the <code>Proxy</code> instance the method was
invoked on
* @param method the invoked method <code>Method</code> object
* @param args an <code>Object[]</code> array of arguments
* @return an <code>Object</code> value or null if none
* @exception Throwable if an error occurs
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
// if ServiceLifecycle.destroy() called, return to CM
if (method.getDeclaringClass().equals(SL_CLASS))
{
if (method.getName().equals(SL_DESTROY))
{
m_manager.release(m_object);
}
return null;
}
else // otherwise pass call to the real object
{
return method.invoke(m_object, args);
}
}
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/reading/AxisRPCReader.java
Index: AxisRPCReader.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.reading;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.soap.SOAPException;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.soap.SOAPConstants;
import org.apache.axis.transport.http.AxisHttpSession;
import org.apache.axis.transport.http.HTTPConstants;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.axis.SoapServer;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.environment.http.HttpEnvironment;
import org.xml.sax.SAXException;
/**
* SOAP Reader
*
* <p>
* This reader accepts a SOAP Request, and generates the resultant
* response as output. Essentially, this reader allows you to serve SOAP
* requests from your Cocoon application.
* </p>
*
* <p>
* Code originates from the Apache
* <a href="http://xml.apache.org/axis">AXIS</a> project,
* <code>org.apache.axis.http.transport.AxisServlet</code>.
* </p>
*
* Ported to Cocoon by:
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
*
* Original <code>AxisServlet</code> authors:
*
* @author <a href="mailto:">Steve Loughran</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Doug Davis</a>
*/
public class AxisRPCReader extends ComposerReader
implements Disposable
{
// soap server reference
private SoapServer m_server;
/**
* Compose this reader
*
* @param manager a <code>ComponentManager</code> instance
* @exception ComponentException if an error occurs
*/
public void compose(final ComponentManager manager)
throws ComponentException
{
super.compose(manager);
// set soap server reference
m_server = (SoapServer) manager.lookup(SoapServer.ROLE);
}
/**
* Axis RPC Router <code>setup</code> method.
*
* <p>
* This method sets the reader up for use. Essentially it checks that
* its been invoked in a HTTP-POST environment, reads some optional
* configuration variables, and obtains several component references to
* be used later.
* </p>
*
* @param resolver <code>SourceResolver</code> instance
* @param objectModel request/response/context data
* @param src source <code>String</code> instance
* @param parameters sitemap invocation time customization parameters
* @exception ProcessingException if an error occurs
* @exception IOException if an error occurs
* @exception SAXException if an error occurs
*/
public void setup(
final SourceResolver resolver,
final Map objectModel,
final String src,
final Parameters parameters
)
throws ProcessingException, IOException, SAXException
{
super.setup(resolver, objectModel, src, parameters);
checkHTTPPost(objectModel);
if (getLogger().isDebugEnabled())
{
getLogger().debug("AxisRPCReader.setup() complete");
}
}
/**
* Helper method to ensure that given a HTTP-POST.
*
* @param objectModel Request/Response/Context map.
* @exception ProcessingException if a non HTTP-POST request has been
made.
*/
private void checkHTTPPost(final Map objectModel)
throws ProcessingException
{
String method = ObjectModelHelper.getRequest(objectModel).getMethod();
if (!"POST".equalsIgnoreCase(method))
throw new ProcessingException(
"Reader only supports HTTP-POST (supplied was " + method + ")"
);
}
/**
* Axis RPC Router <code>generate</code> method.
*
* <p>
* This method reads the SOAP request in from the input stream, invokes
* the requested method and sends the result back to the requestor
* </p>
*
* @exception IOException if an IO error occurs
* @exception SAXException if a SAX error occurs
* @exception ProcessingException if a processing error occurs
*/
public void generate()
throws IOException, SAXException, ProcessingException
{
HttpServletRequest req =
(HttpServletRequest)
objectModel.get(HttpEnvironment.HTTP_REQUEST_OBJECT);
HttpServletResponse res =
(HttpServletResponse)
objectModel.get(HttpEnvironment.HTTP_RESPONSE_OBJECT);
ServletContext con =
(ServletContext)
objectModel.get(HttpEnvironment.HTTP_SERVLET_CONTEXT);
String soapAction = null;
MessageContext msgContext = null;
Message responseMsg = null;
try
{
res.setBufferSize(1024 * 8); // provide performance boost.
// Get message context w/ various properties set
msgContext = m_server.createMessageContext(req, res, con);
// Get request message
Message requestMsg =
new Message(
req.getInputStream(), false,
req.getHeader(HTTPConstants.HEADER_CONTENT_TYPE),
req.getHeader(HTTPConstants.HEADER_CONTENT_LOCATION)
);
if (getLogger().isDebugEnabled())
{
getLogger().debug("Request message:\n" +
messageToString(requestMsg));
}
// Set the request(incoming) message field in the context
msgContext.setRequestMessage(requestMsg);
try
{
//
// Save the SOAPAction header in the MessageContext bag.
// This will be used to tell the Axis Engine which service
// is being invoked. This will save us the trouble of
// having to parse the Request message - although we will
// need to double-check later on that the SOAPAction header
// does in fact match the URI in the body.
// (is this last stmt true??? (I don't think so - Glen))
//
soapAction = getSoapAction(req);
if (soapAction != null)
{
msgContext.setUseSOAPAction(true);
msgContext.setSOAPActionURI(soapAction);
}
// Create a Session wrapper for the HTTP session.
msgContext.setSession(new AxisHttpSession(req));
// Invoke the Axis engine...
if(getLogger().isDebugEnabled())
{
getLogger().debug("Invoking Axis Engine");
}
m_server.invoke(msgContext);
if(getLogger().isDebugEnabled())
{
getLogger().debug("Return from Axis Engine");
}
responseMsg = msgContext.getResponseMessage();
}
catch (AxisFault e)
{
if (getLogger().isErrorEnabled())
{
getLogger().error("Axis Fault", e);
}
// It's been suggested that a lack of SOAPAction
// should produce some other error code (in the 400s)...
int status = getHttpServletResponseStatus(e);
if (status == HttpServletResponse.SC_UNAUTHORIZED)
{
res.setHeader("WWW-Authenticate","Basic realm=\"AXIS\"");
}
res.setStatus(status);
responseMsg = new Message(e);
}
catch (Exception e)
{
if (getLogger().isErrorEnabled())
{
getLogger().error("Error during SOAP call", e);
}
res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
responseMsg = new Message(AxisFault.makeFault(e));
}
}
catch (AxisFault fault)
{
if (getLogger().isErrorEnabled())
{
getLogger().error("Axis fault occured while perforing
request", fault);
}
responseMsg = new Message(fault);
}
catch (Exception e)
{
throw new ProcessingException("Exception thrown while performing
request", e);
}
// Send response back
if (responseMsg != null)
{
if (getLogger().isDebugEnabled())
{
getLogger().debug("Sending response:\n" +
messageToString(responseMsg));
}
sendResponse(getProtocolVersion(req),
msgContext.getSOAPConstants(), res, responseMsg);
}
if (getLogger().isDebugEnabled())
{
getLogger().debug("AxisRPCReader.generate() complete");
}
}
/**
* Extract information from AxisFault and map it to a HTTP Status code.
*
* @param af Axis Fault
* @return HTTP Status code.
*/
protected int getHttpServletResponseStatus(AxisFault af)
{
// This will raise a 401 for both "Unauthenticated" &
"Unauthorized"...
return af.getFaultCode().getLocalPart().startsWith("Server.Unauth")
? HttpServletResponse.SC_UNAUTHORIZED
: HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
/**
* write a message to the response, set appropriate headers for content
* type..etc.
* @param clientVersion client protocol, one of the HTTPConstants strings
* @param res response
* @param responseMsg message to write
* @throws AxisFault
* @throws IOException if the response stream can not be written to
*/
private void sendResponse(
final String clientVersion,
final SOAPConstants constants,
final HttpServletResponse res,
final Message responseMsg
)
throws AxisFault, IOException
{
if (responseMsg == null)
{
res.setStatus(HttpServletResponse.SC_NO_CONTENT);
if (getLogger().isDebugEnabled())
{
getLogger().debug("No axis response, not sending one");
}
}
else
{
if (getLogger().isDebugEnabled())
{
getLogger().debug("Returned Content-Type:" +
responseMsg.getContentType(constants));
getLogger().debug("Returned Content-Length:" +
responseMsg.getContentLength());
}
try
{
res.setContentType(responseMsg.getContentType(constants));
responseMsg.writeTo(res.getOutputStream());
}
catch (SOAPException e)
{
getLogger().error("Exception sending response", e);
}
}
if (!res.isCommitted())
{
res.flushBuffer(); // Force it right now.
}
}
/**
* Extract the SOAPAction header.
* if SOAPAction is null then we'll we be forced to scan the body for it.
* if SOAPAction is "" then use the URL
* @param req incoming request
* @return the action
* @throws AxisFault
*/
private String getSoapAction(HttpServletRequest req)
throws AxisFault
{
String soapAction =
(String)req.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
if (getLogger().isDebugEnabled())
{
getLogger().debug("HEADER_SOAP_ACTION:" + soapAction);
}
//
// Technically, if we don't find this header, we should probably
fault.
// It's required in the SOAP HTTP binding.
//
if (soapAction == null)
{
throw new AxisFault(
"Client.NoSOAPAction",
"No SOAPAction header",
null, null
);
}
if (soapAction.length() == 0)
soapAction = req.getContextPath(); // Is this right?
return soapAction;
}
/**
* Return the HTTP protocol level 1.1 or 1.0
* by derived class.
*/
private String getProtocolVersion(HttpServletRequest req){
String ret = HTTPConstants.HEADER_PROTOCOL_V10;
String prot = req.getProtocol();
if (prot!= null) {
int sindex= prot.indexOf('/');
if (-1 != sindex) {
String ver= prot.substring(sindex+1);
if (HTTPConstants.HEADER_PROTOCOL_V11.equals(ver.trim())) {
ret = HTTPConstants.HEADER_PROTOCOL_V11;
}
}
}
return ret;
}
/**
* Helper method to convert a <code>Message</code> structure
* into a <code>String</code>.
*
* @param msg a <code>Message</code> value
* @return a <code>String</code> value
*/
private String messageToString(final Message msg)
{
try
{
OutputStream os = new ByteArrayOutputStream();
msg.writeTo(os);
return os.toString();
}
catch (Exception e)
{
if (getLogger().isWarnEnabled())
{
getLogger().warn(
"Warning, could not convert message (" + msg + ") into
string", e
);
}
return null;
}
}
/**
* Dispose this reader. Release all held resources.
*/
public void dispose()
{
manager.release(m_server);
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/AbstractComposableService.java
Index: AbstractComposableService.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices;
import javax.xml.rpc.ServiceException;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
import org.apache.cocoon.components.axis.providers.AvalonProvider;
/**
* Base class for providing Composable SOAP services.
*
* <p>
* Note, this class is intended to be used in SOAP Services that require
* references to Component's provided by the Cocoon Component Manager.
* </p>
*
* <p>
* If you require full Avalon support in your SOAP Service, consider using
* the AvalonProvider support built into Axis itself.
* </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: AbstractComposableService.java,v 1.1 2003/03/05 11:35:27
crafterm Exp $
*/
public abstract class AbstractComposableService
extends AbstractLogEnabledService
implements Composable {
// component manager reference
protected ComponentManager m_manager;
/**
* ServiceLifecycle <code>init</code> method. Updates an internal
* reference to the given context object, and enables logging for
* this service.
*
* @param context a javax.xml.rpc.ServiceLifecycle context
* <code>Object</code> instance
* @exception ServiceException if an error occurs
*/
public void init(final Object context) throws ServiceException {
super.init(context);
try {
setComponentManager();
} catch (ComponentException e) {
throw new ServiceException("ComponentException generated", e);
}
}
/**
* Compose this service.
*
* @param manager a <code>ComponentManager</code> instance
* @exception ComponentException if an error occurs
*/
public void compose(final ComponentManager manager) throws
ComponentException {
m_manager = manager;
}
/**
* Helper method to extract the ComponentManager reference
* from the context.
* @exception ComponentException if an error occurs
*/
private void setComponentManager() throws ComponentException {
compose(
(ComponentManager) m_context.getProperty(
AvalonProvider.COMPONENT_MANAGER
)
);
}
/**
* Called by the JAX-RPC runtime to signal the end of this service
*/
public void destroy() {
super.destroy();
m_manager = null;
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/AbstractLogEnabledService.java
Index: AbstractLogEnabledService.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.server.ServiceLifecycle;
import javax.xml.rpc.server.ServletEndpointContext;
import javax.xml.rpc.ServiceException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.Logger;
import org.apache.cocoon.components.axis.SoapServer; // or use Constants ?
/**
* Base class for providing LogEnabled SOAP services.
*
* <p>
* Note, this class is intended to be used for SOAP Services that require
* accessing to a logging object for reporting purposes only.
* </p>
*
* <p>
* If you require full Avalon support for your SOAP Service, then consider
* using the AvalonProvider support built into Axis itself.
* </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: AbstractLogEnabledService.java,v 1.1 2003/03/05 11:35:27
crafterm Exp $
*/
public abstract class AbstractLogEnabledService
extends AbstractLogEnabled
implements ServiceLifecycle {
// servlet endpoint context reference
protected ServletEndpointContext m_endPointContext;
// message context reference
protected MessageContext m_context;
/**
* ServiceLifecycle <code>init</code> method. Updates an internal
* reference to the given context object, and enables logging for
* this service.
*
* @param context a javax.xml.rpc.ServiceLifecycle context
* <code>Object</code> instance
* @exception ServiceException if an error occurs
*/
public void init(final Object context) throws ServiceException {
setContext(context);
setLogger();
}
/**
* Helper method to set the internal context reference for future
* use.
*
* @param context a javax.xml.rpc.ServiceLifecycle context
* <code>Object</code> instance
* @exception ServiceException if an error occurs
*/
private void setContext(final Object context) throws ServiceException {
try {
m_endPointContext = (ServletEndpointContext) context;
} catch (final ClassCastException e) {
throw new ServiceException(
"Service requires ServletEndPointContext, supplied was " +
context, e
);
}
m_context = m_endPointContext.getMessageContext();
}
/**
* Helper method to obtain the Avalon <code>Logger</code> object out of
* the context object and enable logging for this service.
*/
private void setLogger() {
enableLogging((Logger) m_context.getProperty(SoapServer.LOGGER));
}
/**
* Called by the JAX-RPC runtime to signal the end of this service
*/
public void destroy() {
m_context = null;
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/cache/DeploymentDescriptor.wsdd
Index: DeploymentDescriptor.wsdd
===================================================================
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Cocoon-Cache" provider="Handler">
<parameter name="role"
value="org.apache.excalibur.store.Store/TransientStore"/>
<parameter name="className" value="org.apache.excalibur.store.Store"/>
<parameter name="handlerClass"
value="org.apache.cocoon.components.axis.providers.AvalonProvider"/>
<parameter name="allowedMethods" value="clear size"/>
</service>
</deployment>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/instrument/DeploymentDescriptor.wsdd
Index: DeploymentDescriptor.wsdd
===================================================================
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Cocoon-Instrumentation" provider="Handler">
<parameter name="role"
value="org.apache.cocoon.webservices.instrument.InstrumentationService"/>
<parameter name="className"
value="org.apache.cocoon.webservices.instrument.InstrumentationService"/>
<parameter name="handlerClass"
value="org.apache.cocoon.components.axis.providers.AvalonProvider"/>
<parameter name="allowedMethods" value="getSampleSnapshot getSampleNames"/>
</service>
</deployment>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/instrument/InstrumentationService.java
Index: InstrumentationService.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices.instrument;
import org.apache.avalon.framework.component.Component;
import org.apache.excalibur.instrument.InstrumentManageable;
/**
* Component interface for retrieving sample information from the
* InstrumentManager.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: InstrumentationService.java,v 1.1 2003/03/05 11:35:28
crafterm Exp $
*/
public interface InstrumentationService extends InstrumentManageable,
Component {
/**
* Component ROLE name
*/
String ROLE = InstrumentationService.class.getName();
/**
* Obtain an array of samples from a specified sample name.
*
* <p>
* The specified path parameter identifies a sample, hierarchically from
* Instrumentable name to Instrument name, to Instrument sample name
* (including any child Instrumentables) using the '.' character as a
* separator.
* </p>
*
* <pre>
* eg: instrument-manager.active-thread-count.maximum_1000_600
* </pre>
*
* <p>
* The above example identifies the sample 'maximum_1000_600' on
instrument
* 'active-thread-count', on instrumentable 'instrument-manager'.
* </p>
*
* <p>
* The length of the returned array is dependant on the configuration of
the
* sample being accessed. Check instrumentation.xconf for the length of
pre-
* defined samples that operate constantly, when instrumentation is
enabled.
* </p>
*
* @param path path value
* @return an <code>int[]</code> array of samples
* @exception Exception if an error occurs
*/
int[] getSampleSnapshot(String path)
throws Exception;
/**
* Obtains an array of instrumentable sample names
*
* @return a [EMAIL PROTECTED] String[]} array of sample names
*/
String[] getSampleNames();
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/instrument/InstrumentationServiceImpl.java
Index: InstrumentationServiceImpl.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices.instrument;
import java.util.ArrayList;
import java.util.List;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.excalibur.instrument.InstrumentManager;
import org.apache.excalibur.instrument.manager.DefaultInstrumentManager;
import
org.apache.excalibur.instrument.manager.interfaces.InstrumentableDescriptor;
import
org.apache.excalibur.instrument.manager.interfaces.InstrumentDescriptor;
import
org.apache.excalibur.instrument.manager.interfaces.InstrumentSampleDescriptor;
/**
* Implementation of [EMAIL PROTECTED] InstrumentationService} component.
This component
* allows you to access sample information from the InstrumentManager.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: InstrumentationServiceImpl.java,v 1.1 2003/03/05
11:35:28 crafterm Exp $
*/
public final class InstrumentationServiceImpl extends AbstractLogEnabled
implements InstrumentationService {
private static final int[] EMPTY_INT_ARRAY = {};
private static final String[] EMPTY_STRING_ARRAY = {};
// instrument manager reference
private DefaultInstrumentManager m_iManager;
/**
* Sets the [EMAIL PROTECTED] InstrumentManager} for this service object.
*
* @param iManager an [EMAIL PROTECTED] InstrumentManager} instance
*/
public void setInstrumentManager(final InstrumentManager iManager) {
if (iManager == null) {
if (getLogger().isWarnEnabled())
getLogger().warn(
"No instrument manager available," +
"please enable instrumentation in your web.xml"
);
}
// we require a DefaultInstrumentManager, attempt a cast.
if (iManager instanceof DefaultInstrumentManager) {
m_iManager = (DefaultInstrumentManager) iManager;
} else {
throw new UnsupportedOperationException(
"InstrumentationService only supports
DefaultInstrumentManager"
);
}
}
/**
* Obtain an array of samples from a specified sample name.
*
* <p>
* The specified path parameter identifies a sample, hierarchically from
* Instrumentable name to Instrument name, to Instrument sample name
* (including any child Instrumentables) using the '.' character as a
* separator.
* </p>
*
* <pre>
* eg: instrument-manager.active-thread-count.maximum_1000_600
* </pre>
*
* <p>
* The above example identifies the sample 'maximum_1000_600' on
instrument
* 'active-thread-count', on instrumentable 'instrument-manager'.
* </p>
*
* <p>
* The length of the returned array is dependant on the configuration of
the
* sample being accessed. Check instrumentation.xconf for the length of
pre-
* defined samples that operate constantly, when instrumentation is
enabled.
* </p>
*
* @param path path value
* @return an <code>int[]</code> array of samples
* @exception Exception if an error occurs
*/
public int[] getSampleSnapshot(final String path)
throws Exception {
// ensure we have an instrument manager available
if (!haveInstrumentManager()) {
getLogger().warn(
"No instrument manager available," +
"please enable instrumentation in your web.xml"
);
return EMPTY_INT_ARRAY;
}
// return the samples
return m_iManager.locateInstrumentSampleDescriptor(path)
.getSnapshot().getSamples();
}
/**
* Obtain a list of available samples, useful for browsing
* available samples.
*
* @return an [EMAIL PROTECTED] String}[] array of sample names
*/
public String[] getSampleNames() {
// ensure we have an instrument manager available
if (!haveInstrumentManager()) {
getLogger().warn(
"No instrument manager available," +
"please enable instrumentation in your web.xml"
);
return EMPTY_STRING_ARRAY;
}
// list all instrumentables
final InstrumentableDescriptor[] descriptors =
m_iManager.getInstrumentableDescriptors();
final List names = new ArrayList();
for (int i = 0; i < descriptors.length; ++i) {
// list all instruments
InstrumentDescriptor[] insts =
descriptors[i].getInstrumentDescriptors();
for (int k = 0; k < insts.length; ++k) {
// list all samples
InstrumentSampleDescriptor[] samples =
insts[k].getInstrumentSampleDescriptors();
for (int j = 0; j < samples.length; ++j) {
names.add(samples[j].getName());
}
}
}
return (String[])names.toArray(new String[]{});
}
/**
* Helper method to determine if a valid instrument manager is available
*
* @return true if an instrument manager is present, false otherwise
*/
private boolean haveInstrumentManager() {
return (m_iManager != null);
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/instrument/instrumentation.xconf
Index: instrumentation.xconf
===================================================================
<?xml version="1.0"?>
<xconf xpath="/cocoon" unless="[EMAIL
PROTECTED]'org.apache.cocoon.webservices.instrument.InstrumentationService']">
<component
role="org.apache.cocoon.webservices.instrument.InstrumentationService"
class="org.apache.cocoon.webservices.instrument.InstrumentationServiceImpl"
logger="core.instrument.service">
</component>
</xconf>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/instrument/instrumentation.xroles
Index: instrumentation.xroles
===================================================================
<?xml version="1.0"?>
<xroles xpath="/role-list" unless="[EMAIL
PROTECTED]'org.apache.cocoon.webservices.instrument.InstrumentationService']">
<role name="org.apache.cocoon.webservices.instrument.InstrumentationService"
shorthand="instrument-service"
default-class="org.apache.cocoon.webservices.instrument.InstrumentationServiceImpl"/>
</xroles>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/memory/DeploymentDescriptor.wsdd
Index: DeploymentDescriptor.wsdd
===================================================================
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Cocoon-JVM-Memory" provider="java:RPC">
<parameter name="className"
value="org.apache.cocoon.webservices.memory.Memory"/>
<parameter name="allowedMethods" value="getFreeMemory getTotalMemory
invokeGC"/>
</service>
</deployment>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/memory/Memory.java
Index: Memory.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices.memory;
/**
* Class which provides JVM memory related SOAP services.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: Memory.java,v 1.1 2003/03/05 11:35:28 crafterm Exp $
*/
public class Memory {
// static reference to the runtime object.
private static final Runtime runtime = Runtime.getRuntime();
/**
* <code>getFreeMemory</code> returns the amount of free memory
* in the system.
*
* @return the amount of free memory in the system
*/
public static long getFreeMemory() {
return runtime.freeMemory();
}
/**
* <code>getTotalMemory</code> returns the total amount of memory
* in the JVM.
*
* @return the total amount of memory in the JVM
*/
public static long getTotalMemory() {
return runtime.totalMemory();
}
/**
* <code>invokeGC</code> calls upon the JVM Garbage Collector to
* recycle unused objects.
*/
public static void invokeGC() {
runtime.gc();
}
}
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/system/DeploymentDescriptor.wsdd
Index: DeploymentDescriptor.wsdd
===================================================================
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Cocoon-JVM-System" provider="java:RPC">
<parameter name="className"
value="org.apache.cocoon.webservices.system.System"/>
<parameter name="allowedMethods" value="getProperties getArchitecture
getCPUInfo getNumProcessors getOperatingSystem getOperatingSystemVersion"/>
</service>
</deployment>
1.1
xml-cocoon2/src/blocks/axis/java/org/apache/cocoon/webservices/system/System.java
Index: System.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.webservices.system;
import java.util.Properties;
import org.apache.excalibur.util.SystemUtil;
/**
* Class which provides JVM system related SOAP services.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a>
* @version CVS $Id: System.java,v 1.1 2003/03/05 11:35:28 crafterm Exp $
*/
public class System {
/**
* <code>getProperties</code> returns the current System Properties
object.
*
* @return a <code>Properties</code> instance
*/
public Properties getProperties() {
return java.lang.System.getProperties();
}
/**
* <code>getArchitecture</code> returns the host architecture.
*
* @return host architecture
*/
public String getArchitecture() {
return SystemUtil.architecture();
}
/**
* <code>getCPUInfo</code> returns host CPU information.
*
* @return host CPU information
*/
public String getCPUInfo() {
return SystemUtil.cpuInfo();
}
/**
* <code>getNumProcessors</code> returns the number of processors in
* this machine.
*
* @return number of processors
*/
public int getNumProcessors() {
return SystemUtil.numProcessors();
}
/**
* <code>getOperatingSystem</code> returns the host operating system
*
* @return host operating system
*/
public String getOperatingSystem() {
return SystemUtil.operatingSystem();
}
/**
* <code>getOperatingSystemVersion</code> returns the host operating
system
* version
*
* @return host operating system version
*/
public String getOperatingSystemVersion() {
return SystemUtil.osVersion();
}
}
1.1 xml-cocoon2/src/blocks/axis/lib/axis-1.0.jar
<<Binary file>>
1.1 xml-cocoon2/src/blocks/axis/lib/axis-jaxrpc-1.0.jar
<<Binary file>>
1.1 xml-cocoon2/src/blocks/axis/lib/axis-saaj-1.0.jar
<<Binary file>>
1.1 xml-cocoon2/src/blocks/axis/lib/commons-discovery.jar
<<Binary file>>
1.1 xml-cocoon2/src/blocks/axis/lib/excalibur-util-1.0.jar
<<Binary file>>
1.1 xml-cocoon2/src/blocks/axis/lib/wsdl4j.jar
<<Binary file>>