Add seed code for sdnr app based on ONF Centennial
[ccsdk/apps.git] / sdnr / wireless-transport / code-Carbon-SR1 / apps / dlux / 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 org.opendaylight.dlux.loader.Module;
14 import org.opendaylight.dlux.loader.exception.DluxLoaderException;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
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;
30
31 public class DluxLoaderIndexServlet extends HttpServlet{
32
33     private static final long serialVersionUID = 1L;
34     private static Logger logger = LoggerFactory.getLogger(DluxLoaderIndexServlet.class);
35
36     private String DEFINEJS_PROPERTY = "defineJS";
37
38     private String REQUIREJS_PROPERTY = "requireJS";
39
40     private String ANGULARJS_PROPERTY = "angularJS";
41
42     private final String DEFINEJS_START = "var module = [";
43
44     private final String REQUIREJS_START = "var deps = [";
45
46     private final String ANGULARJS_START = "var e = [";
47
48     private final String end = "];";
49
50     private final String COMMA_QUOTE = ",\'";
51
52     private final String QUOTE = "\'";
53
54     private final String NEWLINE = "\n";
55
56     private final DluxLoader loader;
57
58     private final String UTF_CHARSET = "UTF-8";
59
60     private final String JAVASCRIPT_REPLACE_PROPERTY = "javascriptReplaceString";
61
62     private final String CSS_REPLACE_PROPERTY = "cssReplaceString";
63
64     private final String INDEX_HTML_LOC = "index/index.html";
65
66     private final String RESPONSE_CONTENT_TYPE = "text/html";
67
68     private final String CSS_LINK_START = "<link rel=\"stylesheet\" href=\"";
69
70     private final String CSS_LINK_END = "\" />";
71
72     private final Properties prop;
73
74     private final List<String> indexHTML;
75
76     public DluxLoaderIndexServlet(final DluxLoader loader) throws DluxLoaderException {
77         Preconditions.checkNotNull(loader, "Loader service can not be null");
78         this.loader = loader;
79         this.prop = loadProperties();
80         this.indexHTML = loadStaticHTML();
81     }
82
83     private Properties loadProperties() throws DluxLoaderException {
84
85         Properties prop = new Properties();
86
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);
90
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);
94         }
95         return prop;
96     }
97
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();
106             }
107
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);
111         }
112         return indexHTMLContent;
113     }
114
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");
121
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);
128             }
129
130             if(line.contains(cssReplace)) {
131                 inputStringBuilder.append(getCSSString());
132                 inputStringBuilder.append(NEWLINE);
133             }
134             inputStringBuilder.append(line);
135             inputStringBuilder.append(NEWLINE);
136
137         }
138         response.setContentType(RESPONSE_CONTENT_TYPE);
139         PrintWriter out = response.getWriter();
140         out.print(inputStringBuilder.toString());
141     }
142
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);
153         }
154         defineJsBuilder.append(end).append(NEWLINE);
155         requireJsBuilder.append(end).append(NEWLINE);
156         angularBuilder.append(end);
157
158         return defineJsBuilder.toString() + requireJsBuilder.toString() + angularBuilder.toString();
159     }
160
161     private String getCSSString() {
162         StringBuilder cssBuilder = new StringBuilder();
163         for(Module module : loader.getModules()) {
164             if(module.getCssDependencies() == null) {
165                 continue;
166             }
167             for(String cssDependency : module.getCssDependencies()) {
168                 cssBuilder.append(CSS_LINK_START).append(cssDependency).append(CSS_LINK_END).append(NEWLINE);
169             }
170         }
171
172         return cssBuilder.toString();
173     }
174
175     @VisibleForTesting
176     public Properties getProp() {
177         return this.prop;
178     }
179
180     @VisibleForTesting
181     public List<String> getIndexHTML() {
182         return indexHTML;
183     }
184 }