OpenKeyWord  Build_ID: 457, Datum: 01.02.2020 07:45:48
Dont repeat yourself. - Do it once and only once!
OKW_GetJavaClass.java
1 package okw;
2 
3 import java.io.File;
4 import java.io.IOException;
5 import java.lang.reflect.Constructor;
6 import java.net.URL;
7 import java.net.URLDecoder;
8 import java.nio.charset.Charset;
9 import java.nio.file.*;
10 import java.util.ArrayList;
11 import java.util.Enumeration;
12 import java.util.jar.JarEntry;
13 import java.util.jar.JarFile;
14 
15 import javax.xml.xpath.XPathExpressionException;
16 
17 import okw.exceptions.OKWFrameObjectParentNotFoundException;
18 import okw.gui.AnyChildwindow;
19 import okw.gui.OKWLocator;
20 import okw.log.Logger_Sngltn;
21 
22 public class OKW_GetJavaClass
23 {
28 
32  private static LogMessenger LM = new LogMessenger( "FrameObjectDictionary" );
33 
61  public static String findClassGuiAdapter( String fpsClassName )
62  {
63  String OKW_GuiAdapteNameSpace = OKW_Properties.getInstance().getProperty( "okw.gui.adapter", "okw.gui.adapter" );
64  return findClass( fpsClassName, OKW_GuiAdapteNameSpace );
65  }
66 
67 
93  public static String findClass( String fpsClassName, String fpsNameSpace )
94  {
95  String returnGUIAdapter = "";
96 
97  try
98  {
99  ArrayList<String> allAdapter = getClasses( fpsNameSpace );
100 
101  for ( String Adapter : allAdapter )
102  {
103  if ( Adapter.matches( ".*" + fpsClassName ) )
104  {
105  returnGUIAdapter = Adapter;
106  break;
107  }
108  }
109  }
110  catch (XPathExpressionException | IOException e)
111  {
112  // TODO Auto-generated catch block
113  e.printStackTrace();
114  }
115  finally
116  {
117 
118  }
119 
120  return returnGUIAdapter;
121  }
122 
123 
124  public static ArrayList<String> getClasses( String fpsPackage ) throws IOException, XPathExpressionException
125  {
126  ArrayList<String> lvAsReturn = new ArrayList<String>();
127 
128  Log.ResOpenList( "ClassPathes..." );
129  // 1. Hole alle Klassen die das Packet fpsPackeg enthalten...
130  ArrayList<String> lvClassPathes = getClassPaths( fpsPackage );
131  Log.ResCloseList( );
132 
133  // Durchsuchen wir alle Pfade...
134  for ( String lvClassPath : lvClassPathes )
135  {
136  // Decode URI (e.g. spaces and international characters in file names)
137  lvClassPath = URLDecoder.decode( lvClassPath, Charset.defaultCharset().name());
138 
139  if ( lvClassPath.startsWith( "file:" ) )
140  {
141  // Hier handelt es sch um eine *.jar Datei
142  // "file:/some/path/myfile.jar!/okw/gui/frames"
143 
144  lvClassPath = okw.OKW_Helper.getRightFromDelimiterNumber( lvClassPath, "file:", 1 );
145 
146  // nun rechts von "!" abschneiden incl. "!" weg!
147  // Ergebniss: "/some/path/myfile.jar"
148  lvClassPath = okw.OKW_Helper.getLeftFromDelimiterNumber( lvClassPath, "!", 1 );
149 
150  }
151 
152  File file = new File( lvClassPath );
153 
154  if ( file.exists() )
155  {
156  // 2. Ist ein die URL eine *.jar Datei?
157  if ( lvClassPath.endsWith( "jar" ) )
158  {
159  // Dann "okw.gui.frames.*" Klassen des Paketes ermitteln...
160  lvAsReturn.addAll( getClassesFromJar( lvClassPath, fpsPackage ) );
161  }
162  else if ( Files.isDirectory( Paths.get( file.toURI() ), LinkOption.NOFOLLOW_LINKS ) )
163  {
164  // Dann "okw.gui.frames.*" Klassen des gegebenen Pfades ermitteln...
165  lvAsReturn.addAll( getClassesFromDirectory( file.getAbsolutePath(), fpsPackage ) );
166  }
167  }
168  }
169 
170  return lvAsReturn;
171  }
172 
183  static public ArrayList<String> getClassPaths( String packageName ) throws IOException
184  {
185  ArrayList<String> ReturnList = new ArrayList<String>();
186 
187  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
188 
189  String path = packageName.replace( '.', '/' );
190 
191  Enumeration<URL> resources = classLoader.getResources( path );
192 
193  while ( resources.hasMoreElements() )
194  {
195  URL resource = resources.nextElement();
196 
197  String replacedURL = resource.getPath();
198 
199  /* replacedURL = replacedURL.replaceFirst( "/", "" ); */
200 
201  Log.LogPrint( "'" + replacedURL + "'" );
202  ReturnList.add( replacedURL );
203  }
204 
205  return ReturnList;
206  }
207 
219  private static ArrayList<String> getClassesFromDirectory( String fpsdirectory, String packageName )
220  {
221  ArrayList<String> classes = new ArrayList<String>();
222 
223  File directory = new File( fpsdirectory );
224 
225  if ( directory.exists() )
226  {
227 
228  File[] files = directory.listFiles();
229 
230  for ( File file : files )
231  {
232  if ( file.isDirectory() )
233  {
234  // assert !file.getName().contains( "." );
235  classes.addAll( getClassesFromDirectory( file.getPath(), packageName + "." + file.getName() ) );
236  }
237  else if ( file.getName().endsWith( ".class" ) )
238  {
239  // System.out.println( ">>Class: " + file.getName() );
240  classes.add( packageName + '.' + file.getName().substring( 0, file.getName().length() - 6 ) );
241  }
242  }
243  }
244  return classes;
245  }
246 
258  private static ArrayList<String> getClassesFromJar( String jarPath, String packageName ) throws IOException
259  {
260  JarFile jarFile = null;
261  ArrayList<String> lvAL_Return = new ArrayList<String>();
262 
263  try
264  {
265  jarFile = new JarFile( jarPath );
266  Enumeration<JarEntry> en = jarFile.entries();
267  while ( en.hasMoreElements() )
268  {
269  JarEntry entry = en.nextElement();
270  String entryName = entry.getName();
271  packageName = packageName.replace( ".", "/" );
272 
273  if ( entryName != null && entryName.endsWith( ".class" ) && entryName.startsWith( packageName ) )
274  {
275  try
276  {
277  Class<?> entryClass = Class.forName( entryName.substring( 0, entryName.length() - 6 ).replace( "/", "." ) );
278 
279  if ( entryClass != null )
280  {
281  lvAL_Return.add( entryClass.getName() );
282  }
283  }
284  catch (Throwable e)
285  {
286  // do nothing, just continue processing classes
287  }
288  }
289  }
290  }
291  finally
292  {
293  if ( jarFile != null )
294  {
295  jarFile.close();
296  }
297  }
298 
299  return lvAL_Return;
300  }
301 
302  public static Class<?> loadClass( String fpsClass )
303  {
304  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
305  Class<?> aClass = null;
306 
307  try
308  {
309  aClass = classLoader.loadClass( fpsClass );
310  }
311  catch (ClassNotFoundException e)
312  {
313  // TODO Auto-generated catch block
314  e.printStackTrace();
315  }
316 
317  return aClass;
318  }
319 
346  public static Object createInstanceByType( Class<?> fpParentType ) throws InstantiationException, XPathExpressionException
347  {
348  Object lvo_Obj = null;
349  Boolean bOK = false;
350 
351  Log.LogFunctionStartDebug( "FrameObjectDictionary.CreateInstanceByObjectName", "fpParentClass", fpParentType.getName() );
352 
353  try
354  {
355  // lvo_Obj = Activator.CreateInstance(fpParentType, null);
356 
357  lvo_Obj = fpParentType.newInstance();
358 
359  Log.LogPrintDebug( LM.GetMessage( "CreateInstanceByObjectName", "InstanceWasCreated", lvo_Obj.getClass().getName() ) );
360  bOK = true;
361  }
362  catch (IllegalAccessException e)
363  {
364  // EXCEPTION: Pürfen was hier genau passiert. Exception weitergeben
365  throw new OKWFrameObjectParentNotFoundException( LM.GetMessage( "CreateInstanceByObjectName", "InstanceWasCreated", fpParentType.getName() ) );
366  }
367  finally
368  {
369  if ( bOK )
370  {
371  // Wir sind ohne Exception durchgekommen und wir nehmen an,
372  // dass lvo_Obj != null
373  // -> wir geben den Namen des Objektes zurück...
374  Log.LogFunctionEndDebug( lvo_Obj.getClass().getName() );
375  }
376  else
377  {
378  // Irgend etwas ist faul wir rufen nur LogFunctionEndDebug
379  // auf...
381  }
382  }
383  return lvo_Obj;
384  }
385 
386 
411  public static ArrayList<Class<?>> getListOfClasses( String fpsNamespace ) throws ClassNotFoundException, IOException, XPathExpressionException
412  {
413  // String lvsNamespace = "okw.gui.frames";
414  ArrayList<Class<?>> lvALReturn = new ArrayList<Class<?>>();
415 
416  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
417 
418  // 1. Hole alle Klassen, die sich im Package "okw.gui.frames" befinden
419  ArrayList<String> lvALClassNames = OKW_GetJavaClass.getClasses( fpsNamespace );
420 
421  try
422  {
423  for ( String lvsClass : lvALClassNames )
424  {
425  Class<?> aClass = classLoader.loadClass( lvsClass );
426  lvALReturn.add( aClass );
427  }
428  }
429  catch (ClassNotFoundException e)
430  {
431  e.printStackTrace();
432  }
433 
434  return lvALReturn;
435  }
436 }
okw.log.Logger_Sngltn.ResOpenList
void ResOpenList(String fps_Name)
Creates a new hierarchical level in the results file.
Definition: Logger_Sngltn.java:614
okw.LogMessenger
LogMessenger liest Log-Meldungen sprachspezifisch für die im Konstruktor gegeben Klasse aus der Zugeh...
Definition: LogMessenger.java:84
okw.OKW_GetJavaClass.Log
static Logger_Sngltn Log
Zentrale Logger-Klasse stellt Logger-Methoden innerhalb von OKW zur Verfügung.
Definition: OKW_GetJavaClass.java:27
okw.OKW_Properties
Reihenfolge der Resourcen-"Beladung".
Definition: OKW_Properties.java:46
okw.log.Logger_Sngltn.LogFunctionEndDebug
void LogFunctionEndDebug()
LogFunctionEndDebug:
Definition: Logger_Sngltn.java:249
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_GetJavaClass.LM
static LogMessenger LM
LogMessenger liest Log-Meldungen sprachspezifisch für die im Konstruktor gegeben Klasse aus der Zugeh...
Definition: OKW_GetJavaClass.java:32
okw.OKW_GetJavaClass.findClassGuiAdapter
static String findClassGuiAdapter(String fpsClassName)
Methode sucht die Klasse fpsClassName im Namensraum "okw.gui.adapter".
Definition: OKW_GetJavaClass.java:61
okw.OKW_GetJavaClass.findClass
static String findClass(String fpsClassName, String fpsNameSpace)
Methode sucht die Klasse fpsClassName im Namensraum fpsNameSpace.
Definition: OKW_GetJavaClass.java:93
okw.OKW_Properties.getInstance
static OKW_Properties getInstance()
Holt die einzige Instanz dieser Klasse.
Definition: OKW_Properties.java:116
okw.log.Logger_Sngltn.LogFunctionStartDebug
void LogFunctionStartDebug(String fps_FunctionName, String... fpsParameter)
LogFunctionStartDebug:
Definition: Logger_Sngltn.java:311
okw.OKW_GetJavaClass.getClassesFromDirectory
static ArrayList< String > getClassesFromDirectory(String fpsdirectory, String packageName)
Recursive method used to find all classes in a given directory and subdirs.
Definition: OKW_GetJavaClass.java:219
okw.OKW_GetJavaClass
Definition: OKW_GetJavaClass.java:22
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_Properties.getProperty
String getProperty(String fpsKey)
Ermittelt den aktuellen Wert des Propertys gegeben mit dem Schlüssel fpsKey.
Definition: OKW_Properties.java:804
okw.log.Logger_Sngltn.ResCloseList
void ResCloseList()
Closes a hierarchical level in the results file that was opened with ResOpenList.
Definition: Logger_Sngltn.java:574
okw.exceptions.OKWFrameObjectParentNotFoundException
Die Ausnahme OKWFrameObjectWindowNotFoundException wird ausgelöst, wenn ein Fenster-Frame-Objekt mit ...
Definition: OKWFrameObjectParentNotFoundException.java:62
okw.log.Logger_Sngltn.LogPrintDebug
void LogPrintDebug(String fpsMessage)
Loggt eine Nachricht.
Definition: Logger_Sngltn.java:520
okw.OKW_GetJavaClass.createInstanceByType
static Object createInstanceByType(Class<?> fpParentType)
Die Methode erzeugt eine Instanz der Rahmenklasse (frame class) mit dem in 'fps_ParentClassName' gege...
Definition: OKW_GetJavaClass.java:346
okw.LogMessenger.GetMessage
String GetMessage(String MethodName, String TextKey)
Holt die Log-Meldung für MethodeNmae/Textkey ohne weitere Parameter.
Definition: LogMessenger.java:137
okw.OKW_GetJavaClass.getClassesFromJar
static ArrayList< String > getClassesFromJar(String jarPath, String packageName)
Returns the list of classes in the same directories as Classes in classes.
Definition: OKW_GetJavaClass.java:258
okw.OKW_GetJavaClass.getClassPaths
static ArrayList< String > getClassPaths(String packageName)
Ermittel alle Pfade aus classpath, die das Paket packegeName im aktuellen threads enthalten.
Definition: OKW_GetJavaClass.java:183
okw.OKW_GetJavaClass.getListOfClasses
static ArrayList< Class<?> > getListOfClasses(String fpsNamespace)
Methode erstellt eine Liste aller Klassen eines Namesraumes, die in der aktuell ausgeführten Assambly...
Definition: OKW_GetJavaClass.java:411
okw.log.Logger_Sngltn
Definition: Logger_Sngltn.java:54