Java saat di install akan secara default di install di C:\Program Files\Java, kalo dilihat pada instalasi path terdapat character newline (spasi) pada program file. hal ini dapat menyebabkan berbagai error yang muncul. salah satu yang saya temui adalah plugin maven pada eclipse yang tidak berjalan lancar.
Oleh karena itu Java sebaiknya diinstall pada path tanpa character newline seperti program (spasi) tersebut. Sayang nya installer java skrng langsung menginstall java pada path tersebut. untuk menghindari dari error2 yang terjadi dikemudian hari, maka sebaik nya pindahkan saja instalasi JDK / JRE ke folder tanpa spasi
Berikut cara untuk memindahkan Instalasi java ke path yang baru :
1. Pindahkan JDK & JRE pada C:\Program Files\Java, ke C:\Java
2. Ketikkan Regedit pada windows run
3. Kemudian cari registry dengan path : HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft
4. Kemudian rubah setiap nilai pada registry yang berawalan C:\Program Files\Java menjadi C:\Java
5. Pada C:\WINDOWS\system32 hapus setiap file java.exe, javaw.exe, dan javaws.exe
6. Kemudian tambahkan JAVA_HOME & path pada windows global path merujuk ke instalasi java baru
7. Check java dari command prompt
Dan selamat anda telah terhindar dari berbagai jenis error yang mungkin terjadi yang dikarenakan oleh path java dikemudian hari.
Monday, February 28, 2011
JAXP - SAX Parser & Validasi XML
JAXP (Java API for XML) merupakan API dari Java untuk pemprosessan XML. API ini memiliki fungsi untuk parsing, validasi xml dengan menggunakan DTD atau XSD.
JAXP sendiri dibagi menjadi 3 basic methode parsing, yaitu :
SAX parser merupakan parser yang paling ringan dari pada semua yang saya sebutkan diatas.SAX menggunakan urutan event untuk melakukan parsing.Tidak seperti DOM yang akan otomatis melakukan parsing pada XML dokument, SAX memberikan kebebasan kepada programmer untuk menentukan setiap element / attribute yang perlu untuk di proses untuk dimasukkan kedalam model object custom sesuai dengan isi dari XML tersebut.
Kapan menggunakan SAX atau DOM ?
XML file berbentuk seperti ini :
XML tersebut akan di validasi dengan DTD berikut :
XML dan DTD tersebut akan divalidasi dan di parsing melalui SAX implementasi. Berikut Class dari sax parser :
Mari kita breakdown code tersebut :
Parser
Dari hasil parsing yang disimpan pada object model, akan di proses sebagai sumber data untuk melakukan scheduler pada aplikasi.
Untuk lebih lengkap download source codenya pada : http://sax-dtd-example.googlecode.com/files/scheduler01.zip
aplikasi tersebut menggunakan maven untuk script build nya. Eksekusi mvn tomcat:run pada command prompt untuk menjalankan aplikasi ini.
JAXP sendiri dibagi menjadi 3 basic methode parsing, yaitu :
- SAX parser interface : Simple API for XML
- DOM interface : Document Object Model
- StAX : Streaming API for XML
SAX parser merupakan parser yang paling ringan dari pada semua yang saya sebutkan diatas.SAX menggunakan urutan event untuk melakukan parsing.Tidak seperti DOM yang akan otomatis melakukan parsing pada XML dokument, SAX memberikan kebebasan kepada programmer untuk menentukan setiap element / attribute yang perlu untuk di proses untuk dimasukkan kedalam model object custom sesuai dengan isi dari XML tersebut.
Kapan menggunakan SAX atau DOM ?
Saya pribadi akan lebih condong menggunakan SAX parser apabila tag dari document XML tersebut sudah dapat diterka. Dan tag dari xml tersebut tidak terlalu berubah banyak. Sedangkan DOM untuk memparsing XML document yang lebih complex contoh nya HTML file atau XML file yang susah untuk diparsing oleh SAX parser.Kali ini saya akan membahas tentang SAX parser baik method parsing maupun validasi xml dengan menggunakan DTD.XML yang saya buat berfungsi untuk memberikan kemudahan untuk mengconfigurasi scheduling task di java yang akan banyak menggunakan API dari Quartz untuk scheduler.
XML file berbentuk seperti ini :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scheduleList PUBLIC "http://agungbayuiswara.blogspot.com//DTD Scheduler Module 1.0" "scheduler.dtd">
<schedulelist>
<scheduler concurrent="false" id="scheduler01">
<handler>com.jegbagus.util.scheduler.ExampleJob</handler>
<cron>*/5 * * * * ?</cron>
<group>Group01</group>
</scheduler>
</schedulelist>
Schedule list merupakan parent tag yang akan memuat list dari schedule - schedule yang akan dieksekusi. Attribute concurrent untuk menandakan scheduler dapat berjalan beriringan jika scheduler sebelum nya selesai. Name merupakan nama dari scheduler. Kemudian element handler menandakan class handler dari scheduler tersebut. Cron adalah aturan dari eksekusi scheduler. Group adalah group dari eksekusi scheduler.XML tersebut akan di validasi dengan DTD berikut :
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT scheduleList (scheduler*)> <!ATTLIST ScheduleList name CDATA #IMPLIED > <!ELEMENT scheduler (handler,cron,group)> <!ATTLIST scheduler id CDATA #REQUIRED concurrent (true|false) "false" > <!ELEMENT handler (#PCDATA)> <!ELEMENT cron (#PCDATA)> <!ELEMENT group (#PCDATA)>untuk informasi lebih tentang DTD silahkan refer ke website seperti http://www.w3schools.com/DTD/default.asp
XML dan DTD tersebut akan divalidasi dan di parsing melalui SAX implementasi. Berikut Class dari sax parser :
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.jegbagus.util.scheduler.parser;
/**
*
* @author agung.iswara
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.jegbagus.util.scheduler.domain.ScheduleConf;
public class SaxScheduleParser extends DefaultHandler implements SchedulerParserInterface, EntityResolver {
@SuppressWarnings("unused")
private static final Logger logger = LoggerFactory.getLogger(SaxScheduleParser.class);
private static final Map doctypeMap = new HashMap();
private HashMap hashConf;
private ScheduleConf tempConf;
private String tempVal;
private InputStream is;
static {
doctypeMap.put( "http://agungbayuiswara.blogspot.com//DTD Scheduler Module 1.0".toUpperCase(), "config/scheduler.dtd");
}
public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
if (publicId != null)
publicId = publicId.toUpperCase();
InputSource source = null;
try {
String path = (String) doctypeMap.get(publicId);
source = getInputSource(path, source);
} catch (Exception e) {
throw new SAXException(e.toString());
}
return source;
}
private InputSource getInputSource(String path, InputSource source) {
if (path != null) {
InputStream in = null;
try {
in = SaxScheduleParser.class.getClassLoader().getResourceAsStream(path);
source = new InputSource(in);
} catch (Exception e) {
e.printStackTrace();
}
}
return source;
}
public void initParser(String confLoc) {
hashConf = new HashMap();
is = SaxScheduleParser.class.getClassLoader().getResourceAsStream(confLoc);
}
public SaxScheduleParser(String confLoc) {
initParser(confLoc);
}
public HashMap startParse() {
return parseDocument();
}
private HashMap parseDocument() {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = parserFactory.newSAXParser();
saxParser.parse(is, this);
} catch (SAXException se) {
se.printStackTrace();
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
return hashConf;
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tempVal = "";
if (qName.equalsIgnoreCase("scheduler")) {
tempConf = new ScheduleConf();
tempConf.setSchedulerId(attributes.getValue("id"));
tempConf.setConcurent(new Boolean(attributes.getValue("concurrent")));
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
tempVal = new String(ch, start, length);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("scheduler")) {
hashConf.put(tempConf.getSchedulerId(), tempConf);
} else if (qName.equalsIgnoreCase("handler")) {
tempConf.setHandlerName(tempVal);
} else if (qName.equalsIgnoreCase("cron")) {
tempConf.setCron(tempVal);
} else if (qName.equalsIgnoreCase("group")) {
tempConf.setGroup(tempVal);
}
}
}
Mari kita breakdown code tersebut :
Parser
- Sax Parser dapat merupakan turunan dari DefaultHandler, HandlerBase (deprecated pada java 1.6) atau handler lainnya yang terdapat pada package org.sax .kali ini saya akan menggunkan DefaultHandler sebagai base class.
- Method yang harus kita override dari DefaultHandler tersebut untuk mendapatkan Element & attribute adalah startElement & endElement
- startElement akan dieksekusi setiap menemui awal element seperti
, dan dari awal element tersebut akan didapat attribute - attribute dari element tersebut id & concurrent dari element scheduler. method startElement biasa digunakan jika menemui element yang memiliki attribute & memiliki child element. - endElement akan dieksekusi setiap parser menemu akhir element seperti . dari end element kita bisa mendapatkan isi dari element tersebut yang sebelum nya didapat dari method characters
- Untuk mem-validasi xml file perlu menambahkan doctype dan file yang berkesesuaian untuk memvalidasi file XML. Apabila anda menggunakan eclipse dengan DTD ini kita bisa memanfaatkan fasilitas autocomplete pada xml file yang kita buat jika XML file tersebut merujuk ke DTD file.
- Pada java class harus mengimplementasikan EntityResolver yang merujuk file dimana DTD itu tersimpan, dan XML file akan di validasi dari oleh DTD tersebut. Implementasi validasi dari DTD dapat dilihat pada method resolveEntity yang mengembalikan Object dari InputSource DTD tersebut.
Dari hasil parsing yang disimpan pada object model, akan di proses sebagai sumber data untuk melakukan scheduler pada aplikasi.
Untuk lebih lengkap download source codenya pada : http://sax-dtd-example.googlecode.com/files/scheduler01.zip
aplikasi tersebut menggunakan maven untuk script build nya. Eksekusi mvn tomcat:run pada command prompt untuk menjalankan aplikasi ini.
Sunday, February 27, 2011
Method Override <> Polymorphism
Beberapa hari yang lalu saya berbincang - bincang dengan seorang teman. Entah mengapa, perbincangan malah menjurus kearah basic programing.
Kemudian akhir nya kami pun berdebat tentang polymorphism dan method override. Dia memiliki pandangan berbeda terhadap kedua jargon programing ini. Dia menyebutkan bahwa contoh dari polymorphism adalah method override. Tapi bagi saya polymorphism bukan lah seperti itu.
Perbedaan mencolok dari polymorphism dan method override adalah dari konsep pengimplementasian method nya.
Dalam polymorphism suatu class diharuskan untuk mengimplementasikan beberapa method yang didefinisikan sebelum nya oleh parent class berupa abstract class ataupun interface. Sedangkan untuk method override, child class tidak diharuskan untuk mengimplementasikan method yang sudah di implementasi oleh parent class.
Implementasi polymorphism pada java yang sangat sering digunakan salah satu nya interface Map dan berbagai jenis class yang mengimplementasikan nya. Seperti Hashmap, Hashtable, ConcurrentHashMap. Spring framework juga sangat banyak megimplementasikan polymorphism pada module - module nya seperti database connection, security, view, dll.
Dengan itu menurut saya Polymorphism adalah sebuah methode programming yang memberikan kemudahan untuk menerapkan sebuah kasus dengan implementasi yang bebeda - beda, dan interface merupakan sebuah class yang akan diterapkan oleh child class sebagai patokan untuk menyelesaikan kasus tersebut.
Jadi kalau ada kebetulan nanti interview, dan ditanya tau polymorphism? dengan tegas jawab saja Iya! Implementasi real di java adalah interface, contoh nya Map dan berbagai subclass nya.
Setelah bercerita panjang lebar, ternyata dia tidak mengerti, karena contoh yang saya beri hanya ada pada java. Sedangkan pengetahuan nya lebih condong ke arah product microsoft. Cape deh...
Kemudian akhir nya kami pun berdebat tentang polymorphism dan method override. Dia memiliki pandangan berbeda terhadap kedua jargon programing ini. Dia menyebutkan bahwa contoh dari polymorphism adalah method override. Tapi bagi saya polymorphism bukan lah seperti itu.
Perbedaan mencolok dari polymorphism dan method override adalah dari konsep pengimplementasian method nya.
Dalam polymorphism suatu class diharuskan untuk mengimplementasikan beberapa method yang didefinisikan sebelum nya oleh parent class berupa abstract class ataupun interface. Sedangkan untuk method override, child class tidak diharuskan untuk mengimplementasikan method yang sudah di implementasi oleh parent class.
Implementasi polymorphism pada java yang sangat sering digunakan salah satu nya interface Map dan berbagai jenis class yang mengimplementasikan nya. Seperti Hashmap, Hashtable, ConcurrentHashMap. Spring framework juga sangat banyak megimplementasikan polymorphism pada module - module nya seperti database connection, security, view, dll.
Dengan itu menurut saya Polymorphism adalah sebuah methode programming yang memberikan kemudahan untuk menerapkan sebuah kasus dengan implementasi yang bebeda - beda, dan interface merupakan sebuah class yang akan diterapkan oleh child class sebagai patokan untuk menyelesaikan kasus tersebut.
Jadi kalau ada kebetulan nanti interview, dan ditanya tau polymorphism? dengan tegas jawab saja Iya! Implementasi real di java adalah interface, contoh nya Map dan berbagai subclass nya.
Setelah bercerita panjang lebar, ternyata dia tidak mengerti, karena contoh yang saya beri hanya ada pada java. Sedangkan pengetahuan nya lebih condong ke arah product microsoft. Cape deh...
File path dari servlet context & classpath
Untuk mendapatkan file path dari sebuah class ataupun servlet dapat menggunakan snippet code berikut :
Code dibawah akan memberikan absolute path dimana root sebuah web aplikasi terinstall.
Sedangkan untuk mendapatkan path yang berada dari classpath terdapat beberapa cara, yaitu :
Code dibawah akan memberikan absolute path dimana root sebuah web aplikasi terinstall.
String path = getServletContext().getRealPath("/WEB-INF/file.xml");
Sedangkan untuk mendapatkan path yang berada dari classpath terdapat beberapa cara, yaitu :
- class loader dari thread yang sedang berjalan
String path = Thread.currentThread().getContextClassLoader().getResource("file.xml").getFile().toString();
- class loader dari thread yang sedang berjalan
String path = ThisIsClassName.class.getClassLoader().getResourceAsStream("file.xml");
Labels:
classpath,
java,
servlet-context,
snippet-code
SuppressWarning list pada Eclipse
Java memberikan pilihan untuk menonaktifkan warning yang dihasilkan oleh compiler. yaitu dengan menggunakan SuppressWarning.
SuppressWarning merupakan annotation, oleh karena annotation baru diperkenalkan pada java 5, jadi untuk menggunakan SuppressWarning source code perlu dicompile dengan minimal menggunakan java 5.
Suppress warning di support oleh berbagai IDE, salah satu nya adalah Eclipse. Berikut list SuppressWarning yang digunakan pada eclipse :
SuppressWarning merupakan annotation, oleh karena annotation baru diperkenalkan pada java 5, jadi untuk menggunakan SuppressWarning source code perlu dicompile dengan minimal menggunakan java 5.
Suppress warning di support oleh berbagai IDE, salah satu nya adalah Eclipse. Berikut list SuppressWarning yang digunakan pada eclipse :
- all : to suppress all warnings
- boxing : to suppress warnings relative to boxing/unboxing operations
- cast to suppress warnings relative to cast operations
- dep-ann to suppress warnings relative to deprecated annotation
- deprecation to suppress warnings relative to deprecation
- fallthrough to suppress warnings relative to missing breaks in switch statements
- finally to suppress warnings relative to finally block that don’t return
- hiding to suppress warnings relative to locals that hide variable
- incomplete-switch to suppress warnings relativrawtypes – to suppress warnings relative to un-specific types when using generics on class parameterse to missing entries in a switch statement (enum case)
- nls to suppress warnings relative to non-nls string literals
- null to suppress warnings relative to null analysis
- restriction to suppress warnings relative to usage of discouraged or forbidden references
- serial to suppress warnings relative to missing serialVersionUID field for a serializable class
- static-access to suppress warnings relative to incorrect static access
- synthetic-access to suppress warnings relative to unoptimized access from inner classes
- unchecked to suppress warnings relative to unchecked operations
- unqualified-field-access to suppress warnings relative to field access unqualified
- unused to suppress warnings relative to unused code
- rawtype- to suppress warnings relative to un-specific types when using generics on class parameters
@SuppressWarnings("rawtypes")
public static boolean isDirectImplement(Class[] impl, String string) {
for(Class i:impl){
if(string.equalsIgnoreCase(i.getName()))
return true;
}
return false;
}
Sumber : http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm
Labels:
annotation,
eclipse,
java,
suppress-warning
VMWare block USB Modem
VMware merupakan tools yang nyaman untuk digunakan untuk
mensimulasikan Operation System lain (disebut guest OS) didalam Host OS.
Tapi terkala setelah menginstall VMware beberapa kejadian tidak terduga pun terjadi, salah satu satu nya adalah VMware memblock usb modem untuk terkoneksi dengan komputer.
Cara agar usb modem dapat kembali beroperasi dengan baik pada host OS salah satu nya adalah dengan mematikan service USB dari vmware. Hal ini akan mengembalikan kemampuan Host OS untuk kembali mengenali USB Modem tetapi disisi lain segala jenis USB yang terkoneksi pada komputer tidak akan dikenali oleh Guest OS.
Jika memiliki keperluan koneksi internet khususnya dengan menggunakan Modem, saat menggnakan VMware, dapat dengan merubah koneksi Guest OS menjadi NAT.
2. Kemudian cari service dengan nama VMWare USB Arbitration Service
3. Disable service dari VMware tersebut.
Restart komputer, dan kemudian modem akan terkoneksi seperti sebelum menginstall VMWare.
Tapi terkala setelah menginstall VMware beberapa kejadian tidak terduga pun terjadi, salah satu satu nya adalah VMware memblock usb modem untuk terkoneksi dengan komputer.
Cara agar usb modem dapat kembali beroperasi dengan baik pada host OS salah satu nya adalah dengan mematikan service USB dari vmware. Hal ini akan mengembalikan kemampuan Host OS untuk kembali mengenali USB Modem tetapi disisi lain segala jenis USB yang terkoneksi pada komputer tidak akan dikenali oleh Guest OS.
Jika memiliki keperluan koneksi internet khususnya dengan menggunakan Modem, saat menggnakan VMware, dapat dengan merubah koneksi Guest OS menjadi NAT.
Berikut langkah langkah untuk mematikan service vmware :
1. Run : Windows + R , kemudian ketikkan services.msc
2. Kemudian cari service dengan nama VMWare USB Arbitration Service
3. Disable service dari VMware tersebut.
Restart komputer, dan kemudian modem akan terkoneksi seperti sebelum menginstall VMWare.
Subscribe to:
Comments (Atom)



