package org.safehaus.penrose.studio.dnd; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.DND; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.safehaus.penrose.studio.dialog.ErrorDialog; import java.io.*; /** * @author Endi Sukma Dewata */ public abstract class ObjectTransfer extends ByteArrayTransfer { public Logger log = LoggerFactory.getLogger(getClass()); protected void javaToNative(Object object, TransferData transferData) { if (!validate(object) || !isSupportedType(transferData)) { DND.error(DND.ERROR_INVALID_DATA); } try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(out); os.writeObject(object); os.close(); byte[] buffer = out.toByteArray(); super.javaToNative(buffer, transferData); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } protected Object nativeToJava(TransferData transferData) { if (!isSupportedType(transferData)) return null; byte[] buffer = (byte[])super.nativeToJava(transferData); if (buffer == null) return null; try { ByteArrayInputStream in = new ByteArrayInputStream(buffer); ObjectInputStream is = new ObjectInputStream(in); Object object = is.readObject(); is.close(); return object; } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } return null; } public boolean validate(Object object) { if (object == null) return false; if (!(object instanceof Serializable)) return false; return super.validate(object); } }