0

GWT HIbernate Native Query

Dalam aku dok try GWT + RPC + Hibernate, aku try la guna JPA (Java Persistent API) untuk manage database connection. Aku pakai EntityManager dengan annotation @persistentcontext.
Yang semua ok tapi untuk nativeQuery tanpa class object diberi aku dapat output yang berbeza.

Untuk toplink/EclipseLink : aku dapat sebagai List.
Pakai print toString outputnya = [[value1,value2],[value1,value2]]

Untuk yang lain (Hibernate/OpenJPA,KODO) : Ouputnya adalah object[][]
Pakai print toString outputnya = Object[][];

Contohnya macam kat bawah ni.

public List getSQLQuery(String sql) {
   Query query = em.createNativeQuery(sql);
   return query.getResultList();
}
0

GWT Custom Seriallizable HashTable

Untuk memudahkan data exchange antara server & client serta memudahkan client mencapai data, aku create satu seriallizable class ala hashtable. Pengguna boleh panggil data guna index atau key. Senang bukan ?

Anyway seperti, code dia ada kat bawah ni.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package my.com.client;

import com.gwtext.client.data.BooleanFieldDef;
import com.gwtext.client.data.FloatFieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.StringFieldDef;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
*
* @author Peyo
*/
public class MyHashTable implements Serializable {

private ArrayList alValue = new ArrayList();
private ArrayList alKeys = new ArrayList();

public MyHashTable() {
}

public MyHashTable(List list, Object[] keys) {
for (int i = 0; i < list.size(); i++) {
for (int k = 0; k < keys.length; k++) {
add(keys[k], list.get(k));
}
}
}

public MyHashTable(Record record, RecordDef recordDef) {
alValue.clear();
alKeys.clear();
for (int i = 0; i < recordDef.getFields().length; i++) {
String fieldname = recordDef.getFields()[i].getName();
if (recordDef.getFields()[i].getClass().equals(StringFieldDef.class)) {
String value = record.getAsString(fieldname);
add(fieldname, value);
} else if (recordDef.getFields()[i].getClass().equals(IntegerFieldDef.class)) {
Integer value = record.getAsInteger(fieldname);
add(fieldname, value);
} else if (recordDef.getFields()[i].getClass().equals(FloatFieldDef.class)) {
Float value = record.getAsFloat(fieldname);
add(fieldname, value);
} else if (recordDef.getFields()[i].getClass().equals(BooleanFieldDef.class)) {
Object value = record.getAsBoolean(fieldname);
} else {
Object value = record.getAsObject(fieldname);
add(fieldname, value);
}
}
}

public final ArrayList getKeys() {
return alKeys;
}

public Object getValue(
Object key) {
Integer index = checkKeyExist(key);
if (index > -1) {
return alValue.get(index);
}

return null;
}

public Object getValue(Integer index) {
return alValue.get(index);
}

public Integer getCount() {
return Integer.valueOf(alKeys.size());
}

public void add(Object key, Object object) {
alValue.add(object);
alKeys.add(key);
}

public void updateItem(Object key, Object value) {
int index = checkKeyExist(key);
if (index > -1) {
alValue.set(index, value);
}
}

public void deleteItem(Object key) {
int index = checkKeyExist(key);
if (index > -1) {
alValue.remove(index);
alKeys.remove(index);
}
}



private Integer checkKeyExist(Object key) {
for (int i = 0; i <
alKeys.size(); i++) {
if (alKeys.get(i).equals(key)) {
return Integer.valueOf(i);
}

}
return Integer.valueOf(-1);
}

public Object[] toArray() {
return alValue.toArray();
}

public Record toRecord(
RecordDef recordDef) {
Object[] obj = new Object[recordDef.getFields().length];
for (int i = 0; i <
recordDef.getFields().length; i++) {
obj[i] = getValue(recordDef.getFields()[i].getName());
}

Record record = recordDef.createRecord(obj);
return record;
}
}
0

GWT RPC Custom Service Manager

Untuk memudahkan aku access kepada service GWT yang telah aku buat, aku create satu Service Manager class untuk manage service-service yang ada. Jadi x perlua setiap kali nak guna service tu declare satu persatu. Call aje, senang.

Actually, yang bahagian if else tu patutnya x ada, tapi sebab benda ni x stable aku terpaksa juga buat.


