OpenKeyWord  Build_ID: 457, Datum: 01.02.2020 07:45:48
Dont repeat yourself. - Do it once and only once!
OKW_Ini_Sngltn.java
1 /*
2  ==============================================================================
3  Author: Zoltán Hrabovszki <zh@openkeyword.de>
4 
5  Copyright © 2012 - 2019 IT-Beratung Hrabovszki
6  www.OpenKeyWord.de
7  ==============================================================================
8 
9  This file is part of OpenKeyWord.
10 
11  OpenKeyWord is free software: you can redistribute it and/or modify
12  it under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenKeyWord is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  GNU General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenKeyWord. If not, see <http://www.gnu.org/licenses/>.
23 
24  Diese Datei ist Teil von OpenKeyWord.
25 
26  OpenKeyWord ist Freie Software: Sie können es unter den Bedingungen
27  der GNU General Public License, wie von der Free Software Foundation,
28  Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren
29  veröffentlichten Version, weiterverbreiten und/oder modifizieren.
30 
31  OpenKeyWord wird in der Hoffnung, dass es nützlich sein wird, aber
32  OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
33  Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
34  Siehe die GNU General Public License für weitere Details.
35 
36  Sie sollten eine Kopie der GNU General Public License zusammen mit
37  OpenKeyWord erhalten haben. Wenn nicht, siehe <http://www.gnu.org/licenses/>.
38 */
39 
40 package okw;
41 
42 import java.io.File;
43 import java.io.UnsupportedEncodingException;
44 import java.net.URL;
45 import java.net.URLDecoder;
46 import java.nio.charset.Charset;
47 import java.security.CodeSource;
48 
49 import javax.xml.bind.JAXBContext;
50 import javax.xml.bind.JAXBException;
51 import javax.xml.bind.Marshaller;
52 import javax.xml.bind.Unmarshaller;
53 import javax.xml.bind.annotation.XmlElement;
54 import javax.xml.bind.annotation.XmlRootElement;
55 
56 import okw.exceptions.OKWFileDoesNotExistsException;
57 import okw.log.Logger_Sngltn;
58 
59 /*
60 * \brief
61 * OKW.OKW_Ini ist die Klasse zur Konfigurationsdatei OKW_Ini.xml.<br/>
62 *
63 * Die Klasse OKW_Ini hält alle Konfigurationsparameter vor und stellt
64 * diese als Eigenschaften(Properties) zur Verfügung.
65 *
66 * Die Eigenschaften werden in zwei Bereiche eingeteilt
67 *
68 * Name | Beschreibung
69 * ------------------------------ | -------------
70 * OKW.OKW_Ini.OKW_Enviroment | Umgebungseigenschaften, wie z.B. Pfade.<br/> Genaue Beschreibung in der referenzierten Klasse.
71 * OKW.OKW_Ini.OKW_CustomSettings | Allgemeine Einstellungen, wie TimeOuts <br/>Genaue Beschreibung in der referenzierten Klasse.
72 *
73 * Die Klasse ist als Singelton konstruiert.<br/>
74 * __Die Verwendung dieser Klasse erfolgt__ _nicht_ über den Konstruktor, sondern __ausschließlich
75 * über die Eigenschaft OKW.OKW_Ini.Instance.__<br/>
76 *
77 * ## Verwendung der Klasse OKW.OKW_Ini ##
78 * ### Paket einbinden ###
79 * Das Paket OKW enthält die Klasse OKW_Ini. Die kann mit
80 * ~~~~~~~~~~~~~{.py}
81 * use OKW;
82 * ~~~~~~~~~~~~~
83 * erfolgen.
84 *
85 * ### Instanz des Singelton holen ###
86 * Eine Instanz der Klasse wird wie folgt geholt:<br/>
87 * ~~~~~~~~~~~~~{.py}
88 * OKW_Ini myOKW_Ini = OKW_Ini.Instance;
89 * ~~~~~~~~~~~~~
90 *
91 * ### Wert einer Eigenschaft referenzieren ###
92 * ~~~~~~~~~~~~~{.py}
93 * String MeinWert myOKW_Ini.CustomSettings.TimeOutExists;
94 * ~~~~~~~~~~~~~
95 *
96 * ## Hinweis für OKW Entwickler ##
97 * ### Erweiterung der Propertys ###
98 * Im folgenden soll anhand eines Beispiels gezeigt werden, wie eine neue Eigenschaft
99 * _NewProperty_ der OKW_Ini hinzugefügt werden kann.
100 *
101 * Die neue Eigenschaft _NewProperty_ wird mit _"Default Value"_ initialisiert.
102 * Für _NewProperty_ wird wie folgt definiert:
103 * ~~~~~~~~~~~~~{.py}
104 * private String __NewProperty = "Default Value";
105 *
106 * [XmlElement("NewProperty")]
107 * public String NewProperty {
108 * get{ return __NewProperty; }
109 * set{ __NewProperty = value; }
110 * }
111 * ~~~~~~~~~~~~~
112 *
113 * __Anmerkung:__ Die _private_ Variable <code>__NewProperty</code> ist notwendig,
114 * weil die Eigenschaft <code>NewProperty</code>
115 * zunächst auf einen Default-Wert initialisiert wird. Da OKW_Ini automatisch eine
116 * vollständige OKW_Ini.xml-Datei erstellen soll, ist es nicht möglich via Attributdefinition
117 * die Eigenschaft auf einen default Wert zu setzen,
118 * da in <code>System.Xml.Serialization</code> nur Eigenschaften serialisert werden, die sich
119 * vom Default-Wert unterscheiden.
120 *
121 * ### Automatische Serialisierung ###
122 * Die so eingefügte neue Eigenschaft _NewProperty_ wird automatisch mit den anderen Eigenschaften
123 * in die _OKW_Ini.xml_ serialisiert/deserialisiert.
124 *
125 * ### Quellen:
126 * http://www.mkyong.com/java/jaxb-hello-world-example/
127 * \~english
128 * \brief
129 * OKW.OKW_Ini is the related class to the configuration file OKW_Ini.xml.<br/>
130 *
131 * The class OKW_Ini is holding in store all configuration parameters and is providing
132 * this properties.
133 *
134 * The properties are divided in two sections:
135 *
136 * Name | Description
137 * ------------------------------ | -------------
138 * OKW.OKW_Ini.OKW_Enviroment | Environmental characteristics, such as paths.<br/> Detailed description in the referenced class.
139 * OKW.OKW_Ini.OKW_CustomSettings | General settings such as time-outs <br/>Detailed description in the referenced class.
140 *
141 * The class is created as singleton.<br/>
142 * __The use of this class is__ _not_ done with the constructor, but __exclusively
143 * with the property OKW.OKW_Ini.Instance.__<br/>
144 *
145 * ## Usage of the class OKW.OKW_Ini ##
146 * ### Integration of package ###
147 * The package OKW contains the class OKW_Ini. The class can be affected with
148 * ~~~~~~~~~~~~~{.py}
149 * use OKW;
150 * ~~~~~~~~~~~~~
151 *
152 * ### Getting the instance of the singleton ###
153 * An instance of the class is taken as follows:<br/>
154 * ~~~~~~~~~~~~~{.py}
155 * OKW_Ini myOKW_Ini = OKW_Ini.Instance;
156 * ~~~~~~~~~~~~~
157 *
158 * ### Referencing the value of a property ###
159 * ~~~~~~~~~~~~~{.py}
160 * String MeinWert myOKW_Ini.CustomSettings.TimeOutExists;
161 * ~~~~~~~~~~~~~
162 *
163 * ## Hint for OKW Developers ##
164 * ### Extension of Properties ###
165 * The following should be shown by way of example, as a new property
166 * _NewProperty_ of OKW_Ini can be added.
167 *
168 * The new property _NewProperty_ is initialized with _"Default Value"_ .
169 * For _NewProperty_ will be defined as follows:
170 * ~~~~~~~~~~~~~{.py}
171 * private String __NewProperty = "Default Value";
172 *
173 * [XmlElement("NewProperty")]
174 * public String NewProperty {
175 * get{ return __NewProperty; }
176 * set{ __NewProperty = value; }
177 * }
178 * ~~~~~~~~~~~~~
179 *
180 * __Note:__ The _private_ variable <code>__NewProperty</code> is necessary,
181 * because the property <code>NewProperty</code>
182 * is initialized first with a Default-Value.
183 * Since OKW_Ini will automatically create a complete OKW_Ini.xml file,
184 * it is not possible to set the property via attribute definition to a default value,
185 * since <code>System.Xml.Serialization</code>, only properties serializing, which
186 * differ from the default value.
187 *
188 * ### Automatical Serializing ###
189 * The new property _NewProperty_ inserted this wax is automatically serialized/ deserialized
190 * with the other properties in the _OKW_Ini.xml_ .
191 *
192 *
193 * \~
194 * \author Zoltán Hrabovszki
195 * \date 2014-10-25/jn
196  */
197 
198 @XmlRootElement
199 public class OKW_Ini_Sngltn
200 {
201 
206 
207  /*
208  * \brief Dieses Feld hält den Abschnitt OKW_CustomSettings der OKW_Ini.xml
209  * vor.
210  *
211  * \~english \brief This field has in store the section OKW_CustomSettings
212  * of OKW_Ini.xml.
213  *
214  *
215  * \~ \author Zoltán Hrabovszki \date 2014-10-25/jn
216  */
217  @XmlElement
219 
220  /*
221  * \brief Dieses Feld hält den Abschnitt OKW_Enviroment der OKW_Ini.xml vor.
222  *
223  *
224  * \~english \brief This field has in store the section OKW_Enviroment of
225  * OKW_Ini.xml.
226  *
227  *
228  * \~ \author Zoltán Hrabovszki \date 2014-10-25/jnic
229  */
230  @XmlElement
232 
233  /*
234  * \brief Singelton-Pattern: Feld enthält die einzige gültige Instanz dieser
235  * Klasse.
236  *
237  *
238  * \~english* \brief Singelton-Pattern: Field contains the only valid
239  * instance of this class.
240  *
241  *
242  * \~ \author Zoltán Hrabovszki \date 2014-10-25/jnic
243  */
244  private static OKW_Ini_Sngltn Instance;
245 
246 
247  /*
248  * \brief Diese Klasse ist ein Singelton.
249  *
250  * Wie für ein Singelton-Pattern typisch, wird eine Instanz nicht mit dem
251  * Konstruktor erzeugt, sondern über das Property OKW_Ini.Instance
252  * aufgerufen.
253  *
254  * __Wichtig:__ Verwende nicht diesen Konstuktor, um eine Instanz der Klasse
255  * zu erstellen.
256  *
257  * __Anmerkung:__ Der Konstruktor sollte bei einem Singelton 'private' sein.
258  * Dieser Konstuktor muss wegen der Serialisierung 'public' sein!
259  *
260  * \note Näheres zum Thema Singeleton unter
261  * http://csharpindepth.com/Articles/General/Singleton.aspx (nur in
262  * englischer Sprache verfügbar)
263  *
264  *
265  * \~english \brief This class is a Singelton.
266  *
267  * As typical for a Singelton-Pattern an instance is not created with the
268  * constructor, but called with the property OKW_Ini.Instance.
269  *
270  * __Important:__ Do not use this constructor to create an instance of the
271  * class.
272  *
273  * __Note:__ The constructor should be 'private' with a singleton. This
274  * constructor must be 'public' because of the serializing!
275  *
276  * \note Further Information to the topic Singeleton at
277  * http://csharpindepth.com/Articles/General/Singleton.aspx
278  *
279  *
280  * \~ \author Zoltán Hrabovszki \date 2014-10-25/jnic
281  */
282  public OKW_Ini_Sngltn()
283  {
284  try
285  {
286  Init();
287  }
288  catch (Exception e)
289  {
290 
291  System.out.println(e.getMessage());
292  OKW_HandleException.StopRunning(e, Instance.getClass());
293  }
294  }
295 
296  /*
297  * \brief Singelton-Pattern: Instanz gibt die aktuelle, gültige und einzige
298  * Innstanz der Klasse zurück.
299  *
300  * Beim der ersten Verwendung dieser Klasse wird automatisch eine Instanz
301  * dieser Klasse erzeugt.
302  *
303  * __Wichtig:__ Um eine Instanz der OKW.OKW_Ini zu erhalten ausschliesslich
304  * nur diese Eigenschaft verwenden!
305  *
306  *
307  * \~english \brief Singelton-Pattern: instance returns the actual valid and
308  * only instance of the class.
309  *
310  * At the first use of this class an instance of this class is automatically
311  * created.
312  *
313  * __Important:__ To receive an instance of OKW.OKW_Ini use exclusively this
314  * property only!
315  *
316  *
317  * \~
318  * \author Zoltán Hrabovszki
319  * \date 2014.10.25
320  */
321  public static OKW_Ini_Sngltn getInstance()
322  {
323  // Lazy Initialization (If required then only)
324  if (Instance == null)
325  {
326  // Thread Safe. Might be costly operation in some case
327  synchronized (OKW_Ini_Sngltn.class)
328  {
329  if (Instance == null)
330  {
331  Instance = new OKW_Ini_Sngltn();
332  }
333  }
334  }
335  return Instance;
336  }
337 
338  /*
339  * \brief Löschen und zurücksetzten der Klasse.
340  *
341  * Wird in erster Linie für die Unittests benötigt.
342  *
343  * \~english \brief Deleting and resetting of the class.
344  *
345  * Is needed primarily for the unittests.
346  *
347  * \~ \author Zoltan Hrabovszki \date 2014-10-25/jnic
348  */
349  public static void Reset()
350  {
351  Instance = null;
352  }
353 
354  /*
355  * \brief Initialsiert die Klasse OKW.OKW_Ini
356  *
357  * Die Initialisierung der Klasse OKW.OKW_Ini läuft wie folgt ab:
358  *
359  *
360  * - Löschen aller Klassen-Variablen der OKW_Ini. - Lesen der
361  * Umgebungsvariable OKW_Xml + wenn die Umgebunsvariable vorhanden ist... *
362  * und die Datei existiert, dann lesen der Datei. * und mit diesen Werten
363  * eine Datei an der gegebene Stelle erstellen. + wenn die Umgebungsvariable
364  * fehlt oder nicht gesetzt ist, * dann werden alle werden alle
365  * Eigenschaften auf "Default-Wert" gesetzt. * Es wird jedoch keine Datei
366  * geschrieben.(Weil die Zieldatei Fehlt!) * Warnung wird ausgegeben, dass
367  * die Umgebungsvariable fehlt.
368  *
369  * \exception OKWEnviromentVarNotSetException Wenn die Umgebungsvariable
370  * OKW_Xml nicht gesetzt ist. \exception OKWFileDoesNotExistsException wird
371  * ausgelöst, wenn die Datei, gegeben als OKW_Ini.Xml_Ini_xml, nicht
372  * existiert. Vorher wurde eine Vorlagedatei angelegt.
373  *
374  *
375  * \~english \brief Initializes the class OKW.OKW_Ini
376  *
377  * The initialization of the class OKW.OKW_Ini is scheduled as follows:
378  *
379  * @startuml{OKW_Ini_en.png} start :Clear class variables; :read environment
380  * variable **OKW_Xml**; if (is **OKW_Xml** defined?) then (yes)
381  *
382  * if (**OKW_Xml** exists as file?) then (yes) :read data\naus **OKW_Xml**;
383  * else (no) :**OKW_xml** create\ntemplatefile; :Trigger Exception:\n
384  * ""OKWFileDoesNotExistsException""; endif
385  *
386  * else (nein) :give out message:\n"//OKW_Xml is not set//" ; :Trigger
387  * Exception:\n ""OKWEnviromentVarNotSetException"";
388  *
389  * endif
390  *
391  * stop
392  *
393  * @enduml
394  *
395  * - clear all class variables of OKW_Ini. - read environment variable
396  * OKW_Xml + if the environment variable is existing... * and file exists,
397  * then read the file. * and with this values create a file at the given
398  * place. + if the environment variable is missing or not set, * then all
399  * properties are set on "Default-Value". * No file will be written, because
400  * the target file is missing! * Warning is given that the environment
401  * variable is missing.
402  *
403  * \exception OKWEnviromentVarNotSetException If the environment variable
404  * OKW_Xml is not set. \exception OKWFileDoesNotExistsException is
405  * triggered, if the file, given as OKW_Ini.Xml_Ini_xml, is not existing.
406  * Before a template file was created.
407  *
408  *
409  * \~ \author Zoltán Hrabovszki \date 2014-10-25/jnic
410  */
411  public void Init()
412  {
413 
414  String myPath = "";
415 
416  // Get file from resources folder
417  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
418 
419  // ... und dann alles Initialisieren!
420  // 1. Ermittle xml-Verzeichniss in der Resource
421 
422  URL xml_resource_path = classLoader.getResource( "xml/logmessages" );
423 
424  if(xml_resource_path != null)
425  {
426  try
427  {
428  myPath = URLDecoder.decode( xml_resource_path.getPath(), Charset.defaultCharset().name() );
429  }
430  catch (UnsupportedEncodingException e)
431  {
432  // TODO Auto-generated catch block
433  e.printStackTrace();
434  }
435 
436  OKW_Enviroment.setFolder_XML( myPath );
437  Log.LogPrint( "Path to resource/xml: '" + myPath + "'");
438 
439  this.OKW_Enviroment.setFile_OKW_Ini_xml( xml_resource_path.getPath() );
440 
441  this.OKW_Enviroment.setFolder_LogMessages( this.OKW_Enviroment.getFolder_XML() + "/logmessages" );
442 
443  this.OKW_Enviroment.setFile_OKW_Ini_xml(OKW_Enviroment.getFolder_XML() + "/OKW_Ini.xml");
444  }
445  else
446  {
447  // Verzeichniss fehlt: Abbruch!
448  throw new OKWFileDoesNotExistsException( "Resource not found: >>" +"xml/logmessages" + "<<" );
449  }
450  }
451 
452  /*
453  * \brief Liest die Eigenschaften der Klasse OKW_Ini aus einer Datei,
454  * gegeben in OKW.OKW_Ini.Xml_Ini_xml, ein. Es wird eine XML Datei
455  * geschrieben. Hierzu wird die Klasse OKW_Ini mit System.Xml.XmlSerializer
456  * serialisiert.
457  *
458  *
459  * \~english \brief Reads the properties of the class OKW_Ini from a file,
460  * given in OKW.OKW_Ini.Xml_Ini_xml. An XML file is written. For this
461  * purpose the class OKW_Ini is serialized with
462  *
463  * \~ \author Zoltán Hrabovszki \date 2014-10-25
464  */
465  public void Read() throws JAXBException
466  {
467  File file = new File(OKW_Enviroment.getFile_OKW_Ini_xml());
468  JAXBContext jaxbContext = JAXBContext.newInstance(OKW_Ini_Sngltn.class);
469 
470  Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
471  OKW_Ini_Sngltn customer = (OKW_Ini_Sngltn) jaxbUnmarshaller.unmarshal(file);
472 
473  System.out.println(customer);
474  }
475 
476  public void LogAll()
477  {
478  System.out.println("Enviroment:");
479 
480  System.out.println("----------------------------------------------------------------");
481  System.out.println(" Assambly Path: " + this.MyDirectory());
482  System.out.println("----------------------------------------------------------------");
483  System.out.println(" OKW_Ini.xml Path: " + this.OKW_Enviroment.getFile_OKW_Ini_xml());
484  System.out.println(" OKW_Const.xml Path: " + this.OKW_Enviroment.getFile_OKW_Const_xml());
485  System.out.println(" OKW_Docu.xml Path: " + this.OKW_Enviroment.getFile_OKW_Docu_xml());
486  System.out.println(" OKW_Keymap.xml Path: " + this.OKW_Enviroment.getFile_OKW_Keymaps_xml());
487  System.out.println("OKW_Memorize.xml Path: " + this.OKW_Enviroment.getFile_OKW_Memorize_xml());
488  System.out.println("----------------------------------------------------------------");
489  System.out.println(
490  "OKW_ImplementationMatrix.xml Path: " + this.OKW_Enviroment.getFile_OKW_ImplementationMatrix_xml());
491  System.out.println("----------------------------------------------------------------");
492  System.out.println(" XML Verzechnis: " + this.OKW_Enviroment.getFolder_XML());
493  System.out.println(" LogMessanges: " + this.OKW_Enviroment.getFolder_LogMessages());
494  System.out.println("----------------------------------------------------------------");
495  System.out.println(" Language: " + this.OKW_CustomSettings.getLanguage());
496  System.out.println(" PathSep: " + this.OKW_CustomSettings.getPathSep());
497  System.out.println(" TimeOutExists: " + this.OKW_CustomSettings.getTimeOutExists());
498  System.out.println("TimeOutNotExists: " + this.OKW_CustomSettings.getTimeOutNotExists());
499  System.out.println("----------------------------------------------------------------");
500  }
501 
502 
503  /*
504  * \brief Schreibt die Eigenschaften der Klasse OKW_Ini in eine Datei,
505  * gegeben in OKW.OKW_Ini.Xml_Ini_xml. Es wird eine XML Datei geschrieben.
506  * Hierzu wird die Klasse OKW_Ini mit der Klasse System.Xml.XmlSerializer
507  * serialisiert.
508  *
509  *
510  * \~english \brief Writes the property of the class OKW_Ini in a file,
511  * given in OKW.OKW_Ini.Xml_Ini_xml. An XML file is written. For this
512  * purpose the class OKW_Ini with the class System.Xml.XmlSerializer is
513  * serialized.
514  *
515  *
516  * \~ \author Zoltán Hrabovszki \date 2014-10-25/ rev.
517  */
518  public void Save() throws JAXBException
519  {
520  File file = new File(OKW_Enviroment.getFile_OKW_Ini_xml());
521  JAXBContext jaxbContext = JAXBContext.newInstance(OKW_Ini_Sngltn.class);
522  Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
523 
524  // output pretty printed
525  jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
526 
527  jaxbMarshaller.marshal(this, file);
528  jaxbMarshaller.marshal(this, System.out);
529  }
530 
531 
532  /*
533  * \brief Ermittelt den Pfad zu assambly _OKW.dll_.
534  *
535  *
536  * \~english \brief Gets the path to the assembly _OKW.dll_.
537  *
538  * \~ \author Zoltán Hrabovszki \date 2014-10-25/ rev.
539  */
540  public String MyDirectory()
541  {
542  String lvsReturn = "";
543 
544  final CodeSource source = this.getClass().getProtectionDomain().getCodeSource();
545 
546  if (source != null)
547  {
548  lvsReturn = source.getLocation().getPath();
549  }
550  else
551  {
552  // \todo TODO: Hier Ausnahme auslösen Pfad nicht ermittelt...
553  lvsReturn = "";
554  }
555 
556  return lvsReturn;
557  }
558 
559 
560  public static Boolean StringIsNullOrEmpty( String fpsString)
561  {
562 
563  Boolean lvbReturn = true;
564 
565  if(fpsString != null && !fpsString.isEmpty())
566  {
567  lvbReturn = false;
568  }
569 
570  return lvbReturn;
571  }
572 }
okw.OKW_Ini_Sngltn.Log
static Logger_Sngltn Log
Zentrale Logger-Klasse stellt Logger-Methoden innerhalb von OKW zur Verfügung.
Definition: OKW_Ini_Sngltn.java:205
okw.log.Logger_Sngltn.getInstance
static Logger_Sngltn getInstance()
Zentrale Logger-Klasse stellt Logger-Methoden innerhalb von OKW zur Verfügung.
Definition: Logger_Sngltn.java:88
okw.OKW_CustomSettings
Definition: OKW_CustomSettings.java:67
okw.OKW_Ini_Sngltn
Definition: OKW_Ini_Sngltn.java:199
okw.OKW_HandleException
Definition: OKW_HandleException.java:6
okw.log.Logger_Sngltn.LogPrint
void LogPrint(String fps_Message)
LogPrint Function: Prints the values of expressions to the results file.
Definition: Logger_Sngltn.java:487
okw.OKW_Enviroment
Definition: OKW_Enviroment.java:69
okw.log.Logger_Sngltn
Definition: Logger_Sngltn.java:54