net.rim.ejde.internal.launching.MDSCSChecker.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.launching.MDSCSChecker.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.launching;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import net.rim.ejde.internal.launching.JavaVMChecker.JavaVMCheckResult;
import net.rim.ejde.internal.util.CompatibilityVersion;
import net.rim.ejde.internal.util.Messages;

import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.tree.ClassNode;

/**
 * A utility class to check MDS-CS version and Java version, and determine if the MDS-CS can be launched. It also updates the
 * MDS-CS launch batch file.
 *
 * @author dmeng
 *
 */
public class MDSCSChecker {

    // OK: launch MDS-CS without problem
    // CANCEL: stop launching
    // DISABLE_MDSCS: launching with disabled MDS-CS
    public static enum MDSCSCheckResult {
        OK, CANCEL, DISABLE_MDSCS
    }

    private static Logger _logger = Logger.getLogger(MDSCSChecker.class);
    private static int _userDecision = -1;
    private static String _currentVersion;

    /***
     * Check if required version of Java can be found for launching MDS-CS
     *
     * @param MDSHomePath
     *            The MDS-CS home path
     * @return <code>true</code> continue this launching session, otherwise <code>false</code>.
     */
    public static MDSCSCheckResult checkMDSCS(File MDSHomePath) {
        String dialogTitle = "", dialogMessage = ""; //$NON-NLS-1$
        JavaVMCheckResult javaVMResult = null;

        // Get version of current MDS-CS
        CompatibilityVersion mdscsVersion = getMDSCSVersion(MDSHomePath);
        // if MDS-CS version is null, warn user that MDS-CS can not be found
        if (mdscsVersion == null) {
            dialogTitle = Messages.FledgeLaunchConfigurationDelegate_noMDSCSMsg;
        } else {
            // if versions of MDS-CS is equal or greater than 4.1.5, Java 1.6 is
            // required
            CompatibilityVersion mdscs415Version = new CompatibilityVersion("4.1.5"); //$NON-NLS-1$
            String requiredJavaVersion;
            if (mdscsVersion.compareTo(mdscs415Version) >= 0) {
                requiredJavaVersion = "1.6"; //$NON-NLS-1$
            } else {
                requiredJavaVersion = "1.5"; //$NON-NLS-1$
            }
            javaVMResult = JavaVMChecker.getInstance().checkJavaVM(requiredJavaVersion,
                    JavaVMChecker.CHECK_TYPE_GREATEROREQUAL); //$NON-NLS-1$
            if (javaVMResult == null) {
                // required version of Java can not be found in system.
                dialogTitle = Messages.FledgeLaunchConfigurationDelegate_noLaunchMDSCSMsg;
                dialogMessage = NLS.bind(Messages.FledgeLaunchConfigurationDelegate_noJavaMDSCSMsg,
                        requiredJavaVersion);
            }
        }

        if (javaVMResult == null) {
            // either MDS-CS is not found or required Java to run MDS-CS is not
            // found
            dialogMessage = dialogMessage + NLS.bind(Messages.FledgeLaunchConfigurationDelegate_clickNoMDSCSMsg,
                    IDialogConstants.PROCEED_LABEL, IDialogConstants.STOP_LABEL);
            askUserDecision(dialogTitle, dialogMessage);
            if (_userDecision == 0) { // continue launching
                return MDSCSCheckResult.DISABLE_MDSCS;
            } else {
                return MDSCSCheckResult.CANCEL;
            }
        }

        // required version of Java has been found
        if (javaVMResult.getLocationType() != JavaVMCheckResult.LOCATION_ENV_JAVA_HOME) {
            if (!isJavaHomeEnvEmpty() || (javaVMResult.getLocationType() != JavaVMCheckResult.LOCATION_ENV_PATH)) {
                updateBatchFiles(MDSHomePath, javaVMResult);
            }
        }

        return MDSCSCheckResult.OK;
    }

    private static boolean isJavaHomeEnvEmpty() {
        String javaHomeDir = System.getenv("JAVA_HOME"); //$NON-NLS-1$
        if (javaHomeDir != null) {
            javaHomeDir = javaHomeDir.trim();
        }

        return (javaHomeDir == null) || (javaHomeDir.length() == 0);
    }

