Showing posts with label maven. Show all posts
Showing posts with label maven. Show all posts

Friday, March 17, 2017

Mengelola Tools Development dengan Homebrew

Pada tulisan kali ini, kita akan membahas tentang Homebrew. Buat para developer pengguna macOS, homebrew merupakan salah satu tools yang akan sangat membantu. Mari kita mulai tulisan ini dengan perkenalan sekilas terkait Homebrew. Homebrew merupakan sebuah package manager untuk iOS, yang dapat diinstall dengan mudah melalui terminal. Nah pada Homebrew, tools-tools atau package-package itu disebut sebagai formula. Apa aja sih keuntungan dari Homebrew?

Pertama, kita bisa dengan mudah melakukan proses install dan remove dari tools tersebut, cukup melalui terminal. Command untuk melakukan install dan delete melalui brew sangat sederhana, seperti yang dapat dilihat pada gambar-gambar berikut ini.



Sangat sederhana bukan? Jadi pada gambar di atas kita telah menjalankan tiga command dasar pada brew, yaitu install, list, dan remove. Command "brew install" tidak hanya melakukan instalasi tools yang kita maksud saja, tetapi juga akan melakukan instalasi seluruh dependensi yang dibutuhkan untuk dapat menjalankan tools tersebut.

Kedua, kita dapat dengan mudah melakukan instalasi versi lain dari tools tersebut. Seperti yang dapat dilihat pada gambar sebelumnya, kita telah melakukan instalasi homebrew/versions/vim74. Sebenarnya pada contoh sebelumnya, kita hanya melakukan instalasi vim tetapi dengan tambahan "homebrew/versions/<nama_tools>" kita bisa melakukan instalasi untuk versi lain dari tools tersebut. Seperti pada gambar tersebut juga, bisa dilihat bahwa saya memiliki dua versi maven, yaitu maven31 dan maven 32. Apa sih kepentingan untuk memiliki berbagai versi tersebut? Well, ketika kita menjalankan proyek milik client, belum tentu seluruh tools yang digunakan dan dikuasai mereka adalah versi terbaru sehingga kita juga harus bisa melakukan development pada versi-versi yang lain dari suatu tools. Brew memberikan kemudahan tersebut melalui embel-embel "homebrew/versions", dan untuk melakukan penggantian versi pun sangat mudah seperti pada gambar berikut.


Seperti yang terlihat pada gambar di atas, untuk mengganti versi maven yang aktif/digunakan cukup dengan command "brew unlink" dan "brew link", dimana dapat dilihat pada gambar di bawah kalau versi maven yang aktif sudah berubah.


Ketiga, here comes one of the best part. Buat para developer yang pernah mengalami masalah "proyek ini butuh java versi 7, sedangkan laptop gue adanya java versi 8", Homebrew bisa mengatasi permasalahn tersebut dengan relatif mudah. Gimana caranya? Well caranya kita cuma perlu install beberapa tools tambahan melalui brew, yaitu jEnv dan Caskroom. Setelah kedua tools tersebut ter-install, selanjutnya kita tinggal menjalankan command seperti gambar berikut.


Setelah proses download selesai, kita dapat melihat pada direktori "/Library/Java/JavaVirtualMahines/" terdapat dua versi java yang berbeda sudah ter-install, seperti gambar berikut.


Langkah selanjutnya adalah menambahakan path java tersebut ke dalam jenv dengan command "jenv add <javaVersionPath>", seperti gambar berikut ini.


Setelah berhasil, selanjutnya dengan memanfaatkan jEnv kita bisa mengatur versi java yang digunakan baik itu untuk shell, global, maupun local (direktori) seperti pada contoh berikut.



Jadi kesimpulan kali ini adalah untuk memperkenalkan Homebrew dan beberapa kasus yang dapat diselesaikan dengan bantuan Homebrew ini.

Sekian tulisan kali ini, semoga bisa membantu buat para developer ataupun tech-savvy yang ingin bereksperimen dengan terminal milik macOS, selamat mencoba!

P.S.
1. Daftar formula yang terdapat pada Homebrew dapat dilihat pada BrewFomulas
2. Jika merasa command "brew instal homebrew/versions/<nama>" ataupun "brew cask install caskroom/versions/<nama>" terlalu panjang, kita bisa melakukan command "brew tap <repository>" terlebih dahulu, sehingga selanjutnya hanya tinggal melakukan command install.




