Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[JENKINS-26580] Refactor slave JNLP engine to make it easier to add m…
…ore protocols in the future. The engine will now call a factory that returns a list of protocols to try in order. Developers can implement new protocols in separate classes and add them to the factory to be used. Added tests for existing protocols. I noticed the Engine class doesn't have a corresponding Test class. It would be nice to add one, but I think it needs more refactoring before it would be realistic to add tests for it.
- Loading branch information
Showing
10 changed files
with
727 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
* The MIT License | ||
* | ||
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, CloudBees, Inc. | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy | ||
* of this software and associated documentation files (the "Software"), to deal | ||
* in the Software without restriction, including without limitation the rights | ||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
* copies of the Software, and to permit persons to whom the Software is | ||
* furnished to do so, subject to the following conditions: | ||
* | ||
* The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
* THE SOFTWARE. | ||
*/ | ||
package hudson.remoting.engine; | ||
|
||
import java.io.BufferedInputStream; | ||
import java.io.ByteArrayOutputStream; | ||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.util.Properties; | ||
|
||
/** | ||
* Engine utility methods. | ||
* | ||
* @author Akshay Dayal | ||
*/ | ||
public class EngineUtil { | ||
|
||
/** | ||
* Read until '\n' and returns it as a string. | ||
* | ||
* @param inputStream The input stream to read from. | ||
* @return The line read. | ||
* @throws IOException | ||
*/ | ||
public static String readLine(InputStream inputStream) throws IOException { | ||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | ||
while (true) { | ||
int ch = inputStream.read(); | ||
if (ch<0 || ch=='\n') { | ||
// Trim off possible '\r' | ||
return byteArrayOutputStream.toString("UTF-8").trim(); | ||
} | ||
byteArrayOutputStream.write(ch); | ||
} | ||
} | ||
|
||
/** | ||
* Read headers from a response. | ||
* | ||
* @param inputStream The input stream to read from. | ||
* @return The set of headers stored in a {@link Properties}. | ||
* @throws IOException | ||
*/ | ||
public static Properties readResponseHeaders(BufferedInputStream inputStream) throws IOException { | ||
Properties response = new Properties(); | ||
while (true) { | ||
String line = EngineUtil.readLine(inputStream); | ||
if (line.length()==0) { | ||
return response; | ||
} | ||
int idx = line.indexOf(':'); | ||
response.put(line.substring(0,idx).trim(), line.substring(idx+1).trim()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
* The MIT License | ||
* | ||
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, CloudBees, Inc. | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy | ||
* of this software and associated documentation files (the "Software"), to deal | ||
* in the Software without restriction, including without limitation the rights | ||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
* copies of the Software, and to permit persons to whom the Software is | ||
* furnished to do so, subject to the following conditions: | ||
* | ||
* The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
* THE SOFTWARE. | ||
*/ | ||
package hudson.remoting.engine; | ||
|
||
import java.io.BufferedInputStream; | ||
import java.io.DataOutputStream; | ||
import java.io.IOException; | ||
|
||
/** | ||
* Handshake protocol used by JNLP slave when initiating a connection to | ||
* master. | ||
* | ||
* @author Akshay Dayal | ||
*/ | ||
public abstract class JnlpProtocol { | ||
|
||
final String secretKey; | ||
final String slaveName; | ||
|
||
JnlpProtocol(String secretKey, String slaveName) { | ||
this.secretKey = secretKey; | ||
this.slaveName = slaveName; | ||
} | ||
|
||
/** | ||
* Get the name of the protocol. | ||
*/ | ||
public abstract String getName(); | ||
|
||
/** | ||
* Performs a handshake with the master. | ||
* | ||
* @param outputStream The stream to write into to initiate the handshake. | ||
* @param inputStream The stream to read responses from the master. | ||
* @return The greeting response from the master. | ||
* @throws IOException | ||
*/ | ||
public abstract String performHandshake(DataOutputStream outputStream, | ||
BufferedInputStream inputStream) throws IOException; | ||
|
||
// The expected response from the master on successful completion of the | ||
// handshake. | ||
public static final String GREETING_SUCCESS = "Welcome"; | ||
|
||
// Prefix when sending protocol name. | ||
static final String PROTOCOL_PREFIX = "Protocol:"; | ||
} |
Oops, something went wrong.