/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community 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.osedu.org/licenses/ECL-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 tufts.vue.action; import tufts.vue.VueUtil; import tufts.vue.DEBUG; import tufts.vue.VUE; import java.net.URL; import java.io.File; /** * Display a given URL in an external browser. */ public class ShowURLAction extends tufts.vue.VueAction { private String urlString = null; private URL url = null; private String localName = null; // only used if we need to unpack from a jar public ShowURLAction(String urlString) { this(urlString, urlString); } public ShowURLAction(String label, String urlString) { super(label); this.urlString = urlString; } /** * If the given URL is a jar:file URL (which a browser can't acccess), * unpack it into the users VUE config dir (e.g., ~/.vue), and * display it from there. However, if the file was already * unpacked and created there, don't bother to unpack it again. */ public ShowURLAction(String label, URL url, String fileName) { super(label); this.url = url; this.localName = fileName; } @Override public boolean isUserEnabled() { return true; } public void act() { String browserURL = null; if (url == null) { browserURL = urlString; } else { if (DEBUG.IO) Log.info("ShowURLAction: raw url: " + url); if (DEBUG.IO) out("PROTOCOL: " + url.getProtocol()); if ("jar".equals(url.getProtocol())) { if (DEBUG.IO) out("Dealing with [" + localName + "]"); File dir = VueUtil.getDefaultUserFolder(); File localFile = new File(dir, this.localName); try { if (DEBUG.IO) out("Looking for " + localFile); if (localFile.exists() && localFile.length() > 0) { if (DEBUG.IO) out("EXISTS: " + localFile); } else { if (DEBUG.IO) out("COPYING FILE to " + localFile); if (!localFile.exists() && !localFile.createNewFile()) throw new Error("failed to create " + localFile); VueUtil.copyURL(url, localFile); } browserURL = localFile.toURL().toString(); if (DEBUG.IO) out("LOCAL URL: " + browserURL); } catch (Throwable t) { Log.error("Failed to display content for " + url + " in " + localFile); t.printStackTrace(); return; } } else { browserURL = url.toString(); } } try { tufts.vue.VueUtil.openURL(browserURL); } catch (Exception ex) { //System.out.println("ShowURLAction " + this + " failed to display [" + url + "] on " + ae); throw new RuntimeException("ShowURLAction " + this + " failed to display [" + url + "]", ex); } } }