descriptionbuilder.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 693 行 · 第 1/2 页
JAVA
693 行
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.deployment;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.builder.Builder;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.Flow;
import org.apache.axis2.description.HandlerDescription;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.description.ParameterInclude;
import org.apache.axis2.description.PolicyInclude;
import org.apache.axis2.description.WSDL2Constants;
import org.apache.axis2.description.PhaseRule;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.MessageReceiver;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.util.Loader;
import org.apache.axis2.util.XMLUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.neethi.PolicyReference;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.InputStream;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
/**
* This class does the common tasks for all *Builder class.
*/
public class DescriptionBuilder implements DeploymentConstants {
private static final Log log = LogFactory.getLog(DescriptionBuilder.class);
protected ConfigurationContext configCtx;
protected AxisConfiguration axisConfig;
protected InputStream descriptionStream;
public DescriptionBuilder() {
}
public DescriptionBuilder(InputStream serviceInputStream,
ConfigurationContext configCtx) {
this.configCtx = configCtx;
this.descriptionStream = serviceInputStream;
this.axisConfig = this.configCtx.getAxisConfiguration();
}
public DescriptionBuilder(InputStream serviceInputStream,
AxisConfiguration axisConfig) {
this.descriptionStream = serviceInputStream;
this.axisConfig = axisConfig;
}
/**
* Creates OMElement for a given description document (axis2.xml ,
* services.xml and module.xml).
*
* @return Returns <code>OMElement</code> .
* @throws javax.xml.stream.XMLStreamException
*
*/
public OMElement buildOM() throws XMLStreamException {
OMElement element = (OMElement) XMLUtils.toOM(descriptionStream);
element.build();
return element;
}
/**
* Loads default message receivers. First searches in Axiservice for the
* given mepURL, if not found searches in AxisConfiguration with the given
* mepURL.
*
* @param mepURL :
* can be null
* @param service :
* This can be null <code>AxisService</code>
*/
protected MessageReceiver loadDefaultMessageReceiver(String mepURL, AxisService service) {
MessageReceiver messageReceiver;
if (mepURL == null) {
mepURL = WSDL2Constants.MEP_URI_IN_OUT;
}
if (service != null) {
messageReceiver = service.getMessageReceiver(mepURL);
if (messageReceiver != null) {
return messageReceiver;
}
}
return axisConfig.getMessageReceiver(mepURL);
}
/**
* Processes default message receivers specified either in axis2.xml or
* services.xml.
*
*/
protected HashMap processMessageReceivers(OMElement messageReceivers)
throws DeploymentException {
HashMap mr_mep = new HashMap();
Iterator msgReceivers = messageReceivers.getChildrenWithName(new QName(
TAG_MESSAGE_RECEIVER));
while (msgReceivers.hasNext()) {
OMElement msgReceiver = (OMElement) msgReceivers.next();
final OMElement tempMsgReceiver = msgReceiver;
MessageReceiver receiver = null;
try {
receiver = (MessageReceiver) org.apache.axis2.java.security.AccessController
.doPrivileged(new PrivilegedExceptionAction() {
public Object run()
throws org.apache.axis2.deployment.DeploymentException {
return loadMessageReceiver(
Thread.currentThread().getContextClassLoader(),
tempMsgReceiver);
}
});
} catch (PrivilegedActionException e) {
throw (DeploymentException) e.getException();
}
OMAttribute mepAtt = msgReceiver.getAttribute(new QName(TAG_MEP));
mr_mep.put(mepAtt.getAttributeValue(), receiver);
}
return mr_mep;
}
/**
* Processes default message receivers specified either in axis2.xml or
* services.xml.
*
*/
protected HashMap processMessageReceivers(ClassLoader loader,
OMElement element) throws DeploymentException {
HashMap meps = new HashMap();
Iterator iterator = element.getChildrenWithName(new QName(
TAG_MESSAGE_RECEIVER));
while (iterator.hasNext()) {
OMElement receiverElement = (OMElement) iterator.next();
MessageReceiver receiver = loadMessageReceiver(loader,
receiverElement);
OMAttribute mepAtt = receiverElement
.getAttribute(new QName(TAG_MEP));
meps.put(mepAtt.getAttributeValue(), receiver);
}
return meps;
}
protected MessageReceiver loadMessageReceiver(ClassLoader loader,
OMElement element) throws DeploymentException {
OMAttribute receiverName = element.getAttribute(new QName(
TAG_CLASS_NAME));
String className = receiverName.getAttributeValue();
MessageReceiver receiver = null;
try {
Class messageReceiver;
if ((className != null) && !"".equals(className)) {
messageReceiver = Loader.loadClass(loader, className);
receiver = (MessageReceiver) messageReceiver.newInstance();
}
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"ClassNotFoundException", className), e);
} catch (IllegalAccessException e) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"IllegalAccessException", className), e);
} catch (InstantiationException e) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"InstantiationException", className), e);
}
return receiver;
}
/**
* Processes the message builders specified in axis2.xml or services.xml.
*
* @param messageBuildersElement
*/
protected HashMap processMessageBuilders(OMElement messageBuildersElement)
throws DeploymentException {
HashMap builderSelector = new HashMap();
Iterator msgBuilders = messageBuildersElement
.getChildrenWithName(new QName(TAG_MESSAGE_BUILDER));
while (msgBuilders.hasNext()) {
OMElement msgBuilderElement = (OMElement) msgBuilders.next();
OMAttribute builderName = msgBuilderElement.getAttribute(new QName(TAG_CLASS_NAME));
String className = builderName.getAttributeValue();
Class builderClass = null;
Builder builderObject;
try {
builderClass = findAndValidateSelectorClass(className,
DeploymentErrorMsgs.ERROR_LOADING_MESSAGE_BUILDER);
builderObject = (Builder) builderClass.newInstance();
} catch (PrivilegedActionException e) {
throw (DeploymentException) e.getException();
} catch (InstantiationException e) {
throw new DeploymentException(
"Cannot instantiate the specified Builder Class : "
+ builderClass.getName() + ".", e);
} catch (IllegalAccessException e) {
throw new DeploymentException(
"Cannot instantiate the specified Builder Class : "
+ builderClass.getName() + ".", e);
}
OMAttribute contentTypeAtt = msgBuilderElement
.getAttribute(new QName(TAG_CONTENT_TYPE));
builderSelector.put(contentTypeAtt.getAttributeValue(),
builderObject);
}
return builderSelector;
}
/**
* Processes the message builders specified in axis2.xml or services.xml.
*/
protected HashMap processMessageFormatters(OMElement messageFormattersElement)
throws DeploymentException {
HashMap messageFormatters = new HashMap();
Iterator msgFormatters = messageFormattersElement
.getChildrenWithName(new QName(TAG_MESSAGE_FORMATTER));
while (msgFormatters.hasNext()) {
OMElement msgFormatterElement = (OMElement) msgFormatters.next();
OMElement tempMsgFormatter = msgFormatterElement;
OMAttribute formatterName = tempMsgFormatter.getAttribute(new QName(TAG_CLASS_NAME));
String className = formatterName.getAttributeValue();
MessageFormatter formatterObject;
Class formatterClass = null;
try {
formatterClass = findAndValidateSelectorClass(className,
DeploymentErrorMsgs.ERROR_LOADING_MESSAGE_FORMATTER);
formatterObject = (MessageFormatter) formatterClass.newInstance();
} catch (PrivilegedActionException e) {
throw (DeploymentException) e.getException();
} catch (InstantiationException e) {
throw new DeploymentException(
"Cannot instantiate the specified Formatter Class : "
+ formatterClass.getName() + ".", e);
} catch (IllegalAccessException e) {
throw new DeploymentException(
"Cannot instantiate the specified Formatter Class : "
+ formatterClass.getName() + ".", e);
}
OMAttribute contentTypeAtt = msgFormatterElement
.getAttribute(new QName(TAG_CONTENT_TYPE));
messageFormatters.put(contentTypeAtt.getAttributeValue(),
formatterObject);
}
return messageFormatters;
}
protected Class findAndValidateSelectorClass(final String className, final String errorMsg)
throws PrivilegedActionException {
return (Class) org.apache.axis2.java.security.AccessController
.doPrivileged(new PrivilegedExceptionAction() {
public Object run()
throws org.apache.axis2.deployment.DeploymentException {
Class selectorClass;
try {
if ((className != null) && !"".equals(className)) {
selectorClass = Loader.loadClass(Thread.currentThread()
.getContextClassLoader(), className);
} else {
throw new DeploymentException(Messages.getMessage(errorMsg,
"Invalid Class Name",
className));
}
} catch (ClassNotFoundException e) {
throw new DeploymentException(Messages.getMessage(errorMsg,
"ClassNotFoundException",
className), e);
}
return selectorClass;
}
});
}
/**
* Processes flow elements in services.xml .
*
* @param flowelement <code>OMElement</code>
* @return Returns Flow.
* @throws DeploymentException <code>DeploymentException</code>
*/
protected Flow processFlow(OMElement flowelement, ParameterInclude parent)
throws DeploymentException {
Flow flow = new Flow();
if (flowelement == null) {
return flow;
}
Iterator handlers = flowelement.getChildrenWithName(new QName(
TAG_HANDLER));
while (handlers.hasNext()) {
OMElement handlerElement = (OMElement) handlers.next();
flow.addHandler(processHandler(handlerElement, parent));
}
return flow;
}
protected String[] processSupportedPolicyNamespaces(
OMElement supportedPolicyElements) {
OMAttribute namespaces = supportedPolicyElements
.getAttribute(new QName(TAG_NAMESPACES));
if (namespaces != null) {
String value = namespaces.getAttributeValue();
if (value.trim().length() != 0) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?