/**
* Copyright (C) 2007 EDIT
- * European Distributed Institute of Taxonomy
+ * European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
- *
+ *
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
package eu.etaxonomy.taxeditor.featuretree;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.UUID;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
import eu.etaxonomy.cdm.model.description.Feature;
import eu.etaxonomy.cdm.model.term.TermNode;
-import eu.etaxonomy.taxeditor.model.CdmObjectTransfer;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.store.CdmStore;
/**
* @author n.hoffmann
* @created Aug 5, 2010
*/
-public class FeatureNodeTransfer extends CdmObjectTransfer<TermNode<Feature>> {
+public class FeatureNodeTransfer extends ByteArrayTransfer {
private static FeatureNodeTransfer instance = new FeatureNodeTransfer();
private static final String TYPE_NAME = "featureNode-transfer-format";
protected String[] getTypeNames() {
return new String[] { TYPE_NAME };
}
-
@Override
- public TermNode<Feature> loadElement(UUID uuid) {
- return CdmStore.getService(IFeatureNodeService.class).load(uuid);
- }
+ protected void javaToNative(Object object, TransferData transferData) {
+ if (object != null){
+ byte[] bytes = toByteArray((TermNode[]) object);
+ if (bytes != null) {
+ super.javaToNative(bytes, transferData);
+ }
+ }
+ }
+
+ @Override
+ protected Object nativeToJava(TransferData transferData) {
+ try{
+ byte[] bytes = (byte[]) super.nativeToJava(transferData);
+ if (bytes != null){
+ return fromByteArray(bytes);
+ }
+ }catch (SWTException e){
+ MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
+ }
+
+ return null;
+ }
+
+
+ protected byte[] toByteArray(TermNode[] elements) {
+ ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(byteOut);
+
+ byte[] bytes = null;
+
+ try {
+ for(TermNode element : elements){
+ if (element.getUuid() == null){
+ // MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
+
+ }else{
+ writeElementUuid(element, out);
+ }
+ }
+ out.close();
+ bytes = byteOut.toByteArray();
+ } catch (IOException e) {
+
+ // when in doubt send nothing
+ }
+ return bytes;
+ }
+
+ protected Object[] fromByteArray(byte[] bytes) {
+ DataInputStream in = new DataInputStream(
+ new ByteArrayInputStream(bytes));
+
+ try {
+ List<TermNode> elements = new ArrayList<TermNode>();
+
+ try{
+ while(true){
+ UUID uuid = readElementUuid(in);
+ elements.add(loadElement(uuid));
+ }
+ }catch(EOFException e){
+ return elements.toArray();
+ }
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public TermNode loadElement(UUID uuid){
+ TermNode<Feature> node = CdmStore.getService(IFeatureNodeService.class).load(uuid);
+ return node;
+ }
+
+ public UUID readElementUuid(DataInputStream in) throws IOException{
+ return UUID.fromString(in.readUTF());
+ }
+
+ private void writeElementUuid(Object element, DataOutputStream out) throws IOException {
+ out.writeUTF(((TermNode)element).getUuid().toString());
+ }
+
}