package org.xmind.ui.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.xmind.ui.internal.ToolkitPlugin;
/**
* @author Shawn Liu
* @since 3.6.50
*/
public class WebImageManager {
public static interface WebImageCallback {
void handleWith(String imagePath);
}
private static final Map<String, String> mime = new HashMap<String, String>();
static {
mime.put("image/bmp", ".bmp"); //$NON-NLS-1$ //$NON-NLS-2$
mime.put("image/gif", ".gif"); //$NON-NLS-1$ //$NON-NLS-2$
mime.put("image/x-icon", ".ico"); //$NON-NLS-1$ //$NON-NLS-2$
mime.put("image/jpeg", ".jpg"); //$NON-NLS-1$ //$NON-NLS-2$
mime.put("image/png", ".png"); //$NON-NLS-1$ //$NON-NLS-2$
mime.put("image/tiff", ".tiff"); //$NON-NLS-1$ //$NON-NLS-2$
}
private static final int ID_LENGTH = 26;
private static final char PADDING_CHAR = '0';
private static final Random random = new Random(System.currentTimeMillis());
private static WebImageManager webImageManager = null;
private WebImageManager() {
}
public void requestWebImage(final String imageUrl,
final WebImageCallback callback) {
if (callback == null) {
return;
}
if (imageUrl == null) {
callback.handleWith(null);
return;
}
//get image from web
Job job = new Job("") { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(null, 100);
String imageFilePath = createWebImageFile(imageUrl);
callback.handleWith(imageFilePath);
monitor.worked(100);
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.setUser(false);
job.schedule();
}
private String createWebImageFile(String imageUrl) {
if (imageUrl == null) {
return null;
}
InputStream inputStream = null;
FileOutputStream outputStream = null;
String tempImageFilePath = null;
try {
HttpURLConnection connection = (HttpURLConnection) new URL(imageUrl)
.openConnection();
connection.setInstanceFollowRedirects(true);
connection.connect();
int responseCode = connection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
return null;
}
String contentType = connection.getHeaderField("Content-Type"); //$NON-NLS-1$
if (contentType == null) {
return null;
}
String imageExtension = getImageExtension(contentType);
if (imageExtension == null) {
return null;
}
//write image from stream to file
inputStream = connection.getInputStream();
tempImageFilePath = getTempImageFilePath(imageUrl, imageExtension);
File file = new File(tempImageFilePath);
WebImageManager.ensureFileParent(file);
outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int num = 0;
while ((num = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, num);
outputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return tempImageFilePath;
}
private String getTempImageFilePath(String imageUrl,
String imageExtension) {
String tempFile = ToolkitPlugin.getDefault().getStateLocation()
.append("/webImages/" //$NON-NLS-1$
+ createId() + imageExtension)
.toString();
return tempFile;
}
private String createId() {
BigInteger bi = new BigInteger(128, random);
String id = bi.toString(32);
int paddingLength = ID_LENGTH - id.length();
if (paddingLength > 0) {
StringBuffer buf = new StringBuffer(ID_LENGTH);
for (int i = 0; i < paddingLength; i++) {
buf.append(PADDING_CHAR);
}
buf.append(id);
return buf.toString();
}
return id;
}
private static File ensureFileParent(File f) {
ensureDirectory(f.getParentFile());
return f;
}
private static File ensureDirectory(File dir) {
if (!dir.exists())
dir.mkdirs();
return dir;
}
private static String getImageExtension(String contentType) {
if (contentType == null) {
return null;
}
return mime.get(contentType);
}
public static synchronized WebImageManager getInstance() {
if (webImageManager == null) {
webImageManager = new WebImageManager();
}
return webImageManager;
}
}