blob: 699df7f872e13bd173568753ae83fb8b7d4ba292 [file] [log] [blame]
/*
* 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.jaxws.context.listener;
/**
* Utility Class that holds a ways to registerProviderOMListener and oter operations
* used by ParsedEntityCustom Builder.
*/
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.om.OMContainer;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.message.databinding.ParsedEntityReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ContextListenerUtils {
private static final Log log =
LogFactory.getLog(ContextListenerUtils.class);
public static void registerProviderOMListener(MessageContext mc){
if(log.isDebugEnabled()){
log.debug("Creating ProviderOMContextListener");
}
ProviderOMContextListener.create(mc.getAxisMessageContext().getServiceContext());
}
public static InputStream createPayloadElement(InputStream payloadContent, OMNamespace ns, String localPart, OMContainer parent, HashMap<String, String> nsElementDecls, HashMap<String, String> attrElementDecls){
CompositeInputStream inputStream = new CompositeInputStream();
InputStream startTag = getStartTag(ns, localPart, parent, nsElementDecls, attrElementDecls);
InputStream endTag = getEndTag(ns, localPart);
//Add Element startTag
((CompositeInputStream)inputStream).append(startTag);
//Add Element content
((CompositeInputStream)inputStream).append(payloadContent);
//Add Element endTag
((CompositeInputStream)inputStream).append(endTag);
return inputStream;
}
public static int skipEventsTo(int targetEvent, XMLStreamReader parser) throws XMLStreamException {
int eventType = 0;
while (parser.hasNext()) {
eventType = parser.next();
if (eventType == targetEvent)
return eventType;
}
return eventType; // return END_DOCUMENT;
}
private static InputStream getEndTag(OMNamespace ns, String localPart){
if(log.isDebugEnabled()){
log.debug("Start ParsedEntityDataSource.Data.getEndTag()");
}
String endElement = null;
String prefix = (ns!=null)?ns.getPrefix():null;
String uri = (ns!=null)?ns.getNamespaceURI():null;
if(prefix!=null && prefix.length()>0){
endElement = "</"+prefix+":"+localPart+">";
}else{
endElement = "</"+localPart+">";
}
if(log.isDebugEnabled()){
log.debug("End ParsedEntityDataSource.Data.getEndTag()");
}
return new ByteArrayInputStream(endElement.getBytes());
}
/*
* get startElement using namespace and local part. Add all namespace prefixes from parent elements.
*/
private static InputStream getStartTag(OMNamespace ns, String localPart, OMContainer parent, HashMap<String, String> nsElementDecls, HashMap<String, String> attrElementDecls){
if(log.isDebugEnabled()){
log.debug("Start ParsedEntityDataSource.Data.getStartTag()");
}
//Start creating the element.
StringBuffer startElement = new StringBuffer();
String prefix = (ns!=null)?ns.getPrefix():null;
String uri = (ns!=null)?ns.getNamespaceURI():null;
//Get all of the namespaces associated with Body, envelope, etc
HashMap<String, String> nsDecls = getParentnsdeclarations(parent);
nsDecls.putAll(nsElementDecls);
if(prefix!=null && prefix.length()>0){
startElement.append("<"+prefix+":"+localPart+ " ");
if (!nsDecls.containsKey(prefix) || !nsDecls.get(prefix).equals(uri)){
nsDecls.put(prefix, uri);
}
}else{
startElement.append("<"+localPart + " ");
}
addParentNs(startElement, parent, nsDecls);
addAttrs(startElement, attrElementDecls);
if(log.isDebugEnabled()){
log.debug("StartElement ="+startElement);
}
if(log.isDebugEnabled()){
log.debug("End ParsedEntityDataSource.Data.getStartTag()");
}
return new ByteArrayInputStream(startElement.toString().getBytes());
}
/*
* fetch all prent namespace declarations
*/
private static HashMap<String, String> getParentnsdeclarations(OMContainer parent){
HashMap<String, String> nsDecls = new HashMap<String, String>();
if (parent instanceof OMElement) {
Iterator ite = ((OMElement) parent).getNamespacesInScope();
while (ite.hasNext()) {
OMNamespace omn = (OMNamespace) ite.next();
nsDecls.put(omn.getPrefix(), omn.getNamespaceURI());
}
}
return nsDecls;
}
/*
* add all parent namespace declarations to the element
*/
private static void addParentNs(StringBuffer startElement, OMContainer parent, HashMap<String, String> nsDecls){
Iterator<Map.Entry<String, String>> iter = nsDecls.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
String prefix = entry.getKey();
String uri = entry.getValue();
if ("".equals(prefix))
startElement.append(" xmlns=\"");
else {
startElement.append(" xmlns:");
startElement.append(prefix);
startElement.append("=\"");
}
startElement.append(uri);
startElement.append("\"");
}
}
private static void addAttrs(StringBuffer startElement, HashMap<String, String> attrDecls)
{
Iterator<Map.Entry<String, String>> iter = attrDecls.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
String compoundName = entry.getKey();
String value = entry.getValue();
startElement.append(" ");
startElement.append(compoundName);
startElement.append("=\"");
startElement.append(value);
startElement.append("\"");
}
startElement.append(">");
}
}