Referensi:
o http://stackoverflow.com/questions/15740480/how-to-remove-all-versions-of-a-formula-with-brew
o https://brew.sh
o http://www.jenv.be
o https://caskroom.github.io
o http://stackoverflow.com/questions/8833230/how-do-i-find-a-list-of-homebrews-installable-packages
o http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula
o http://stackoverflow.com/questions/26252591/mac-os-x-and-multiple-java-versions
o http://stackoverflow.com/questions/27440575/how-to-switch-between-maven-and-maven30
o http://stackoverflow.com/questions/34408147/what-does-brew-tap-mean
o https://github.com/caskroom/homebrew-cask/issues/9447

Thursday, June 18, 2015

Maven Jetty Run : menggunakan JNDI

Saya ingin memberikan sedikit tips tentang running webapp menggunakan jetty plugin di maven.
Berawal pada saat ingin running aplikasi web spring menggunakan mvn jetty:run.
Awalnya baik baik saja. kemudian muncul masalah ketika source code di repository jdbc connection ke MySQL diganti menggunakan JNDI yg dipasang di jetty server.

 <jee:jndi-lookup id="dataSource"  
            jndi-name="jdbc/SampleDB"  
            expected-type="javax.sql.DataSource" />  
  <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">  
     <property name="persistenceUnitName" value="testPersistenceUnit"/>  
     <property name="dataSource" ref="dataSource"/>  
 </bean>  

