de.juwimm.cms.Main.java Source code

Java tutorial

Introduction

Here is the source code for de.juwimm.cms.Main.java

Source

/**
 * Copyright (c) 2009 Juwi MacMillan Group GmbH
 *
 * Licensed under the Apache 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.apache.org/licenses/LICENSE-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 de.juwimm.cms;

import static de.juwimm.cms.client.beans.Application.getBean;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.RepaintManager;
import javax.swing.UIManager;

import org.apache.commons.httpclient.HttpException;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.tizzit.util.XercesHelper;
import org.w3c.dom.Document;

import sun.misc.PerformanceLogger;

import com.Ostermiller.util.Browser;

import de.juwimm.cms.client.beans.Application;
import de.juwimm.cms.client.beans.Beans;
import de.juwimm.cms.common.Constants;
import de.juwimm.cms.common.UserRights;
import de.juwimm.cms.exceptions.UserHasNoUnitsException;
import de.juwimm.cms.gui.FrmVersion;
import de.juwimm.cms.gui.LookAndFeel;
import de.juwimm.cms.gui.PanLogin;
import de.juwimm.cms.gui.PanRibbon;
import de.juwimm.cms.gui.PanStatusbar;
import de.juwimm.cms.gui.PanTool;
import de.juwimm.cms.gui.PasswordDialog;
import de.juwimm.cms.gui.admin.PanAdministrationAdmin;
import de.juwimm.cms.gui.admin.PanAdministrationRoot;
import de.juwimm.cms.gui.controls.UnloadablePanel;
import de.juwimm.cms.gui.event.ExitEvent;
import de.juwimm.cms.gui.event.MyWindowListener;
import de.juwimm.cms.gui.views.PanContentView;
import de.juwimm.cms.gui.views.PanInitView;
import de.juwimm.cms.http.HttpClientWrapper;
import de.juwimm.cms.http.ProxyHelper;
import de.juwimm.cms.util.ActionHub;
import de.juwimm.cms.util.Communication;
import de.juwimm.cms.util.PerformanceUtils;
import de.juwimm.cms.util.UIConstants;

/**
 * <b>Tizzit Enterprise Content Management</b><br/>
 * This is the Main-Class of the Swing-Client Software.
 * <p>Copyright: Copyright (c) 2002, 2003</p>
 * <p>Company: JuwiMacMillan Group GmbH</p>
 * @author <a href="mailto:s.kulawik@juwimm.com">Sascha-Matthias Kulawik</a>
 * @version $Id$
 */
public class Main extends JFrame implements ActionListener {
    private static Logger log = null;

    private Communication comm = null;
    private PanRibbon panRibbon;
    private PanStatusbar panStatusbar;
    private PanLogin panLogin;
    private PanAdministrationAdmin panAdmin;
    private PanAdministrationRoot panRoot;
    private PanTool panTool;
    private ResourceBundle rb = null;
    private UnloadablePanel activePanel = null;
    private final static String LOG4J_PROPERTIES_ARGUMENT = "clientMailAppenderProperties";
    private static Main instance;

    public static Main getInstance() {
        if (instance == null) {
            throw new IllegalAccessError("Main window is not initialized");
        }
        return instance;
    }

    public static void main(String[] argv) {
        for (int i = 0; i < argv.length; i++) {
            argv[i] = argv[i].trim();
        }
        instance = new Main(argv);
    }

    public void logSys(String stri) {
        System.out.println(stri);
    }

