/* * Copyright 2008 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 org.springframework.ws.soap.support; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.ws.transport.TransportConstants; /** * Contains various utility methods for handling SOAP messages. * * @author Arjen Poutsma * @since 1.5.5 */ public abstract class SoapUtils { private static final Pattern ACTION_PATTERN = Pattern.compile("action\\s*=\\s*([^;]+)"); private SoapUtils() { } /** Escapes the given SOAP action to be surrounded by quotes. */ public static String escapeAction(String soapAction) { if (!StringUtils.hasLength(soapAction)) { soapAction = "\"\""; } if (!soapAction.startsWith("\"")) { soapAction = "\"" + soapAction; } if (!soapAction.endsWith("\"")) { soapAction = soapAction + "\""; } return soapAction; } /** * Returns the value of the action parameter in the given SOAP 1.2 content type. * * @param contentType the SOAP 1.2 content type * @return the action */ public static String extractActionFromContentType(String contentType) { if (contentType != null) { Matcher matcher = ACTION_PATTERN.matcher(contentType); if (matcher.find() && matcher.groupCount() == 1) { return matcher.group(1).trim(); } } return TransportConstants.EMPTY_SOAP_ACTION; } /** * Replaces or adds the value of the action parameter in the given SOAP 1.2 content type. * * @param contentType the SOAP 1.2 content type * @param action the action * @return the new content type */ public static String setActionInContentType(String contentType, String action) { Assert.hasLength(contentType, "'contentType' must not be empty"); if (StringUtils.hasText(action)) { Matcher matcher = ACTION_PATTERN.matcher(contentType); if (matcher.find() && matcher.groupCount() == 1) { StringBuffer buffer = new StringBuffer(); matcher.appendReplacement(buffer, "action=" + action); matcher.appendTail(buffer); return buffer.toString(); } else { return contentType + "; action=" + action; } } else { return contentType; } } }