Ketika di run lewat mvn jetty terjadi error, karena JNDI name tidak temukan.

 2015-06-19 11:07:04.474:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.m.p.JettyWebAppContext@7270fd39{/organika,file:/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/src/main/webapp/,STARTING}{file:/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/src/main/webapp/}  
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [/Data/Data-Project/Nostra/Organika/sources/nostratech-farming-server/nostra-web/target/classes/spring/applicationContext.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException:  
 Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/SampleDB'  
 .....  
 Caused by:  
 org.springframework.beans.factory.BeanCreationException:   
 Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException; remaining name 'jdbc/SampleDB'  

Salah satu solusinya adalah saya harus menginstall standalone jetty dan menambahkan JNDI config di jetty nya. Karena hal itu cukup rumit maka saya tidak melakukannya.
Cara lain yg saya lakukan adalah memasang JNDI di maven jetty plugin.
Di folder resource kita buat file jetty-env.xml.



Di dalamnya kita definisikan JNDI yg kita pakai name nya kita samakan saja dengan yg dipakai di server.
 <?xml version="1.0" encoding="UTF-8"?>  
 <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">  
 <Configure id ="sampledb" class="org.eclipse.jetty.webapp.WebAppContext">  
   <New id="SampleDB" class="org.eclipse.jetty.plus.jndi.Resource">  
     <Arg>jdbc/sampleDB</Arg>  
         <Arg>  
     <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">  
       <Set name="Url">jdbc:mysql://localhost:3306/test_db</Set>  
       <Set name="User">root</Set>  
       <Set name="Password"></Set>  
     </New>  
     </Arg>  
   </New>  
 </Configure>  

Setelah itu kita panggil jetty-env.xml itu di config jetty plugin (pom.xml)
di configuration :
<jettyXml>src/main/resources/jetty-env.xml</jettyXml>
       <plugin>  
         <groupId>org.eclipse.jetty</groupId>  
         <artifactId>jetty-maven-plugin</artifactId>  
         <version>9.1.2.v20140210</version>  
                     <configuration>  
           <jettyXml>src/main/resources/jetty-env.xml</jettyXml>  
                          <webAppConfig>  
                               <contextPath>/${war.name}</contextPath>  
                          </webAppConfig>  
           <stopKey/>  
           <stopPort/>    
         <dependencies>  
           <dependency>  
             <groupId>mysql</groupId>  
             <artifactId>mysql-connector-java</artifactId>  
             <version>5.1.30</version>  
             <type>jar</type>  
           </dependency>  
         </dependencies>  
                </plugin>  

Kita running lagi mvn jetty:run.


Yes akhirnya bisa juga.

Referensi : https://wiki.eclipse.org/Jetty/Howto/Configure_JNDI_Datasource
                  https://wiki.eclipse.org/Jetty/Feature/JNDI

Selamat mencoba.



FullText Search Query : menggunakan Hibernate-Search


Jumpa lagi kita dengan team nostratech. Kali ini kita akan belajar tentang seraching data di database menggunakan Full Text Search. Apa itu full text search?.

Seperti saat kita search di google. Kita ketik keyword apa, maka akan muncul list data yang sesuai (match atau sama persis dengan keyword yang kita ketik) dan juga semua data ada hubungannya dengan keyword yang kita ketik. Misal kita ketik 'hibernate book', maka akan muncul semua list yang ada kata mirip denhan 'hibernate' dan 'book'.



Seperti itulah sederhananya pengertian full text search.

Kita ambil contoh yang sederhana saja.
Misalnya kita punya data list nama contact di tabel seperti ini :


Disini kita asumsikan kita menggunakan ORM hibernate.

Bagaimana caranya search data “Paolo Coelho Jr” ? Kalo menggunakan keyword 'paolo' tentunya kita memakai query :

 select a from Contact where a.name like 'paolo%'  

jika keyword dari usernya 'coelho' :

 select a from Contact where a.name like '%coelho%'  

Nah bagaimana jika keyword dari usernya seperti ini : 'coelho Jr', 'coelho jr paolo', 'famous writer paolo coelho', 'the name of Coelho NM paolo ' dan lain lain.
Tentu kita akan bingung dan akan kesulitan tentunya kita.
Search query classic : name like '%keyword%' tentu tidak bisa menghandle lagi jika sudah menggunakan query yang aneh aneh seperti diatas.
Selain tidak mendapatkan hasil yang diharapkan, tentunya query %% tentu sangat buruk untuk masalah performence kalau datanya sudah terlampau banyak (walaupun field name di tabel Contact sudah di Index).

Solusinya kita bisa menggunakan library hibernate-search untuk menangani search query untuk problem diatas.
Hibernate search didalamnya menggunakan engine apache lucene untuk indexing datanya. Jadi nantinya data Name dari tabel Contact akan disimpan di index lucene.
Hibernate tidak akan langsung mencari data di tabel contact tetapi di cari terlebih dulu di index luncene.

Proses yang terjadi kurang lebih seperti ini :

Hibernate --> search index lucene --> search index name dan get id nya --> search ke tabel contact berdasarkan id --> tampilkan data.

Tambahkan dependency maven di pom.xml

 <dependency>  
   <groupId>org.hibernate</groupId>  
   <artifactId>hibernate-core</artifactId>  
   <version>4.3.9.Final</version>  
 </dependency>  
 <dependency>  
   <groupId>org.hibernate</groupId>  
   <artifactId>hibernate-search-orm</artifactId>  
   <version>5.2.0.Final</version>  
 </dependency>  

Mari kita mulai ke contohnya.

Kita buat dulu model Contact.

Set property mana yang akan diindex menggunakan @Field

 import javax.persistence.Entity;  
 import javax.persistence.Id;  
 import javax.persistence.Table;  
 import org.apache.lucene.analysis.core.LowerCaseFilterFactory;  
 import org.apache.lucene.analysis.snowball.SnowballPorterFilterFactory;  
 import org.apache.lucene.analysis.standard.StandardTokenizerFactory;  
 import org.hibernate.search.annotations.*;  
 /**  
  * The persistent class for the contact database table.  
  */  
 @Entity  
 @Indexed  
 @AnalyzerDef(name = "customanalyzer",  
     tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),  
     filters = {  
         @TokenFilterDef(factory = LowerCaseFilterFactory.class)  
         , @TokenFilterDef(factory = SnowballPorterFilterFactory.class  
     )  
     })  
 @Table(name = "contact")  
 public class Contact {  
   @Id  
   @DocumentId  
   private Integer id;  
   @Field(index = Index.YES, store = Store.NO)  
   @Analyzer(definition = "customanalyzer")  
   private String name;  
   private String email;  
      /// setter + getter  
 }  