    public Main(String[] argv) {
        // Bugfix [CH], use the "old" Java 5 RepaintManager (no-arg constructor creates one) for current thread group
        // instead of setting the system property "swing.bufferPerWindow" to false (does not work with JavaWebStart)
        PerformanceUtils.start();
        RepaintManager.setCurrentManager(new RepaintManager());

        System.setProperty("swing.aatext", "true");
        try {
            InputStream in = this.getClass().getResourceAsStream("/pom.xml");
            String pom = IOUtils.toString(in);
            Document doc = XercesHelper.string2Dom(pom);

            String version = XercesHelper.getNodeValue(doc, "/project/version");
            System.setProperty("tizzit.version", version);

            Constants.CMS_VERSION = "V " + version;

            logSys("Starting Tizzit Version " + Constants.CMS_VERSION);
        } catch (Exception e) {
        }
        //SplashShell splash = new SplashShell();
        FrmVersion splash = new FrmVersion();
        int screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        int frameHeight = 300;
        int frameWidth = 450;
        splash.setLocation((screenWidth / 2) - (frameWidth / 2), (screenHeight / 2) - (frameHeight / 2));
        splash.setIconImage(new ImageIcon(getClass().getResource("/images/cms_16x16.gif")).getImage());
        splash.setSize(frameWidth, frameHeight);
        splash.setVisible(true);

        String host = "";
        if (argv.length >= 2 && argv[0].equals("URL_HOST")) {
            try {
                URL url = new URL(argv[1]);
                Constants.URL_HOST = url.toString();
                host = url.getHost();
                Constants.SERVER_SSL = url.getProtocol().equalsIgnoreCase("https");
                if (Constants.SERVER_SSL) {
                    JOptionPane.showMessageDialog(null,
                            "Fehler beim Erstellen der SSL Verbindung!\nBitte wenden Sie sich an den Tizzit Support.",
                            "Tizzit", JOptionPane.ERROR_MESSAGE);
                    System.exit(-1);
                }
                Constants.SERVER_PORT = (url.getPort() == -1) ? ((Constants.SERVER_SSL) ? 443 : 80) : url.getPort();
            } catch (Exception exe) {
                log.error(exe);
            }
        } else if (argv.length == 1) {
            host = argv[0];
        } else {
            return;
        }
        if ("".equalsIgnoreCase(host)) {
            return;
        }

        logSys("CONNECTING HOST " + host + " " + argv[1] + " with SSL " + Constants.SERVER_SSL);
        Constants.SERVER_HOST = host;
        Constants.SVG_CACHE = Constants.DB_PATH + "svgcache_" + Constants.SERVER_HOST
                + System.getProperty("file.separator");
        UIConstants.setMainFrame(this);

        logSys("Setting SAX/DOM XML Parser to Apache Xerces");
        System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
                "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
        System.setProperty("javax.xml.parsers.DocumentBuilder", "org.apache.xerces.jaxp.DocumentBuilderImpl"); // needed?
        System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
        System.setProperty("javax.xml.parsers.SAXParser", "org.apache.xerces.jaxp.SAXParserImpl"); //needed?
        System.setProperty("org.xml.sax.driver", "org.apache.xerces.parsers.SAXParser"); //needed?
        initLog4J(host, argv);
        PerformanceUtils.mark("Initial stage");
        String testUrl = ((Constants.SERVER_SSL) ? "https://" : "http://") + Constants.SERVER_HOST + ":"
                + Constants.SERVER_PORT + "/admin/juwimm-cms-client.jnlp";
        try {
            URI desturi = new URI(testUrl);
            ProxyHelper helper = new ProxyHelper();
            helper.init(desturi, false);

        } catch (IllegalArgumentException ex) {
            logSys("could not initialize the proxy settings for host " + host + ": " + ex);
        } catch (URISyntaxException ex) {
            logSys("could not initialize the proxy settings because URI from host " + host + ": " + ex);
            // log.error("could not initialize the proxy settings because URI from host " + host + " : ", ex);
        }
        PerformanceUtils.mark("Initialising proxy server");
        try {
            UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader());
            LookAndFeel.switchTo(LookAndFeel.determineLookAndFeel());
        } catch (Exception exe) {
            log.error("Can't switch to Default LookAndFeel");
        }
        PerformanceUtils.mark("Initialising look and feel");
        splash.setStatusInfo("Invoking Bean Framework...");
        Application.initializeContext();
        PerformanceUtils.mark("Initialising spring context");
        splash.setStatusInfo("Getting Locale Settings...");

        try {
            Constants.rb = ResourceBundle.getBundle("CMS", Constants.CMS_LOCALE);
        } catch (Exception ex) {
            log.warn("Could not find ResourceBundle for language: " + Constants.CMS_LOCALE + " - loading default");
            Constants.rb = ResourceBundle.getBundle("CMS", Constants.CMS_LOCALE);
        }
        PerformanceUtils.mark("Loading resource bundle");
        splash.setStatusInfo(Constants.rb.getString("splash.checkingSSL"));
        HttpClientWrapper httpClientWrapper = HttpClientWrapper.getInstance();

