All Downloads are FREE. Search and download functionalities are using the official Maven repository.

okw.OKW_GetJavaClass Maven / Gradle / Ivy

Go to download

This is the core-module of OpenKeyWord. This module is automatically integrated by the adapters. In GUI automation, the core module is automatically integrated by the GUI modules (dependencies).

The newest version!
/*
	    ==============================================================================
	      Author: Zoltán Hrabovszki 

	      Copyright © 2012 - 2020, IT-Beratung Hrabovszki
	      www.OpenKeyWord.de
	    ============================================================================== 

	    This file is part of OpenKeyWord.

	    OpenKeyWord is free software: you can redistribute it and/or modify
	    it under the terms of the GNU General Public License as published by
	    the Free Software Foundation, either version 3 of the License, or
	    (at your option) any later version.

	    OpenKeyWord is distributed in the hope that it will be useful,
	    but WITHOUT ANY WARRANTY; without even the implied warranty of
	    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	    GNU General Public License for more details.

	    You should have received a copy of the GNU General Public License
	    along with OpenKeyWord.  If not, see .

	    Diese Datei ist Teil von OpenKeyWord.

	    OpenKeyWord ist Freie Software: Sie können es unter den Bedingungen
	    der GNU General Public License, wie von der Free Software Foundation,
	    Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren
	    veröffentlichten Version, weiterverbreiten und/oder modifizieren.

	    OpenKeyWord wird in der Hoffnung, dass es nützlich sein wird, aber
	    OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite
	    Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
	    Siehe die GNU General Public License für weitere Details.

	    Sie sollten eine Kopie der GNU General Public License zusammen mit 
	    OpenKeyWord erhalten haben. Wenn nicht, siehe .
 */

package okw;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import javax.xml.xpath.XPathExpressionException;

import okw.exceptions.OKWFrameObjectParentNotFoundException;
import okw.log.Logger_Sngltn;

public class OKW_GetJavaClass
{
	/**
	 *  \copydoc Logger_Sngltn::getInstance()
	 */
	private static Logger_Sngltn Log = Logger_Sngltn.getInstance();

	/**
	 *  \copybrief LogMessenger
	 */
	private static LogMessenger  LM = new LogMessenger( "FrameObjectDictionary" );

	/**
	 * \~german
	 * Methode sucht die Klasse fpsClassName im Namensraum "okw.gui.adapter".
	 * 
	 * Es wird der Vollqualifizerte Namen der Klasse zurück gegeben.
	 * Wird die gegebene Klasse nicht gefunden, dann wir "" zurückgegeben.
	 * 
	 * Der Namansraum, in dem gesucht wird, kann mit dem Property "okw.gui.adapter" geändert werden.
	 *
	 * @param fpsClassName Name der Klasse die gesucht werden soll.
	 * 
	 * @return vollqualifizierte Name der Klasse.
	 * 
	 * \~english
	 * Method searches for the class fpsClassName in the namespace fpsNameSpace.
	 * 
	 * The fully qualified name of the class is returned.
	 * If the given class is not found, "" is returned.
	 * 
	 * The namespace in which the search is executed can be changed with the property "okw.gui.adapter".
	 *
	 * @param fpsClassName Name of the class to be searched for.
	 * @return fully qualified name of the class.
	 * \~
	 * @author Zoltán Hrabovszki
	 * \date 02.11.2019
	 */
	public static String findClassGuiAdapter( String fpsClassName )
	{
		String OKW_GuiAdapteNameSpace = OKW_Properties.getInstance().getProperty( "okw.gui.adapter", "okw.gui.adapter" );
		return findClass( fpsClassName, OKW_GuiAdapteNameSpace );
	}


