package org.opensourcephysics.tools;
import java.awt.Component;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.text.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.logging.Level;
import javax.swing.*;
import org.opensourcephysics.controls.OSPLog;
import org.opensourcephysics.controls.XML;
import org.opensourcephysics.display.OSPRuntime;
import org.opensourcephysics.media.core.VideoIO;
/**
* Checks to see if Xuggle is installed and working.
*
* @author Wolfgang Christian
* @author Douglas Brown
* @version 1.0
*/
public class DiagnosticsForXuggle {
@SuppressWarnings("javadoc")
public static final String XUGGLE_INSTALLER_URL ="http://www.compadre.org/osp/items/detail.cfm?ID=11606"; //$NON-NLS-1$
public static final String REQUEST_TRACKER = "Tracker"; //$NON-NLS-1$
static String newline = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
static String[] xuggleJarNames = new String[] {"xuggle-xuggler.jar", "logback-core.jar", //$NON-NLS-1$ //$NON-NLS-2$
"logback-classic.jar", "slf4j-api.jar"}; //$NON-NLS-1$ //$NON-NLS-2$
static int vmBitness;
static String codeBase, xuggleHome, javaExtDirectory;
static File[] codeBaseJars, xuggleHomeJars, javaExtensionJars;
static String pathEnvironment, pathValue;
static String requester;
static Component dialogOwner;
static{ // added by W. Christian
try {
String name = "org.opensourcephysics.media.xuggle.XuggleIO"; //$NON-NLS-1$
Class<?> xuggleClass = Class.forName(name);
Method method=xuggleClass.getMethod("registerWithVideoIO"); //$NON-NLS-1$
method.invoke(null, (Object[])null);
} catch(Exception ex) {
} catch(Error err) {
}
vmBitness = OSPRuntime.getVMBitness();
// get code base and and XUGGLE_HOME
try {
URL url = DiagnosticsForXuggle.class.getProtectionDomain().getCodeSource()
.getLocation();
// File myJarFile = new File(url.getPath());
File myJarFile = new File(url.toURI());
codeBase = myJarFile.getParent();
} catch (Exception e) {
}
xuggleHome = System.getenv("XUGGLE_HOME"); //$NON-NLS-1$
xuggleHomeJars = new File[xuggleJarNames.length];
javaExtensionJars = new File[xuggleJarNames.length];
codeBaseJars = new File[xuggleJarNames.length];
}
private DiagnosticsForXuggle() {
}
/**
* Sets the owner for JOptionPane dialogs.
* @param owner a JComponent (may be null)
*/
public static void setDialogOwner(Component owner) {
dialogOwner = owner;
}
/**
* Displays the About Xuggle dialog. If working correctly, shows version, etc.
* If not working, shows a diagnostic message.
*/
public static void aboutXuggle() {
int status = getStatusCode();
if (OSPLog.getLevelValue()<=Level.CONFIG.intValue()) {
// log XUGGLE_HOME and PATH environment variables
OSPLog.config("XUGGLE_HOME = "+xuggleHome); //$NON-NLS-1$
OSPLog.config("Code base = "+codeBase); //$NON-NLS-1$
// log current java VM
String javaHome = System.getProperty("java.home"); //$NON-NLS-1$
String bitness = "("+vmBitness+"-bit): "; //$NON-NLS-1$ //$NON-NLS-2$
OSPLog.config("Java VM "+bitness+javaHome); //$NON-NLS-1$
// log xuggle home jars
File[] xuggleJars = getXuggleJarFiles(xuggleHome+"/share/java/jars"); //$NON-NLS-1$
boolean hasAllHomeJars = xuggleJars[0]!=null;
for (int i=1; i< xuggleJars.length; i++) {
hasAllHomeJars = hasAllHomeJars && xuggleJars[i]!=null;
}
SimpleDateFormat sdf = new SimpleDateFormat();
String[] jarDates = new String[xuggleJarNames.length];
for (int i=0; i< jarDates.length; i++) {
jarDates[i] = xuggleJars[i]==null? "": " modified "+sdf.format(xuggleJars[i].lastModified()); //$NON-NLS-1$ //$NON-NLS-2$
}
String[] jarSizes = new String[xuggleJarNames.length];
for (int i=0; i< jarSizes.length; i++) {
jarSizes[i] = xuggleJars[i]==null? "": " (file size "+(xuggleJars[i].length()/1024)+"kB) "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
String fileData = "Xuggle home files: "; //$NON-NLS-1$
for (int i=0; i< jarSizes.length; i++) {
if (i>0) fileData+=", "; //$NON-NLS-1$
fileData+=xuggleJarNames[i]+" "+jarSizes[i]+xuggleJars[i]+jarDates[i]; //$NON-NLS-1$
}
OSPLog.config(fileData);
// log codeBase jars
xuggleJars = getXuggleJarFiles(codeBase);
for (int i=0; i< jarDates.length; i++) {
jarDates[i] = xuggleJars[i]==null? "": " modified "+sdf.format(xuggleJars[i].lastModified()); //$NON-NLS-1$ //$NON-NLS-2$
}
for (int i=0; i< jarSizes.length; i++) {
jarSizes[i] = xuggleJars[i]==null? "": " (file size "+(xuggleJars[i].length()/1024)+"kB) "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
fileData = "Code base files: "; //$NON-NLS-1$
for (int i=0; i< jarSizes.length; i++) {
if (i>0) fileData+=", "; //$NON-NLS-1$
fileData+=xuggleJarNames[i]+" "+jarSizes[i]+xuggleJars[i]+jarDates[i]; //$NON-NLS-1$
}
OSPLog.config(fileData);
// log extension jars
xuggleJars = getJavaExtensionJars();
for (int i=0; i< jarDates.length; i++) {
jarDates[i] = xuggleJars[i]==null? "": " modified "+sdf.format(xuggleJars[i].lastModified()); //$NON-NLS-1$ //$NON-NLS-2$
}
for (int i=0; i< jarSizes.length; i++) {
jarSizes[i] = xuggleJars[i]==null? "": " (file size "+(xuggleJars[i].length()/1024)+"kB) "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
fileData = "Java extension files: "; //$NON-NLS-1$
for (int i=0; i< jarSizes.length; i++) {
if (i>0) fileData+=", "; //$NON-NLS-1$
fileData+=xuggleJarNames[i]+" "+jarSizes[i]+xuggleJars[i]+jarDates[i]; //$NON-NLS-1$
}
OSPLog.config(fileData);
OSPLog.config(pathEnvironment+" = "+pathValue); //$NON-NLS-1$
}
// display appropriate dialog
if (status==0) { // xuggle working correctly
String fileInfo = newline;
String path = " "+XuggleRes.getString("Xuggle.Dialog.Unknown"); //$NON-NLS-1$ //$NON-NLS-2$
String className = "com.xuggle.xuggler.IContainer"; //$NON-NLS-1$
try {
Class<?> xuggleClass = Class.forName(className);
URL url = xuggleClass.getProtectionDomain().getCodeSource().getLocation();
// File codeFile = new File(url.getPath());
File codeFile = new File(url.toURI());
path = " " + codeFile.getAbsolutePath(); //$NON-NLS-1$
DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT);
Date date = new Date(codeFile.lastModified());
fileInfo = " (" + format.format(date) + ")"; //$NON-NLS-1$ //$NON-NLS-2$
} catch (Exception ex) {
}
String version = getXuggleVersion();
String message = XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.Version") //$NON-NLS-1$
+ " " + version + fileInfo + newline //$NON-NLS-1$
+ XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.Home") //$NON-NLS-1$
+ " " + xuggleHome + newline //$NON-NLS-1$
+ XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.Path") //$NON-NLS-1$
+ path;
if (VideoIO.guessXuggleVersion()==5.4) {
String recommended = XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message1"); //$NON-NLS-1$
if (requester.equals("Tracker")) { //$NON-NLS-1$
recommended += "\n"+XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message3"); //$NON-NLS-1$ //$NON-NLS-2$
}
message = message+"\n\n"+recommended; //$NON-NLS-1$
}
JOptionPane.showMessageDialog(dialogOwner,
message,
XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Title"), //$NON-NLS-1$
JOptionPane.INFORMATION_MESSAGE);
}
else { // xuggle not working
String[] diagnostic = getDiagnosticMessage(status, requester);
Box box = Box.createVerticalBox();
box.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
for (String line: diagnostic) {
box.add(new JLabel(line));
}
boolean showPrefsQuestionForTracker = false;
if (status==7 && "Tracker".equals(requester) && dialogOwner!=null) { //$NON-NLS-1$
// wrong VM bitness: show Preferences dialog for Tracker if appropriate
if (OSPRuntime.isWindows()) {
Collection<String> jreDirs = ExtensionsManager.getManager().getPublicJREs(32);
showPrefsQuestionForTracker = !jreDirs.isEmpty();
}
else if (OSPRuntime.isMac()) {
showPrefsQuestionForTracker = true;
}
}
boolean showCopyJarsQuestionForTracker = false;
if (status==5 && "Tracker".equals(requester) && dialogOwner!=null) { //$NON-NLS-1$
showCopyJarsQuestionForTracker = true;
}
if (showPrefsQuestionForTracker) {
box.add(new JLabel(" ")); //$NON-NLS-1$
String question = XuggleRes.getString("Xuggle.Dialog.AboutXuggle.ShowPrefs.Question"); //$NON-NLS-1$
box.add(new JLabel(question));
int response = JOptionPane.showConfirmDialog(dialogOwner, box,
XuggleRes.getString("Xuggle.Dialog.BadXuggle.Title"), //$NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if (response==JOptionPane.YES_OPTION) {
// call Tracker method by reflection
try {
Class<?> trackerClass = Class.forName("org.opensourcephysics.cabrillo.tracker.TFrame"); //$NON-NLS-1$
if (dialogOwner.getClass().equals(trackerClass)) {
Method m = trackerClass.getMethod("showPrefsDialog", String.class); //$NON-NLS-1$
m.invoke(dialogOwner, "runtime"); //$NON-NLS-1$
}
} catch (Exception e) {
}
}
}
else if (showCopyJarsQuestionForTracker) {
box.add(new JLabel(" ")); //$NON-NLS-1$
String question = XuggleRes.getString("Xuggle.Dialog.AboutXuggle.CopyJars.Question"); //$NON-NLS-1$
box.add(new JLabel(question));
int response = JOptionPane.showConfirmDialog(dialogOwner, box,
XuggleRes.getString("Xuggle.Dialog.BadXuggle.Title"), //$NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (response==JOptionPane.YES_OPTION) {
// copy jars to codebase directory
File dir = new File(codeBase);
ExtensionsManager.getManager().copyXuggleJarsTo(dir);
}
}
else {
JOptionPane.showMessageDialog(dialogOwner, box,
XuggleRes.getString("Xuggle.Dialog.BadXuggle.Title"), //$NON-NLS-1$
JOptionPane.WARNING_MESSAGE);
}
}
}
/**
* Displays the About Xuggle dialog for Tracker or other requester.
* @param request currently only "Tracker" is supported
*/
public static void aboutXuggle(String request) {
requester = request;
aboutXuggle();
}
/**
* Gets the xuggle jar files (named in xuggleJarNames) found in a given directory.
* Always returns the array, but individual elements may be null.
* @param dir the directory
* @return the array of jar files found
*/
public static File[] getXuggleJarFiles(String dir) {
// look for xuggle-xuggler and support jars in the directory
File[] jarFiles = new File[xuggleJarNames.length];
for (int i=0; i< jarFiles.length; i++) {
String next = xuggleJarNames[i];
File file = new File(dir, next);
jarFiles[i] = file.exists()? file: null;
}
return jarFiles;
}
/**
* Gets the xuggle jar names.
* @return an array of jar names
*/
public static String[] getXuggleJarNames() {
// return cloned array
String[] names = new String[xuggleJarNames.length];
System.arraycopy(xuggleJarNames, 0, names, 0, xuggleJarNames.length);
return names;
}
/**
* Gets the xuggle jar files in the current VM extensions.
* Always returns the array, but individual elements may be null.
* @return the array of jar files found
*/
public static File[] getJavaExtensionJars() {
File[] xuggleFiles = new File[xuggleJarNames.length];
// look for xuggle jars in system extensions directories
String extFolders = XML.forwardSlash(System.getProperty("java.ext.dirs")); //$NON-NLS-1$
String separator = System.getProperty("path.separator"); //$NON-NLS-1$
int n = extFolders.indexOf(separator);
if (n==-1) { // no separators, so single path
javaExtDirectory = extFolders;
xuggleFiles = getXuggleJarFiles(extFolders);
if (xuggleFiles[0]!=null) {
return xuggleFiles;
}
}
else {
String dir = extFolders;
javaExtDirectory = null;
while (xuggleFiles[0]==null && n > -1) {
dir = extFolders.substring(0, n);
if (javaExtDirectory==null)
javaExtDirectory = dir; // first one in list by default
extFolders = extFolders.substring(n + 1);
xuggleFiles = getXuggleJarFiles(dir);
if (xuggleFiles[0]!=null) {
javaExtDirectory = dir;
return xuggleFiles;
}
n = extFolders.indexOf(separator);
}
}
return xuggleFiles;
}
/**
* Gets a status code that identifies the current state of the Xuggle video engine.
* Codes are:
* 0 working correctly
* 1 not installed (XUGGLE_HOME==null, no xuggle jars in code base and extensions)
* 2 can't find xuggle home (XUGGLE_HOME==null but xuggle jars found in code base and/or extensions)
* 3 XUGGLE_HOME incomplete: missing xuggle jars in XUGGLE_HOME/share/java/jars
* 4 XUGGLE_HOME OK, but incorrect "PATH", "DYLD_LIBRARY_PATH", or "LD_LIBRARY_PATH"
* 5 XUGGLE_HOME OK, but no xuggle jars in code base or extensions
* 6 XUGGLE_HOME OK, but mismatched xuggle versions in code base or extensions
* 7 XUGGLE_HOME OK, but wrong Java VM bitness
* -1 none of the above
*
* @return status code
*/
public static int getStatusCode() {
codeBaseJars = getXuggleJarFiles(codeBase);
javaExtensionJars = getJavaExtensionJars();
pathEnvironment = OSPRuntime.isWindows()? "Path": OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
pathValue = System.getenv(pathEnvironment);
// return 0 if working correctly
if (VideoIO.getVideoType(VideoIO.ENGINE_XUGGLE, null)!=null) return 0;
boolean completeExt = javaExtensionJars[0]!=null;
for (int i=1; i< javaExtensionJars.length; i++) {
completeExt = completeExt && javaExtensionJars[i]!=null;
}
boolean completeCodeBase = codeBaseJars[0]!=null;
for (int i=1; i< codeBaseJars.length; i++) {
completeCodeBase = completeCodeBase && codeBaseJars[i]!=null;
}
if (xuggleHome==null) {
return completeExt? 2: completeCodeBase? 2: 1;
}
// get xuggle home jars
xuggleHomeJars = getXuggleJarFiles(xuggleHome+"/share/java/jars"); //$NON-NLS-1$
boolean completeHome = xuggleHomeJars[0]!=null;
for (int i=1; i< xuggleHomeJars.length; i++) {
completeHome = completeHome && xuggleHomeJars[i]!=null;
}
if (!completeHome) return 3; //missing xuggle jars in XUGGLE_HOME/share/java/jars
// from this point on XUGGLE_HOME is OK
if (!completeExt && !completeCodeBase) return 5; //no xuggle jars in code base or extensions
// from here on either code base or extension jars are complete
File loadableJar = completeExt? javaExtensionJars[0]: codeBaseJars[0];
long homeLength = xuggleHomeJars[0].length();
boolean mismatched = homeLength!=loadableJar.length();
if (mismatched) return 6; //mismatched xuggle versions in code base or extensions
if (homeLength<1000000) { // Xuggle version 3.4
String folder = OSPRuntime.isWindows()? "/bin": "/lib"; //$NON-NLS-1$ //$NON-NLS-2$
String xuggleLib = XML.forwardSlash(xuggleHome+folder);
if (XML.forwardSlash(pathValue).indexOf(xuggleLib)==-1) return 4; //incorrect "PATH", "DYLD_LIBRARY_PATH", or "LD_LIBRARY_PATH"
// Xuggle 3.4 requires 32-bit Java VM on Windows
if (vmBitness==64 && OSPRuntime.isWindows()) return 7;
}
// all Xuggle versions require 64-bit VM on OSX
if (vmBitness==32 && OSPRuntime.isMac()) return 7;
return -1;
}
/**
* Gets a diagnostic message when Xuggle is not working.
* @param status the status code from getStatusCode() method
* @param requester--currently only "Tracker" is supported
* @return an array strings containing the message lines
*/
public static String[] getDiagnosticMessage(int status, String requester) {
if (status==0) return new String[] {"OK"}; //$NON-NLS-1$
ArrayList<String> message = new ArrayList<String>();
switch(status) {
case 1: // not installed (XUGGLE_HOME==null, missing xuggle jars in code base and extensions)
message.add(XuggleRes.getString("Xuggle.Dialog.NoXuggle.Message1")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message3")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.TrackerInstallerPath.Message")); //$NON-NLS-1$
message.add(Diagnostics.TRACKER_INSTALLER_URL);
}
else {
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.InstallerPath")); //$NON-NLS-1$
message.add(XUGGLE_INSTALLER_URL);
}
break;
case 2: // can't find xuggle home (XUGGLE_HOME==null, but xuggle jars found in code base and/or extensions)
message.add(XuggleRes.getString("Xuggle.Dialog.BadXuggle.Message")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NoXuggleHome.Message1")); //$NON-NLS-1$
if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message3")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.TrackerInstallerPath.Message")); //$NON-NLS-1$
message.add(Diagnostics.TRACKER_INSTALLER_URL);
}
else {
message.add(XuggleRes.getString("Xuggle.Dialog.NoXuggleHome.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.InstallerPath")); //$NON-NLS-1$
message.add(XUGGLE_INSTALLER_URL);
}
break;
case 3: // XUGGLE_HOME incomplete: missing or bad xuggle jars in XUGGLE_HOME/share/java/jars
message.add(XuggleRes.getString("Xuggle.Dialog.BadXuggle.Message")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.IncompleteXuggle.Message1")); //$NON-NLS-1$
if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message3")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.TrackerInstallerPath.Message")); //$NON-NLS-1$
message.add(Diagnostics.TRACKER_INSTALLER_URL);
}
else {
message.add(XuggleRes.getString("Xuggle.Dialog.IncompleteXuggle.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.InstallerPath")); //$NON-NLS-1$
message.add(XUGGLE_INSTALLER_URL);
}
break;
case 4: // XUGGLE_HOME OK, but incorrect "PATH", "DYLD_LIBRARY_PATH", or "LD_LIBRARY_PATH"
message.add(XuggleRes.getString("Xuggle.Dialog.MissingEnvironmentVariable.Message1")); //$NON-NLS-1$
message.add("\""+pathEnvironment+"\" "+XuggleRes.getString("Xuggle.Dialog.MissingEnvironmentVariable.Message2")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
break;
case 5: // XUGGLE_HOME OK, but no xuggle jars in code base or extensions
String missingJars = ""; //$NON-NLS-1$
for (int i=0; i<xuggleJarNames.length; i++) {
if (javaExtensionJars[i]==null) {
if (missingJars.length()>1) missingJars += ", "; //$NON-NLS-1$
missingJars += xuggleJarNames[i];
}
}
String source = XML.forwardSlash(xuggleHome)+"/share/java/jars"; //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.NotWorking.Message")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.Missing.Message")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(missingJars);
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.CopyToCodeBase.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.CopyToCodeBase.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.SourceDirectory.Message")+" "+source); //$NON-NLS-1$ //$NON-NLS-2$
message.add(XuggleRes.getString("Xuggle.Dialog.TargetDirectory.Message")+" "+codeBase); //$NON-NLS-1$ //$NON-NLS-2$
break;
case 6: // XUGGLE_HOME OK, but mismatched xuggle versions in code base or extensions
missingJars = ""; //$NON-NLS-1$
for (int i=0; i<xuggleJarNames.length; i++) {
if (javaExtensionJars[i]==null) {
if (missingJars.length()>1) missingJars += ", "; //$NON-NLS-1$
missingJars += xuggleJarNames[i];
}
}
source = XML.forwardSlash(xuggleHome)+"/share/java/jars"; //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.NotWorking.Message")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.Mismatched.Message")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(missingJars);
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.CopyToCodeBase.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NeedJars.CopyToCodeBase.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.SourceDirectory.Message")+" "+source); //$NON-NLS-1$ //$NON-NLS-2$
message.add(XuggleRes.getString("Xuggle.Dialog.TargetDirectory.Message")+" "+codeBase); //$NON-NLS-1$ //$NON-NLS-2$
break;
case 7: // XUGGLE_HOME OK, but wrong Java VM bitness
if (OSPRuntime.isMac()) {
// wrong VM on Mac: should be 64-bit
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMMac.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMMac.Message2")); //$NON-NLS-1$
if (REQUEST_TRACKER.equals(requester)) {
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMMac.Message3")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMMac.Message4")); //$NON-NLS-1$
}
}
else {
// wrong VM on Windows (shouldn't happen in Linux)
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMWindows.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.WrongVMWindows.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
Collection<String> jreDirs = ExtensionsManager.getManager().getPublicJREs(32);
if (jreDirs.isEmpty()) {
if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.NoVMTracker.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NoVMTracker.Message2")); //$NON-NLS-1$
}
else {
message.add(XuggleRes.getString("Xuggle.Dialog.NoVM.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NoVM.Message2")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NoVM.Message3")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.NoVM.Message4")); //$NON-NLS-1$
}
}
else if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.SetVM.Message1")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.SetVM.Message2")); //$NON-NLS-1$
}
}
break;
default: // none of the above
message.add(XuggleRes.getString("Xuggle.Dialog.BadXuggle.Message")); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.UnknownProblem.Message")); //$NON-NLS-1$
if (REQUEST_TRACKER.equals(requester)) {
message.add(XuggleRes.getString("Xuggle.Dialog.ReplaceXuggle.Message3")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.TrackerInstallerPath.Message")); //$NON-NLS-1$
message.add(Diagnostics.TRACKER_INSTALLER_URL);
}
else {
message.add(XuggleRes.getString("Xuggle.Dialog.NoXuggleHome.Message2")); //$NON-NLS-1$
message.add(" "); //$NON-NLS-1$
message.add(XuggleRes.getString("Xuggle.Dialog.AboutXuggle.Message.InstallerPath")); //$NON-NLS-1$
message.add(XUGGLE_INSTALLER_URL);
}
}
return message.toArray(new String[message.size()]);
}
/**
* Gets the Xuggle version as a String. Returns "Unknown' if Xuggle is missing or unidentified.
* @return Xuggle version
*/
public static String getXuggleVersion() {
String xuggleVersion = XuggleRes.getString("Xuggle.Dialog.Unknown"); //$NON-NLS-1$
int status = getStatusCode();
if (status==0) { // xuggle working correctly
try {
String name = "com.xuggle.xuggler.Version"; //$NON-NLS-1$
Class<?> xuggleClass = Class.forName(name);
Method method = xuggleClass.getMethod("getVersionString"); //$NON-NLS-1$
xuggleVersion = (String)method.invoke(null, (Object[])null);
} catch(Exception ex) {
} catch(Error err) {
}
}
return xuggleVersion;
}
/**
* Tests this class.
* @param args ignored
*/
public static void main(String[] args) {
System.out.println(getXuggleVersion());
aboutXuggle();
}
}