Tomcat: Packete dynamisch auslesen und Klassen erzeugen

ThLu

Mitglied
Hallo liebes Java-Forum,

ich habe einen Tomcat 7 als Applikationsserver laufen auf dem ich mein .war-Verzeichnis deployed habe. Mein Programm hat fünf Schichten:
1. Schicht und 2. Schicht sind nur Datenbank + Zugriff, deswegen habe ich die hier weggelassen.
3. Schicht: Logik
4. Schicht: Logikzugriffsschicht für die Servlets
5. Schicht: Servlets

Ich biete verschiedene Services an, die alle XML oder KML Daten zurückliefern. Die Architektur ist so gedacht auch jeder anders später neue Services implementieren kann, dazu muss er einfach ein eigenes Servlet schreiben, das von meinem TestServlet erbt. Die Klasse TestServlet ergänzt eigentlich die Basis-Servlet Klasse nur um eine Funktion
Java:
public void getCapability()
, die von allen Servlets implementiert sein muss, da ich hierüber Informationen über den Service sammele.
Ich habe mir das so gedacht, dass wenn der Service AllCapabilititiesGetServlet aufgerufen wird, alle Pakete der 5. Schicht durchlaufen werden und für jedes Servlet die Funktion getCapability() aufgerufen wird. Die Funktion schreibt nämlich jedes mal einen Eintrag in ein Array und dieses Arry liefert mein AllCapabilititesGetServlet als XML-File zurück.
Durch die Struktur will ich sicher stellen, dass sobald ein neues Servlet von wem auch immer geschrieben wurde und dann die Capabilitites ausgelesen werden sollen, auch die neu angelegten Servlets berücksichtigt werden und direkt in das Array geschrieben werden.

Dazu habe ich folgende relevante Klassen:

5. Schicht: AllCapabiltiitesGetServlet:
Java:
package de.test.servlets.get;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import de.test.get.AllCapabilitiesGet;
import de.test.servlets.help.TestServlet;

/**
 * Servlet implementation class AllCapabilitites
 */
public class AllCapabilititiesGetServlet extends TestServlet {
	private static final long serialVersionUID = 1L;
       
	private AllCapabilitiesGet ref;
	private String answer;
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AllCapabilititiesGetServlet() {
        super();
    }
    
    public void init() throws ServletException {
		ref = new de.test.get.AllCapabilitiesGet();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("application/xml");
		response.setHeader("Content-Disposition", "attachment; filename=AllCapabilities.xml");
		
		answer = ref.getAllCapabilities();
		PrintWriter out = response.getWriter();
		out.println(answer);	
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

	@Override
	public void getCapability() {
		//Hier steht nichts drin weil dieser Service alle Capabilities liefert
	}

}

4. Schicht: AllCapabilititesGet
Java:
package de.test.get;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import de.testrest.datalogic.Manager;

@Path("/GET/AllCapabilities")
public class AllCapabilitiesGet {

	@GET
	@Produces(MediaType.TEXT_XML)
	public String getAllCapabilities(){
		String testString = Manager.getInstance().getAllCapabilities();
		return testString;
	}
	
}


3. Schicht: Manager:
Java:
package de.testrest.datalogic;

import java.io.File;

import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.sql.*;
import java.util.ArrayList;
import java.util.Set;

import javax.servlet.ServletContext;

import org.jdom.*;
import org.jdom.output.*;

import sun.misc.Launcher;

import de.micromata.opengis.kml.v_2_2_0.*;

/**
 * Diese Klasse ist die Basislogik und stellt somit die Basisfunktionalitäten der Services zur Verfügung
 *
 */
public class Manager {

...
	
	//verwaltet alle Capabilities (Capabilitites ist eine eigene Klasse)
	ArrayList<Capability> allCapabilities = new ArrayList<Capability>();
	
