Project

General

Profile

Download (4.62 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2020 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.termtree;
10

    
11
import java.io.ByteArrayInputStream;
12
import java.io.ByteArrayOutputStream;
13
import java.io.DataInputStream;
14
import java.io.DataOutputStream;
15
import java.io.EOFException;
16
import java.io.IOException;
17
import java.util.ArrayList;
18
import java.util.List;
19
import java.util.UUID;
20

    
21
import org.eclipse.swt.SWTException;
22
import org.eclipse.swt.dnd.ByteArrayTransfer;
23
import org.eclipse.swt.dnd.TransferData;
24

    
25
import eu.etaxonomy.cdm.api.service.ITermNodeService;
26
import eu.etaxonomy.cdm.model.term.TermNode;
27
import eu.etaxonomy.cdm.model.term.TermTree;
28
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
29
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
30
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
31
import eu.etaxonomy.taxeditor.model.MessagingUtils;
32
import eu.etaxonomy.taxeditor.store.CdmStore;
33

    
34
/**
35
 * @author k.luther
36
 * @since Oct 13, 2020
37
 */
38
public class CharacterNodeDtoTransfer extends ByteArrayTransfer {
39

    
40
    private static CharacterNodeDtoTransfer instance = new CharacterNodeDtoTransfer();
41
    private static final String TYPE_NAME = "featureNodeDto-transfer-format";
42
    private static final int TYPEID = registerType(TYPE_NAME);
43

    
44
    /**
45
     * <p>Getter for the field <code>instance</code>.</p>
46
     *
47
     * @return a {@link eu.etaxonomy.taxeditor.termtree.FeatureNodeTransfer} object.
48
     */
49
    public static synchronized CharacterNodeDtoTransfer getInstance() {
50
        return instance;
51
    }
52

    
53
    private CharacterNodeDtoTransfer() {
54
    }
55

    
56
    /** {@inheritDoc} */
57
    @Override
58
    protected int[] getTypeIds() {
59
        return new int[] { TYPEID };
60
    }
61

    
62
    /** {@inheritDoc} */
63
    @Override
64
    protected String[] getTypeNames() {
65
        return new String[] { TYPE_NAME };
66
    }
67
    @Override
68
    protected void javaToNative(Object object, TransferData transferData) {
69
        if (object != null){
70
            byte[] bytes = toByteArray((TermNodeDto[]) object);
71
            if (bytes != null) {
72
                super.javaToNative(bytes, transferData);
73
            }
74
        }
75
    }
76

    
77
    @Override
78
    protected Object nativeToJava(TransferData transferData) {
79
        try{
80
            byte[] bytes = (byte[]) super.nativeToJava(transferData);
81
            if (bytes != null){
82
                return fromByteArray(bytes);
83
            }
84
        }catch (SWTException e){
85
            MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
86
        }
87

    
88
        return null;
89
    }
90

    
91

    
92
    protected byte[] toByteArray(TermNodeDto[] elements) {
93
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
94
        DataOutputStream out = new DataOutputStream(byteOut);
95

    
96
        byte[] bytes = null;
97

    
98
        try {
99
            for(TermNodeDto element : elements){
100
                if (element.getUuid() == null){
101
                //  MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving");
102

    
103
                }else{
104
                    writeElementUuid(element, out);
105
                }
106
            }
107
            out.close();
108
            bytes = byteOut.toByteArray();
109
        } catch (IOException e) {
110

    
111
            // when in doubt send nothing
112
        }
113
        return bytes;
114
    }
115

    
116
    protected Object[] fromByteArray(byte[] bytes) {
117
        DataInputStream in = new DataInputStream(
118
                new ByteArrayInputStream(bytes));
119

    
120
        try {
121
            List<CharacterNodeDto> elements = new ArrayList<CharacterNodeDto>();
122

    
123
            try{
124
                while(true){
125
                    UUID uuid = readElementUuid(in);
126
                    elements.add(loadElement(uuid));
127
                }
128
            }catch(EOFException e){
129
                return  elements.toArray();
130
            }
131
        } catch (IOException e) {
132
            return null;
133
        }
134
    }
135

    
136
    public CharacterNodeDto loadElement(UUID uuid){
137
        TermNode node = CdmStore.getService(ITermNodeService.class).load(uuid);
138
        TermTreeDto tree = TermTreeDto.fromTree((TermTree)node.getGraph());
139
        return CharacterNodeDto.fromTermNode(node, tree);
140
    }
141

    
142
    public UUID readElementUuid(DataInputStream in) throws IOException{
143
        return UUID.fromString(in.readUTF());
144
    }
145

    
146
    private void writeElementUuid(TermNodeDto element, DataOutputStream out) throws IOException {
147
        out.writeUTF(element.getUuid().toString());
148
    }
149

    
150

    
151
}
(3-3/11)