package my.com.client.common;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import my.com.client.GeneralSettings.GeneralSettingsService;
import my.com.client.GeneralSettings.GeneralSettingsServiceAsync;
import my.com.client.lecturer.LecturerService;
import my.com.client.lecturer.LecturerServiceAsync;
import my.com.client.login.LoginService;
import my.com.client.login.LoginServiceAsync;
import my.com.client.semester.SemesterService;
import my.com.client.semester.SemesterServiceAsync;
import my.com.client.subject.SubjectService;
import my.com.client.subject.SubjectServiceAsync;

/**
*
* @author Peyo
*/
public class ServiceManager {

public static LoginServiceAsync getLoginService() {
return (LoginServiceAsync) getService(LoginService.class,"loginservice");
}

public static SubjectServiceAsync getSubjectService() {
return (SubjectServiceAsync) getService(SubjectService.class,"subjectservice");
}

public static GeneralSettingsServiceAsync getGeneralSettingService() {
return (GeneralSettingsServiceAsync) getService(GeneralSettingsService.class,"generalsettingsservice");
}

public static SemesterServiceAsync getSemesterService(){
return (SemesterServiceAsync) getService(SemesterService.class,"semesterservice");
}

public static LecturerServiceAsync getLecturerService(){
return (LecturerServiceAsync) getService(LecturerService.class,"lecturerservice");
}

private static Object getService(Class myclass,String relativeurl) {
Object service=null;
if (relativeurl.equals("subjectservice")) {
service = GWT.create(SubjectService.class);
}else if(relativeurl.equals("loginservice")){
service = GWT.create(LoginService.class);
}else if(relativeurl.equals("generalsettingsservice")){
service = GWT.create(GeneralSettingsService.class);
}else if(relativeurl.equals("semesterservice")){
service = GWT.create(SemesterService.class);
}else if(relativeurl.equals("lecturerservice")){
service = GWT.create(LecturerService.class);
}

//service = GWT.create(myclass);
ServiceDefTarget endpoint = (ServiceDefTarget) service;
String moduleRelativeURL = GWT.getModuleBaseURL() + relativeurl;
endpoint.setServiceEntryPoint(moduleRelativeURL);
return service;
}
}
0

GWT Custom Exception

Masa guna gwt-rpc-java servlet aku kena buat server side error handling.
Untuk membolehkan exception tu boleh cross antara server side & client side aku kena buat satu exception class aku sendiri yang extend dari serializableException.
Code dia ada kat bawah tu aku pastekan.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package my.com.client.common;

import com.google.gwt.user.client.rpc.SerializationException;

/**
*
* @author Peyo
*/
public class MyException extends SerializationException {

public MyException() {
super();
}

public MyException(String string) {
super(string);
}

public MyException(Throwable cause) {
super(cause);
}

public MyException(String string,Throwable cause) {
super(string, cause);
}
}
0

QR Code Testing Updates

Aku baru je test satu lagi projek QRCode, ZXing. Actually projek ni adalah projek untuk baca semua jenis barcode. Aku dah test dengan beberapa jenis QRCode yang aku dah generate. Bagusnya dia boleh detect QRCode dalam semua arah walaupun telah dirotate.

Dalam post aku sebelum ni, projek tu x boleh recognize kalau QRcode tu dah dirotate beberapa degree.


Kalau nak try, boleh gi web ni. Ader link untuk online encode & decode.
http://code.google.com/p/zxing/
0

GWT Ext Grid Remote Paging + PHP JSON

Aku tengah belaja cara nak pakai Google Web Toolkit sendiri lepas Jimin tunjuk kat aku projek dia yang pakai GWT ni. Maklumat lanjut pasal GWT ni boleh rujuk kat sini.

http://code.google.com/webtoolkit/
http://extjs.com
http://www.gwt-ext.com
http://code.google.com/p/cypal-studio/


Masa aku try, aku berdepan dengan satu masalah. Macam mana nak buat remote paging & sort remotely pakai JSON. Dekat sehari aku try baru berjaya. Masa aku deploy error ada popup message Error:Expected";". Rupanya, GWT ni dia pakai Callback untuk JSON dia.

online demo kat sini
http://www.gwt-ext.com/demo/#remotePagingGrid