        try {
            httpClientWrapper.testAndConfigureConnection(testUrl);
        } catch (HttpException exe) {
            JOptionPane.showMessageDialog(null, exe.getMessage(), Constants.rb.getString("dialog.title"),
                    JOptionPane.ERROR_MESSAGE);
            System.exit(-1);
        }
        PerformanceUtils.mark("Initialising client wrapper");
        splash.setStatusInfo(Constants.rb.getString("splash.configBrowserSettings"));
        Browser.init(); // only needs to be called once.
        splash.setStatusInfo(Constants.rb.getString("splash.gettingTemplates"));
        comm = ((Communication) getBean(Beans.COMMUNICATION));
        splash.setStatusInfo(Constants.rb.getString("splash.locadingLocalCachingDatabase"));
        comm.getDbHelper(); // check if there is already a programm running
        ActionHub.addActionListener(this);
        rb = Constants.rb;
        PerformanceUtils.mark("Initialising dbHelper");
        splash.setStatusInfo(Constants.rb.getString("splash.initUI"));
        try {
            this.getContentPane().setLayout(new BorderLayout());
            panLogin = new PanLogin();
            setCenterPanel(panLogin);
            Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_LOGIN;
            screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
            screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
            frameWidth = Constants.CMS_SCREEN_WIDTH;
            frameHeight = Constants.CMS_SCREEN_HEIGHT;
            this.setSize(frameWidth, frameHeight);
            this.setLocationRelativeTo(null);
            this.setIconImage(UIConstants.CMS.getImage());
            this.setTitle(rb.getString("dialog.title") + " " + Constants.CMS_VERSION);
            this.addWindowListener(new MyWindowListener());
            this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

            if (screenHeight <= frameHeight && screenWidth <= frameWidth) {
                this.setExtendedState(MAXIMIZED_BOTH);
            }

            this.setVisible(true);
            // splash.disposeMe(true);
            splash.dispose();

            // unimportant stuff
            UIConstants.loadImages();

        } catch (Exception exe) {
            log.error("Tizzit will exit", exe);
            JOptionPane.showMessageDialog(this, exe.getMessage() + "\nCMS will exit.", "CMS",
                    JOptionPane.ERROR_MESSAGE);
        } finally {
            //splash.disposeMe();
            splash.dispose();
        }
        PerformanceUtils.mark("Initialising main window");
    }

    private void initLog4J(String host, String[] arguments) {
        Properties prop = new Properties();
        String mailAppenderLog = initMailAppender(prop, arguments);
        String loggerLevel = "INFO";

        if ("true".equalsIgnoreCase(System.getProperty("debug"))) {
            loggerLevel = "DEBUG";
        }
        String log4jRootLogger = prop.getProperty("log4j.rootLogger");
        if (log4jRootLogger == null || log4jRootLogger.isEmpty()) {
            prop.setProperty("log4j.rootLogger", "ERROR, STDOUT, CMSLOG");
        } else {
            prop.setProperty("log4j.rootLogger", "ERROR, STDOUT, CMSLOG, " + log4jRootLogger);
        }

        prop.setProperty("log4j.category.org.apache", "WARN");
        prop.setProperty("log4j.category.httpclient.wire", "WARN");
        prop.setProperty("log4j.category.de.juwimm", loggerLevel);
        prop.setProperty("log4j.category.org.apache.commons.httpclient", "ERROR");

        prop.setProperty("log4j.appender.STDOUT", "org.apache.log4j.ConsoleAppender");
        prop.setProperty("log4j.appender.STDOUT.layout", "org.apache.log4j.PatternLayout");
        prop.setProperty("log4j.appender.STDOUT.layout.ConversionPattern", "%d %-5p [%-16t] %c{1} - %m%n");

        prop.setProperty("log4j.appender.CMSLOG", "org.apache.log4j.RollingFileAppender");
        prop.setProperty("log4j.appender.CMSLOG.File", System.getProperty("user.home") + "/tizzit_cms.log");
        prop.setProperty("log4j.appender.CMSLOG.MaxFileSize", "1024KB");
        prop.setProperty("log4j.appender.CMSLOG.MaxBackupIndex", "1");
        prop.setProperty("log4j.appender.CMSLOG.layout", "org.apache.log4j.PatternLayout");
        prop.setProperty("log4j.appender.CMSLOG.layout.ConversionPattern", "%d %-5p [%-16t] %c{1} - %m%n");

        PropertyConfigurator.configure(prop);
        log = Logger.getLogger(Main.class);
        log.debug(mailAppenderLog);
    }

    /**
     * Transfer properties from arguments string to property object 
     * @param prop will contain mail appender log properties
     * @param arguments 
     * @return message to be print in log 
     */
    private String initMailAppender(Properties prop, String[] arguments) {
        if (arguments == null || arguments.length == 0) {
            return "no mail appender log properties specified";
        }
        String log4jArguments = null;
        for (String argument : arguments) {
            if (argument.contains(LOG4J_PROPERTIES_ARGUMENT)) {
                log4jArguments = argument.replace(LOG4J_PROPERTIES_ARGUMENT + "=", "");
                log4jArguments = log4jArguments.replace("\"", "");
                log4jArguments = log4jArguments.replace(";", "\n");
                break;
            }
        }

        if (log4jArguments == null || log4jArguments.isEmpty()) {
            return "no mail appender log properties specified from server";
        }

        //loads all the log4j properties into Properties object
        //log4jArguments has format "v1=k1\nv2=k2\n ..."
        InputStream is = new ByteArrayInputStream(log4jArguments.getBytes());
        try {
            prop.load(is);
        } catch (IOException e) {
            return "can not load mail appender log properties";
        }
        if (prop.entrySet().size() > 0) {
            prop.setProperty("log4j.appender.email", "org.apache.log4j.net.SMTPAppender");
            prop.setProperty("log4j.appender.email.bufferSize", "3");
            prop.setProperty("log4j.appender.email.layout", "org.apache.log4j.SimpleLayout");
            prop.setProperty("log4j.appender.email.subject", "CQ Richclient Errors");
            prop.setProperty("log4j.rootLogger", "email");
            return "mail appender log properties loaded";
        } else {
            return "no mail appender log properties specified from server";
        }

    }

    private void setCenterPanel(UnloadablePanel pan) {
        JPanel jpan = (JPanel) pan;
        if (pan != activePanel) {
            try {
                activePanel.unload();
            } catch (Exception exe) {
            }
            try {
                this.getContentPane().remove((JPanel) activePanel);
            } catch (Exception e) {
            }
            activePanel = pan;
            this.getContentPane().add(jpan, BorderLayout.CENTER);
        }
    }

    private void showAdminPanel() throws Exception {
        Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_ADMIN;
        panRibbon.setView(false);

        if (comm.isUserInRole(UserRights.SITE_ROOT)) {
            try {
                if (panRoot == null) {
                    panRoot = new PanAdministrationRoot();
                }
                panRoot.reload();
            } catch (UserHasNoUnitsException ex) {
                JOptionPane.showMessageDialog(UIConstants.getMainFrame(), ex.getMessage(),
                        rb.getString("msgbox.title.loginFailed"), JOptionPane.ERROR_MESSAGE);
                ActionHub.fireActionPerformed(
                        new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_LOGOFF));
                return;
            }
            setCenterPanel(panRoot);
        } else {
            try {
                if (panAdmin == null) {
                    panAdmin = new PanAdministrationAdmin();
                }
                panAdmin.reload();
            } catch (UserHasNoUnitsException ex) {
                JOptionPane.showMessageDialog(UIConstants.getMainFrame(), ex.getMessage(),
                        rb.getString("msgbox.title.loginFailed"), JOptionPane.ERROR_MESSAGE);
                ActionHub.fireActionPerformed(
                        new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_LOGOFF));
                return;
            }
            setCenterPanel(panAdmin);
        }
    }

    private void showToolPanel(boolean withSelection, ActionEvent e) throws Exception {
        if (Constants.CMS_CLIENT_VIEW != Constants.CLIENT_VIEW_CONTENT) {
            panRibbon.setView(true);
            try {
                panTool = PanTool.getInstance();
                panTool.reload(withSelection, e.getSource());
            } catch (UserHasNoUnitsException ex) {
                JOptionPane.showMessageDialog(UIConstants.getMainFrame(), ex.getMessage(),
                        rb.getString("msgbox.title.loginFailed"), JOptionPane.ERROR_MESSAGE);
                ActionHub.fireActionPerformed(
                        new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_LOGOFF));
                return;
            } catch (NullPointerException npe) {
                panTool.setTreeToEmpty();
                JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.SiteIsEmpty"),
                        rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
            }
            setCenterPanel(panTool);
        }
    }

    private void showTaskPanel() throws Exception {
        if (Constants.CMS_CLIENT_VIEW != Constants.CLIENT_VIEW_TASK) {
            panTool = PanTool.getInstance();
            setCenterPanel(panTool);
        }
    }

    public void actionPerformed(ActionEvent e) {
        String action = e.getActionCommand();
        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        try {
            if (action.equals(Constants.ACTION_EXIT)) {
                if (ActionHub.fireExitPerformed(new ExitEvent())) {
                    comm.getDbHelper().shutdown();
                    System.exit(0);
                }
            } else if (action.equals(Constants.ACTION_LOGIN)) {
                this.setLayout(new BorderLayout());
                Constants.CMS_CLIENT_VIEW = -1;
                setCenterPanel(PanInitView.getInstance());

                if (panStatusbar == null) {
                    panStatusbar = new PanStatusbar();
                    UIConstants.setStatusLine(panStatusbar);
                    ActionHub.addActionListener(panStatusbar);
                }

                if (panRibbon == null) {
                    panRibbon = new PanRibbon(comm);
                    ActionHub.addActionListener(panRibbon);
                }
                this.getContentPane().add(panRibbon, BorderLayout.NORTH);
                ActionHub.fireActionPerformed(
                        new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_VIEW_EDITOR));

                //      this.getJMenuBar().setVisible(true);
                //      this.getContentPane().add(panToolbar, BorderLayout.NORTH);
                this.getContentPane().add(panStatusbar, BorderLayout.SOUTH);

                this.getRootPane().setDoubleBuffered(true);
                this.getRootPane().validate();
                this.getRootPane().repaint();
            } else if (action.equals(Constants.ACTION_LOGOFF)) {
                if (ActionHub.fireExitPerformed(new ExitEvent())) {
                    comm.setLoggedIn(false);
                    Application.initializeContext();
                    panLogin = new PanLogin();
                    panRoot = null;
                    panAdmin = null;
                    panRibbon = null;
                    this.getContentPane().removeAll();
                    //this.getJMenuBar().setVisible(false);
                    comm.getDbHelper().autoEmptyCache();
                    PanContentView.getInstance().unloadAll();
                    setCenterPanel(panLogin);
                    Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_LOGIN;
                    this.validate();
                    this.getContentPane().validate();
                    this.getContentPane().repaint();
                    this.repaint();
                    panLogin.init();
                }
            } else if (action.equals(Constants.ACTION_VIEW_EDITOR)) {
                showToolPanel(false, e);
                panTool = PanTool.getInstance();
                Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_CONTENT;
            } else if (action.equals(Constants.ACTION_VIEW_EDITOR_WITH_SELECTION)) {
                showToolPanel(true, e);
                panTool = PanTool.getInstance();
                Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_CONTENT;
            } else if (action.equals(Constants.ACTION_VIEW_ADMIN) || action.equals(Constants.ACTION_VIEW_ROOT)) {
                Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_ADMIN;
                showAdminPanel();
                panStatusbar.setCountVisible(false);
            } else if (action.equals(Constants.ACTION_CHANGE_PASSWORD)) {
                showChangePasswordDialog();
            } else if (action.equals(Constants.ACTION_SHOW_TASK)) {
                showTaskPanel();
                panStatusbar.setCountVisible(false);
                Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_TASK;
            } else if (action.equals(Constants.ACTION_SHOW_CONTENT)) {
                Constants.CMS_CLIENT_VIEW = Constants.CLIENT_VIEW_CONTENT;
            }
        } catch (Exception exe) {
            log.error("Error in actionPerformed", exe);
        } finally {
            this.setCursor(Cursor.getDefaultCursor());
        }
    }

    private void showChangePasswordDialog() {
        PasswordDialog dialog = new PasswordDialog(comm.getUser().getUserName());
        dialog.setVisible(true);
    }

    public static void showProxies() {
        StringBuffer text = new StringBuffer();
        final String crlf = System.getProperty("line.separator");
        text.append("http.proxyUser=" + System.getProperty("http.proxyUser")).append(crlf);
        text.append("http.proxySet=" + System.getProperty("http.proxySet")).append(crlf);
        text.append("http.proxyHost=" + System.getProperty("http.proxyHost")).append(crlf);
        text.append("http.proxyPort=" + System.getProperty("http.proxyPort")).append(crlf);

        text.append("https.proxySet=" + System.getProperty("https.proxySet")).append(crlf);
        text.append("https.proxyHost=" + System.getProperty("https.proxyHost")).append(crlf);
        text.append("https.proxyPort=" + System.getProperty("https.proxyPort")).append(crlf);

        text.append("proxySet=" + System.getProperty("proxySet")).append(crlf);
        text.append("proxyHost=" + System.getProperty("proxyHost")).append(crlf);
        text.append("proxyPort=" + System.getProperty("proxyPort")).append(crlf);
        log.info(text.toString());
        JOptionPane.showMessageDialog(null, text.toString(), "Proxy-Info", JOptionPane.INFORMATION_MESSAGE);
    }

    public void freezeInput(boolean freeze) {
        log.info("input frozen=" + freeze);
        this.getGlassPane().setVisible(freeze); //block mouse input
        this.getGlassPane().repaint();
        this.repaint();
    }

}