Hibernate config xml
 <?xml version="1.0" encoding="UTF-8"?>  
 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
 <hibernate-configuration>  
   <session-factory>  
    <property name="show_sql">false</property>  
    <property name="format_sql">true</property>  
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
    <property name="connection.username">root</property>  
    <property name="connection.password"></property>  
    <property name="hibernate.hbm2ddl.auto">update</property>  
    <property name="hibernate.show_sql">true</property>  
    <property name="hibernate.search.default.directory_provider">filesystem</property>  
    <property name="hibernate.search.default.indexBase">/tmp/lucene/indexes</property>  
    <mapping class="com.srccodes.example.hibernate.Contact"/>  
   </session-factory>  
 </hibernate-configuration>  

untuk menentukan dimana kita menyimpan file index nya.

 <property name="hibernate.search.default.directory_provider">filesystem</property>  
 <property name="hibernate.search.default.indexBase">/tmp/lucene/indexes</property>  


Hibernate session until (kalau kita mengunakan JPA diatas hibernate kita bisa menggunakan entity manager)

 public class HibernateUtil {  
   private static SessionFactory sessionFactory = null;   
   private static ServiceRegistry serviceRegistry = null;   
   private static SessionFactory configureSessionFactory() throws HibernateException {   
     Configuration configuration = new Configuration();   
     configuration.configure();   
     Properties properties = configuration.getProperties();  
    serviceRegistry = new ServiceRegistryBuilder().applySettings(properties).buildServiceRegistry();       
     sessionFactory = configuration.buildSessionFactory(serviceRegistry);   
     return sessionFactory;   
   }  
   static {  
    configureSessionFactory();  
   }  
   private HibernateUtil() {}  
   public static Session getSession() {  
    return sessionFactory.openSession();  
   }  
 }  

Create indexing pada setiap insert, update, delete data agar index di lucene terupdate mengikuti data di tabel.

 private void doIndex() throws InterruptedException {  
   Session session = HibernateUtil.getSession();  
   FullTextSession fullTextSession = Search.getFullTextSession(session);  
   fullTextSession.createIndexer().startAndWait();  
   fullTextSession.close();  
 }  

Create fulltext session dan lucene query yang nantinya akan diterjemahkan ke JPA/hibernate query. Jadi kita tidak perlu secara detail tahu tentang lucene query karen sudah dihandle oleh si hibernate.

 private List<Contact> search(String queryString) {  
   Session session = HibernateUtil.getSession();  
   FullTextSession fullTextSession = Search.getFullTextSession(session);  
   QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Contact.class).get();  
   org.apache.lucene.search.Query luceneQuery = queryBuilder  
   .keyword().onFields("name").matching(queryString).createQuery();  
   org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Contact.class);  
   List<Contact> contactList = fullTextQuery.list();  
   fullTextSession.close();  
   return contactList;  
 }  

jika dilihat di sq log maka query ditabel contact hanya mengunakan where id (yg didapat dari lucene index) tidak ada pencarian berasarkan 'name'. Karena name sudah dihandle oleh hibernate-search.

 Hibernate:   
   select  
     this_.id as id1_0_0_,  
     this_.email as email2_0_0_,  
     this_.name as name3_0_0_   
   from  
     contact this_   
   where  
     (  
       this_.id in (  
         ?  
       )  
     )  


Berikut contoh pencarian data dengan beberapa keyword :
 >>>>>>Record found for 'paolo coelho' count : 1  
 Id: 2 | Name:Paolo Coelho | Email:paolo@gmail.com  
 ===============================================  
 >>>>>>Record found for 'mr coelho paolo is his name' count : 1  
 Id: 2 | Name:Paolo Coelho | Email:paolo@gmail.com  
 ===============================================  
 >>>>>>Record found for 'who is mister coelho paolo ?' count : 1  
 Id: 2 | Name:Paolo Coelho | Email:paolo@gmail.com  
 ===============================================  
 >>>>>>Record found for 'famous writer paolo coelho' count : 1  
 Id: 2 | Name:Paolo Coelho | Email:paolo@gmail.com  
 ===============================================  

Sekedar tambahan file index lucene bisa dibuka menggunakan software Luke.


Setiap kata di property Contact -> name di index oleh lucene (dan disimpan Id nya). Dari sinilah hibernate mencari index beradasarkan keyword yang diinginkan





Happy coding & selamat menjalankan ibadah puasa ramadhan bagi yang menjalankan.




