ソースを参照

add more streaming/sendable resources

tags/2.0.1
Jonathan Cobb 4年前
コミット
27e2ba819f
4個のファイルの変更118行の追加0行の削除
  1. +12
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlSendableResource.java
  2. +50
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlStreamingOutput.java
  3. +20
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlSendableResource.java
  4. +36
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlStreamingOutput.java

+ 12
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlSendableResource.java ファイルの表示

@@ -0,0 +1,12 @@
package org.cobbzilla.wizard.stream;

public class DataUrlSendableResource extends SendableResource {

public DataUrlSendableResource(String name, String dataUrl) {
super(new DataUrlStreamingOutput(dataUrl));
final DataUrlStreamingOutput out = (DataUrlStreamingOutput) getOut();
setName(name);
setContentType(out.getContentType());
}

}

+ 50
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/stream/DataUrlStreamingOutput.java ファイルの表示

@@ -0,0 +1,50 @@
package org.cobbzilla.wizard.stream;

import lombok.Getter;
import org.apache.commons.codec.binary.Base64InputStream;
import org.apache.commons.io.IOUtils;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import static org.cobbzilla.util.daemon.ZillaRuntime.die;
import static org.cobbzilla.util.string.StringUtil.ellipsis;

public class DataUrlStreamingOutput implements StreamingOutput {

public static final String DATA_URL_PREFIX = "data:";

@Getter private final String contentType;
private final boolean base64;
private final InputStream data;

public DataUrlStreamingOutput(String dataUrl) {

if (!dataUrl.startsWith(DATA_URL_PREFIX)) die("DataUrlStreamingOutput: url does not start with 'data:' : "+ ellipsis(dataUrl, 50));
final int commaPos = dataUrl.indexOf(",");
if (commaPos == -1) die("DataUrlStreamingOutput: no comma found in data url: "+ ellipsis(dataUrl, 50));
if (commaPos == dataUrl.length()-1) die("DataUrlStreamingOutput: no data found after comma data url: "+ ellipsis(dataUrl, 50));
final String mediaSpecifier = dataUrl.substring(DATA_URL_PREFIX.length(), commaPos);
final int b64pos = mediaSpecifier.indexOf(";base64");

final byte[] dataBytes = dataUrl.substring(commaPos).getBytes();
if (b64pos == -1) {
contentType = mediaSpecifier;
base64 = false;
data = new ByteArrayInputStream(dataBytes);
} else {
contentType = mediaSpecifier.substring(0, b64pos);
base64 = true;
data = new Base64InputStream(new ByteArrayInputStream(dataBytes), false);
}
}

@Override public void write(OutputStream output) throws IOException, WebApplicationException {
IOUtils.copyLarge(data, output);
}

}

+ 20
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlSendableResource.java ファイルの表示

@@ -0,0 +1,20 @@
package org.cobbzilla.wizard.stream;

import org.cobbzilla.util.collection.NameAndValue;

import static org.cobbzilla.util.http.URIUtil.getPath;
import static org.cobbzilla.util.io.FileUtil.basename;

public class UrlSendableResource extends SendableResource {

public UrlSendableResource(String url) {
super(new UrlStreamingOutput(url));
final UrlStreamingOutput urlOut = (UrlStreamingOutput) getOut();
setStatus(urlOut.getResponse().getStatus());
setHeaders(urlOut.getResponse().getHeaders().toArray(NameAndValue.EMPTY_ARRAY));
setName(basename(getPath(url)));
setContentLength(urlOut.getResponse().getContentLength());
setContentType(urlOut.getResponse().getContentType());
}

}

+ 36
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/stream/UrlStreamingOutput.java ファイルの表示

@@ -0,0 +1,36 @@
package org.cobbzilla.wizard.stream;

import lombok.Getter;
import org.apache.commons.io.IOUtils;
import org.cobbzilla.util.http.HttpRequestBean;
import org.cobbzilla.util.http.HttpResponseBean;
import org.cobbzilla.util.http.HttpUtil;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;

import static org.cobbzilla.util.daemon.ZillaRuntime.die;
import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;

public class UrlStreamingOutput implements StreamingOutput {

@Getter private HttpResponseBean response;
private ByteArrayInputStream in;

public UrlStreamingOutput(String url) {
try {
response = HttpUtil.getResponse(new HttpRequestBean(url));
in = new ByteArrayInputStream(response.getEntity());
} catch (IOException e) {
die("UrlStreamingOutput: "+shortError(e));
}
}

@Override public void write(OutputStream output) throws IOException, WebApplicationException {
IOUtils.copyLarge(in, output);
}

}

読み込み中…
キャンセル
保存