Full URL yang dipanggil oleh GWT setiap kali ke page seterusnya adalah seperti di bawah:
http://extjs.com/forum/topics-browse-remote.php?start=25&limit=25&sort=lastpost&dir=DESC&_dc=1203168761468&callback=stcCallback1002

Kalau dalam PHP kena buat macama ni.

$arr = array('totalCount'=>"4",'topics'=>$data);
$jsonstr= json_encode($arr);
print $_GET['callback']."(".$jsonstr.");";
?>





0

AES Random IV

Sebenarnya lama dah aku nak try buat random IV untuk Rjindael Encryption ni. Actually Jimin pernah tunjuk kat aku tapi tu dah setahun yang lepas rasanya. Mostly, sample kat internet dia buat ambik dari Hash (SHA atau MD5) dari salt. 32 byte pakai untuk key , 16 byte pakai untuk IV.

Semalam aku sempat try sambil2 aku tolong staf aku buat secure config.

Apa kejadahnya IV ni?

IV ni sebenarnya adalah Initiallized Vector. IV ni akan menentukan output encryption. kalau pakai statik IV, password yang sama dan data yang sama, hasil output akan konsisten je setiap kali encrypt. Kalau pakai random IV ni, password sama dan data yang sama, hasil outputnya akan berbeza setiap kali encrypt. Jadi, ini menjadikan ia lebih susah untuk dihack(aku rasala). Tambah2 lagi kalau digunakan dalam watermarking atau steganography.

Nak cerita lebih2 pun payah, takut x paham pulak. aku letak code dia kat sini. Korang try la sendiri kalau nak la. X nak sudah..... hahahhahah...


Imports System.Security.Cryptography
Imports System.IO

Public Class clsAESJCE
Public Shared Function Encrypt(ByVal data() As Byte, ByVal key As String) As Byte()
Dim ms As New MemoryStream
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA As New SHA512Managed

Dim keybyte() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(key.ToCharArray)
Dim HashByte() As Byte = SHA.ComputeHash(keybyte)

Dim keys(31) As Byte
Dim IV(15) As Byte

System.Array.Copy(HashByte, 0, keys, 0, 32)
'System.Array.Copy(HashByte, 32, IV, 0, 16)

AES.KeySize = 256
'AES.BlockSize = 256
AES.Mode = CipherMode.CBC
AES.Padding = PaddingMode.PKCS7
AES.GenerateIV()

Dim newdata() As Byte
Try
Dim objCryptoStream As CryptoStream
objCryptoStream = New CryptoStream(ms, AES.CreateEncryptor(keys, IV), CryptoStreamMode.Write)
objCryptoStream.Write(data, 0, data.Length)
objCryptoStream.FlushFinalBlock()

newdata = ms.ToArray()
objCryptoStream.Close()
ms.Close()
Catch ex As Exception

End Try

Return newdata
End Function


Public Shared Function Decrypt(ByVal data() As Byte, ByVal key As String) As Byte()

Dim ms As New MemoryStream(data)
Dim AES As New System.Security.Cryptography.RijndaelManaged
Dim SHA As New SHA512Managed

Dim keybyte() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(key.ToCharArray)
Dim HashByte() As Byte = SHA.ComputeHash(keybyte)

Dim keys(31) As Byte
Dim IV(15) As Byte

System.Array.Copy(HashByte, 0, keys, 0, 32)
'System.Array.Copy(HashByte, 32, IV, 0, 16)

AES.KeySize = 256
'AES.BlockSize = 256
AES.Mode = CipherMode.CBC
AES.Padding = PaddingMode.PKCS7
AES.GenerateIV()

Dim newdata(data.Length - 1) As Byte
Dim iRead As Integer = -1
Try
Dim objCryptoStream As CryptoStream
objCryptoStream = New CryptoStream(ms, AES.CreateDecryptor(keys, IV), CryptoStreamMode.Read)

iRead = objCryptoStream.Read(newdata, 0, newdata.Length)

objCryptoStream.FlushFinalBlock()
objCryptoStream.Close()
ms.Close()
Catch ex As Exception

End Try
ReDim data(iRead - 1)
System.Array.Copy(newdata, 0, data, 0, iRead)
Return data
End Function
End Class
 
Copyright © peyotest