All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.javacrumbs.springws.test.lookup.PayloadRootBasedResourceLookup Maven / Gradle / Ivy

/**
 * Copyright 2009-2010 the original author or authors.
 *
 * Licensed 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 net.javacrumbs.springws.test.lookup;

import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;

import org.springframework.core.io.Resource;
import org.springframework.util.StringUtils;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.server.endpoint.support.PayloadRootUtils;
import org.w3c.dom.Document;

/**
 * Resource lookup based on root payload map. 
 * TODO add documentation
 * @author Lukas Krecan
 *
 */
public class PayloadRootBasedResourceLookup extends AbstractResourceLookup {

	
	static final String DEFAULT_PAYLOAD_DELIMITER = "/";

	static final String DEFAULT_DISCRIMINATOR_DELIMITER = "-";

	static final String DEFAULT_PATH_SUFFIX = "response.xml";

	static final String DEFAULT_PATH_PREFIX = "mock-xml/";

	private Map discriminators;
	
	private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
	
	private String pathPrefix = DEFAULT_PATH_PREFIX;

	private String pathSuffix = DEFAULT_PATH_SUFFIX;

	private String discriminatorDelimiter = DEFAULT_DISCRIMINATOR_DELIMITER;

	private String payloadDelimiter = DEFAULT_PAYLOAD_DELIMITER;
	
	private boolean prependUri = false;
	
	public Resource lookupResource(URI uri, WebServiceMessage message) throws IOException {
		QName payloadQName;
		try {
			payloadQName = PayloadRootUtils.getPayloadRootQName(message.getPayloadSource(), TRANSFORMER_FACTORY);
		} catch (TransformerException e) {
			logger.warn("Can not resolve payload.",e);
			return null;
		} catch (XMLStreamException e) {
			logger.warn("Can not resolve payload.",e);
			return null;
		}
		String payloadName = payloadQName.getLocalPart();
		String[] expressions = getDiscriminators(payloadName);
		Document document = getXmlUtil().loadDocument(message);
		Resource resource; 
		int discriminatorsCount = expressions.length;
		do
		{
			String resourceName = getResourceName(uri, payloadName, expressions, discriminatorsCount, document);
			logger.debug("Looking for resource "+resourceName);
			resource = getResourceLoader().getResource(resourceName);
			discriminatorsCount--;
		}
		while((resource == null || !resource.exists()) && discriminatorsCount>=0);
		if (resource!=null && resource.exists())
		{
			logger.debug("Found resource "+resource);
			return processResource(uri, message, resource);
		}
		else
		{
			return null;
		}
	}

	
	private String[] getDiscriminators(String payloadName) {
		String[] result = discriminators.get(payloadName);
		return result!=null?result:new String[0];
	}
	
	protected String getResourceName(URI uri, String payloadName, String[] expressions, int discriminatorsCount, Document document) {
		String uriHost = prependUri?(uri.getHost()+payloadDelimiter):"";
		return pathPrefix+uriHost+payloadName+payloadDelimiter+getDiscriminatorExpression(uri, expressions, discriminatorsCount, document)+pathSuffix;
	}
	/**
	 * Returns expression generated from discriminators
	 * @param uri
	 * @param expressions
	 * @param discriminatorsCount 
	 * @param document
	 * @return
	 */
	protected String getDiscriminatorExpression(URI uri, String[] expressions, int discriminatorsCount, Document document) {
		StringBuilder result = new StringBuilder();
		for (int i=0; i getDiscriminatorsMap() {
		return discriminators;
	}

	public void setDiscriminatorsMap(Map discriminators) {
		this.discriminators = discriminators;
	}
	
	public void setDiscriminators(Map discriminators) {
		Map disc = new HashMap();
		for(Entry entry:discriminators.entrySet())
		{
			disc.put(entry.getKey(), entry.getValue().split("\\s*;\\s*"));
		}
		this.discriminators = disc;
	}
	
	public String getPathPrefix() {
		return pathPrefix;
	}
	public void setPathPrefix(String pathPrefix) {
		this.pathPrefix = pathPrefix;
	}
	public String getPathSuffix() {
		return pathSuffix;
	}
	public void setPathSuffix(String pathSuffix) {
		this.pathSuffix = pathSuffix;
	}
	public String getDiscriminatorDelimiter() {
		return discriminatorDelimiter;
	}
	public void setDiscriminatorDelimiter(String discriminatorDelimiter) {
		this.discriminatorDelimiter = discriminatorDelimiter;
	}
	public String getPayloadDelimiter() {
		return payloadDelimiter;
	}
	public void setPayloadDelimiter(String payloadDelimiter) {
		this.payloadDelimiter = payloadDelimiter;
	}

	public boolean isPrependUri() {
		return prependUri;
	}

	public void setPrependUri(boolean prependUri) {
		this.prependUri = prependUri;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy