De.uka.ipd.sdq.monitoring

Aus SDQ-Wiki

Dokumentation zu de.uka.ipd.sdq.monitoring

Dieses Plugin instrumentiert Java Source Code mit Monitoring-Anweisungen für die Beobachtung des Kontroll- und Datenflusses von Komponenten. Die Spezifikation der zu instrumentierenden Stellen erfolgt auf Basis von Schnittstelleninformationen.

de.uka.ipd.sdq.monitoring.heuristics.configurator.impl.ArgumentHandlerConfigurator

Diese Klasse implementiert die provided interface: de.uka.ipd.sdq.monitoring.extensions.provider.IArgumentHandlerConfigurator. Eine ausführliche Dokumentation der Schnittstelle ist in SVN zu finden.

Hier kann der Benutzer kann sagen, welche Methoden für welchem parameter type aufgerufen werden sollen. Zum Beispiel, der Benutzer kann bestimmen daß für die Argumente vom Typ Sting, die Methoden toString() und hashCode() aufgerufen werden sollen:

clazz = Class.forName("java.lang.String");
Method meth2 = clazz1.getMethod("toString", new Class[]{});
methods.add(meth2);
Method meth = clazz1.getMethod("hashCode", new Class[]{});
methods.add(meth);
configuration.put(clazz1, methods1);

Für jede dieser Methoden, ein logger-Aufruf wird generiert.

Der Benutzer hat auch die Möglichkeit die Methoden verkettet nacheinander aufzurufen. Daffür übertragt die Verantwortung, daß die Reihenfolge sinn macht:

//Allow chaining of the calls
MonitorConfigurationController.getConfigurationController().setChainHeuristicCalls(true);

Alternative Konfiguration über /de.uka.ipd.sdq.monitoring/configuration.xml:

  • options>logger>methods>selection>modifiers>
    • private: Monitor method entrance / exit of private methods
    • public: Monitor method entrance / exit of public methods
  • options>logger>handler>heuristics>calls>
    • chained: concatenate methods defined in heuristics (form cartesian product) e.g. toString().hashCode() vs. toString, hashCode()

de.uka.ipd.sdq.monitoring.required.configurator.impl.RequiredWhiteListMethodsProvider

Diese Klasse implementiert die provided Interface: de.uka.ipd.sdq.monitoring.extensions.provider.IRequiredWhiteList. Eine ausführliche Dokumentation der Schnittstelle ist in SVN zu finden.

Hier kann der Benutzer spezifizieren welche Required Methoden instrumentiert werden soll.

Als Beispiel, wollen wir nur die folgende 4 Methoden der Klasse String instrumentieren:

Class<?> clazz = Class.forName("java.lang.String");
Method meth = clazz.getMethod("length", new Class[]{});
Method meth1 = clazz.getMethod("charAt", new Class[]{int.class});
Method meth2 = clazz.getMethod("valueOf", new Class[]{Object.class});
Method meth3 = clazz.getMethod("concat", new Class[]{String.class});

Die Schnittstelle IRequiredWhiteList deklariert auch die Methode initializeArgumentsNegativeList. Mit hilfe dieser Methode kann der Benutzer eingeben welche Argumente einer Methode sollen nicht instrumentiert werden. Es gibt Fälle wo man nur bestimmte Argumente einer Methode instrumentieren will.

Als Beipsiel, wollen wir hier daß der zweite Argument der Methode Integer.getInteger(String, Integer) nicht instrumentiert wird, d.h, unser tool wird nur der String Argument instrumentieren, der Integer aber nicht:

Method meth = clazz.getMethod("getInteger", new Class<?>[]{String.class, Integer.class});
//second arg of type Integer should not be monitored !!
IArgument arg = new Argument(meth, 2);
arguments.add(arg);


de.uka.ipd.sdq.monitoring.provided.configurator.impl.ProvidedWhiteListMethodsProvider

Das selbe wie bei de.uka.ipd.sdq.monitoring.provided.configurator.impl.ProvidedWhiteListMethodsProvider, hier aber spezifiziert der Benutzer seine Einstellungen für die angebotene Methode (die Methoden die das zu instrumentierende Programm declariert).


Java Array Instanzen erzeugen / Methodensignatur erzeugen

Class<?> clazz = ClassLoaderUtil.loadClass("org.spec.jappserver.ejb.supplier.mdb.BuyerMDB");
Class<?> arrayType = ClassLoaderUtil.loadClass("org.spec.jappserver.ejb.supplier.entity.SupplierComponent");
//create an array instance 
Object array = Array.newInstance(arrayType /*class type of the array*/, 0/*Dimension of the array*/);
//use getDeclaredMethod to get private Method
Method method = clazz.getDeclaredMethod("doIndividualPOs", new Class<?>[]{int.class, array.getClass(), List.class});

Dieses Beispiel ermöglicht den Zugriff auf die Methode:

private void doIndividualPOs(int siteID, SupplierComponent[] supplierComponents,  List<ComponentQuantities> required)

Troubleshooting

  • If only the imports are added to the instrumented class, check for if/else without "{" and "}".