Tuesday, September 16, 2014

Spring Boot


Pada tutorial kali ini kita akan membahas tentang Spring-Boot. Spring boot digunakan untuk membuat standalone application berbasis Spring Framework.
Kelebihan spring boot antara lain :
  • Dapat membuat aplikasi spring secara cepat.
  • Tidak perlu menggunakan XML configuration.  Konfigurasi dapat langsung diinject di java class nya. Konfigurasi cukup dilakukan di pom.xml saja
  • Tidak perlu menggunakan server (seperti Tomcat atau jetty). Running menggunakan file jar hasil packing

Sekarang akan kita coba membuat contoh aplikasi Spring MVC menggunakan spring-boot.
Untuk mempermudah compiling dan packaging dapat menggunakan Maven atau Gradle.
Karena saya lebih familiar, maka digunakan maven saja.

di pom.xml tambahkan dependency spring-boot
 <parent>  
   <groupId>org.springframework.boot</groupId>  
   <artifactId>spring-boot-starter-parent</artifactId>  
   <version>1.1.6.RELEASE</version>  
 </parent>  
 <dependencies>  
   <dependency>  
     <groupId>org.springframework.boot</groupId>  
     <artifactId>spring-boot-starter-web</artifactId>  
   </dependency>  
 </dependencies>  

Kemudian tambahkan dependency actuator module. Modul ini berisi embbeded tomcat/jetty.
     <dependency>  
       <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-actuator</artifactId>  
     </dependency>  

Seperti biasa di spring mvc pattern kita buat class class berikut (model, service, controller).

Model
 package com.nostratech.app;  
 import java.io.Serializable;  
 public class Person implements Serializable {  
   private Integer id;  
   private String name;  
   private String address;  
   public Person() {}  
   public Person(Integer id, String name, String address) {  
     this.id = id;  
     this.name = name;  
     this.address = address;  
   }  
   public Integer getId() {  
     return id;  
   }  
   public void setId(Integer id) {  
     this.id = id;  
   }  
   public String getName() {  
     return name;  
   }  
   public void setName(String name) {  
     this.name = name;  
   }  
   public String getAddress() {  
     return address;  
   }  
   public void setAddress(String address) {  
     this.address = address;  
   }  
   @Override  
   public String toString() {  
     final StringBuffer sb = new StringBuffer("Person{");  
     sb.append("id=").append(id);  
     sb.append(", name='").append(name).append('\'');  
     sb.append(", address='").append(address).append('\'');  
     sb.append('}');  
     return sb.toString();  
   }  
 }  

Service
 package com.nostratech.app;  
 import org.springframework.stereotype.Service;  
 import java.util.ArrayList;  
 import java.util.List;  
 @Service  
 public class PersonService {  
   private List<Person> personList;  
   public PersonService(){  
     if(personList == null) personList = new ArrayList<Person>();  
     personList.add(new Person(1, "andri", "jakarta"));  
     personList.add(new Person(2, "budi", "bandung"));  
   }  
   public Integer getId(){  
     return 10;  
   }  
   public List<Person> findAllPerson(){  
     return personList;  
   }  
 }  

Controller
 package com.nostratech.app;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.stereotype.Controller;  
 import org.springframework.web.bind.annotation.RestController;  
 import org.springframework.web.bind.annotation.RequestMapping;  
 @RestController  
 @RequestMapping(value = "/persons")  
 public class PersonController {  
   @Autowired  
   private PersonService personService;  
   @RequestMapping("/")  
   public String index() {  
     return "hello person controlller "+personService.getId();  
   }  
   @RequestMapping("/findAll")  
   public String findAll() {  
     return "Find all person : \n"+personService.findAllPerson();  
   }  
 }  

Kemudian buat class Application.
Untuk running aplikasi spring nya class ini harus memanggil SpringApplication.run().
 package com.nostratech.app;  
 import java.util.Arrays;  
 import org.springframework.boot.SpringApplication;  
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;  
 import org.springframework.context.ApplicationContext;  
 import org.springframework.context.annotation.ComponentScan;  
 import org.springframework.context.annotation.Configuration;  
 @Configuration  
 @EnableAutoConfiguration  
 @ComponentScan  
 public class Application {  
   public static void main(String[] args) {  
     ApplicationContext ctx = SpringApplication.run(Application.class, args);  
   }  
 }  

Tambahkan tag berikut :
@Configuration : menunjukkan bahwa class tersebut didefinisikan di application context.
@EnabledAutoConfiguration : meload semua bean bean yang sudah didefinisikan
@ComponentScan : scan semua component, configuration, service yang berada dalam satu package

tambahkan definisi class tersebut di pom.xml
 <properties>  
     <start-class>com.nostratech.app.Application</start-class>  
   </properties>  
class Application ini yang akan otomatis distart ketika aplikasi spring nya sudah running.

Compile aplikasinya dengan menjalankan : mvn clean install
semua class dan library akan dipackaging dalam satu file jar.

Sekarang jalankan aplikasinya lewat command java -jar
java -jar target/sample-spring-boot-1.0.0.jar
Berikut ini tampilan di Console ketika start aplikasi

Begitu spring boot sudah distart maka embeded tomcat akan otomatis running. default port 8080
Kemudian kita coba panggil controllernya localhost:8080/persons (panggil controller person)



Sekian tutorial dari saya.

Terima kasih




JavaFX : Konsep MVC

Konsep MVC
MVC singkatan dari Model-View-Controller, konsep ini bertujuan untuk memudahkan pemrograman dengan mengelompokan source code berdasarkan fungsinya.

Model
Biasanya untuk source code yang berfungsi untuk menampung data-data saat aplikasi sedang berjalan.

View
Biasanya untuk source code yang berfungsi untuk menangani tampilan (user interface) pada aplikasi.

Controller
Biasanya untuk source code yang berfungsi untuk mengatur fungsi-fungsi yang ada pada tampilan (user interface) dengan menggunakan Model sebagai penampung datanya.

JavaFX 
Untuk tahu lebih banyak tentang JavaFX bisa melihat di http://www.oracle.com/technetwork/java/javase/overview/javafx-overview-2158620.html.

Singkat kata JavaFX merupakan pengganti Swing untuk pemrograman Java pada aplikasi desktop, yang katanya juga bisa berjalan diatas Android OS dan iOS.

Kemudian saya mencoba menerapkan konsep MVC pada pemrograman dengan JavaFX dengan bantuan Maven.

Berikut merupakan screen capture untuk mengelompokan source code sesuai dengan konsep MVC :

Mengelompokan Model pada 1 package

Mengelompokan Controller pada 1 package

Mengelompokan View (FXML) pada 1 folder
Untuk source code-nya bisa didownload di https://bitbucket.org/agus3winarno/blog.

Class Model
Model diimplementasi dengan POJO. seperti class User yang digunakan pada

public class User implements Serializable {

    private Integer id;
    private String username;
    private String password;
    private String keterangan;
    private String email;

    public User() {
    }

    //fungsi setter & getter


Desain UI pada JavaFX
Untuk mendesain UI bisa menggunakan Scene Builder dari http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-info-2157684.html. Saat ini saya masih menggunakan versi 1.1.

Scene Builder 1.1

Integrasi dengan IDE
Saat ini saya menggunakan IntelliJ IDEA, untuk mengintegrasikan dengan Scene Builder dapat mengikuti screen capture dengan membuka Preferences -> IDE Settings :
Integrasi dengan IntelliJ IDEA
Setelah terintegrasi, akan muncul menu saat klik kanan pada file UI (FXML) :
Menu klik kanan Scene Builder
Untuk menghubungkan antara UI (FXML) dengan Controller tambahkan attribute
fx:controller
pada file FXML-nya. Contohnya untuk menghubungkan UI userManagement.fxml tambahkan attribute
fx:controller="org.controller.UserManagementController"

Class Controller
Controller diimplementasikan dengan contoh sbb :
public class UserManagementController extends BaseController {

    @FXML
    private TableView<User> userTable;
    @FXML
    private TableColumn<User,String> userName;
    @FXML
    private TableColumn<User,String> email;
    @FXML
    private TableColumn<User,String> keterangan;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        super.initialize(url, rb);

        userName.setCellValueFactory(new PropertyValueFactory<User,String>("username"));
        email.setCellValueFactory(new PropertyValueFactory<User,String>("email"));
        keterangan.setCellValueFactory(new PropertyValueFactory<User,String>("keterangan"));