	/**
	 * \~german
	 * Methode sucht die Klasse fpsClassName im Namensraum fpsNameSpace.
	 * 
	 * Es wird der Vollqualifizerte Namen der Klasse zurück gegeben.
	 * Wird die gegebene Klasse nicht gefunden, dann wir "" zurückgegeben.
	 *
	 * @param fpsClassName Name der Klasse die gesucht werden soll.
	 * @param fpsNameSpace Name-Space, in dem die Klasse gesucht werden soll.
	 * 
	 * @return vollqualifizierte Name der Klasse
	 * 
	 * \~english
	 * Method searches for the class fpsClassName in the namespace fpsNameSpace.
	 * 
	 * The fully qualified name of the class is returned.
	 * If the given class is not found, "" is returned.
	 *
	 * @param fpsClassName Name of the class to be searched for.
	 * @param fpsNameSpace Name space in which the class is to be searched.
	 * @return
	 * \~
	 * @author Zoltán Hrabovszki
	 * \date 02.11.2019
	 */
	public static String findClass( String fpsClassName, String fpsNameSpace )
	{
		String returnGUIAdapter = "";

		try
		{
			ArrayList allAdapter = getClasses( fpsNameSpace );

			for ( String Adapter : allAdapter )
			{
				if ( Adapter.matches( ".*" + fpsClassName ) )
				{
					returnGUIAdapter = Adapter;
					break;
				}
			}
		}
		catch (XPathExpressionException | IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{

		}

		return returnGUIAdapter;
	}


	public static ArrayList getClasses( String fpsPackage ) throws IOException, XPathExpressionException
	{
		ArrayList lvAsReturn = new ArrayList();

		Log.ResOpenList( "ClassPathes..." );
		// 1. Hole alle Klassen die das Packet fpsPackeg enthalten...
		ArrayList lvClassPathes = getClassPaths( fpsPackage );
		Log.ResCloseList( );

		// Durchsuchen wir alle Pfade...
		for ( String lvClassPath : lvClassPathes )
		{
			// Decode URI (e.g. spaces and international characters in file names)
			lvClassPath = URLDecoder.decode( lvClassPath, Charset.defaultCharset().name());

			if ( lvClassPath.startsWith( "file:" ) )
			{
				// Hier handelt es sch um eine *.jar Datei
				// "file:/some/path/myfile.jar!/okw/gui/frames"

				lvClassPath = okw.OKW_Helper.getRightFromDelimiterNumber( lvClassPath, "file:", 1 );

				// nun rechts von "!" abschneiden incl. "!" weg!
				// Ergebniss: "/some/path/myfile.jar"
				lvClassPath = okw.OKW_Helper.getLeftFromDelimiterNumber( lvClassPath, "!", 1 );

			}

			File file = new File( lvClassPath );

			if ( file.exists() )
			{
				// 2. Ist ein die URL eine *.jar Datei?
				if ( lvClassPath.endsWith( "jar" ) )
				{
					// Dann "okw.gui.frames.*" Klassen des Paketes ermitteln...
					lvAsReturn.addAll( getClassesFromJar( lvClassPath, fpsPackage ) );
				}
				else if ( Files.isDirectory( Paths.get( file.toURI() ), LinkOption.NOFOLLOW_LINKS ) )
				{
					// Dann "okw.gui.frames.*" Klassen des gegebenen Pfades ermitteln...
					lvAsReturn.addAll( getClassesFromDirectory( file.getAbsolutePath(), fpsPackage ) );
				}
			}
		}

		return lvAsReturn;
	}

	/**
	 * \~german
	 * Ermittel alle Pfade aus classpath, die das Paket packegeName im aktuellen threads enthalten.
	 * 
	 * @param packageName Name des P
	 *                  
	 * @return
	 *       Liste der Klassen-Pfade () im gegebenem package
	 * @throws IOException
	 */
	static public ArrayList getClassPaths( String packageName ) throws IOException
	{
		ArrayList ReturnList = new ArrayList();

		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

		String path = packageName.replace( '.', '/' );

		Enumeration resources = classLoader.getResources( path );

		while ( resources.hasMoreElements() )
		{
			URL resource = resources.nextElement();

			String replacedURL = resource.getPath();

			/* replacedURL = replacedURL.replaceFirst( "/", "" ); */

			Log.LogPrint( "'" + replacedURL + "'" );
			ReturnList.add( replacedURL );
		}

		return ReturnList;
	}

	/**
	 * Recursive method used to find all classes in a given directory and
	 * subdirs.
	 *
	 * @param directory
	 *            The base directory
	 * @param packageName
	 *            The package name for classes found inside the base directory
	 * @return The classes
	 * @throws ClassNotFoundException
	 */
	private static ArrayList getClassesFromDirectory( String fpsdirectory, String packageName )
	{
		ArrayList classes = new ArrayList();

		File directory = new File( fpsdirectory );

		if ( directory.exists() )
		{

			File[] files = directory.listFiles();

			for ( File file : files )
			{
				if ( file.isDirectory() )
				{
					// assert !file.getName().contains( "." );
					classes.addAll( getClassesFromDirectory( file.getPath(), packageName + "." + file.getName() ) );
				}
				else if ( file.getName().endsWith( ".class" ) )
				{
					// System.out.println( ">>Class: " + file.getName() );
					classes.add( packageName + '.' + file.getName().substring( 0, file.getName().length() - 6 ) );
				}
			}
		}
		return classes;
	}

	/**
	 *
	 * Returns the list of classes in the same directories as Classes in
	 * classes.
	 *
	 * @param result
	 * @param classes
	 * @param jarPath
	 * @throws IOException 
	 *
	 */
	private static ArrayList getClassesFromJar( String jarPath, String packageName ) throws IOException
	{
		JarFile jarFile = null;
		ArrayList lvAL_Return = new ArrayList();

		try
		{
			jarFile = new JarFile( jarPath );
			Enumeration en = jarFile.entries();
			while ( en.hasMoreElements() )
			{
				JarEntry entry = en.nextElement();
				String entryName = entry.getName();
				packageName = packageName.replace( ".", "/" );

				if ( entryName != null && entryName.endsWith( ".class" ) && entryName.startsWith( packageName ) )
				{
					try
					{
						Class entryClass = Class.forName( entryName.substring( 0, entryName.length() - 6 ).replace( "/", "." ) );

						if ( entryClass != null )
						{
							lvAL_Return.add( entryClass.getName() );
						}
					}
					catch (Throwable e)
					{
						// do nothing, just continue processing classes
					}
				}
			}
		}
		finally
		{
			if ( jarFile != null )
			{
				jarFile.close();
			}
		}

		return lvAL_Return;
	}

	public static Class loadClass( String fpsClass )
	{
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		Class aClass = null;

		try
		{
			aClass = classLoader.loadClass( fpsClass );
		}
		catch (ClassNotFoundException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return aClass;
	}

	/**
	 * \~german
	 * Die Methode erzeugt eine Instanz der Rahmenklasse (frame class) mit dem
	 * in 'fps_ParentClassName' gegebenen Namen.
	 *
	 * \note __WICHTIG:__ Die Klasse muss zwingend so heißen, wie angegeben.
	 * Hier wird kein 'Frame Präfix' ergänzt.
	 *   
	 * \param fps_ParentClassName Name der Klasse
	 *   
	 * \return Liefert die Instanz der Klasse.
	 *   
	 * \~english
	 *    The method generates an instance of the frame class with the name given
	 *    in 'fps_ParentClassName'.
	 *    
	 *    \note __IMPORTANT:__ the class is forced to be exactly, as specified.
	 *    Here is no 'frame prefix' added.
	 *    \return
	 *    Delivers the instance of the class
	 *    \param fps_ParentClassName Name of the class
	 *   
	 *    \~
	 *    \author Zoltan Hrabovszki
	 *    \date 2014.10.10
	 */
	public static Object createInstanceByType( Class fpParentType ) throws InstantiationException, XPathExpressionException
	{
		Object lvo_Obj = null;

		try
		{
			// lvo_Obj = Activator.CreateInstance(fpParentType, null);

			lvo_Obj = fpParentType.newInstance();

			Log.LogPrintDebug( LM.GetMessage( "CreateInstanceByObjectName", "InstanceWasCreated", lvo_Obj.getClass().getName() ) );
		}
		catch (IllegalAccessException e)
		{
			// EXCEPTION: Pürfen was hier genau passiert. Exception weitergeben
			throw new OKWFrameObjectParentNotFoundException( LM.GetMessage( "CreateInstanceByObjectName", "InstanceWasCreated", fpParentType.getName() ) );
		}

		return lvo_Obj;
	}


	/** \~german
	 *  Methode erstellt eine Liste aller Klassen eines Namesraumes,
	 *  die in der aktuell ausgeführten Assambly definiert sind.
	 * 
	 *  \note __WICHTIG:__ Es werden alle Klassen in die Liste aufgenommen, die
	 *  -# dem gegebene Namepsace zugeordent sind.
	 * 
	 *  \parameter fpsNamespace Namesraum, die nach Klassen durchsucht werden soll.
	 * 
	 *  \return
	 *  Liefert die Liste der Klasse, die der Namespace OKW.Frames und mit dem
	 *  Attribute OKWGUI vershen sind.
	 * 
	 *  \~english

	 *  \note __IMPORTANT:__ the class is forced to be exactly, as specified.
	 *  Here is no 'frame prefix' added.
	 *  \return
	 * 
	 *  \~
	 *  \author Zoltan Hrabovszki
	 *  \date 2014.10.10
	 * @throws XPathExpressionException 
	 */
	public static ArrayList> getListOfClasses( String fpsNamespace ) throws ClassNotFoundException, IOException, XPathExpressionException
	{
		// String lvsNamespace = "okw.gui.frames";
		ArrayList> lvALReturn = new ArrayList>();

		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

		// 1. Hole alle Klassen, die sich im Package "okw.gui.frames" befinden
		ArrayList lvALClassNames = OKW_GetJavaClass.getClasses( fpsNamespace );

		try
		{
			for ( String lvsClass : lvALClassNames )
			{
				Class aClass = classLoader.loadClass( lvsClass );
				lvALReturn.add( aClass );
			}
		}
		catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}

		return lvALReturn;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy