Skip to content

Commit 00c542a

Browse files
Add openFile to support stream way to get remote file, a callback interface is added for reading inputstream
1 parent d8345de commit 00c542a

File tree

6 files changed

+103
-4
lines changed

6 files changed

+103
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.cloudfoundry.client.lib;
2+
3+
import java.io.IOException;
4+
5+
import org.springframework.http.client.ClientHttpResponse;
6+
7+
/**
8+
* Callback class while the client receives the server response.
9+
*
10+
*/
11+
public interface ClientHttpResponseCallback {
12+
13+
public void onClientHttpResponse(ClientHttpResponse clientHttpResponse) throws IOException;
14+
}

cloudfoundry-client-lib/src/main/java/org/cloudfoundry/client/lib/CloudFoundryClient.java

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21+
import java.io.InputStream;
2122
import java.net.URL;
2223
import java.util.List;
2324
import java.util.Map;
@@ -358,6 +359,10 @@ public String getFile(String appName, int instanceIndex, String filePath, int st
358359
return cc.getFile(appName, instanceIndex, filePath, startPosition, endPosition - 1);
359360
}
360361

362+
public void openFile(String appName, int instanceIndex, String filePath, ClientHttpResponseCallback callback) {
363+
cc.openFile(appName, instanceIndex, filePath, callback);
364+
}
365+
361366
public String getFileTail(String appName, int instanceIndex, String filePath, int length) {
362367
Assert.isTrue(length > 0, length + " is not a valid value for length, it should be 1 or greater.");
363368
return cc.getFile(appName, instanceIndex, filePath, -1, length);

cloudfoundry-client-lib/src/main/java/org/cloudfoundry/client/lib/rest/CloudControllerClient.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.UUID;
2525

2626
import org.cloudfoundry.client.lib.ApplicationLogListener;
27+
import org.cloudfoundry.client.lib.ClientHttpResponseCallback;
2728
import org.cloudfoundry.client.lib.CloudCredentials;
2829
import org.cloudfoundry.client.lib.RestLogCallback;
2930
import org.cloudfoundry.client.lib.StartingInfo;
@@ -151,6 +152,8 @@ void createApplication(String appName, Staging staging, Integer disk, Integer me
151152

152153
String getFile(String appName, int instanceIndex, String filePath, int startPosition, int endPosition);
153154

155+
void openFile(String appName, int instanceIndex, String filePath, ClientHttpResponseCallback callback);
156+
154157
void bindService(String appName, String serviceName);
155158

156159
void unbindService(String appName, String serviceName);
@@ -171,6 +174,7 @@ void createApplication(String appName, Staging staging, Integer disk, Integer me
171174

172175
// Domains and routes management
173176

177+
174178
List<CloudDomain> getDomainsForOrg();
175179

176180
List<CloudDomain> getDomains();
@@ -198,6 +202,4 @@ void createApplication(String appName, Staging staging, Integer disk, Integer me
198202
void registerRestLogListener(RestLogCallback callBack);
199203

200204
void unRegisterRestLogListener(RestLogCallback callBack);
201-
202-
203205
}

cloudfoundry-client-lib/src/main/java/org/cloudfoundry/client/lib/rest/CloudControllerClientImpl.java

+29
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.commons.logging.Log;
4545
import org.apache.commons.logging.LogFactory;
4646
import org.cloudfoundry.client.lib.ApplicationLogListener;
47+
import org.cloudfoundry.client.lib.ClientHttpResponseCallback;
4748
import org.cloudfoundry.client.lib.CloudCredentials;
4849
import org.cloudfoundry.client.lib.CloudFoundryException;
4950
import org.cloudfoundry.client.lib.CloudOperationException;
@@ -250,6 +251,13 @@ public String getFile(String appName, int instanceIndex, String filePath, int st
250251
return doGetFile(urlPath, appId, instanceIndex, filePath, startPosition, endPosition);
251252
}
252253

254+
255+
public void openFile(String appName, int instanceIndex, String filePath, ClientHttpResponseCallback callback) {
256+
String urlPath = getFileUrlPath();
257+
Object appId = getFileAppId(appName);
258+
doOpenFile(urlPath, appId, instanceIndex, filePath, callback);
259+
}
260+
253261
public void registerRestLogListener(RestLogCallback callBack) {
254262
if (getRestTemplate() instanceof LoggingRestTemplate) {
255263
((LoggingRestTemplate)getRestTemplate()).registerRestLogListener(callBack);
@@ -424,6 +432,13 @@ protected Map<String, String> doGetLogs(String urlPath, String appName, String i
424432
return logs;
425433
}
426434

435+
@SuppressWarnings("unchecked")
436+
protected void doOpenFile(String urlPath, Object app, int instanceIndex, String filePath,
437+
ClientHttpResponseCallback callback) {
438+
getRestTemplate().execute(getUrl(urlPath), HttpMethod.GET, null, new ResponseExtractorWrapper(callback), app,
439+
String.valueOf(instanceIndex), filePath);
440+
}
441+
427442
protected String doGetFile(String urlPath, Object app, int instanceIndex, String filePath, int startPosition, int endPosition) {
428443
return doGetFile(urlPath, app, String.valueOf(instanceIndex), filePath, startPosition, endPosition);
429444
}
@@ -1740,4 +1755,18 @@ private boolean hasEmbeddedResource(Map<String, Object> resource, String resourc
17401755
return entity.containsKey(resourceKey) || entity.containsKey(resourceKey + "_url");
17411756
}
17421757

1758+
private static class ResponseExtractorWrapper implements ResponseExtractor {
1759+
1760+
private ClientHttpResponseCallback callback;
1761+
1762+
public ResponseExtractorWrapper(ClientHttpResponseCallback callback) {
1763+
this.callback = callback;
1764+
}
1765+
1766+
public Object extractData(ClientHttpResponse clientHttpResponse) throws IOException {
1767+
callback.onClientHttpResponse(clientHttpResponse);
1768+
return null;
1769+
}
1770+
1771+
}
17431772
}

cloudfoundry-client-lib/src/main/java/org/cloudfoundry/client/lib/rest/LoggingRestTemplate.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCal
5757
public T extractData(ClientHttpResponse response) throws IOException {
5858
httpStatus[0] = response.getStatusCode();
5959
headers[0] = response.getHeaders();
60-
if (responseExtractor != null) {
61-
T data = responseExtractor.extractData(response);
60+
T data = null;
61+
if (responseExtractor != null && (data = responseExtractor.extractData(response)) != null) {
6262
if (data instanceof String) {
6363
message[0] = ((String)data).length() + " bytes";
6464
} else if (data instanceof Map) {

cloudfoundry-client-lib/src/test/java/org/cloudfoundry/client/lib/CloudFoundryClientTest.java

+49
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.io.File;
1717
import java.io.IOException;
18+
import java.io.InputStream;
1819
import java.net.InetSocketAddress;
1920
import java.net.MalformedURLException;
2021
import java.net.URL;
@@ -31,6 +32,7 @@
3132
import java.util.UUID;
3233
import java.util.concurrent.atomic.AtomicInteger;
3334

35+
import org.apache.commons.io.IOUtils;
3436
import org.apache.http.HttpHost;
3537
import org.apache.http.conn.params.ConnRoutePNames;
3638
import org.cloudfoundry.client.lib.domain.ApplicationStats;
@@ -1063,6 +1065,14 @@ public void getFile() throws Exception {
10631065
doGetFile(connectedClient, appName);
10641066
}
10651067

1068+
@Test
1069+
public void openFile() throws Exception {
1070+
String appName = namespacedAppName("simple_openFile");
1071+
createAndUploadAndStartSimpleSpringApp(appName);
1072+
boolean running = getInstanceInfosWithTimeout(appName, 1, true);
1073+
assertTrue("App failed to start", running);
1074+
doOpenFile(connectedClient, appName);
1075+
}
10661076

10671077
//
10681078
// Basic Services tests
@@ -1516,6 +1526,45 @@ private boolean getInstanceInfosWithTimeout(String appName, int count, boolean s
15161526
return pass;
15171527
}
15181528

1529+
private void doOpenFile(CloudFoundryClient client, String appName) throws Exception {
1530+
String appDir = "app";
1531+
String fileName = appDir + "/WEB-INF/web.xml";
1532+
String emptyPropertiesFileName = appDir + "/WEB-INF/classes/empty.properties";
1533+
1534+
// File is often not available immediately after starting an app... so
1535+
// allow up to 60 seconds wait
1536+
for (int i = 0; i < 60; i++) {
1537+
try {
1538+
client.getFile(appName, 0, fileName);
1539+
break;
1540+
} catch (HttpServerErrorException ex) {
1541+
Thread.sleep(1000);
1542+
}
1543+
}
1544+
// Test open file
1545+
1546+
client.openFile(appName, 0, fileName, new ClientHttpResponseCallback() {
1547+
1548+
public void onClientHttpResponse(ClientHttpResponse clientHttpResponse) throws IOException {
1549+
InputStream in = clientHttpResponse.getBody();
1550+
assertNotNull(in);
1551+
byte[] fileContents = IOUtils.toByteArray(in);
1552+
assertTrue(fileContents.length > 5);
1553+
}
1554+
});
1555+
1556+
client.openFile(appName, 0, emptyPropertiesFileName, new ClientHttpResponseCallback() {
1557+
1558+
public void onClientHttpResponse(ClientHttpResponse clientHttpResponse) throws IOException {
1559+
InputStream in = clientHttpResponse.getBody();
1560+
assertNotNull(in);
1561+
byte[] fileContents = IOUtils.toByteArray(in);
1562+
assertTrue(fileContents.length == 0);
1563+
}
1564+
});
1565+
1566+
}
1567+
15191568
private void doGetFile(CloudFoundryClient client, String appName) throws Exception {
15201569
String appDir = "app";
15211570
String fileName = appDir + "/WEB-INF/web.xml";

0 commit comments

Comments
 (0)