        // Auto resize columns
        userTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    }

    @Override
    protected void init() {
        super.init();
        userTable.setItems(UserService.getInstance().findAllEntity());
    }

    @Override
    public void setApp(Main application) {
        super.setApp(application);
    }

    public void create(ActionEvent actionEvent) {
        getApplication().addPageParameter(Constants.Parameter.ACTION, Constants.Parameter.ACTION_NEW);
        getApplication().translateToWithDefaultScreen(Layout.INPUT_PROFILE);
    }

    public void edit(ActionEvent actionEvent) {

        if(userTable.getSelectionModel().getSelectedItem() == null){
            Dialogs.showInformationDialog(getApplication().getStage(), "Belum ada data yang dipilih");
            return;
        }

        getApplication().addPageParameter(Constants.Parameter.ACTION, Constants.Parameter.ACTION_EDIT);
        getApplication().addPageParameter(Constants.Parameter.OBJECT, userTable.getSelectionModel().getSelectedItem());
        getApplication().translateToWithDefaultScreen(Layout.INPUT_PROFILE);
    }

    public void delete(ActionEvent actionEvent) {

        if(userTable.getSelectionModel().getSelectedItem() == null){
            Dialogs.showInformationDialog(getApplication().getStage(), "Belum ada data yang dipilih");
            return;
        }

        Integer id = userTable.getSelectionModel().getSelectedItem().getId();
        UserService.getInstance().remove(id);
        init();
        Dialogs.showInformationDialog(getApplication().getStage(), "Hapus data berhasil");
    }

    public void close(ActionEvent actionEvent) {
        getApplication().translateToWithDefaultScreen(Layout.MAIN);
    }

}


Untuk setiap property yang memiliki @FXML akan di-binding dengan komponen yang ada pada file FXML sesuai dengan fx:id nya.

Dan untuk setiap method action dari button yang ada pada file FXML akan di-binding menggunakan attribute onAction="#{nama_method}".

Ok. sekian dulu javafx-nya. semoga bermanfaat.

Tuesday, April 16, 2013

Integrasi Maven dengan Android menggunakan Eclipse

Banyak orang diluar sana berbicara tentang Maven. Apa sih Maven ? Maven adalah sebuah software dan tool yang komprehensif untuk project management. Untuk detailnya ada disini.

Kenapa harus dengan Maven ? Karena, e karena memudah developer dalam proses library dependency dan proses build apps.

 Hal yang perlu di persiapan adalah:
  1. Eclipse Indigo atau Juno
  2. Android Developer Tool
  3. Java SDK
Setelah persiapan selesai, jalankan Eclipse untuk instalasi Maven di Eclipse. Langkah pertama adalah :
  1. Klik menu Help
  2. Pilih Install new Software

Sekarang saatnya kita coba bikin Android Apps dengan Maven.



  • Group Id: com.yukibuwana
  • Artifact Id: tutorial
Jika ada error tambahkan folder src/test/java manually.

Tambahkan android SDK di pom.xml
  • ${android.home}
Setiap ada perubahan di pom.xml lakukan update
Untuk membuat apk file atau jar, lakukan mvn install


Kita akan membahas lebih dalam penggunaan Maven di Android pada kesempatan yang akan datang.

Friday, September 28, 2012

Plugin Maven untuk WebLogic server

Petunjuk ini didapat dari http://docs.oracle.com/cd/E21764_01/web.1111/e13702/maven_deployer.htm untuk membuat maven plugin weblogic 10.3

Langkah-langkah untuk membuat plugin maven untuk weblogic server yaitu :

Buat jar plugin menggunakan WebLogic JarBuilder Tool (wljarbuilder)
*) Pastikan WebLogic server sudah diinstall pada pc.
*) Buka console, pindah direktori ke ${MIDDLEWARE_HOME}/wlserver_10.3/server/lib/
*) Jalankan perintah
java -jar wljarbuilder.jar -profile weblogic-maven-plugin

