/*
* Copyright 2017 TWO SIGMA OPEN SOURCE, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.twosigma.beaker.mimetype;
import com.google.common.io.ByteStreams;
import com.google.common.io.Files;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.net.URL;
public class MIMEContainer {
public enum MIME {
TEXT_PLAIN("text/plain"),
TEXT_HTML("text/html"),
TEXT_LATEX("text/latex"),
TEXT_MARKDOWN("text/markdown"),
APPLICATION_JAVASCRIPT("application/javascript"),
IMAGE_PNG("image/png"),
IMAGE_JPEG("image/jpeg"),
IMAGE_SVG("image/svg+xml"),
HIDDEN("x-beakerx/empty");
private String mime;
MIME(String mime) {
this.mime = mime;
}
public String getMime() {
return mime;
}
}
private MIME mime;
private String code;
public MIMEContainer() {
}
public MIMEContainer(MIME mime) {
this.mime = mime;
}
public MIMEContainer(MIME mime, String code) {
this.mime = mime;
this.code = code;
}
public MIME getMime() {
return mime;
}
public String getCode() {
return code;
}
public static MIMEContainer HIDDEN() {
return addMimeType(MIME.HIDDEN);
}
public static MIMEContainer JavaScript(Object code) {
return addMimeType(MIME.APPLICATION_JAVASCRIPT, code);
}
public static MIMEContainer HTML(Object code) {
return addMimeType(MIME.TEXT_HTML, code);
}
public static MIMEContainer Latex(Object code) {
return addMimeType(MIME.TEXT_LATEX, code);
}
public static MIMEContainer Text(Object code) {
return addMimeType(MIME.TEXT_PLAIN, code);
}
public static MIMEContainer Markdown(Object code) {
return addMimeType(MIME.TEXT_MARKDOWN, code);
}
public static MIMEContainer Math(String code) {
code = StringUtils.strip(code, "$");
return addMimeType(MIME.TEXT_LATEX, "$$" + code + "$$");
}
public static MIMEContainer Javascript(Object code) {
return addMimeType(MIME.APPLICATION_JAVASCRIPT, code);
}
public static MIMEContainer IFrame(String src, Object width, int height) {
String code = String.format("<iframe width = '%1$s' height= '%2$d' src = '%3$s' frameborder='0' allowfullscreen> </iframe>", width.toString(), height, src);
return addMimeType(MIME.TEXT_HTML, code);
}
public static MIMEContainer VimeoVideo(String id, Object width, int height) {
String src = String.format("https://player.vimeo.com/video/%1$s", id);
return IFrame(src, width, height);
}
public static MIMEContainer ScribdDocument(String id, Object width, int height) {
String src = String.format("https://www.scribd.com/embeds/%1$s/content", id);
return IFrame(src, width, height);
}
public static MIMEContainer YoutubeVideo(String id) {
String src = String.format("https://www.youtube.com/embed/%1$s", id);
return IFrame(src, 400, 300);
}
public static MIMEContainer Video(String src) {
String output = String.format("<video src='%1$s' controls> Your browser does not support the <code>video</code> element. </video>", src);
return addMimeType(MIME.TEXT_HTML, output);
}
protected static MIMEContainer addMimeType(MIME mime) {
return new MIMEContainer(mime);
}
protected static MIMEContainer addMimeType(MIME mime, Object code) {
return new MIMEContainer(mime, code.toString());
}
protected static String exceptionToString(Exception e) {
StringWriter w = new StringWriter();
PrintWriter printWriter = new PrintWriter(w);
e.printStackTrace(printWriter);
printWriter.flush();
return w.toString();
}
protected static boolean exists(String data) {
File f = new File(data);
return (f.exists() && !f.isDirectory());
}
protected static boolean isValidURL(String urlString) {
try {
URL url = new URL(urlString);
url.toURI();
return true;
} catch (Exception exception) {
return false;
}
}
protected static byte[] getBytes(Object data) throws IOException {
byte[] bytes;
if (isValidURL(data.toString())) {
bytes = ByteStreams.toByteArray((new URL(data.toString()).openStream()));
} else if (exists(data.toString())) {
File imgFile = new File(data.toString());
bytes = Files.toByteArray(imgFile);
} else {
throw new FileNotFoundException(data.toString() + " doesn't exist. ");
}
return bytes;
}
@Override
public String toString() {
return this.getMime() + " CODE = " + this.getCode();
}
}