ScreenshotGenerator.java
package sk.iway.iwcm.grideditor.generator;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.io.IwcmFile;
public class ScreenshotGenerator {
private ScreenshotGenerator() {
}
/**
* Vyvtori nahlad stranky
* Pozor, potrebne pripojit Phantomjs binarny subor
* @param properties - parametre pre metodu
*/
public static ScreenShotPropBean generatePreview(ScreenShotPropBean properties)
{
String[] args = new String[11];//4
args[0] = Constants.getString("grideditorPhantomjsPath")+getRuntimeFile();//phantomjs.exe";
IwcmFile f1 = new IwcmFile(args[0]);
IwcmFile f2 = new IwcmFile("C:/"+ScreenshotGenerator.getRuntimeFile());
if(!f1.exists() && f2.exists())
{
f1 = f2;
args[0] = f2.getAbsolutePath();
}
String error = "";
if(!f1.exists())
{
error = "Binarny subor Phantomjs neexistuje nie je mozne generovat nahlady. Subor: " + args[0];
Logger.debug(ScreenshotGenerator.class, error);
properties.getErrors().add(error);
}
else
{
//JS skript na generovanie nahladu
args[1] = Tools.getRealPath("/components/grideditor/phantom/phantomjs_screenshot.js");
IwcmFile fileScreenShotJs = new IwcmFile(args[1]);
if(!fileScreenShotJs.exists())
{
error = "JS subor pre Phantomjs neexistuje nie je mozne generovat nahlady. Subor: " + args[1];
Logger.debug(ScreenshotGenerator.class, error);
properties.getErrors().add(error);
properties.setResultNumber(5);
//return 5;
}
//web stranka
args[2] = (properties.getScreenshotUrl().startsWith("http")) ? properties.getScreenshotUrl() : "http://"+properties.getScreenshotUrl();
//nazov suboru-nahladu ktory bude vytvoreny
String generatedScreenshotFileName = convertDomainToImageName(properties.getScreenshotUrl());
String defaultScreenshotFilePath = Constants.getString("phantomjsFileUrl")+"screenshots/"+generatedScreenshotFileName;//Tools.getRealPath(Constants.getString("imagesRootDir") + "/screenshots/"+file_name);
String dirRealPath = Tools.getRealPath( properties.getSaveImageToPath());//Tools.getRealPath(Constants.getString("imagesRootDir") + "/screenshots/");
if (dirRealPath != null)
{
IwcmFile screenshotFile = new IwcmFile(dirRealPath);
if (screenshotFile.getParentFile().getParentFile().getParentFile().exists()==false)
screenshotFile.getParentFile().getParentFile().getParentFile().mkdirs();
if (screenshotFile.getParentFile().getParentFile().exists()==false)
screenshotFile.getParentFile().getParentFile().mkdirs();
if (screenshotFile.getParentFile().exists()==false)
screenshotFile.getParentFile().mkdirs();
}
args[3] = fixImagePath(properties.getSaveImageToPath() ,defaultScreenshotFilePath);
args[4] = properties.getImageWidth()+"";//"920";//width
args[5] = properties.getImageHeight()+"";//"880";//height
args[6] = properties.getZoom()+"";//"1";//zoom
args[7] = properties.getTimeDelayMilisecond()+"";//"3000";//delay before screenshot
//ak potrebujeme nastavit cookie
args[8] = properties.getCookieHtmlData();
args[9] = getDomainName(properties.getScreenshotUrl());// domena pre cookies
args[10] = properties.isAutoHeigth()? "true" : "false";
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(args);
if(properties.isDebug())
{
InputStream stderr = proc.getErrorStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
String line = null;
while ((line = br.readLine()) != null)
{
Logger.debug(ScreenshotGenerator.class, "Status for "+properties.getScreenshotUrl()+" : "+line);
if(Tools.isNotEmpty(line))
{
properties.getPhantomErrors().add(line);
}
}
br.close();
}
properties.setResultNumber(proc.waitFor());
}
catch (Exception ex)
{
sk.iway.iwcm.Logger.error(ex);
}
Logger.debug(ScreenshotGenerator.class,"exitValue: "+ properties.getResultNumber()+" "+fixImagePath(properties.getSaveImageToPath() ,defaultScreenshotFilePath));
properties.setSaveImageToPath(fixImagePath(properties.getSaveImageToPath() ,defaultScreenshotFilePath));
return properties;
}
properties.setResultNumber(4);
return properties;
}
/** Ak je cesta relafivna, doplni absolutnu. Ak cesta konci na lomitko, doplni "image.jpg". Ak cesta neobsahuje bodku (priponu), doplni ".jpg"
*
* @param imagePath
* @param defaultPath
* @return
*/
private static String fixImagePath(String imagePath,String defaultPath)
{
String fixedPath = imagePath;
if(Tools.isNotEmpty(imagePath))
{
if(fixedPath.endsWith("/"))
{
fixedPath = fixedPath+"image.jpg" ;
}
else if(fixedPath.indexOf(".") == -1)
{
fixedPath = fixedPath + ".jpg";
}
if(fixedPath.startsWith("/"))
{
fixedPath = Tools.getRealPath(fixedPath);
}
return fixedPath;
}
return defaultPath;
}
public static String convertDomainToImageName (String str)
{
return (((str.replace("http://", "")).replace("www.","")).replace("/","")).replace(".","_")+".jpg";
}
/**
*
* @return vrati meno RuntimeFile-u "phantomjs" a pre Win "phantomjs.exe"
*/
public static String getRuntimeFile()
{
String result = "phantomjs";
if (System.getProperty("os.name").indexOf("Windows") != -1)
{
result = "phantomjs.exe";
}
return result ;
}
public static String getDomainName(String url){
try
{
URI uri = new URI(url);
String domain = uri.getHost();
if(domain != null)
{
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
}
catch (URISyntaxException use)
{
sk.iway.iwcm.Logger.error(use);
}
return "";
}
}