/** * 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(); } }