blob: eb09557106e20fac02a409c544fb9eac8d011036 [file] [log] [blame]
margaretha339fd2e2018-11-13 12:14:53 +01001package de.ids_mannheim.korap.server;
2
3import java.io.File;
margarethad77ee712024-03-22 12:35:30 +01004import java.io.FileInputStream;
margaretha339fd2e2018-11-13 12:14:53 +01005import java.io.FileOutputStream;
6import java.io.IOException;
margarethad77ee712024-03-22 12:35:30 +01007import java.io.InputStream;
margaretha339fd2e2018-11-13 12:14:53 +01008import java.io.OutputStreamWriter;
9import java.nio.charset.StandardCharsets;
10import java.security.NoSuchAlgorithmException;
margarethad77ee712024-03-22 12:35:30 +010011import java.util.Properties;
margaretha0ddaed62021-01-21 17:10:33 +010012import java.util.Scanner;
Michael Hanl72c7b832015-09-03 08:42:15 +020013
margarethad77ee712024-03-22 12:35:30 +010014import org.apache.logging.log4j.LogManager;
15import org.apache.logging.log4j.Logger;
Michael Hanl72c7b832015-09-03 08:42:15 +020016import org.eclipse.jetty.server.Connector;
margaretha7920aab2021-10-01 15:31:20 +020017import org.eclipse.jetty.server.HttpConnectionFactory;
Michael Hanl72c7b832015-09-03 08:42:15 +020018import org.eclipse.jetty.server.Server;
margaretha58e18632018-02-15 13:04:42 +010019import org.eclipse.jetty.server.ServerConnector;
margaretha339fd2e2018-11-13 12:14:53 +010020import org.eclipse.jetty.server.handler.HandlerList;
21import org.eclipse.jetty.server.handler.ShutdownHandler;
Michael Hanl72c7b832015-09-03 08:42:15 +020022import org.eclipse.jetty.servlet.ServletContextHandler;
23import org.eclipse.jetty.servlet.ServletHolder;
abcpro187984e32022-11-07 17:16:25 +000024import org.glassfish.jersey.server.ServerProperties;
abcpro1d912a2c2022-11-07 17:10:50 +000025import org.glassfish.jersey.servlet.ServletContainer;
margarethaeaa8fb62023-04-24 09:19:46 +020026import org.springframework.web.context.ContextLoaderListener;
margarethafbf7cfd2023-11-27 12:22:39 +010027import org.springframework.web.context.support.XmlWebApplicationContext;
margarethaade7d4a2017-07-20 19:53:35 +020028
margarethaade7d4a2017-07-20 19:53:35 +020029import de.ids_mannheim.korap.config.KustvaktConfiguration;
margaretha339fd2e2018-11-13 12:14:53 +010030import de.ids_mannheim.korap.encryption.RandomCodeGenerator;
31import de.ids_mannheim.korap.exceptions.KustvaktException;
margarethaade7d4a2017-07-20 19:53:35 +020032import lombok.Getter;
33import lombok.Setter;
34
Michael Hanl72c7b832015-09-03 08:42:15 +020035/**
margarethad77ee712024-03-22 12:35:30 +010036 * @author hanl, margaretha
37 *
Michael Hanl72c7b832015-09-03 08:42:15 +020038 */
Michael Hanlada713a2016-06-03 17:46:57 +020039public abstract class KustvaktBaseServer {
margaretha58e18632018-02-15 13:04:42 +010040
margarethad77ee712024-03-22 12:35:30 +010041 private Logger log = LogManager.getLogger(KustvaktBaseServer.class);
42
margaretha58e18632018-02-15 13:04:42 +010043 protected static KustvaktConfiguration config;
margarethaaf3cb442023-04-25 09:05:21 +020044 protected static String springConfig = "default-config.xml";
margaretha7f0a4d42018-02-20 19:16:44 +010045
margaretha543f2002017-07-14 00:27:15 +020046 protected static String rootPackages;
margarethaade7d4a2017-07-20 19:53:35 +020047 protected static KustvaktArgs kargs;
margaretha58e18632018-02-15 13:04:42 +010048
margaretha74a1f9e2019-04-25 16:11:49 +020049 public KustvaktBaseServer () {
margarethafbf7cfd2023-11-27 12:22:39 +010050 rootPackages = "de.ids_mannheim.korap.core.web;"
51 + "de.ids_mannheim.korap.web;"
52// + "com.fasterxml.jackson.jaxrs.json;"
53 ;
margaretha35e1ca22023-11-16 22:00:01 +010054
margarethac9d29412023-04-28 12:40:34 +020055 File d = new File(KustvaktConfiguration.DATA_FOLDER);
56 if (!d.exists()) {
57 d.mkdir();
58 }
margaretha74a1f9e2019-04-25 16:11:49 +020059 }
Michael Hanlc0ed00f2016-06-23 14:33:10 +020060
Michael Hanl8abaf9e2016-05-23 16:46:35 +020061 protected KustvaktArgs readAttributes (String[] args) {
Michael Hanl72c7b832015-09-03 08:42:15 +020062 KustvaktArgs kargs = new KustvaktArgs();
63 for (int i = 0; i < args.length; i++) {
64 switch ((args[i])) {
margarethaac3c4712018-03-08 15:55:54 +010065 case "--spring-config":
66 kargs.setSpringConfig(args[i + 1]);
Michael Hanl72c7b832015-09-03 08:42:15 +020067 break;
68 case "--port":
69 kargs.setPort(Integer.valueOf(args[i + 1]));
70 break;
Michael Hanlf21773f2015-10-16 23:02:31 +020071 case "--help":
72 StringBuffer b = new StringBuffer();
73
margaretha35e1ca22023-11-16 22:00:01 +010074 b.append("Parameter description: \n").append(
75 "--spring-config <Spring XML configuration>\n")
margarethaac3c4712018-03-08 15:55:54 +010076 .append("--port <Server port number>\n")
Michael Hanlf21773f2015-10-16 23:02:31 +020077 .append("--help : This help menu\n");
78 System.out.println(b.toString());
79 System.out.println();
Akron38eb4442018-02-20 16:48:46 +010080 return (KustvaktArgs) null;
Michael Hanl72c7b832015-09-03 08:42:15 +020081 }
82 }
83 return kargs;
84 }
85
margarethad77ee712024-03-22 12:35:30 +010086 protected void loadProperties (String path, String defaultPath) throws IOException {
87 File f = new File(path);
88 Properties properties = new Properties();
89
90 InputStream in = null;
91 if (!f.exists()) {
92 log.info("Loading kustvakt configuration from "+defaultPath);
93 in = KustvaktServer.class.getClassLoader()
94 .getResourceAsStream(defaultPath);
95 }
96 else {
97 log.info("Loading kustvakt configuration from "+path);
98 in = new FileInputStream(f);
99 }
100
101 properties.load(in);
102 in.close();
103
104 config = new KustvaktConfiguration();
105 config.loadBasicProperties(properties);
106 }
107
margaretha339fd2e2018-11-13 12:14:53 +0100108 protected void start ()
109 throws KustvaktException, IOException, NoSuchAlgorithmException {
margaretha7f0a4d42018-02-20 19:16:44 +0100110
111 if (kargs.port == -1) {
margarethaade7d4a2017-07-20 19:53:35 +0200112 kargs.setPort(config.getPort());
margaretha543f2002017-07-14 00:27:15 +0200113 }
margaretha58e18632018-02-15 13:04:42 +0100114
margaretha35e1ca22023-11-16 22:00:01 +0100115 String adminToken = "";
margarethada1571c2024-04-15 13:21:32 +0200116 File f = new File("data/adminToken");
margaretha3d55b002019-03-19 12:00:44 +0100117 if (!f.exists()) {
118 RandomCodeGenerator random = new RandomCodeGenerator();
119 adminToken = random.createRandomCode(config);
margarethada1571c2024-04-15 13:21:32 +0200120 FileOutputStream fos = new FileOutputStream(f);
margaretha35e1ca22023-11-16 22:00:01 +0100121 OutputStreamWriter writer = new OutputStreamWriter(fos,
122 StandardCharsets.UTF_8.name());
margaretha3d55b002019-03-19 12:00:44 +0100123 writer.append("token=");
124 writer.append(adminToken);
125 writer.flush();
126 writer.close();
127 }
128 else {
margaretha0ddaed62021-01-21 17:10:33 +0100129 Scanner scanner = new Scanner(f);
130 adminToken = scanner.nextLine().substring(6);
131 scanner.close();
margaretha3d55b002019-03-19 12:00:44 +0100132 }
133
margaretha543f2002017-07-14 00:27:15 +0200134 Server server = new Server();
margaretha7f0a4d42018-02-20 19:16:44 +0100135
margarethafbf7cfd2023-11-27 12:22:39 +0100136 String configLocation = "classpath:" + springConfig;
137 if (kargs.getSpringConfig() != null) {
138 configLocation = "file:" + kargs.getSpringConfig();
139 }
140 XmlWebApplicationContext context = new XmlWebApplicationContext();
141 context.setConfigLocation(configLocation);
142
margaretha35e1ca22023-11-16 22:00:01 +0100143 ServletContextHandler contextHandler = new ServletContextHandler(
144 ServletContextHandler.NO_SESSIONS);
margaretha543f2002017-07-14 00:27:15 +0200145 contextHandler.setContextPath("/");
margarethafbf7cfd2023-11-27 12:22:39 +0100146 contextHandler.addEventListener(new ContextLoaderListener(context));
margaretha3d55b002019-03-19 12:00:44 +0100147 contextHandler.setInitParameter("adminToken", adminToken);
margaretha543f2002017-07-14 00:27:15 +0200148
margarethafbf7cfd2023-11-27 12:22:39 +0100149 ServletHolder servletHolder = new ServletHolder(
150 new ServletContainer());
margaretha35e1ca22023-11-16 22:00:01 +0100151 servletHolder.setInitParameter(ServerProperties.PROVIDER_PACKAGES,
152 rootPackages);
margaretha543f2002017-07-14 00:27:15 +0200153 servletHolder.setInitOrder(1);
margarethaea68a0a2017-09-21 03:09:49 +0200154 contextHandler.addServlet(servletHolder, config.getBaseURL());
margaretha58e18632018-02-15 13:04:42 +0100155
156 ServerConnector connector = new ServerConnector(server);
margaretha543f2002017-07-14 00:27:15 +0200157 connector.setPort(kargs.port);
margaretha58e18632018-02-15 13:04:42 +0100158 connector.setIdleTimeout(60000);
margaretha7920aab2021-10-01 15:31:20 +0200159 connector.getConnectionFactory(HttpConnectionFactory.class)
margaretha35e1ca22023-11-16 22:00:01 +0100160 .getHttpConfiguration().setRequestHeaderSize(64000);
margaretha7f0a4d42018-02-20 19:16:44 +0100161
margaretha35e1ca22023-11-16 22:00:01 +0100162 ShutdownHandler shutdownHandler = new ShutdownHandler(adminToken, true,
margaretha396e46b2023-11-17 21:27:52 +0100163 false);
margaretha339fd2e2018-11-13 12:14:53 +0100164
165 HandlerList handlers = new HandlerList();
166 handlers.addHandler(shutdownHandler);
167 handlers.addHandler(contextHandler);
168
169 server.setHandler(handlers);
margaretha7f0a4d42018-02-20 19:16:44 +0100170
margaretha543f2002017-07-14 00:27:15 +0200171 server.setConnectors(new Connector[] { connector });
172 try {
173 server.start();
174 server.join();
175 }
176 catch (Exception e) {
177 System.out.println("Server could not be started!");
178 System.out.println(e.getMessage());
margaretha58e18632018-02-15 13:04:42 +0100179 e.printStackTrace();
margaretha543f2002017-07-14 00:27:15 +0200180 System.exit(-1);
margaretha543f2002017-07-14 00:27:15 +0200181 }
182 }
margaretha35e1ca22023-11-16 22:00:01 +0100183
Michael Hanl72c7b832015-09-03 08:42:15 +0200184 @Setter
185 public static class KustvaktArgs {
186
Michael Hanl72c7b832015-09-03 08:42:15 +0200187 @Getter
margarethaac3c4712018-03-08 15:55:54 +0100188 private String springConfig;
Michael Hanl72c7b832015-09-03 08:42:15 +0200189 private int port;
Michael Hanl72c7b832015-09-03 08:42:15 +0200190
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200191 public KustvaktArgs () {
Michael Hanl72c7b832015-09-03 08:42:15 +0200192 this.port = -1;
margarethaac3c4712018-03-08 15:55:54 +0100193 this.springConfig = null;
Michael Hanl72c7b832015-09-03 08:42:15 +0200194 }
Michael Hanlc4446022016-02-12 18:03:17 +0100195 }
Akron38eb4442018-02-20 16:48:46 +0100196}