diff --git a/designer-base/src/com/fr/start/ServerStarter.java b/designer-base/src/com/fr/start/ServerStarter.java index 880a33774c..027c1fdba3 100644 --- a/designer-base/src/com/fr/start/ServerStarter.java +++ b/designer-base/src/com/fr/start/ServerStarter.java @@ -72,7 +72,7 @@ public class ServerStarter { private static void initDemoServerAndBrowser() { try { - FineEmbedServer.getInstance().start(); + FineEmbedServer.start(); } finally { //先访问Demo, 后访问报表, 不需要重置服务器. browser("http://localhost:" + DesignerEnvManager.getEnvManager().getEmbedServerPort() + "/" + GeneralContext.getCurrentAppNameOfEnv() + "/" + ServerConfig.getInstance().getServletName()); @@ -86,7 +86,7 @@ public class ServerStarter { */ public static void browserURLWithLocalEnv(String url) { - FineEmbedServer.getInstance().start(); + FineEmbedServer.start(); browser(url); } @@ -124,11 +124,6 @@ public class ServerStarter { } } - public static boolean isStarted() { - - return FineEmbedServer.getInstance().isRunning(); - } - private static class InformationPane extends BasicPane { private static final long serialVersionUID = 1L; diff --git a/designer-base/src/com/fr/start/server/FineEmbedServer.java b/designer-base/src/com/fr/start/server/FineEmbedServer.java index 96e07f166b..e977884427 100644 --- a/designer-base/src/com/fr/start/server/FineEmbedServer.java +++ b/designer-base/src/com/fr/start/server/FineEmbedServer.java @@ -1,134 +1,29 @@ package com.fr.start.server; -import com.fr.base.FRContext; -import com.fr.design.DesignerEnvManager; import com.fr.event.EventDispatcher; -import com.fr.log.FineLoggerFactory; -import com.fr.module.ModuleRole; -import com.fr.startup.FineWebApplicationInitializer; -import com.fr.third.springframework.web.SpringServletContainerInitializer; -import com.fr.third.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.apache.catalina.Context; -import org.apache.catalina.LifecycleException; -import org.apache.catalina.loader.VirtualWebappLoader; -import org.apache.catalina.startup.Tomcat; - -import java.io.File; -import java.util.HashSet; -import java.util.Set; +import com.fr.module.ModuleContext; /** - * Created by juhaoyu on 2018/6/5. + * Created by juhaoyu on 2018/6/6. */ -public class FineEmbedServer { - - private static final FineEmbedServer INSTANCE = new FineEmbedServer(); - - private Tomcat tomcat; - - private volatile boolean isRunning = false; - - public static FineEmbedServer getInstance() { - - return INSTANCE; - } - - private FineEmbedServer() {} +public abstract class FineEmbedServer { - - public synchronized void start() { + public synchronized static void start() { - if (isRunning) { - return; - } EventDispatcher.fire(EmbedServerEvent.BeforeStart); - try { - //初始化tomcat - initTomcat(); - tomcat.start(); - } catch (LifecycleException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - isRunning = true; + ModuleContext.getModule(FineEmbedServerActivator.class).start(); EventDispatcher.fire(EmbedServerEvent.AfterStart); } - public synchronized void stop() { + public synchronized static void stop() { - if (!isRunning) { - return; - } EventDispatcher.fire(EmbedServerEvent.BeforeStop); - try { - stopSpring(); - stopServerActivator(); - stopTomcat(); - } catch (LifecycleException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - isRunning = false; + ModuleContext.getModule(FineEmbedServerActivator.class).stop(); EventDispatcher.fire(EmbedServerEvent.AfterStop); } - public boolean isRunning() { - - return isRunning; - } - - - private void initTomcat() { - - tomcat = new Tomcat(); + public static boolean isRunning() { - tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort()); - String docBase = new File(FRContext.getCurrentEnv().getPath()).getParent(); - String appName = "/" + FRContext.getCurrentEnv().getAppName(); - Context context = tomcat.addContext(appName, docBase); - tomcat.addServlet(appName, "default", "org.apache.catalina.servlets.DefaultServlet"); - //覆盖tomcat的WebAppClassLoader - context.setLoader(new FRTomcatLoader()); - - //直接指定initializer,tomcat就不用再扫描一遍了 - SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); - Set> classes = new HashSet>(); - classes.add(FineWebApplicationInitializer.class); - context.addServletContainerInitializer(initializer, classes); + return ModuleContext.getModule(FineEmbedServerActivator.class).isRunning(); } - - - private void stopServerActivator() { - - ModuleRole.ServerRoot.stop(); - } - - private void stopSpring() { - - AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.getSingleton(AnnotationConfigWebApplicationContext.class); - if (context != null) { - context.stop(); - context.destroy(); - } - } - - private void stopTomcat() throws LifecycleException { - - tomcat.stop(); - tomcat.destroy(); - } - - - /** - * Created by juhaoyu on 2018/6/5. - * 自定义的tomcat loader,主要用于防止内置服务器再加载一遍class - */ - private static class FRTomcatLoader extends VirtualWebappLoader { - - @Override - public ClassLoader getClassLoader() { - - return this.getClass().getClassLoader(); - } - - } - } diff --git a/designer-base/src/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/com/fr/start/server/FineEmbedServerActivator.java new file mode 100644 index 0000000000..b7aa95cb2e --- /dev/null +++ b/designer-base/src/com/fr/start/server/FineEmbedServerActivator.java @@ -0,0 +1,107 @@ +package com.fr.start.server; + +import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; +import com.fr.event.EventDispatcher; +import com.fr.log.FineLoggerFactory; +import com.fr.module.Activator; +import com.fr.module.ModuleRole; +import com.fr.startup.FineWebApplicationInitializer; +import com.fr.third.springframework.web.SpringServletContainerInitializer; +import com.fr.third.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.loader.VirtualWebappLoader; +import org.apache.catalina.startup.Tomcat; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by juhaoyu on 2018/6/5. + */ +public class FineEmbedServerActivator extends Activator { + + private Tomcat tomcat; + + @Override + public synchronized void start() { + + try { + //初始化tomcat + initTomcat(); + tomcat.start(); + } catch (LifecycleException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + @Override + public synchronized void stop() { + + try { + stopSpring(); + stopServerActivator(); + stopTomcat(); + } catch (LifecycleException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + private void initTomcat() { + + tomcat = new Tomcat(); + + tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort()); + String docBase = new File(FRContext.getCurrentEnv().getPath()).getParent(); + String appName = "/" + FRContext.getCurrentEnv().getAppName(); + Context context = tomcat.addContext(appName, docBase); + tomcat.addServlet(appName, "default", "org.apache.catalina.servlets.DefaultServlet"); + //覆盖tomcat的WebAppClassLoader + context.setLoader(new FRTomcatLoader()); + + //直接指定initializer,tomcat就不用再扫描一遍了 + SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); + Set> classes = new HashSet>(); + classes.add(FineWebApplicationInitializer.class); + context.addServletContainerInitializer(initializer, classes); + } + + + private void stopServerActivator() { + + ModuleRole.ServerRoot.stop(); + } + + private void stopSpring() { + + AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.getSingleton(AnnotationConfigWebApplicationContext.class); + if (context != null) { + context.stop(); + context.destroy(); + } + } + + private void stopTomcat() throws LifecycleException { + + tomcat.stop(); + tomcat.destroy(); + } + + + /** + * Created by juhaoyu on 2018/6/5. + * 自定义的tomcat loader,主要用于防止内置服务器再加载一遍class + */ + private static class FRTomcatLoader extends VirtualWebappLoader { + + @Override + public ClassLoader getClassLoader() { + + return this.getClass().getClassLoader(); + } + + } + +} diff --git a/designer-base/src/com/fr/start/server/ServerManageFrame.java b/designer-base/src/com/fr/start/server/ServerManageFrame.java index 4f05cdeaff..51cdfc3b19 100644 --- a/designer-base/src/com/fr/start/server/ServerManageFrame.java +++ b/designer-base/src/com/fr/start/server/ServerManageFrame.java @@ -9,7 +9,6 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.Inter; -import com.fr.start.ServerStarter; import javax.swing.*; import java.awt.*; @@ -75,7 +74,7 @@ public class ServerManageFrame extends JFrame { startButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { - FineEmbedServer.getInstance().start(); + FineEmbedServer.start(); checkButtonEnabled(); } catch(Exception exp) { FRContext.getLogger().error(exp.getMessage()); @@ -92,7 +91,7 @@ public class ServerManageFrame extends JFrame { stopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { - FineEmbedServer.getInstance().stop(); + FineEmbedServer.stop(); checkButtonEnabled(); } catch(Exception exp) { FRContext.getLogger().error(exp.getMessage()); @@ -137,7 +136,7 @@ public class ServerManageFrame extends JFrame { */ public void checkButtonEnabled() throws Exception { - if (ServerStarter.isStarted()) { + if (FineEmbedServer.isRunning()) { GUICoreUtils.setEnabled(startPane, false); GUICoreUtils.setEnabled(stopPane, true); } else { diff --git a/designer-base/src/com/fr/start/server/ServerTray.java b/designer-base/src/com/fr/start/server/ServerTray.java index 4598be3e0e..5663b27a90 100644 --- a/designer-base/src/com/fr/start/server/ServerTray.java +++ b/designer-base/src/com/fr/start/server/ServerTray.java @@ -17,20 +17,20 @@ import java.awt.event.MouseEvent; * Create server tray. */ public class ServerTray { - - private static ServerTray INSTANCE; - - private MenuItem startMenu; - - private MenuItem stopMenu; - - private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png"); - - private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped.png"); - - private ServerManageFrame serverManageFrame; - - private TrayIcon trayIcon; + + private static ServerTray INSTANCE; + + private MenuItem startMenu; + + private MenuItem stopMenu; + + private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png"); + + private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped.png"); + + private ServerManageFrame serverManageFrame; + + private TrayIcon trayIcon; private ServerTray() { @@ -38,89 +38,95 @@ public class ServerTray { listen(); //p:首先构建右键菜单 PopupMenu popup = new PopupMenu(); - MenuItem manangeMenu = new MenuItem(Inter.getLocText("Server-Open_Service_Manager")); - manangeMenu.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - - serverManageFrame = ServerManageFrame.getServerManageFrame(); - if (!serverManageFrame.isVisible()) { - serverManageFrame.setVisible(true); - } - serverManageFrame.toFront();//p:到第一个. - } - }); + MenuItem manangeMenu = new MenuItem(Inter.getLocText("Server-Open_Service_Manager")); + manangeMenu.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + serverManageFrame = ServerManageFrame.getServerManageFrame(); + if (!serverManageFrame.isVisible()) { + serverManageFrame.setVisible(true); + } + serverManageFrame.toFront();//p:到第一个. + } + }); startMenu = new MenuItem(Inter.getLocText("FR-Server_Embedded_Server_Start")); stopMenu = new MenuItem(Inter.getLocText("FR-Server_Embedded_Server_Stop")); - MenuItem exitMenu = new MenuItem(Inter.getLocText("Exit")); - //创建打开监听器 - ActionListener startListener = new ActionListener() { - - public void actionPerformed(ActionEvent e) { - - try { - FineEmbedServer.getInstance().start(); - } catch (Exception exp) { - FRContext.getLogger().error(exp.getMessage(), exp); - } - } - }; - ActionListener stopListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - try { - FineEmbedServer.getInstance().stop(); - } catch (Throwable exp) { - FRContext.getLogger().error(exp.getMessage(), exp); - } - } - }; - startMenu.addActionListener(startListener); - stopMenu.addActionListener(stopListener); - //创建退出菜单监听器 - ActionListener exitListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - exit(); - } - }; - - exitMenu.addActionListener(exitListener); - popup.add(manangeMenu); - popup.addSeparator(); - popup.add(startMenu); - popup.add(stopMenu); - popup.addSeparator(); - popup.add(exitMenu); - - //p:开始创建托盘. - trayIcon = new TrayIcon(trayStartedImage, Inter.getLocText("Server-Embedded_Server"), popup); - trayIcon.setImageAutoSize(true); - trayIcon.addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - if(e.getClickCount() < 2) { - return; - } - - ServerManageFrame serverManageFrame = ServerManageFrame.getServerManageFrame(); - if (!serverManageFrame.isVisible()) { - serverManageFrame.setVisible(true); - } - serverManageFrame.toFront();//p:到第一个. - } - }); - - TrayIcon[] icons = SystemTray.getSystemTray().getTrayIcons(); - for (TrayIcon icon : icons) { - SystemTray.getSystemTray().remove(icon); - } - - try { - SystemTray.getSystemTray().add(trayIcon); - } catch (AWTException e) { - System.err.println("Can not create the System Tray:" + e); - } - - checkPopupMenuItemEnabled(); - } + MenuItem exitMenu = new MenuItem(Inter.getLocText("Exit")); + //创建打开监听器 + ActionListener startListener = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + try { + FineEmbedServer.start(); + } catch (Exception exp) { + FRContext.getLogger().error(exp.getMessage(), exp); + } + } + }; + ActionListener stopListener = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + try { + FineEmbedServer.stop(); + } catch (Throwable exp) { + FRContext.getLogger().error(exp.getMessage(), exp); + } + } + }; + startMenu.addActionListener(startListener); + stopMenu.addActionListener(stopListener); + //创建退出菜单监听器 + ActionListener exitListener = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + + exit(); + } + }; + + exitMenu.addActionListener(exitListener); + popup.add(manangeMenu); + popup.addSeparator(); + popup.add(startMenu); + popup.add(stopMenu); + popup.addSeparator(); + popup.add(exitMenu); + + //p:开始创建托盘. + trayIcon = new TrayIcon(trayStartedImage, Inter.getLocText("Server-Embedded_Server"), popup); + trayIcon.setImageAutoSize(true); + trayIcon.addMouseListener(new MouseAdapter() { + + public void mouseClicked(MouseEvent e) { + + if (e.getClickCount() < 2) { + return; + } + + ServerManageFrame serverManageFrame = ServerManageFrame.getServerManageFrame(); + if (!serverManageFrame.isVisible()) { + serverManageFrame.setVisible(true); + } + serverManageFrame.toFront();//p:到第一个. + } + }); + + TrayIcon[] icons = SystemTray.getSystemTray().getTrayIcons(); + for (TrayIcon icon : icons) { + SystemTray.getSystemTray().remove(icon); + } + + try { + SystemTray.getSystemTray().add(trayIcon); + } catch (AWTException e) { + System.err.println("Can not create the System Tray:" + e); + } + + checkPopupMenuItemEnabled(); + } private void listen() { @@ -137,37 +143,38 @@ public class ServerTray { } private void exit() { - - FineEmbedServer.getInstance().stop(); - SystemTray.getSystemTray().remove(trayIcon); - } - - private void checkPopupMenuItemEnabled() { - try { - if (FineEmbedServer.getInstance().isRunning()) { - startMenu.setEnabled(false); - stopMenu.setEnabled(true); - - trayIcon.setImage(trayStartedImage); - } else { - startMenu.setEnabled(true); - stopMenu.setEnabled(false); - - trayIcon.setImage(trayStoppedImage); - } - - if (serverManageFrame != null) { - serverManageFrame.checkButtonEnabled(); - serverManageFrame.repaint(); - } - } catch(Exception exp) { + + FineEmbedServer.stop(); + SystemTray.getSystemTray().remove(trayIcon); + } + + private void checkPopupMenuItemEnabled() { + + try { + if (FineEmbedServer.isRunning()) { + startMenu.setEnabled(false); + stopMenu.setEnabled(true); + + trayIcon.setImage(trayStartedImage); + } else { + startMenu.setEnabled(true); + stopMenu.setEnabled(false); + + trayIcon.setImage(trayStoppedImage); + } + + if (serverManageFrame != null) { + serverManageFrame.checkButtonEnabled(); + serverManageFrame.repaint(); + } + } catch (Exception exp) { FRContext.getLogger().error(exp.getMessage(), exp); - } - } - - public static void init() { - - INSTANCE = new ServerTray(); + } + } + public static void init() { + + INSTANCE = new ServerTray(); + } } \ No newline at end of file diff --git a/designer-realize/src/com/fr/start/Designer.java b/designer-realize/src/com/fr/start/Designer.java index 74a8758c56..a890bc73c4 100644 --- a/designer-realize/src/com/fr/start/Designer.java +++ b/designer-realize/src/com/fr/start/Designer.java @@ -39,13 +39,10 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.module.DesignerModule; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.event.EventDispatcher; import com.fr.general.ComparatorUtils; import com.fr.general.Inter; -import com.fr.locale.InterProviderFactory; import com.fr.module.Module; import com.fr.module.ModuleContext; -import com.fr.module.ModuleEvent; import com.fr.stable.BuildContext; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; @@ -99,8 +96,7 @@ public class Designer extends BaseDesigner { designerRoot.setSingleton(StartupArgs.class, new StartupArgs(args)); designerRoot.start(); if (FRContext.getCurrentEnv() instanceof LocalEnv) { - // 预启动一下 - FineEmbedServer.getInstance().start(); + //初始化一下serverTray ServerTray.init(); } diff --git a/designer-realize/src/com/fr/start/module/DesignerModuleActivator.java b/designer-realize/src/com/fr/start/module/DesignerModuleActivator.java index fc488fb7e5..2855a45f4f 100644 --- a/designer-realize/src/com/fr/start/module/DesignerModuleActivator.java +++ b/designer-realize/src/com/fr/start/module/DesignerModuleActivator.java @@ -23,7 +23,7 @@ public class DesignerModuleActivator extends Activator implements Prepare { @Override public void stop() { - + ModuleContext.stopModule(DesignerModule.class.getName()); } @Override diff --git a/designer-realize/src/com/fr/start/module/DesignerStartup.java b/designer-realize/src/com/fr/start/module/DesignerStartup.java index 54e8c1d9fa..c57a9b807a 100644 --- a/designer-realize/src/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/com/fr/start/module/DesignerStartup.java @@ -1,7 +1,10 @@ package com.fr.start.module; +import com.fr.core.env.EnvConfig; +import com.fr.core.env.EnvEvent; +import com.fr.event.Event; +import com.fr.event.Listener; import com.fr.module.Activator; -import com.fr.stable.CoreActivator; import com.fr.start.Designer; import com.fr.start.EnvSwitcher; import com.fr.start.SplashContext; @@ -21,10 +24,9 @@ public class DesignerStartup extends Activator { Designer designer = new Designer(args); //启动env startSub(DesignerEnvProvider.class); - //启动各个模块 - getSub(CoreActivator.class).start(); - getSub("designer").start(); + getSub(EnvBasedModule.class).start(); getRoot().getSingleton(EnvSwitcher.class).switch2LastEnv(); + registerEnvListener(); //启动设计器界面 designer.show(args); //启动画面结束 @@ -32,7 +34,30 @@ public class DesignerStartup extends Activator { startSub(StartFinishActivator.class); } - + /** + * 切换环境时,重新启动所有相关模块 + */ + private void registerEnvListener() { + + listenEvent(EnvEvent.BEFORE_SIGN_OUT, new Listener() { + + @Override + public void on(Event event, EnvConfig param) { + + getSub(EnvBasedModule.class).stop(); + } + }); + listenEvent(EnvEvent.AFTER_SIGN_IN, new Listener() { + + @Override + public void on(Event event, EnvConfig param) { + + getSub(EnvBasedModule.class).start(); + } + }); + } + + @Override public void stop() { diff --git a/designer-realize/src/com/fr/start/module/EnvBasedModule.java b/designer-realize/src/com/fr/start/module/EnvBasedModule.java new file mode 100644 index 0000000000..bc32128ab0 --- /dev/null +++ b/designer-realize/src/com/fr/start/module/EnvBasedModule.java @@ -0,0 +1,29 @@ +package com.fr.start.module; + +import com.fr.module.Activator; +import com.fr.stable.CoreActivator; +import com.fr.start.server.FineEmbedServerActivator; + +/** + * Created by juhaoyu on 2018/6/6. + * 基于env的模块启动关闭 + */ +public class EnvBasedModule extends Activator { + + @Override + public void start() { + //core和设计器启动 + getSub(CoreActivator.class).start(); + getSub("designer").start(); + //这里不启动tomcat,由客户手动触发 + } + + @Override + public void stop() { + //先关闭tomcat(如果已经启动了的话) + getSub(FineEmbedServerActivator.class).stop(); + //倒叙关闭其他模块 + getSub("designer").stop(); + getSub(CoreActivator.class).stop(); + } +}