<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.grejpfrut.org &#187; visualvm</title>
	<atom:link href="http://grejpfrut.org/blog/tag/visualvm/feed/" rel="self" type="application/rss+xml" />
	<link>http://grejpfrut.org/blog</link>
	<description>a DRY KISS</description>
	<lastBuildDate>Fri, 22 Jan 2010 20:58:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Własny ApplicationType w VisualVM</title>
		<link>http://grejpfrut.org/blog/2008/12/20/wlasny-applicationtype-w-visualvm/</link>
		<comments>http://grejpfrut.org/blog/2008/12/20/wlasny-applicationtype-w-visualvm/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 13:20:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[netbeans-day]]></category>
		<category><![CDATA[visualvm]]></category>

		<guid isPermaLink="false">http://grejpfrut.org/blog/2008/12/20/wlasny-applicationtype-w-visualvm/</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Tworzenia prostych rozszerzeń do VisualVM ciąg dalszy</strong>, muszę przyznać, że platforma poza  paroma dziwnymi zachowaniami jest całkiem przyjemna i klepanie takich prostych rzeczy jest niezłą rozrywką <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . 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.</p>
<p><strong>Możecie pobrać całość w <a href="http://grejpfrut.org/examples/visualvm-plugin-tutorial.zip">zipie</a> (gotowe do zaimportowania projekty NetBeansowe)</strong> lub gotowe do użycia pliki nbm (w update site wpiszcie : <a href="http://grejpfrut.org/examples/vvm-modules/updates.xml">http://grejpfrut.org/examples/vvm-modules/updates.xml</a>).</p>
<p>Tak jak poprzednio <strong>zaczniemy od implementacji fabryki</strong> tworzącej instancję naszej implementacji ApplicationType.</p>
<pre class="brush: java;">
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;
  }
}</pre>
<p>Warto pamiętać, że w zależności od dostępnych informacji <strong>zmienna mainClass nie zawsze musi zawierać nazwę głównej klasy</strong>.</p>
<p>W tym konkretnym przykładzie aplikacje grejpfrutowe to takie, które zostały uruchomione lokalnie.</p>
<p>Kolejny krok to nieco więcej pisania, ale dalej nic trudnego.</p>
<pre class="brush: java;">
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 &quot;Grejpfrut &quot;+name;
    }
    @Override
    public String getVersion() {
        return &quot;blee.bleee&quot;;
    }
    @Override
    public String getDescription() {
        return &quot;Application type for Grejpfrut&quot;;
    }
    @Override
    public Image getIcon() {
	//używamy tej saame ikonki co w poprzednim przykładzie (patrz poprzedni wpis)
        return Utilities.loadImage(FirstExamplePluginView.IMAGE_PATH, true);
    }
}</pre>
<p>Teraz jeszcze zarejestrowanie nowego ApplicationType w klasie Installer (patrz poprzedni post).</p>
<pre class="brush: java;">
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);
    }
}</pre>
<p>Wprowadźmy jeszcze jedną małą zmianę w FirstExamplePluginViewProvider, dodając jedną nową metodę.</p>
<pre class="brush: java;">
    @Override
    protected boolean supportsViewFor(Application app) {
        if (ApplicationTypeFactory.getApplicationTypeFor(app) instanceof GrejpfrutApplicationType) {
            return true;
        }
        return false;
    }</pre>
