P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package foundation.server;
 
import javax.servlet.ServletContext;
 
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
import foundation.route.RouteTable;
import foundation.server.config.Configer;
import foundation.server.config.ConfigerLoader;
import foundation.server.config.ServerAssembleLoader;
import foundation.server.config.ServerStatus;
 
 
public class ServerInstance {
 
    private static Logger logger;
    private static ServerInstance instance;
    private ServletContext servletContext;
    private String version;
 
    static {
        logger = LogManager.getLogger(ServerInstance.class);
    }
    
    public ServerInstance(ServletContext servletContext) {
        this.servletContext = servletContext;
        version = "2.0";
    }
 
    public static void startService(ServletContext servletContext) {
        try {
            instance = new ServerInstance(servletContext);
            instance.start();
        } 
        catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
    }
 
    public static void stopService() {
        try {
            if(instance != null) {
                instance.stop();
            }
            
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
        }
    }
 
    public void start() throws Exception {
        try {
            logger.info("server is startting...");
            logger.debug("server root path is " + Configer.getPath_Application());
            ServerStatus.setStarting(true);
 
            //1. 
            String contextPath = servletContext.getContextPath();
            RouteTable.createInstance(contextPath);
            
            //2. load parameter and assemble configure file
            ConfigerLoader.staticLoad();
            ServerAssembleLoader.staticLoad();
 
            //3. run initializers
            InitializerContainer initializerContainer = InitializerContainer.getInstance();
 
            for (Initializer initializer : initializerContainer) {
                initializer.onServerStart();
            }
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            ServerStatus.init();
            ServerStatus.setStarting(false);
            printStartUpMessage();
        }
    }
 
    public void stop() {
        logger.info("internal server is stopping...");
 
        InitializerContainer initializerContainer = InitializerContainer.getInstance();
 
        for (Initializer initializer : initializerContainer) {
            initializer.onServerStop();
        }
 
        logger.info("internal server has been stopped");
    }
 
    public void restart() throws Exception {
        stop();
        start();
    }
    
    private static String echoString(String word, int count) {
        StringBuilder result = new StringBuilder();
 
        for (int i = 1; i <= count; i++) {
            result.append(word);
        }
 
        return result.toString();
    }
 
    private void printStartUpMessage() {
        int length_total = 40;
 
        long total = Math.round((Runtime.getRuntime().totalMemory()) / (1024.0 * 1024));
        long max = Math.round((Runtime.getRuntime().maxMemory()) / (1024.0 * 1024));
 
        String envirenment = Configer.getString("EnvironmentName");
        System.out.println("--->>> " + envirenment + " --->>>");
 
        System.out.println(echoString("*", length_total + 2));
        printMessage("Total Memory:" + total + "M", length_total);
        printMessage("Max Memory:" + max + "M", length_total);
        printMessage(version, length_total);
        System.out.println(echoString("*", length_total + 2));
    }
 
    private void printMessage(String message, int totalLength) {
        MessagePos messagePos = new MessagePos(totalLength, message);
        System.out.println("*" + echoString(" ", messagePos.length_begin) + message + echoString(" ", messagePos.length_end) + "*");
    }
 
    private class MessagePos {
        private int length_begin;
        private int length_end;
        private int length_message;
 
        public MessagePos(int totalLength, String message) {
            length_message = message.length();
            length_begin = (totalLength - length_message) / 2;
            length_end = totalLength - length_begin - length_message;
        }
    }
 
    public static ServerInstance getInstance() {
        return instance;
    }
}