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 edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import org.opendaylight.dlux.loader.Module;
15 import org.opendaylight.dlux.loader.exception.DluxLoaderException;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
19 import javax.servlet.ServletException;
20 import javax.servlet.http.HttpServlet;
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23 import java.io.BufferedReader;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.io.InputStreamReader;
27 import java.io.PrintWriter;
28 import java.util.ArrayList;
29 import java.util.List;
30 import java.util.Properties;
32 public class DluxLoaderIndexServlet extends HttpServlet{
34 private static final long serialVersionUID = 1L;
35 private static final Logger LOG = LoggerFactory.getLogger(DluxLoaderIndexServlet.class);
37 private String DEFINEJS_PROPERTY = "defineJS";
39 private String REQUIREJS_PROPERTY = "requireJS";
41 private String ANGULARJS_PROPERTY = "angularJS";
43 private final String DEFINEJS_START = "var module = [";
45 private final String REQUIREJS_START = "var deps = [";
47 private final String ANGULARJS_START = "var e = [";
49 private final String end = "];";
51 private final String COMMA_QUOTE = ",\'";
53 private final String QUOTE = "\'";
55 private final String NEWLINE = "\n";
57 @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "Maintenance Update")
58 private final DluxLoader loader;
60 private final String UTF_CHARSET = "UTF-8";
62 private final String JAVASCRIPT_REPLACE_PROPERTY = "javascriptReplaceString";
64 private final String CSS_REPLACE_PROPERTY = "cssReplaceString";
66 private final String INDEX_HTML_LOC = "index/index.html";
68 private final String RESPONSE_CONTENT_TYPE = "text/html";
70 private final String CSS_LINK_START = "<link rel=\"stylesheet\" href=\"";
72 private final String CSS_LINK_END = "\" />";
74 private final Properties prop;
76 private final List<String> indexHTML;
78 public DluxLoaderIndexServlet(final DluxLoader loader) throws DluxLoaderException {
79 Preconditions.checkNotNull(loader, "Loader service can not be null");
81 this.prop = loadProperties();
82 this.indexHTML = loadStaticHTML();
85 private Properties loadProperties() throws DluxLoaderException {
87 Properties prop = new Properties();
89 try(InputStream inputStream = DluxLoaderIndexServlet.class.getClassLoader().getResourceAsStream("CommonAppModules.properties")){
90 Preconditions.checkNotNull(inputStream, "Could not load the module properties file");
91 prop.load(inputStream);
93 } catch (IOException e) {
94 LOG.error("Could not load properties from input stream", e);
95 throw new DluxLoaderException("Dlux Loader Servlet initialization failed. ", e);
100 private List<String> loadStaticHTML() throws DluxLoaderException{
101 List<String> indexHTMLContent = new ArrayList<>();
102 try(InputStream indexHTMLStream = DluxLoaderIndexServlet.class.getClassLoader().getResourceAsStream(INDEX_HTML_LOC);
103 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(indexHTMLStream, UTF_CHARSET))) {
104 String line = bufferedReader.readLine();
105 while(line != null) {
106 indexHTMLContent.add(line);
107 line = bufferedReader.readLine();
110 } catch (IOException e) {
111 LOG.error("Could not load index html from input stream", e);
112 throw new DluxLoaderException("Dlux Loader Servlet initialization failed. ", e);
114 return indexHTMLContent;
117 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
118 String jsReplace = prop.getProperty(JAVASCRIPT_REPLACE_PROPERTY);
119 String cssReplace = prop.getProperty(CSS_REPLACE_PROPERTY);
120 Preconditions.checkNotNull(jsReplace, "Global requireJS replace string should be present in properties file");
121 Preconditions.checkNotNull(cssReplace, "Global css replace string should be present in properties file");
122 Preconditions.checkArgument(indexHTML.size() > 0, "HTML file was not loaded properly at servlet initialization");
124 StringBuilder inputStringBuilder = new StringBuilder();
125 for (String line : this.indexHTML) {
126 // add global variables
127 if(line.contains(jsReplace)) {
128 inputStringBuilder.append(getModulesString());
129 inputStringBuilder.append(NEWLINE);
132 if(line.contains(cssReplace)) {
133 inputStringBuilder.append(getCSSString());
134 inputStringBuilder.append(NEWLINE);
136 inputStringBuilder.append(line);
137 inputStringBuilder.append(NEWLINE);
140 response.setContentType(RESPONSE_CONTENT_TYPE);
141 PrintWriter out = response.getWriter();
142 out.print(inputStringBuilder.toString());
145 private String getModulesString() {
146 StringBuilder defineJsBuilder = new StringBuilder();
147 StringBuilder requireJsBuilder = new StringBuilder();
148 StringBuilder angularBuilder = new StringBuilder();
149 defineJsBuilder.append(DEFINEJS_START).append(prop.getProperty(DEFINEJS_PROPERTY));
150 requireJsBuilder.append(REQUIREJS_START).append(prop.getProperty(REQUIREJS_PROPERTY));
151 angularBuilder.append(ANGULARJS_START).append(prop.getProperty(ANGULARJS_PROPERTY));
152 for (Module module: loader.getModules()){
153 requireJsBuilder.append(COMMA_QUOTE).append(module.getRequireJs()).append(QUOTE);
154 angularBuilder.append(COMMA_QUOTE).append(module.getAngularJs()).append(QUOTE);
156 defineJsBuilder.append(end).append(NEWLINE);
157 requireJsBuilder.append(end).append(NEWLINE);
158 angularBuilder.append(end);
160 return defineJsBuilder.toString() + requireJsBuilder.toString() + angularBuilder.toString();
163 private String getCSSString() {
164 StringBuilder cssBuilder = new StringBuilder();
165 for(Module module : loader.getModules()) {
166 if(module.getCssDependencies() == null) {
169 for(String cssDependency : module.getCssDependencies()) {
170 cssBuilder.append(CSS_LINK_START).append(cssDependency).append(CSS_LINK_END).append(NEWLINE);
174 return cssBuilder.toString();
178 public Properties getProp() {
183 public List<String> getIndexHTML() {