/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ package com.jboss.transaction.wstf.proxy; /** * @author kevin */ public class ProxyURIRewriting { /** * The base URI of the proxy. */ private static String PROXY_URI ; /** * Set the proxy URI. * @param proxyURI The proxy URI. */ public static synchronized void setProxyURI(final String proxyURI) { PROXY_URI = proxyURI ; } /** * Get the proxy URI. * @return The proxy URI. */ public static synchronized String getProxyURI() { return PROXY_URI ; } /** * Rewrite the URI. * @param conversationIdentifier The conversation identifier. * @param uri The uri to be rewritten. * @return The replacement URI. */ public static String rewriteURI(final String conversationIdentifier, final String uri) { final String proxyURI = getProxyURI() ; if (uri != null) { if (uri.startsWith(proxyURI)) { final int separatorIndex = uri.indexOf('/', proxyURI.length()+1) ; final String remainder = uri.substring(separatorIndex+1) ; return decodeURI(remainder) ; } else if (!uri.startsWith("http://www.w3.org/")) { return proxyURI + "/" + conversationIdentifier + "/" + encodeURI(uri) ; } } return uri ; } /** * Decode a URI that has been encoded. * @param uri The encoded URI. * @return The decoded URI. */ public static String decodeURI(final String uri) { if (uri == null) { return null ; } final StringBuffer result = new StringBuffer() ; final int length = uri.length() ; int separatorCount = 0 ; boolean seenBracket = false; for(int count = 0 ; count < length ; count++) { final char ch = uri.charAt(count) ; if (separatorCount < 3) { if (ch == '-') { result.append('/') ; separatorCount++ ; continue ; } else if (ch == '_') { result.append(':') ; continue ; } else if (ch == '~') { result.append(seenBracket ? ']' : '[') ; seenBracket = !seenBracket; continue ; } result.append(ch) ; } else { result.append(ch) ; } } return result.toString() ; } /** * Encode a URI. * @param uri The URI. * @return The encoded URI. */ public static String encodeURI(final String uri) { if (uri == null) { return "" ; } final StringBuffer result = new StringBuffer() ; final int length = uri.length() ; int separatorCount = 0 ; for(int count = 0 ; count < length ; count++) { final char ch = uri.charAt(count) ; if (separatorCount < 3) { if (ch == '/') { separatorCount++ ; result.append('-') ; } else if (ch == ':') { result.append('_') ; } else if (ch == '[' || ch == ']') { result.append('~') ; } else { result.append(ch) ; } } else { result.append(ch) ; } } return result.toString() ; } }