Własny ApplicationType w VisualVM
Tworzenia prostych rozszerzeń do VisualVM ciąg dalszy, muszę przyznać, że platforma poza paroma dziwnymi zachowaniami jest całkiem przyjemna i klepanie takich prostych rzeczy jest niezłą rozrywką
. Dzisiaj (póki co) ostatni odcinek moich przygód związanych z przygotowywaniem prezentacji na NetBeans Day w Poznaniu. W kilku zwięzłych zdaniach opowiem Wam o dodawaniu własnego ApplicationType i łączeniu tego co stworzymy z kodem stworzonym w poprzednim wpisie.
Możecie pobrać całość w zipie (gotowe do zaimportowania projekty NetBeansowe) lub gotowe do użycia pliki nbm (w update site wpiszcie : http://grejpfrut.org/examples/vvm-modules/updates.xml).
Tak jak poprzednio zaczniemy od implementacji fabryki tworzącej instancję naszej implementacji ApplicationType.
public class GrejpfrutApplicationTypeProvider extends MainClassApplicationTypeFactory {
@Override
public ApplicationType createApplicationTypeFor(Application app, Jvm jvm, String mainClass) {
if (app.isLocalApplication()) {
return new GrejpfrutApplicationType(app.getPid(), mainClass);
}
return null;
}
}
Warto pamiętać, że w zależności od dostępnych informacji zmienna mainClass nie zawsze musi zawierać nazwę głównej klasy.
W tym konkretnym przykładzie aplikacje grejpfrutowe to takie, które zostały uruchomione lokalnie.
Kolejny krok to nieco więcej pisania, ale dalej nic trudnego.
public class GrejpfrutApplicationType extends ApplicationType {
protected final int appPID;
protected final String name;
public GrejpfrutApplicationType(int appPID, String name) {
this.appPID = appPID;
this.name = name;
}
@Override
public String getName() {
return "Grejpfrut "+name;
}
@Override
public String getVersion() {
return "blee.bleee";
}
@Override
public String getDescription() {
return "Application type for Grejpfrut";
}
@Override
public Image getIcon() {
//używamy tej saame ikonki co w poprzednim przykładzie (patrz poprzedni wpis)
return Utilities.loadImage(FirstExamplePluginView.IMAGE_PATH, true);
}
}
Teraz jeszcze zarejestrowanie nowego ApplicationType w klasie Installer (patrz poprzedni post).
public class Installer extends ModuleInstall {
private static GrejpfrutApplicationTypeProvider INSTANCE = new GrejpfrutApplicationTypeProvider();
@Override
public void restored() {
FirstExamplePluginViewProvider.initialize();
ApplicationTypeFactory.getDefault().registerProvider(INSTANCE);
}
@Override
public void uninstalled() {
FirstExamplePluginViewProvider.unregister();
ApplicationTypeFactory.getDefault().unregisterProvider(INSTANCE);
}
}
Wprowadźmy jeszcze jedną małą zmianę w FirstExamplePluginViewProvider, dodając jedną nową metodę.
@Override
protected boolean supportsViewFor(Application app) {
if (ApplicationTypeFactory.getApplicationTypeFor(app) instanceof GrejpfrutApplicationType) {
return true;
}
return false;
}
Stworzona w poprzednim odcinku zakładka będzie się wyświetlała tylko w przypadku gdy zostanie jej przypisany typ GrejpfrutApplicationType.
Czyścimy całość i odpalamy, co się teraz stanie? Jeżeli masz odpalone tylko NetBeans i VisualVM w którym została uruchomiona wtyczka to niczego nie zobaczysz. Dlaczego? Otóż na tyle na ile to rozumiem NetBeansApplicationType i VisualVMApplicationType zostały zarejestrowane przed GrejpfrutApplicationType. VVM przypisuje aplikacji pierwszy ApplicationType który uda mu się do niej dopasować więc nie dochodzi nawet do sprawdzania czy NetBeans i VVM są też grejpfrutami
. Uruchom jakiegoś Eclipse’a ;P wtedy na drzewku Applications pojawi się nowy grejpfrut.
To by było na tyle
jeżeli napotkacie jakieś ładne stactrace’y bawiąc się Shootoutem i moimi źródełkami dajcie znać.
Jeszcze jedna finalna uwaga – testowałem na platformie w wersji 6.01 więc już dość leciwej.