/* MonkeyTalk - a cross-platform functional testing tool
Copyright (C) 2012 Gorilla Logic, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package com.gorillalogic.monkeyconsole.editors.utils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.LocationListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.eclipse.ui.internal.browser.BrowserViewer;
import org.eclipse.ui.internal.browser.WebBrowserEditor;
import org.eclipse.ui.internal.browser.WebBrowserEditorInput;
import org.eclipse.ui.internal.browser.WebBrowserView;
//?? Juno ?? import org.eclipse.rwt.widgets.ExternalBrowser;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ViewPart;
import com.gorillalogic.monkeyconsole.plugin.FoneMonkeyPlugin;
import com.gorillalogic.monkeyconsole.preferences.PreferenceConstants;
import com.gorillalogic.monkeytalk.Command;
import com.gorillalogic.monkeytalk.api.js.tools.JSMTGenerator;
public class MonkeyTalkUtils {
public static final String EXTERNAL_BROWSER_ID=FoneMonkeyPlugin.PLUGIN_ID + "_BROWSER";
public static void runOnGUI(Runnable r, Display display) {
runOnGUI(r, true, display);
}
public static void runOnGUI(Runnable r, boolean async, Display display) {
if (!display.isDisposed()) {
if (async)
display.asyncExec(r);
else
display.syncExec(r);
}
}
public static void openBrowser(final String name, String url, final IWorkbenchPartSite site)
throws PartInitException,MalformedURLException {
if (shouldUseExternalBrowser()) {
openExternalBrowser(name, url, site);
} else {
openInternalBrowser(name, url, site);
}
}
private static boolean shouldUseExternalBrowser() {
return isWindows();
}
private static void openExternalBrowser(final String name, String url, final IWorkbenchPartSite site)
throws PartInitException,MalformedURLException {
// ExternalBrowser.open(name,url,ExternalBrowser.LOCATION_BAR | ExternalBrowser.NAVIGATION_BAR | ExternalBrowser.STATUS);
IWorkbenchBrowserSupport browserSupport =
PlatformUI.getWorkbench().getBrowserSupport();
IWebBrowser browser =
browserSupport.createBrowser(IWorkbenchBrowserSupport.AS_EXTERNAL,
EXTERNAL_BROWSER_ID, "", "");
browser.openURL(new URL(url));
}
private static void openInternalBrowser(final String name, String url, final IWorkbenchPartSite site)
throws PartInitException,MalformedURLException {
WebBrowserEditor browserEditor = (WebBrowserEditor) site.getPage()
.openEditor(
new WebBrowserEditorInput(new URL(url), BrowserViewer.BUTTON_BAR
| BrowserViewer.LOCATION_BAR, name),
WebBrowserEditor.WEB_BROWSER_EDITOR_ID);
Browser swtBrowser;
try {
Field wb = WebBrowserEditor.class.getDeclaredField("webBrowser");
wb.setAccessible(true);
BrowserViewer bviewer = (BrowserViewer) wb.get(browserEditor);
Field b = BrowserViewer.class.getDeclaredField("browser");
b.setAccessible(true);
swtBrowser = (Browser) b.get(bviewer);
} catch (Exception e) {
throw new IllegalStateException("Error opening web browser", e);
}
swtBrowser.addLocationListener(new LocationListener() {
@Override
public void changing(LocationEvent event) {
String location = event.location;
if (!location.contains("liveview.html")) {
return;
}
Pattern p = Pattern.compile("//(.+):");
Matcher m = p.matcher(location);
m.find();
//String hostname = m.group(1);
WebBrowserView browserView;
try {
browserView = (WebBrowserView) site
.getPage()
.showView(WebBrowserView.WEB_BROWSER_VIEW_ID, "Live View",
IWorkbenchPage.VIEW_ACTIVATE);
} catch (PartInitException e) {
throw new IllegalStateException("Unable to show browser", e);
}
browserView.setURL(location);
try {
Method meth = ViewPart.class.getDeclaredMethod("setPartName", String.class);
meth.setAccessible(true);
meth.invoke(browserView, name);
} catch (Exception e1) {
System.out.println("Unable to set window name");
e1.printStackTrace();
}
try {
FoneMonkeyPlugin.getDefault().getController()
.connectToCloudHost(new URL(location).getHost());
} catch (MalformedURLException e) {
}
event.doit = false;
}
@Override
public void changed(LocationEvent event) {
}
});
}
public static void setDefaultUPFromClassPath() throws IOException{
IPreferenceStore preferenceStore = FoneMonkeyPlugin.getDefault().getPreferenceStore();
String pass = preferenceStore.getString(PreferenceConstants.P_CLOUDPASS);
String username = preferenceStore.getString(PreferenceConstants.P_CLOUDUSR);
if((username+pass).trim().equalsIgnoreCase("")){
Properties rb = getPropertiesFromClasspath("com/gorillalogic/cloud/ideversion/credentials.properties");
preferenceStore.setValue(PreferenceConstants.P_CLOUDPASS, rb.getProperty("password"));
preferenceStore.setValue(PreferenceConstants.P_CLOUDUSR, rb.getProperty("username"));
}
}
public static Properties getPropertiesFromClasspath(String propFileName) throws IOException {
// loading xmlProfileGen.properties from the classpath
Properties props = new Properties();
InputStream inputStream = MonkeyTalkUtils.class.getClassLoader()
.getResourceAsStream(propFileName);
if (inputStream == null) {
throw new FileNotFoundException("property file '" + propFileName
+ "' not found in the classpath");
}
props.load(inputStream);
return props;
}
/**
* Make a list of strings lower case
* @param strings
* @return
*/
public static List<String> toLowerList(List<String> listToConvert)
{
List<String> copiedList = new ArrayList<String>();
for(String x : listToConvert){
copiedList.add(x.toLowerCase());
}
return copiedList;
}
public static void generateJScript(FileEditorInput fei, List<Command> commands, IWorkbenchPartSite editorSite) {
File f = new File((fei).getPath().toString());
f = f.getParentFile();
String js = "";
try {
js = JSMTGenerator.createScript((fei).getFile().getProject()
.getName(), fei.getName(), commands);
} catch (Exception e) {
// /couldn't convert
}
String fileName = (fei).getName().substring(0,
(fei).getName().length() - 3)
+ ".js";
File outfile = new File(f.getAbsolutePath() + "/" + fileName);
if (outfile.exists()) {
// ////ask the user before overwriting!
}
try {
BufferedWriter out = new BufferedWriter(new FileWriter(outfile));
out.write(js);
out.close();
} catch (IOException e) {
//System.out.println("Exception: " + e.getMessage());
}
try {
(fei).getFile().getProject()
.refreshLocal(IResource.DEPTH_INFINITE, null);
IEditorPart ieditorpart = editorSite.getPage()
.getActiveEditor();
IFile fileToBeOpened = ((IFileEditorInput) ieditorpart
.getEditorInput()).getFile().getProject().getFile(fileName);
IEditorInput editorInput = new FileEditorInput(fileToBeOpened);
editorSite.getPage()
.openEditor(editorInput,
"org.eclipse.wst.jsdt.ui.CompilationUnitEditor");
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static boolean isDemoApp(String pathToApp) {
if (pathToApp==null | pathToApp.length()==0) {
return false;
}
if (pathToApp.contains("Demo") || pathToApp.contains("demo")) {
// certainly not conclusive, but whatever...
return true;
}
return false;
}
private static String OS = System.getProperty("os.name").toLowerCase();
public static String getOs() {
if (isWindows()) {
return "windows";
} else if (isMac()) {
return("mac");
} else if (isSolaris()) {
return "solaris";
} else if (isLinux()) {
return "linux";
} else if (isUnix()) {
return "unix";
} else {
return OS;
}
}
public static boolean isWindows() {
return (OS.indexOf("win") >= 0);
}
public static boolean isMac() {
return (OS.indexOf("mac") >= 0);
}
public static boolean isUnix() {
return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 || isSolaris());
}
public static boolean isLinux() {
return (OS.indexOf("linux") >= 0);
}
public static boolean isSolaris() {
return (OS.indexOf("sunos") >= 0);
}
}