<p>Stworzona w poprzednim odcinku zakładka będzie się wyświetlała tylko w przypadku gdy zostanie jej przypisany typ GrejpfrutApplicationType.</p>
<p><strong>Czyścimy całość i odpalamy, co się teraz stanie?</strong> 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 <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Uruchom jakiegoś Eclipse’a ;P wtedy na drzewku Applications pojawi się nowy grejpfrut.</p>
<p>To by było na tyle <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  jeżeli napotkacie jakieś ładne stactrace’y bawiąc się Shootoutem i moimi źródełkami dajcie znać.</p>
<p>Jeszcze jedna finalna uwaga &#8211; testowałem na platformie w wersji 6.01 więc już dość leciwej.</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2008/12/20/wlasny-applicationtype-w-visualvm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VisualVM Java IDE wars plugin</title>
		<link>http://grejpfrut.org/blog/2008/12/03/visualvm-java-ide-wars-plugin/</link>
		<comments>http://grejpfrut.org/blog/2008/12/03/visualvm-java-ide-wars-plugin/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 16:49:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[po polsku]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[netbeans-day]]></category>
		<category><![CDATA[visualvm]]></category>

		<guid isPermaLink="false">http://grejpfrut.org/blog/2008/12/03/visualvm-java-ide-wars-plugin/</guid>
		<description><![CDATA[Pobierz :
- NetBeans IDE 6.1 ub 6.5
- Visual VM .
Potrzebny będzie również kod źródłowy gry Shootout autorstwa Dawida Weissa, orginalna wersja nie pozwalała na osadzenie gry w kontenerach Swingowych, musiałem więc wprowadzić kilka poprawek  . Kod źródłowy dostępny jest tutaj. Aby zbudować jar’a wystarczy rozpakować archiwum i w katalogu shootout wydać polecenie: ant jar-netbeans [...]]]></description>
			<content:encoded><![CDATA[<p>Pobierz :<br />
- <a href="http://www.netbeans.org/">NetBeans IDE</a> 6.1 ub 6.5<br />
- <a href="https://visualvm.dev.java.net/">Visual VM </a>.</p>
<p>Potrzebny będzie również <strong>kod źródłowy gry Shootout</strong> autorstwa <a href="http://www.cs.put.poznan.pl/dweiss">Dawida Weissa</a>, orginalna wersja nie pozwalała na osadzenie gry w kontenerach Swingowych, musiałem więc wprowadzić kilka poprawek <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Kod źródłowy dostępny jest <a href="http://grejpfrut.org/examples/shootout.zip">tutaj</a>. Aby zbudować jar’a wystarczy rozpakować archiwum i w katalogu shootout wydać polecenie: ant jar-netbeans w shootout/build znajdziecie finalnego jar’a.</p>
<p>Po zainstalowaniu Visual VM (można też użyć tego który znajduje się w Waszym JDK) i uruchomieniu NetBeans IDE możemy przystąpić do pracy. W niektórych miejscach korzystałem z wizardów NetBeansowych więc samo spojrzenie w kod tych próbek może nie dać wam pełnego obrazu jak najszybciej dojść do finalnego efektu</p>
<p><strong>Visual VM to aplikacja stworzona w oparciu o NetBeans Paltform</strong>, przeglądając zawartość folderu aplikacji możecie natknąć się na charakterystyczne dla aplikacji NBP nazwy plików i katalogów. Zanim zaczniemy właściwą pracę musimy zarejestrować instację platformy NB, która znajduje się w Visual VM. Oprócz standardowych elementów NB są tam również moduły specyficzne dla Visual VM jak np.  VisualVM-Application czy VisualVM-Core.</p>
<p>Aby zarejestrować instancje platformy należy wybrać z menu Tools&gt;NetBeans Plaform i dodać nową platformę (przycisk Add Platform) &#8211; wskazujemy na katalog w którym został zainstalowany VisualVM</p>
<p><strong>Rejestracja platformy umożliwi nam nie tylko zapewnienie pełnej zgodności</strong> z platformą na której uruchamiany będzie plugin, ale pozwoli również na debugowanie i szybkie uruchamianie tworzonego przez nas rozszerzenia w docelowym środowisku.</p>
<p>Tworzymy nowy projekt wybierając <strong>File&gt;New Project&gt;NetBeans Modules</strong> i z listy o prawej stronie wybrać <strong>Module Suite</strong> klikamy Next.</p>
<p>W następnym kroku kreatora wpisujemy nazwę projektu i wybieramy platformę w oparciu o którą będziemy rozwijali nasz zestaw modułów. W poprzednich krokach zarejestrowaliśmy instancję należącą do Visual VM i to właśnie ją wybieramy z listy rozwijanej.</p>
<p><strong>Module Suite</strong> jest kontenerem dla modułów które są z jakichś względów są ze sobą powiązane, w wyniku naszych działań powstaną dwa moduły: właściwa wtyczka do VisualVM i drugi będący owijką na shootout.jar. Dlaczego tak? Scenariusz jest bardzo prosty wyobraźcie sobie, że została wydana nowa wersja Shooout i chcielibyśmy mieć ją w naszej wtyczce. Po dokonaniu niezbędnych zmian przez nas, użytkownicy wtyczki musieliby ściągać nie tylko nową wersję gry, ale i samą wtyczkę, którą już przecież mają. Aby więc w pełni wykorzystać zalety modułowości każda biblioteka wykorzystywana przez naszą wtyczkę powinna zostać opakowana w pewne dodatkowe informacje, które pozwolą instancji NetBeans Platform na aktualizację tylko tej konkretnej biblioteki.</p>
<p>Czas więc stworzyć <strong>Library Wrapper Module</strong> dla Shootout.jar. Klikamy <strong>File&gt;New Project&gt;NetBeans Module&gt;Library Wrapper Module</strong> w pierwszym kroku kreatora trzeba podać ścieżkę do pliku jar, który opakowujemy i do pliku z licencją na której biblioteka jest/ma być udostępniania. W ostatnim kroku kreatora pojawia się pytanie o codebase, wpisujemy com.dawidweiss.shootout.</p>
<p>O czym jeszcze warto wspomnieć, pierwotnie <strong>Shootout.jar miał w manifeście ustawiony parameter Main-Class, który wskazywał na klasę posiadającą metodę main w której uruchamiana była gra.</strong> Powodowało to, że wtyczka po umieszczeniu w VisualVM nie działała. Wywalenie tego atrybutu z manifestu załatwiło sprawę. Niestety nie znam się na wnętrznościach NetBeans Platform więc nie jestem w stanie tego sobie wytłumaczyć bardziej racjonalnie.</p>
<p>Zależności w formie LWM mogą być deklarowane przez wszystkie moduły wchodzące w skład nadrzędnego Module Suite.</p>
<p>Mamy już jeden moduł, teraz czas przejść do najważniejszej części tego artykułu &#8211; tworzenia właściwej wtyczki do VisualVM.</p>
<p>Tworzymy nowy projekt <strong>File&gt;New Project&gt;NetBeans Module&gt;Module</strong>, moduł powinien zostać dodany do stworzonego wcześniej Module Suite. W kolejnym kroku wpisujemy codebase : org.grejpfrut.vvm, w NetBeans 6.5 wpisanie poprawnego codebase uzupełnia również pozostałe pola formularza.</p>
<p>Kolejny krok to dodanie zależności, w oknie Projects klikamy prawym na węzeł reprezentujący moduł i <strong>wybieramy Properties.</strong> Następnie <strong>zakładka Libraries</strong> musimy mieć zadeklarowane następujące zależności: Module System API, shootout, Utilities API, VisualVM-Application i VisualVM-Core.</p>
<p><strong>W oknie Projects</strong> klikamy prawym przyciskiem myszy na węzeł reprezentujący stworzony przed chwilą moduł i wybieramy <strong>New&gt;Module Installer</strong>. Stworzona klasa Installer i jej dwie metody restored i uninstalled umożliwiają nam wpięcie się w cykl życia tworzonej właśnie wtyczki. Kod z metody restored jest wykonywany w chwili załadowania modułu, jest to najwłaściwsze miejsce aby zarejestrować klasy implementujące rozszerzenia. Natomiast metoda uninstalled jest wywoływana w momentcie gdy moduł jest usuwany ze środowiska lub gdy jest ono wyłączane.</p>
<pre class="brush: java;">
public class Installer extends ModuleInstall {
    @Override
    public void restored() {
        FirstExamplePluginViewProvider.initialize();
    }
    @Override
    public void uninstalled() {
        FirstExamplePluginViewProvider.unregister();
    }
}</pre>
<p>W mojej prezentacji z NetBeans Day możecie znaleźć krótkie omówienie tego co można rozszerzyć w VisualVM, więcej o tym piszę Geertjan w<br />
dokumentacji VisualVM i na swoim blogu. FirstExamplePlugin będzie tworzył dodatkową zakładką, którą użytkownicy będą mogli zobaczyć po połączeniu się do jakiegoś JVMa. W zakładce tej będą się działy rzeczy różne <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Należy teraz <strong>stworzyć klasę FirstExamplePluginViewProvider</strong>, jak sugeruje nazwa, klasa ta będzie odpowiedzialna za “produkcję” instancji klasy FirstExamplePluginView.</p>
<pre class="brush: java;">
class FirstExamplePluginViewProvider extends DataSourceViewProvider {
    //prosty singleton
    private static DataSourceViewProvider instance = new FirstExamplePluginViewProvider();

    static void initialize() {
        //rejestrujemy instancję FirstExamplePluginViewProvider w zarządcy widoków
        DataSourceViewsManager.sharedInstance().addViewProvider(instance, Application.class);
    }

    static void unregister() {
        //wyrejestrowujemy instancję FirstExamplePluginViewProvider w zarządcy widoków
	//metoda jest wywoływana podczas odinstalowywania modułu i wyłączania środowiska
        DataSourceViewsManager.sharedInstance().removeViewProvider(instance);
    }

    @Override
    protected DataSourceView createView(Application app) {
        //tworzy instancję widoku
        return new FirstExamplePluginView(app);
    }
}</pre>
<p>Klasa ta to prosty singleton, który w czasie inicjalizacji modułu (initialize) dodaje do <strong>DataSourceViewManager’a</strong> swoją instancję. Najważniejszą metodą w tej klasie jest createView, która to tworzy naszą zakładkę.</p>
<p>Kopiując poniższy kod należy pamiętać <strong>o wskazaniu poprawnej ścieżki do ikonki</strong> wyświetlanej w etykiecie zakładki:<br />
org/grejpfrut/vvmnbd/example/grejpfrut.png &#8211; szczegóły będą widoczne w źródłach.</p>
<pre class="brush: java;">
public class FirstExamplePluginView extends DataSourceView {

    private DataViewComponent dvc;

    //sciezka do ikony, ktora bedzie wyswietlana w zakładce zakładki
    public final static String IMAGE_PATH = &quot;org/grejpfrut/vvmnbd/example/grejpfrut.png&quot;;

    public FirstExamplePluginView(Application app) {
        //tytuł zakładki i ikona
        super(app, &quot;Java IDE wars plugin&quot;, new ImageIcon(Utilities.loadImage(IMAGE_PATH)).getImage(), 3, true);
    }

    @Override
    protected DataViewComponent createComponent() {
    	//tworzenie elementów widoku
        JEditorPane generalDataArea = new JEditorPane();
        generalDataArea.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8));

        JPanel details1Panel = new JPanel(new BorderLayout());
        ShootoutBoard board = new ShootoutBoard(new ShootoutUtilities().getEnemyFactory(), details1Panel);
        details1Panel.add(board, BorderLayout.CENTER);
        details1Panel.setBackground(Color.GRAY);
        details1Panel.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

	//osadzanie stworzonych kontrolek w kontenerze VisualVM
        DataViewComponent.MasterView masterView = new DataViewComponent.MasterView(&quot;Java IDE wars plugin&quot;, null, generalDataArea);
	//konfiguracja widoku
        DataViewComponent.MasterViewConfiguration masterViewConfiguration = new DataViewComponent.MasterViewConfiguration(false);

	//tworzymy właściwy komponent, który bedzie wyswietlany w VVM
        dvc = new DataViewComponent(masterView, masterViewConfiguration);

	//tworzymy panel z planszą gry
        DataViewComponent.DetailsView details = new DataViewComponent.DetailsView(&quot;&quot;, &quot;Detale tego okienka&quot;, 10, details1Panel, null);
	//umieszczamy go w odpowiednim miejscu
        dvc.addDetailsView(details, DataViewComponent.TOP_LEFT);
	//gra ma być domyślnie ukryta
        dvc.hideDetailsArea(DataViewComponent.TOP_LEFT);
        return dvc;
    }
}</pre>
<p></strong>Po uzupełnieniu importów</strong>, możemy uruchomić nasz plugin aby tego dokonać należy w oknie Projects kliknąć prawym na węzeł reprezentujący nasz <strong>Module Suite</strong> i wybrać “Run” lub “Debug”. NetBeans uruchomi teraz nasz plugin w platformie która wybraliśmy dla naszych modułów. Teraz klikamy w dowolny proces JVM, który jest wyświetlany na <strong>drzewku Applications</strong> i powinna się naszym oczom ukazać zakładka z grejpfrutem, po kliknięciu “Details” powinna już rozpocząć się strzelanina <img src='http://grejpfrut.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><img class="size-full wp-image-71 alignnone" title="java-ide-warss" src="http://grejpfrut.org/test/wordpress/wp-content/uploads/2008/12/java-ide-warss.jpg" alt="java-ide-warss" width="500" height="366" /></p>
<p>Kompletne źródła już wkrótce, po tym jak skończe drugą cześć “Własny ApplicationType”.</p>
<p>Wszystko oparte na serii artykułów <a href="http://blogs.sun.com/geertjan/entry/getting_started_extending_visualvm">Getting Started Extending VisualVM</a> autorstwa <a href="http://blogs.sun.com/geertjan">Geertjana Wielengi</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://grejpfrut.org/blog/2008/12/03/visualvm-java-ide-wars-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