*) Hasilnya akan terbentuk file weblogic-maven-plugin.jar, didalam file tersebut terdapat pom.xml.
*) Ekstrak file pom.xml yang ada didalam file tersebut ke direktori ${MIDDLEWARE_HOME}/wlserver_10.3/server/lib/,
dengan cara :
jar xvf ${MIDDLEWARE_HOME}/wlserver_10.3/server/lib/weblogic-maven-plugin.jar META-INF/maven/com.oracle.weblogic/weblogic-maven-plugin/pom.xml

lalu copy file tersebut dengan perintah :
cp ${MWMIDDLEWAREHOME}/wlserver_10.3/server/lib/META-INF/maven/com.oracle.weblogic/ weblogic-maven-plugin/pom.xml ${MIDDLEWARE_HOME}/wlserver_10.3/server/lib

Setting tambahan untuk menyingkat prefix pemanggilan
*) Ubah file setting.xml yang ada di local repository, secara default akan ada di $HOME/.m2 dengan code dibawah ini :
<pluginGroups>
 <pluginGroup>com.oracle.weblogic</pluginGroup>
</pluginGroups>
*) Ubah file pom.xml di ${MW_HOME}/wlserver_10.3/server/lib, sesuaikan dengan kode dibawah ini :
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
        http://maven.apache.org/maven-v4_0_0.xsd">   
 <modelVersion>4.0.0</modelVersion>   
 <groupId>com.oracle.weblogic</groupId>   
 <artifactId>weblogic-maven-plugin</artifactId>   
 <packaging>maven-plugin</packaging>   
 <version>10.3.4</version>   
 <name>Maven Mojo Archetype</name>   
 <url>http://maven.apache.org</url>   
 <dependencies>     
  <dependency>       
   <groupId>org.apache.maven</groupId>
   <artifactId>maven-plugin-api</artifactId>      
   <version>2.0</version>     
  </dependency>   
 </dependencies>    
 <build>    
 <plugins>       
  <plugin>        
   <artifactId>maven-plugin-plugin</artifactId>        
   <version>2.3</version>        
   <configuration>          
    <goalPrefix>weblogic</goalPrefix>        
   </configuration>       
  </plugin>     
 </plugins>   
 </build>   
</project>

*) Install file weblogic-maven-plugin.jar ke local repository maven, dengan perintah :
mvn install:install-file  -Dfile=${MW_HOME}/wlserver_10.3/server/lib/weblogic-maven-plugin.jar -DpomFile=pom.xml

*) Note : perintah mvn install akan mendownload library-library Maven dari repository (local/internet) yang dibutuhkan supaya proses eksekusi berhasil.

Konfigurasi di file pom.xml untuk project Maven
*) Pada file pom.xml di project Maven tambahkan kode dibawah ini :
<plugin>        
 <groupId>com.oracle.weblogic</groupId> 
 <artifactId>weblogic-maven-plugin</artifactId> 
 <version>10.3.4</version> 
 <configuration> 
  <adminurl>t3:/${ipServerWebLogic}:${portServerWebLogic}</adminurl>
  <user>${userAdminWebLogic}</user> 
  <password>${passwordAdminWebLogic}</password> 
  <upload>true</upload>
  <remote>false</remote> 
  <verbose>true</verbose> 
  <targets>{nameServerWebLogic}</targets>
  <name>${project.build.finalName}</name>
 </configuration>
</plugin>


Deploy ke weblogic server menggunakan weblogic maven plugin *) Dari path project, jalankan perintah dibawah ini :
mvn weblogic:deploy –Dadminurl=t3://{serverHost}:7001 –Duser={userWebLogic} –Dpassword={password} –Dtargets={namaInstanceServer} –Dsource={path ke jar/war/ear} –Dname={namaAplikasi}

*) Note : apabila pada pom.xml sudah diset property adminurl, user, password, targets, name maka perintah deploy menjadi :
mvn weblogic:deploy –Dsource={path ke jar/war/ear}


Undeploy dari weblogic server menggunakan weblogic maven plugin
*) Dari path project, jalankan perintah dibawah ini :
mvn weblogic:undeploy –Dadminurl=t3://{serverHost}:7001 –Duser={userWebLogic} –Dpassword={password} –Dtargets={namaInstanceServer} –Dsource={path ke jar/war/ear} –Dname={namaAplikasi}

*) Note : apabila pada pom.xml sudah diset property adminurl, user, password, targets, name maka perintah deploy menjadi :
mvn weblogic:undeploy