    private static void updateBatchFiles(File MDSHome, JavaVMCheckResult javaVMResult) {
        try {
            String javaExePath;
            if (javaVMResult.getLocationType() == JavaVMCheckResult.LOCATION_ENV_PATH) {
                // required Java is found in path environment variable.
                javaExePath = "java.exe"; //$NON-NLS-1$
            } else {
                // required Java must be found in window registry
                javaExePath = javaVMResult.getJavaHomeDir() + "\\bin\\java.exe"; //$NON-NLS-1$
            }

            // for run.bat
            String runBatFilePath = MDSHome.getCanonicalPath() + "\\run.bat"; //$NON-NLS-1$
            backup(runBatFilePath);
            PrintWriter runBatWriter = new PrintWriter(new FileOutputStream(runBatFilePath));
            runBatWriter.println("@ECHO  OFF"); //$NON-NLS-1$
            runBatWriter.println("call setBMDSEnv"); //$NON-NLS-1$
            runBatWriter.println("start cmd /v:on /c \"" //$NON-NLS-1$
                    + javaExePath
                    + "\" -classpath !BMDS_CLASSPATH!;!BMDS_CLASSPATH2! -Xmx512M -Djava.endorsed.dirs=classpath\\endorsed -DKeystore.Password=password net.rim.application.ipproxyservice.IPProxyServiceApplication -log.console.dump"); //$NON-NLS-1$
            runBatWriter.println(":END"); //$NON-NLS-1$
            runBatWriter.flush();
            runBatWriter.close();

            // for event.bat
            String eventBatFilePath = MDSHome.getCanonicalPath() + "\\event.bat"; //$NON-NLS-1$
            backup(eventBatFilePath);
            PrintWriter eventBatWriter = new PrintWriter(new FileOutputStream(eventBatFilePath));
            eventBatWriter.println("@ECHO  OFF"); //$NON-NLS-1$
            eventBatWriter.println("IF /I NOT [%BMDS_ENV_SET%] == [true]  call setBMDSEnv"); //$NON-NLS-1$
            eventBatWriter.println("\"" //$NON-NLS-1$
                    + javaExePath
                    + "\" -classpath %BMDS_CLASSPATH% net.rim.application.ipproxyservice.IPProxyEvent %1 %2 %3 %4 %5 %6 %7 %8 %9"); //$NON-NLS-1$
            eventBatWriter.flush();
            eventBatWriter.close();

        } catch (Exception ex) {
            _logger.error("updateBatchFiles exception:" //$NON-NLS-1$
                    + ex.getMessage());
        }
    }

    private static void backup(String originalFilePath) throws Exception {
        String backupFilePath = originalFilePath + ".ori";
        File backupFile = new File(backupFilePath);
        if (!backupFile.exists()) {
            FileInputStream input = new FileInputStream(originalFilePath);
            FileOutputStream output = new FileOutputStream(backupFile);

            byte[] buffer = new byte[1024 * 4];
            int len;
            while ((len = input.read(buffer)) != -1) {
                output.write(buffer, 0, len);
            }

            input.close();
            output.close();
        }
    }

    /***
     *
     * @return return null if MDS-CS can not be found. Otherwise, corresponding version is returned
     */
    private static CompatibilityVersion getMDSCSVersion(File MDSHome) {
        CompatibilityVersion mdscsVersion = null;
        try {
            String bmdsJarPath = MDSHome.getPath() + File.separator + "classpath" + File.separator + "bmds.jar"; //$NON-NLS-1$
            File bmdsJarFile = new File(bmdsJarPath);
            if (bmdsJarFile.exists()) {
                ZipFile zipFile = new ZipFile(bmdsJarFile);
                Enumeration<?> entries = zipFile.entries();
                while (entries.hasMoreElements()) {
                    ZipEntry entry = (ZipEntry) entries.nextElement();
                    if (!entry.isDirectory()) {
                        _logger.debug(entry.getName());
                        if (entry.getName().equalsIgnoreCase("net/rim/application/ipproxyservice/Version.class")) { //$NON-NLS-1$
                            // find Version class
                            InputStream is = zipFile.getInputStream(entry);
                            String versionStr = getMDSCSVersion(is);
                            if (versionStr != null) {
                                org.osgi.framework.Version osgiVersion = new org.osgi.framework.Version(versionStr);
                                mdscsVersion = new CompatibilityVersion(osgiVersion.getMajor(),
                                        osgiVersion.getMinor(), osgiVersion.getMicro());
                            }
                            break;
                        }
                    }
                } // end of while
            }
        } catch (Exception ex) {
            _logger.error("getMDSCSVersion error:" + ex.getMessage()); ////$NON-NLS-1$
        }
        return mdscsVersion;
    }

    private static String getMDSCSVersion(InputStream inputStream) {
        _currentVersion = null; // reset the value
        try {
            ClassReader classReader = new ClassReader(inputStream);
            ClassNode myVisitor = new ClassNode() {
                public FieldVisitor visitField(int access, String name, String desc, String signature,
                        Object value) {
                    if (value instanceof String) {
                        String[] parts = ((String) value).split("\\.");
                        if (parts.length > 2) {
                            _currentVersion = (String) value;
                        }
                    }
                    return super.visitField(access, name, desc, signature, value);
                }
            };
            classReader.accept(myVisitor, ClassReader.SKIP_FRAMES);
        } catch (Throwable ex) {
            _logger.error("", ex);
        }
        return _currentVersion;
    }

    private static void askUserDecision(final String title, final String message) {
        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                Shell shell = new Shell();
                MessageDialog dialog = new MessageDialog(shell, title, null, // accept the default window icon
                        message, MessageDialog.WARNING,
                        new String[] { IDialogConstants.PROCEED_LABEL, IDialogConstants.STOP_LABEL }, 0); // proceed
                // is the default
                _userDecision = dialog.open();
                shell.dispose();
            }
        });
    }
}