package org.codehaus.mojo.fitnesse.runner; /* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see <http://www.gnu.org/licenses/>. */ import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Iterator; import java.util.List; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; import org.codehaus.mojo.fitnesse.ClassPathSubstitution; import fitnesse.components.FitProtocol; import fitnesse.util.StreamReader; public class ClassPathBuilder { private String mHostName; private int mPort; private String mPage; private Log mLog; ClassPathBuilder() { } ClassPathBuilder( Log pLog ) { mLog = pLog; } public ClassPathBuilder( String hostName, int port, String page, Log pLog ) { super(); mHostName = hostName; mPort = port; mPage = page; mLog = pLog; } public String getPath( List pSubstitutions, Log pLog ) throws MojoExecutionException { String tOriginalPath; String tUrl = "GET /" + mPage + "?responder=fitClient&includePaths=yes HTTP/1.1\r\n\r\n"; pLog.debug( "Use URL for classPath download [" + tUrl + "]" ); try { StreamReader tSocketReader = establishConnection( tUrl ); int tNbBytes = FitProtocol.readSize( tSocketReader ); if ( tNbBytes != 0 ) { throw new MojoExecutionException( "Unable to connect to server." ); } tNbBytes = FitProtocol.readSize( tSocketReader ); tOriginalPath = FitProtocol.readDocument( tSocketReader, tNbBytes ); pLog.debug( "Download classpath is [" + tOriginalPath + "]" ); String tPath = transformPath( tOriginalPath, pSubstitutions ); pLog.info( "Use path [" + tPath + "]" ); return tPath; } catch ( Exception e ) { throw new MojoExecutionException( "Unable to download path from FitNesse Server", e ); } } private StreamReader establishConnection( String pUrl ) throws UnknownHostException, IOException { Socket socket = new Socket( mHostName, mPort ); OutputStream socketOutput = socket.getOutputStream(); StreamReader socketReader = new StreamReader( socket.getInputStream() ); byte[] tBytes = pUrl.getBytes( "UTF-8" ); socketOutput.write( tBytes ); socketOutput.flush(); return socketReader; } String transformPath( String pOriginalPath, List pSubstitutions ) { String curPath = pOriginalPath; ClassPathSubstitution curSub; for ( Iterator tIt = pSubstitutions.iterator(); tIt.hasNext(); ) { curSub = (ClassPathSubstitution) tIt.next(); mLog.debug( "use subtitution [" + curSub.getSearch() + "=" + curSub.getReplaceWith() ); curPath = replaceAll( curPath, curSub.getSearch(), curSub.getReplaceWith() ); } curPath = curPath.replaceAll( " +\";", "\";" ); curPath = curPath.replaceAll( ";\" +", ";\"" ); curPath = curPath.replaceAll( "\"", "" ); // // curPath = curPath.replaceAll( " +;", ";" ); // curPath = curPath.replaceAll( "; +", ";" ); // curPath = curPath.replaceAll( "\" +;", "\";" ); // curPath = curPath.replaceAll( ";\" +", ";\"" ); // return curPath; } String replaceAll( String pPath, String pKey, String pValue ) { StringBuffer tempNewPath = new StringBuffer(); int curStart = 0; int curEnd = pPath.indexOf( pKey ); while ( curEnd != -1 ) { tempNewPath.append( pPath.substring( curStart, curEnd ) ); tempNewPath.append( pValue ); curStart = curEnd + pKey.length(); curEnd = pPath.indexOf( pKey, curStart ); } tempNewPath.append( pPath.substring( curStart, pPath.length() ) ); return tempNewPath.toString(); } }