Merge "Fixes sonar issues in API_Artifact"
[aaf/authz.git] / misc / env / src / main / java / org / onap / aaf / misc / env / impl / BasicEnv.java
1 /**\r
2  * ============LICENSE_START====================================================\r
3  * org.onap.aaf\r
4  * ===========================================================================\r
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.\r
6  * ===========================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END====================================================\r
19  *\r
20  */\r
21 \r
22 package org.onap.aaf.misc.env.impl;\r
23 \r
24 import java.applet.Applet;\r
25 import java.io.BufferedReader;\r
26 import java.io.File;\r
27 import java.io.FileInputStream;\r
28 import java.io.IOException;\r
29 import java.io.InputStream;\r
30 import java.io.InputStreamReader;\r
31 import java.util.Properties;\r
32 \r
33 import javax.xml.namespace.QName;\r
34 import javax.xml.validation.Schema;\r
35 \r
36 import org.onap.aaf.misc.env.APIException;\r
37 import org.onap.aaf.misc.env.DataFactory;\r
38 import org.onap.aaf.misc.env.Decryptor;\r
39 import org.onap.aaf.misc.env.Encryptor;\r
40 import org.onap.aaf.misc.env.Env;\r
41 import org.onap.aaf.misc.env.EnvJAXB;\r
42 import org.onap.aaf.misc.env.LogTarget;\r
43 import org.onap.aaf.misc.env.StaticSlot;\r
44 import org.onap.aaf.misc.env.StoreImpl;\r
45 import org.onap.aaf.misc.env.TimeTaken;\r
46 import org.onap.aaf.misc.env.TransCreate;\r
47 import org.onap.aaf.misc.env.TransJAXB;\r
48 import org.onap.aaf.misc.env.jaxb.JAXBDF;\r
49 import org.onap.aaf.misc.env.util.Split;\r
50 \r
51 /**\r
52  * An essential Implementation of Env, which will fully function, without any sort\r
53  * of configuration.\r
54  * \r
55  * Use as a basis for Group level Env, just overriding where needed.\r
56  * @author Jonathan\r
57  *\r
58  */\r
59 public class BasicEnv extends StoreImpl implements EnvJAXB, TransCreate<TransJAXB>{\r
60         protected LogTarget fatal=LogTarget.SYSERR;\r
61         protected LogTarget error=LogTarget.SYSERR;\r
62         protected LogTarget audit=LogTarget.SYSOUT;\r
63         protected LogTarget init=LogTarget.SYSOUT;\r
64         protected LogTarget warn=LogTarget.SYSERR;\r
65         protected LogTarget info=LogTarget.SYSOUT;\r
66         protected LogTarget debug=LogTarget.NULL;\r
67         protected LogTarget trace=LogTarget.NULL;\r
68 //      protected Map<String, String> props;\r
69         \r
70 //      private boolean sysprops;\r
71 \r
72         public BasicEnv(String ... args) {\r
73                 super(null,args);\r
74         }\r
75 \r
76         public BasicEnv(String tag, String[] args) {\r
77                 super(tag, args);\r
78         }\r
79         \r
80 \r
81         /**\r
82          * Suitable for use in Applets... obtain all the values \r
83          * listed for the variable String arg "tags"\r
84          */\r
85         public BasicEnv(Applet applet, String ... tags) {\r
86                 super(null, tags);\r
87 //              props = new HashMap<>();\r
88 //              String value;\r
89 //              for(int i=0;i<tags.length;++i) {\r
90 //                      value = applet.getParameter(tags[i]);\r
91 //                      if(value!=null) {\r
92 //                              props.put(tags[i], value);\r
93 //                      }\r
94 //              }\r
95         }\r
96 \r
97         public BasicEnv(Properties props) {\r
98                 super(null, props);\r
99         }\r
100 \r
101         public BasicEnv(String tag, Properties props) {\r
102                 super(tag, props);\r
103         }\r
104 \r
105 \r
106 \r
107         // @Override\r
108         public LogTarget fatal() {\r
109                 return fatal;\r
110         }\r
111 \r
112         // @Override\r
113         public LogTarget error() {\r
114                 return error;\r
115         }\r
116 \r
117         \r
118         // @Override\r
119         public LogTarget audit() {\r
120                 return audit;\r
121         }\r
122 \r
123         // @Override\r
124         public LogTarget init() {\r
125                 return init;\r
126         }\r
127 \r
128         // @Override\r
129         public LogTarget warn() {\r
130                 return warn;\r
131         }\r
132 \r
133         // @Override\r
134         public LogTarget info() {\r
135                 return info;\r
136         }\r
137 \r
138         // @Override\r
139         public LogTarget debug() {\r
140                 return debug;\r
141         }\r
142 \r
143         public void debug(LogTarget lt) {\r
144                 debug = lt;\r
145         }\r
146 \r
147         // @Override\r
148         public LogTarget trace() {\r
149                 return trace;\r
150         }\r
151 \r
152         // @Override\r
153         public TimeTaken start(String name, int flag) {\r
154                 return new TimeTaken(name, flag) {\r
155                         /**\r
156                          * Format to be printed when called upon\r
157                          */\r
158                         // @Override\r
159                         public void output(StringBuilder sb) {\r
160         \r
161                                 switch(flag) {\r
162                                         case Env.XML: sb.append("XML "); break;\r
163                                         case Env.JSON: sb.append("JSON "); break;\r
164                                         case Env.REMOTE: sb.append("REMOTE "); break;\r
165                                 }\r
166                                 sb.append(name);\r
167                                 if(flag != Env.CHECKPOINT) {\r
168                                         sb.append(' ');\r
169                                         sb.append((end-start)/1000000f);\r
170                                         sb.append("ms");\r
171                                         if(size>=0) {\r
172                                                 sb.append(" size: ");\r
173                                                 sb.append(Long.toString(size));\r
174                                         }\r
175                                 }\r
176                         }\r
177                 };\r
178         }\r
179 \r
180         // @Override\r
181         public String getProperty(String key) {\r
182                 return get(staticSlot(key),null);\r
183         }\r
184         \r
185         public Properties getProperties(String ... filter) {\r
186                 Properties props = new Properties();\r
187                 boolean yes;\r
188                 for(String key : existingStaticSlotNames()) {\r
189                         if(filter.length>0) {\r
190                                 yes = false;\r
191                                 for(String f : filter) {\r
192                                         if(key.startsWith(f)) {\r
193                                                 yes = true;\r
194                                                 break;\r
195                                         }\r
196                                 }\r
197                         } else {\r
198                                 yes = true;\r
199                         }\r
200                         if(yes) {\r
201                                 String value = getProperty(key);\r
202                                 if(value!=null) {\r
203                                         props.put(key, value);\r
204                                 }\r
205                         }\r
206                 }\r
207                 return props;\r
208         }\r
209         \r
210         // @Override\r
211         public String getProperty(String key, String defaultValue) {\r
212                 return get(staticSlot(key),defaultValue);\r
213         }\r
214 \r
215         // @Override\r
216         public String setProperty(String key, String value) {\r
217                 put(staticSlot(key),value==null?null:value.trim());\r
218                 return value;\r
219         }\r
220         \r
221         protected Decryptor decryptor = Decryptor.NULL;\r
222         protected Encryptor encryptor = Encryptor.NULL;\r
223 \r
224         \r
225         public Decryptor decryptor() {\r
226                 return decryptor; \r
227         }\r
228         \r
229         public void set(Decryptor newDecryptor) {\r
230                 decryptor = newDecryptor;\r
231         }\r
232         \r
233         public Encryptor encryptor() {\r
234                 return encryptor; \r
235         }\r
236         \r
237         public void set(Encryptor newEncryptor) {\r
238                 encryptor = newEncryptor;\r
239         }\r
240 \r
241         \r
242 //      @SuppressWarnings("unchecked")\r
243         // @Override\r
244         public <T> DataFactory<T> newDataFactory(Class<?>... classes) throws APIException {\r
245 //              if(String.class.isAssignableFrom(classes[0])) \r
246 //                      return (DataFactory<T>) new StringDF(this);\r
247                 return new JAXBDF<T>(this,classes);\r
248         }\r
249 \r
250 //      @SuppressWarnings("unchecked")\r
251         // @Override\r
252         public <T> DataFactory<T> newDataFactory(Schema schema, Class<?>... classes) throws APIException {\r
253 //              if(String.class.isAssignableFrom(classes[0])) \r
254 //                      return (DataFactory<T>) new StringDF(this);\r
255                 return new JAXBDF<T>(this, schema, classes);\r
256         }\r
257 \r
258 //      @SuppressWarnings("unchecked")\r
259         // @Override\r
260         public<T> DataFactory<T> newDataFactory(QName qName, Class<?> ... classes) throws APIException {\r
261 //              if(String.class.isAssignableFrom(classes[0])) \r
262 //                      return (DataFactory<T>) new StringDF(this);\r
263                 return new JAXBDF<T>(this, qName, classes);\r
264         }\r
265 \r
266         // @Override\r
267         public<T> DataFactory<T> newDataFactory(Schema schema, QName qName, Class<?> ... classes) throws APIException {\r
268                 return new JAXBDF<T>(this, schema, qName, classes);\r
269         }\r
270 \r
271         // @Override\r
272         public BasicTrans newTrans() {\r
273                 return new BasicTrans(this);\r
274         }\r
275 \r
276         public void loadFromSystemPropsStartsWith(String ... str) {\r
277                  for(String name : System.getProperties().stringPropertyNames()) {\r
278                         for(String s : str) {\r
279                                 if(name.startsWith(s)) {\r
280                                         setProperty(name, System.getProperty(name));\r
281                                 }\r
282                         }\r
283                 }\r
284         }\r
285 \r
286         /**\r
287          * \r
288          * \r
289          */\r
290         public void loadToSystemPropsStartsWith(String ... str) {\r
291                 String value;\r
292                 for(String name : existingStaticSlotNames()) {\r
293                         for(String s : str) {\r
294                                 if(name.startsWith(s)) {\r
295                                         if((value = getProperty(name))!=null)\r
296                                                 System.setProperty(name,value);\r
297                                 }\r
298                         }\r
299                  }\r
300         }\r
301         \r
302         public void loadPropFiles(String tag, ClassLoader classloader) throws IOException {\r
303                 String propfiles = getProperty(tag);\r
304                 if(propfiles!=null) {\r
305                         for(String pf : Split.splitTrim(File.pathSeparatorChar, propfiles)) {\r
306                                 InputStream is = classloader==null?null:classloader.getResourceAsStream(pf);\r
307                                 if(is==null) {\r
308                                         File f = new File(pf);\r
309                                         if(f.exists()) {\r
310                                                 is = new FileInputStream(f);\r
311                                         }\r
312                                 }\r
313                                 if(is!=null) {\r
314                                         BufferedReader br = new BufferedReader(new InputStreamReader(is));\r
315                                         try {\r
316                                                 String line;\r
317                                                 while((line=br.readLine())!=null) {\r
318                                                         line = line.trim();\r
319                                                         if(!line.startsWith("#")) {\r
320                                                                 String[] tv = Split.splitTrim('=', line);\r
321                                                                 if(tv.length==2) {\r
322                                                                         setProperty(tv[0],tv[1]);\r
323                                                                 }\r
324                                                         }\r
325                                                 }\r
326                                         } finally {\r
327                                                 try {\r
328                                                         br.close();\r
329                                                 } catch (IOException e) {\r
330                                                         error().log(e);\r
331                                                 }\r
332                                         }\r
333                                 }\r
334                         }\r
335                 }\r
336         }\r
337         \r
338         /**\r
339          * Create a StaticSlot, and load it from existing Properties\r
340          * \r
341          * @param name\r
342          * @param propName\r
343          * @return\r
344          */\r
345         public synchronized StaticSlot staticSlot(String name, final String propName) {\r
346                 StaticSlot ss = staticSlot(name);\r
347                 put(ss,getProperty(propName));\r
348                 return ss;\r
349         }\r
350 \r
351 \r
352 }\r