	/**
	 * Liefert alle Capabilitites zurück (nutzt Java Reflection)
	 * @return String im XML-Format mit allen Capabilitites
	 */	
	public String getAllCapabilities(){
		
		//ArrayList für alle vorhandenen Klassen
		ArrayList<String> allClasses = new ArrayList<String>();
		
		//Hilfs-ArrayListen die jeweils alle Klassen der vier aufgezeigten Pakete enthalten
		ArrayList<String> getAL = findClassNames("de.test.servlets.get");
		ArrayList<String> delAL = findClassNames("de.test.servlets.delete");
		ArrayList<String> putAL = findClassNames("de.test.servlets.put");
		ArrayList<String> postAL = findClassNames("de.test.servlets.post");

		//Jede ArrayList wird mit ihrer Länge durchlaufen und allClasses hinzugefügt
		//Danach hat man nur noch die Main-ArrayList die alle vorhanden Klassennamen enthält
		//Den Umweg musste man gehen, da die Pakete unterschiedliche Länge haben können
		
		for (int i = 0; i<getAL.size();i++){
			allClasses.add("de.test.servlets.get."+getAL.get(i));
		}
		for (int i = 0; i<delAL.size();i++){
			allClasses.add("de.test.servlets.delete."+delAL.get(i));
		}
		for (int i = 0; i<putAL.size();i++){
			allClasses.add("de.test.servlets.put."+putAL.get(i));
		}
		for (int i = 0; i<postAL.size();i++){
			allClasses.add("de.test.servlets.post."+postAL.get(i));
		}
		
		//Für jeden Eintrag in allClasses...
		for(int i = 0;i<allClasses.size();i++){
			
			//...wird sich der Name geholt...
			String className = (String) allClasses.get(i);
			
			//..dann wird eine Class deklariert...
			@SuppressWarnings("rawtypes")
			Class cls;
			
			try {
				//...und diese Klasse wird initialisiert und instanziiert mit dem entsprechenden Name...
				cls = Class.forName(className);
				Object obj = cls.newInstance();
				
				//...dann werden alle Methoden dieser Klasse durchlaufen...
				for(java.lang.reflect.Method method : obj.getClass().getMethods()) {
					//...und sobald diese Methode getCapabilitiy heißt
					if(method.getName().equals("getCapability")){
						//wird diese angestoßen (jedes Servlet muss diese abstrakte Funktion getCapabilitis implementieren
						method.invoke(obj,null);
					}
				}
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}
		return generateCapabilitiesXML();
	}
	
	/**
	 * Hilfsfunktion für getAllCapabilitis
	 * Findet zu einem gegebenen Paketname die einzelnen Klassennamen
	 * @return ArrayList<String> alle Klassennamen des jeweiligen Pakets
	 */	
	 public static ArrayList<String> findClassNames(String pckgname) {
	     
		 //ArrayList für alle Klassennamen wird erzeugt
		 ArrayList<String> classnames = new ArrayList<String>();
		 
		 	//Falls der package-Name nicht mit einem "/" beginnt wird eins davor gesetzt
	        String name = new String(pckgname);
	        if (!name.startsWith("/")) {
	            name = "/" + name;
	        }        
	       
	        //danach erden alle "." durch "/" ersetzt
	        name = name.replace('.','/');
	        
	        // Es wird sich ein File-Objekt erzeugt
	       URL url = Launcher.class.getResource(name);
	        
	        //TODO: Die Ressource ist auf dem Server leer!!! lokal nicht!
	        File directory = new File(url.getFile());
	        
	        //Falls es ein directory gibt...
	        if (directory.exists()) {
	            //...hole den Inhalt...
	            String [] files = directory.list();
	            for (int i=0;i<files.length;i++) {
	                //...nimm nur die Inhalt mit .class am Ende...
	                if (files[i].endsWith(".class")) {
	                    //...und ziehe die letzten sechs Zeichen ab (wegen .class)
	                    String classname = files[i].substring(0,files[i].length()-6);
	                    //Falls der Klassenname ungleich AllCapabilititesGetServlet ist, füge den Name der ArrayList classnames hinzu
	                    if(!(classname.equals("AllCapabilititiesGetServlet")))
	                    	classnames.add(classname);
	                }
	            }
	        }
	        //gibt die ArrayList mit allen Klassennamen zurück
	        return classnames;
	    }
	
}

Das Problem ist jetzt, dass lokal alles wunderbar funktioniert und ich die Packete auslesen, die Klassen erzeugen und die Funktionen aufrufen kann. Auf dem Server allerdings die URL in meiner Manager - findClassNames immer leer ist (Zeile 126). Das liegt daran das der Pfad irgendwie nicht stimmt. Der Pfad ist WEB-INF/classes/de/test/XXX (das XXX steht für die jeweiligen Klassen). Ich habe schon versucht über ServletContext getResource und getRealPath zu arbeiten, jedoch ohne Erfolg. Ich sitze schon mehrere Tage an diesem einen Problem.

Hat von euch jemand eine Idee wie ich an den Pfad komme und die dynamisch Klassen auslesen kann?
Ich wäre über jede Art von Tipp dankbar.

Viele Grüße,
Thomas.
 

Chris_K

Neues Mitglied
Wenn ich das richtig sehe, verwendest Du Java Reflection. Das scheint auch das Problem zu sein, weil das auf dem Tomcat nicht funktioniert.
 

ThLu

Mitglied
Hey Chris K,

Danke schön für die Antwort.
Mist, dann kann ich also mein gesamtes Programm umschreiben? Ich dachte es wäre irgendwie möglich dynamisch Pakete von einem Applikationsserver auszulesen. So habe ich aber immerhin wieder was dazu gelernt.

Viele Grüße,
Thomas.
 

ThLu

Mitglied
Hallo zusammen,

es geht doch!

Habe im Internet folgendes gefunden was wunderbar funktioniert:
URL url = Thread.currentThread().getContextClassLoader().getResource(name);

Viele Grüße,
Thomas.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu Servlet Tomcat Versionsproblem? Web Tier 4
I JSF JSF, Tomcat, Server Faces und maven Web Tier 3
feinperligekohlensaeure JSF JSF + Tomcat 9 | HTTP Status 404 |(com.sun.faces.config.ConfigureListener?) Web Tier 1
R Tomcat - java.lang.OutOfMemoryError: PermGen space Web Tier 0
puba mit JDev entwickelter WS auf Tomcat deployen Web Tier 2
R JSF Tomcat 7 & JSF - UnsupportedOperationException Web Tier 1
G Probleme mit Java + Tomcat | Cannot switch on a value of type String for source level below 1.7 Web Tier 8
S Tomcat 8.0.9 logging Web Tier 0
S Servlet Tomcat 8.0.9 logging Web Tier 13
D JSP Anfängerfrage - Ändern von JSP / Tomcat Web Tier 4
R Tomcat 7 und SSL Web Tier 3
J JSP Web Applikation auf virtuellem Tomcat Server Web Tier 1
T JSF in Eclipse mit Tomcat Web Tier 0
S JSF Tomcat in Eclipse einbinden (JSF) Web Tier 0
G Magnolia CMS - jedes mal Tomcat restart Web Tier 7
A Wartezeit nach Tomcat start wegen Servlets zu hoch Web Tier 2
M tomcat anwendungsabhängige konfigdateien Web Tier 6
H JSP, Eclipse, Tomcat - Java Klasse wird nicht gefunden Web Tier 8
C Tomcat wirft keine ViewExpiredException Web Tier 8
C Tomcat + Eclipselink = NotSerializable Exception? Web Tier 2
M JSP Problem beim deployen auf Tomcat Web Tier 2
A Servlet File Upload funktioniert nur lokal auf Entwicklungsrechner, nicht in Tomcat Web Tier 5
T Tomcat mit Servlets Problem Web Tier 7
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
P JSF Umgebungsvariablen bei Tomcat-Start setzen Web Tier 4
D Tomcat/Struts2 Benutzer bestimmt Name der URL Web Tier 2
S Servlet Problem mit Tomcat Web Tier 3
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
reibi Tomcat : Änderbare Config-Files Web Tier 5
reibi Servlet Tomcat : Display name und version setzen Web Tier 3
JCODA Tomcat ohne Fenster starten Web Tier 5
P Eclipse zeigt Errors an, die auf Tomcat nicht auftreten Web Tier 2
B Tomcat 6 ergibt Fehler - java.net.SocketException Web Tier 2
L Services in Tomcat einbinden? Web Tier 2
B JSF Tomcat Windows Linux equals Problem Web Tier 3
N JSP org.apache.tomcat cannot be resolved to a type InstanceManager cannot be resolved to a type Web Tier 4
S Tomcat 7, Struts, JPA baut keine Verbindung auf Web Tier 13
M Geschwindigkeit von Tomcat / JavaWebanwendungen Web Tier 3
D Probleme mit Tomcat Web Tier 3
M Tomcat 6 Umlaut Probleme Web Tier 2
F No Factories configured for this Application - Myfaces mit Tomcat Web Tier 1
T jsf Tobago in Tomcat classpath aufnehmen Web Tier 2
A Beispiel wirft Fehler. JSF 2.0 / Tomcat / Eclipse Web Tier 2
J Tomcat-Server mit JSF auf Eclipse einrichten Web Tier 7
F umzug von tomcat 4 auf tomcat 6 Web Tier 2
J tomcat webapp restarten Web Tier 2
ruutaiokwu tomcat autodeploy Web Tier 7
I Tomcat aktualisiert CSS - Datei nur ab und zu Web Tier 4
T Tomcat-Projektverzeichnis Web Tier 13
E JSF Applikation läuft nicht über Tomcat Web Tier 3
F JApplet in Tomcat-Umgebung funktioniert mal wieder nicht ... Web Tier 8
T Tomcat, JSP, UTF-8 und URL-Codierung Web Tier 4
A Hat Tomcat einen Cache? Web Tier 5
S Tomcat Heap Memory erhoehen..? Web Tier 4
I Rich Faces nur mit JBoss oder auch Tomcat? Web Tier 7
S Tomcat / Eclipse Probleme Web Tier 2
T Tomcat Projekt ohne Eclipse starten Web Tier 11
A Tomcat - JSP läuft nicht Web Tier 2
reibi access.log in Tomcat ... ist das möglich? Web Tier 2
R Fehler 1053 beim Beenden von Tomcat Web Tier 25
A Tomcat - JSP ausführen Web Tier 8
M Tomcat - Mehrere Verzeichnisse für die jsp Web Tier 12
thE_29 Tomcat - Applications(Context) bekommen Web Tier 19
A Tomcat: beim Start des Servers einmalige Aktion aufrufen (Problem gelöst) Web Tier 2
T Hibernate, Debuggingparameter Tomcat Web Tier 3
A JDBC in Tomcat einbinden Web Tier 3
P Tomcat funktioniert nicht so wie er sollte Web Tier 11
C Tomcat total memory Web Tier 11
C Apache-Tomcat Web Tier 13
F ssl, tomcat und jsp anwendungen Web Tier 5
G Tomcat 4.1 Experimente 8) Web Tier 3
S Tomcat JSP context.xml - Standartpfad einstellen Web Tier 3
J Fehler Tomcat/JSP findet Methode nich Web Tier 3
jann Tomcat und Kompression Web Tier 9
Q tomcat konfiguration - rewrite Web Tier 3
A TomCat will nicht - Wieso? Web Tier 5
Q Auth. per Tomcat Web Tier 4
O kurze Frage zur Tomcat Installation Web Tier 2
G Probleme mit Tomcat Web Tier 14
G Tomcat findet angeblich die Datei nicht. Web Tier 8
J Tomcat - web.xml und package . Web Tier 4
L JSP Tomcat Login Web Tier 6
G SCHWERWIEGEND: NullPointerException bei Tomcat Web Tier 4
U Java Application auf Tomcat Web Tier 5
Y JSF - Exception bei Tomcat Start Web Tier 4
O Source-Code vom Tomcat kompilieren lassen Web Tier 6
S Dynamisch Drop-Down Menüs und Formular Feld Bindings Web Tier 4
F JSF - Seiteninhalt dynamisch laden Web Tier 5
J JSF statisch oder dynamisch? Web Tier 3
A JSF JSF Page dynamisch/modular aufbauen Web Tier 7
N Bilder aus Datenbank dynamisch in JSF streamen Web Tier 7
S Servlet Dynamisch Content? Web Tier 2
N Tabelle dynamisch mit Daten aus Datenbank füllen Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben