2 * Copyright (c) 2014 Inocybe Technologies, and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.dlux.loader.implementation;
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Preconditions;
13 import org.opendaylight.dlux.loader.Module;
14 import org.opendaylight.dlux.loader.exception.DluxLoaderException;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
18 import javax.servlet.ServletException;
19 import javax.servlet.http.HttpServlet;
20 import javax.servlet.http.HttpServletRequest;
21 import javax.servlet.http.HttpServletResponse;
22 import java.io.BufferedReader;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.io.PrintWriter;
27 import java.util.ArrayList;
28 import java.util.List;
29 import java.util.Properties;
31 public class DluxLoaderIndexServlet extends HttpServlet{
33 private static final long serialVersionUID = 1L;
34 private static Logger logger = LoggerFactory.getLogger(DluxLoaderIndexServlet.class);
36 private String DEFINEJS_PROPERTY = "defineJS";
38 private String REQUIREJS_PROPERTY = "requireJS";
40 private String ANGULARJS_PROPERTY = "angularJS";
42 private final String DEFINEJS_START = "var module = [";
44 private final String REQUIREJS_START = "var deps = [";
46 private final String ANGULARJS_START = "var e = [";
48 private final String end = "];";
50 private final String COMMA_QUOTE = ",\'";
52 private final String QUOTE = "\'";
54 private final String NEWLINE = "\n";
56 private final DluxLoader loader;
58 private final String UTF_CHARSET = "UTF-8";
60 private final String JAVASCRIPT_REPLACE_PROPERTY = "javascriptReplaceString";
62 private final String CSS_REPLACE_PROPERTY = "cssReplaceString";
64 private final String INDEX_HTML_LOC = "index/index.html";
66 private final String RESPONSE_CONTENT_TYPE = "text/html";
68 private final String CSS_LINK_START = "<link rel=\"stylesheet\" href=\"";
70 private final String CSS_LINK_END = "\" />";
72 private final Properties prop;
74 private final List<String> indexHTML;
76 public DluxLoaderIndexServlet(final DluxLoader loader) throws DluxLoaderException {
77 Preconditions.checkNotNull(loader, "Loader service can not be null");
79 this.prop = loadProperties();
80 this.indexHTML = loadStaticHTML();
83 private Properties loadProperties() throws DluxLoaderException {
85 Properties prop = new Properties();
87 try(InputStream inputStream = DluxLoaderIndexServlet.class.getClassLoader().getResourceAsStream("CommonAppModules.properties")){
88 Preconditions.checkNotNull(inputStream, "Could not load the module properties file");
89 prop.load(inputStream);
91 } catch (IOException e) {
92 logger.error("Could not load properties from input stream", e);
93 throw new DluxLoaderException("Dlux Loader Servlet initialization failed. ", e);
98 private List<String> loadStaticHTML() throws DluxLoaderException{
99 List<String> indexHTMLContent = new ArrayList<>();
100 try(InputStream indexHTMLStream = DluxLoaderIndexServlet.class.getClassLoader().getResourceAsStream(INDEX_HTML_LOC);
101 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(indexHTMLStream, UTF_CHARSET))) {
102 String line = bufferedReader.readLine();
103 while(line != null) {
104 indexHTMLContent.add(line);
105 line = bufferedReader.readLine();
108 } catch (IOException e) {
109 logger.error("Could not load index html from input stream", e);
110 throw new DluxLoaderException("Dlux Loader Servlet initialization failed. ", e);
112 return indexHTMLContent;
115 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
116 String jsReplace = prop.getProperty(JAVASCRIPT_REPLACE_PROPERTY);
117 String cssReplace = prop.getProperty(CSS_REPLACE_PROPERTY);
118 Preconditions.checkNotNull(jsReplace, "Global requireJS replace string should be present in properties file");
119 Preconditions.checkNotNull(cssReplace, "Global css replace string should be present in properties file");
120 Preconditions.checkArgument(indexHTML.size() > 0, "HTML file was not loaded properly at servlet initialization");
122 StringBuilder inputStringBuilder = new StringBuilder();
123 for (String line : this.indexHTML) {
124 // add global variables
125 if(line.contains(jsReplace)) {
126 inputStringBuilder.append(getModulesString());
127 inputStringBuilder.append(NEWLINE);
130 if(line.contains(cssReplace)) {
131 inputStringBuilder.append(getCSSString());
132 inputStringBuilder.append(NEWLINE);
134 inputStringBuilder.append(line);
135 inputStringBuilder.append(NEWLINE);
138 response.setContentType(RESPONSE_CONTENT_TYPE);
139 PrintWriter out = response.getWriter();
140 out.print(inputStringBuilder.toString());
143 private String getModulesString() {
144 StringBuilder defineJsBuilder = new StringBuilder();
145 StringBuilder requireJsBuilder = new StringBuilder();
146 StringBuilder angularBuilder = new StringBuilder();
147 defineJsBuilder.append(DEFINEJS_START).append(prop.getProperty(DEFINEJS_PROPERTY));
148 requireJsBuilder.append(REQUIREJS_START).append(prop.getProperty(REQUIREJS_PROPERTY));
149 angularBuilder.append(ANGULARJS_START).append(prop.getProperty(ANGULARJS_PROPERTY));
150 for (Module module: loader.getModules()){
151 requireJsBuilder.append(COMMA_QUOTE).append(module.getRequireJs()).append(QUOTE);
152 angularBuilder.append(COMMA_QUOTE).append(module.getAngularJs()).append(QUOTE);
154 defineJsBuilder.append(end).append(NEWLINE);
155 requireJsBuilder.append(end).append(NEWLINE);
156 angularBuilder.append(end);
158 return defineJsBuilder.toString() + requireJsBuilder.toString() + angularBuilder.toString();
161 private String getCSSString() {
162 StringBuilder cssBuilder = new StringBuilder();
163 for(Module module : loader.getModules()) {
164 if(module.getCssDependencies() == null) {
167 for(String cssDependency : module.getCssDependencies()) {
168 cssBuilder.append(CSS_LINK_START).append(cssDependency).append(CSS_LINK_END).append(NEWLINE);
172 return cssBuilder.toString();
176 public Properties getProp() {
181 public List<String> getIndexHTML() {