Fix checkstyle and spotbugs issues
[dlux.git] / loader / impl / src / main / java / org / opendaylight / dlux / loader / implementation / DluxLoaderIndexServlet.java
1 /*
2  * Copyright (c) 2014 Inocybe Technologies, and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.dlux.loader.implementation;
10
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;
18
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;
31
32 public class DluxLoaderIndexServlet extends HttpServlet{
33
34     private static final long serialVersionUID = 1L;
35     private static final Logger LOG = LoggerFactory.getLogger(DluxLoaderIndexServlet.class);
36
37     private String DEFINEJS_PROPERTY = "defineJS";
38
39     private String REQUIREJS_PROPERTY = "requireJS";
40
41     private String ANGULARJS_PROPERTY = "angularJS";
42
43     private final String DEFINEJS_START = "var module = [";
44
45     private final String REQUIREJS_START = "var deps = [";
46
47     private final String ANGULARJS_START = "var e = [";
48
49     private final String end = "];";
50
51     private final String COMMA_QUOTE = ",\'";
52
53     private final String QUOTE = "\'";
54
55     private final String NEWLINE = "\n";
56
57     @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "Maintenance Update")
58     private final DluxLoader loader;
59
60     private final String UTF_CHARSET = "UTF-8";
61
62     private final String JAVASCRIPT_REPLACE_PROPERTY = "javascriptReplaceString";
63
64     private final String CSS_REPLACE_PROPERTY = "cssReplaceString";
65
66     private final String INDEX_HTML_LOC = "index/index.html";
67
68     private final String RESPONSE_CONTENT_TYPE = "text/html";
69
70     private final String CSS_LINK_START = "<link rel=\"stylesheet\" href=\"";
71
72     private final String CSS_LINK_END = "\" />";
73
74     private final Properties prop;
75
76     private final List<String> indexHTML;
77
78     public DluxLoaderIndexServlet(final DluxLoader loader) throws DluxLoaderException {
79         Preconditions.checkNotNull(loader, "Loader service can not be null");
80         this.loader = loader;
81         this.prop = loadProperties();
82         this.indexHTML = loadStaticHTML();
83     }
84
85     private Properties loadProperties() throws DluxLoaderException {
86
87         Properties prop = new Properties();
88
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);
92
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);
96         }
97         return prop;
98     }
99
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();
108             }
109
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);
113         }
114         return indexHTMLContent;
115     }
116
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");
123
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);
130             }
131
132             if(line.contains(cssReplace)) {
133                 inputStringBuilder.append(getCSSString());
134                 inputStringBuilder.append(NEWLINE);
135             }
136             inputStringBuilder.append(line);
137             inputStringBuilder.append(NEWLINE);
138
139         }
140         response.setContentType(RESPONSE_CONTENT_TYPE);
141         PrintWriter out = response.getWriter();
142         out.print(inputStringBuilder.toString());
143     }
144
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);
155         }
156         defineJsBuilder.append(end).append(NEWLINE);
157         requireJsBuilder.append(end).append(NEWLINE);
158         angularBuilder.append(end);
159
160         return defineJsBuilder.toString() + requireJsBuilder.toString() + angularBuilder.toString();
161     }
162
163     private String getCSSString() {
164         StringBuilder cssBuilder = new StringBuilder();
165         for(Module module : loader.getModules()) {
166             if(module.getCssDependencies() == null) {
167                 continue;
168             }
169             for(String cssDependency : module.getCssDependencies()) {
170                 cssBuilder.append(CSS_LINK_START).append(cssDependency).append(CSS_LINK_END).append(NEWLINE);
171             }
172         }
173
174         return cssBuilder.toString();
175     }
176
177     @VisibleForTesting
178     public Properties getProp() {
179         return this.prop;
180     }
181
182     @VisibleForTesting
183     public List<String> getIndexHTML() {
184         return indexHTML;
185     }
186 }