blob: e675a6c7b5efbf7ad07d5673ca1175271e42009b [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.ws.java2wsdl;
import org.apache.axiom.om.util.StAXUtils;
import org.apache.tools.ant.BuildException;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
/**
* Used for nested package definitions.
* The file format used for storing mappings is a list of package=namespace
*/
public class NamespaceMapping implements Mapper {
public static final QName PKG2NS_MAPPINGS = new QName("http://ws.apache.org/axis2", "pkg2ns_mapping");
public static final QName MAPPING = new QName("http://ws.apache.org/axis2", "mapping");
public static final String NAMESPACE = "namespace";
public static final String PACKAGE = "package";
private String namespace = null;
private String packageName = null;
private File mappingFile;
private InputStream mapInputStream = null;
private XMLStreamReader mapXmlReader = null;
/**
* pass in the namespace to map to
*/
public NamespaceMapping() {
}
/**
* the namespace in the WSDL. Required.
* @param value new uri of the mapping
*/
public void setNamespace(String value) {
namespace = value;
}
/**
* the Java package to bind to. Required.
* @param value java package name
*/
public void setPackage(String value) {
packageName = value;
}
/**
* name of a property file that contains mappings in
* package=namespace format
* @param file file to load
*/
public void setFile(File file) {
mappingFile = file;
}
/**
* map a namespace to a package
* @param map map to assign to
* @param packName package name
* @param nspace namespace
* @param packageIsKey if the package is to be the key for the map
*/
protected void map(HashMap map,
String packName,
String nspace,
boolean packageIsKey) {
if(packageIsKey) {
map.put(packName,nspace);
} else {
map.put(nspace, packName);
}
}
/**
* validate the option set
*/
private void validate() {
if (mappingFile != null || mapInputStream != null || mapXmlReader != null ) {
if (namespace != null || packageName != null) {
throw new BuildException(
"Namespace or Package cannot be used with a File attribute");
}
} else {
if (namespace == null) {
throw new BuildException("namespace must be defined");
}
if (packageName == null) {
throw new BuildException("package must be defined");
}
}
}
/**
* Load a mapping xml reader and save it to the map
* @param map target map file
* @param packageIsKey if the package is to be the key for the map
* @throws BuildException if an IOException needed swallowing
*/
protected void mapXmlReader(HashMap map, boolean packageIsKey) throws BuildException {
try {
loadMappingFromXMLReader(map, packageIsKey);
} catch ( Exception e ) {
throw new BuildException(e);
}
}
/**
* Load a mapping input stream and save it to the map
* @param map target map file
* @param packageIsKey if the package is to be the key for the map
* @throws BuildException if an IOException needed swallowing
*/
protected void mapXmlStream(HashMap map, boolean packageIsKey) throws BuildException {
try {
mapXmlReader = StAXUtils.createXMLStreamReader(mapInputStream);
mapXmlReader(map, packageIsKey);
//ensure this clean up so that the next invocation does not have any stale state
mapXmlReader = null;
} catch ( Exception e ) {
throw new BuildException(e);
}
}
/**
* Load a mapping file and save it to the map
* @param map target map file
* @param packageIsKey if the package is to be the key for the map
* @throws BuildException if an IOException needed swallowing
*/
protected void mapFile(HashMap map, boolean packageIsKey) throws BuildException {
try {
mapInputStream = new FileInputStream(mappingFile);
mapXmlStream(map, packageIsKey);
//need to do this since the file was opened here
mapInputStream.close();
//ensure this clean up so that the next invocation does not have any stale state
mapInputStream = null;
} catch ( Exception e ) {
throw new BuildException(e);
}
}
/**
* load from an xml reader containing mapping info
* @return a properties file with zero or more mappings
* @throws BuildException if the load failed
*/
private void loadMappingFromXMLReader(HashMap map, boolean packageIsKey) throws BuildException {
try {
QName parentElement = null;
//if the reader is in the fragment that deals with package to namespace mappings
while (mapXmlReader.hasNext()) {
// mapXmlReader.next();mapXmlReader.next();
// if ( mapXmlReader.getName().equals(PKG2NS_MAPPINGS) ) {
switch (mapXmlReader.next()) {
case XMLStreamConstants.START_ELEMENT :
QName qname = mapXmlReader.getName();
if (MAPPING.equals(qname) && parentElement.equals(PKG2NS_MAPPINGS)) {
map(map,
mapXmlReader.getAttributeValue(null, PACKAGE),
mapXmlReader.getAttributeValue(null, NAMESPACE),
packageIsKey);
} else {
parentElement = qname;
}
mapXmlReader.next();
break;
case XMLStreamConstants.END_ELEMENT:
if (mapXmlReader.getName().equals(PKG2NS_MAPPINGS)) {
//ensure this clean up
return;
}
break;
// }
}
}
} catch ( Exception e ) {
System.out.println("Exception while loading package to namespace mappings... " + e);
}
}
/**
* execute the mapping
* @param map map to map to
* @param packageIsKey if the package is to be the key for the map
* @throws BuildException in case of emergency
*/
public void execute(HashMap map, boolean packageIsKey) throws BuildException {
validate();
if (mappingFile != null ) {
mapFile(map,packageIsKey);
//ensure this clean up so that the next invocation does not have any stale state
mappingFile = null;
} else if ( mapInputStream != null ) {
mapXmlStream(map, packageIsKey);
} else if ( mapXmlReader != null ) {
mapXmlReader(map, packageIsKey);
} else {
map(map, packageName, namespace, packageIsKey);
}
}
public InputStream getMapInputStream() {
return mapInputStream;
}
public void setMapInputStream(InputStream mapInputStream) {
this.mapInputStream = mapInputStream;
}
public File getMappingFile() {
return mappingFile;
}
public void setMappingFile(File mappingFile) {
this.mappingFile = mappingFile;
}
public XMLStreamReader getXmlReader() {
return mapXmlReader;
}
public void setXmlReader(XMLStreamReader xmlReader) {
this.mapXmlReader = xmlReader;
}
}