View | Details | Raw Unified | Return to bug 46677
Collapse All | Expand All

(-)src/core/org/apache/jmeter/util/JMeterTreeNodeTransferable.java (+96 lines)
Line 0 Link Here
1
/*
2
 *  Licensed to the Apache Software Foundation (ASF) under one or more
3
 *  contributor license agreements.  See the NOTICE file distributed with
4
 *  this work for additional information regarding copyright ownership.
5
 *  The ASF licenses this file to You under the Apache License, Version 2.0
6
 *  (the "License"); you may not use this file except in compliance with
7
 *  the License.  You may obtain a copy of the License at
8
 *
9
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 *  Unless required by applicable law or agreed to in writing, software
12
 *  distributed under the License is distributed on an "AS IS" BASIS,
13
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 *  See the License for the specific language governing permissions and
15
 *  limitations under the License.
16
 */
17
18
package org.apache.jmeter.util;
19
20
import java.awt.datatransfer.DataFlavor;
21
import java.awt.datatransfer.Transferable;
22
import java.awt.datatransfer.UnsupportedFlavorException;
23
import java.io.ByteArrayInputStream;
24
import java.io.ByteArrayOutputStream;
25
import java.io.IOException;
26
import java.io.ObjectInput;
27
import java.io.ObjectInputStream;
28
import java.io.ObjectOutputStream;
29
30
import org.apache.jmeter.gui.tree.JMeterTreeNode;
31
32
/**
33
 * Simple implementation of a transferable for {@link JMeterTreeNode} arrays based on serialization.
34
 */
35
public class JMeterTreeNodeTransferable implements Transferable {
36
    
37
    public final static DataFlavor JMETER_TREE_NODE_ARRAY_DATA_FLAVOR = new DataFlavor(JMeterTreeNode[].class, JMeterTreeNode[].class.getName());
38
    
39
    private final static DataFlavor[] DATA_FLAVORS = new DataFlavor[]{JMETER_TREE_NODE_ARRAY_DATA_FLAVOR};
40
    
41
    private byte[] data = null;
42
43
    @Override
44
    public DataFlavor[] getTransferDataFlavors() {
45
        return DATA_FLAVORS;
46
    }
47
48
    @Override
49
    public boolean isDataFlavorSupported(DataFlavor flavor) {
50
        return flavor.match(JMETER_TREE_NODE_ARRAY_DATA_FLAVOR);
51
    }
52
53
    @Override
54
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
55
        if(!isDataFlavorSupported(flavor)) {
56
            throw new UnsupportedFlavorException(flavor);
57
        }
58
        if(data != null) {
59
            ObjectInput ois = null;
60
            try {
61
                ois = new ObjectInputStream(new ByteArrayInputStream(data));
62
                JMeterTreeNode[] nodes = (JMeterTreeNode[]) ois.readObject();
63
                return nodes;
64
            } catch (ClassNotFoundException cnfe) {
65
                throw new IOException("Failed to read object stream.", cnfe);
66
            } finally {
67
                if(ois != null) {
68
                    try {
69
                        ois.close();
70
                    } catch (Exception e) {
71
                        // NOOP
72
                    }
73
                }
74
            }
75
        }
76
        return null;
77
    }
78
    
79
    public void setTransferData(JMeterTreeNode[] nodes) throws IOException {
80
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
81
        ObjectOutputStream oos = null;
82
        try {
83
            oos = new ObjectOutputStream(bos);
84
            oos.writeObject(nodes);
85
            data = bos.toByteArray();
86
        } finally {
87
            if(oos != null) {
88
                try {
89
                    oos.close();
90
                } catch (Exception e) {
91
                    // NOOP
92
                }
93
            }
94
        }
95
    }
96
}
(-)src/core/org/apache/jmeter/gui/action/Copy.java (-25 / +22 lines)
Lines 23-46 Link Here
23
 */
23
 */
24
package org.apache.jmeter.gui.action;
24
package org.apache.jmeter.gui.action;
25
25
26
import java.awt.Toolkit;
27
import java.awt.datatransfer.Clipboard;
26
import java.awt.event.ActionEvent;
28
import java.awt.event.ActionEvent;
27
import java.util.Enumeration;
29
import java.util.Enumeration;
28
import java.util.HashSet;
30
import java.util.HashSet;
29
import java.util.Set;
31
import java.util.Set;
30
32
33
import javax.swing.JOptionPane;
34
31
import org.apache.jmeter.gui.GuiPackage;
35
import org.apache.jmeter.gui.GuiPackage;
32
import org.apache.jmeter.gui.tree.JMeterTreeListener;
36
import org.apache.jmeter.gui.tree.JMeterTreeListener;
33
import org.apache.jmeter.gui.tree.JMeterTreeNode;
37
import org.apache.jmeter.gui.tree.JMeterTreeNode;
34
import org.apache.jmeter.testelement.TestElement;
38
import org.apache.jmeter.testelement.TestElement;
39
import org.apache.jmeter.util.JMeterTreeNodeTransferable;
40
import org.apache.jmeter.util.JMeterUtils;
35
41
36
/**
42
/**
37
 * Implements the Copy menu command
43
 * Implements the Copy menu command
38
 */
44
 */
39
public class Copy extends AbstractAction {
45
public class Copy extends AbstractAction {
40
    private static JMeterTreeNode copiedNode = null;
46
    
41
42
    private static JMeterTreeNode copiedNodes[] = null;
43
44
    private static final HashSet<String> commands = new HashSet<String>();
47
    private static final HashSet<String> commands = new HashSet<String>();
45
48
46
    static {
49
    static {
Lines 63-88 Link Here
63
    }
66
    }
64
67
65
    public static JMeterTreeNode[] getCopiedNodes() {
68
    public static JMeterTreeNode[] getCopiedNodes() {
66
        if (copiedNodes == null) { // can be null if Copy has yet to be used
69
        
67
            return null;
70
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
68
        }
71
        if(clipboard.isDataFlavorAvailable(JMeterTreeNodeTransferable.JMETER_TREE_NODE_ARRAY_DATA_FLAVOR)) {
69
        for (int i = 0; i < copiedNodes.length; i++) {
72
            try {
70
            if (copiedNodes[i] == null) {
73
                return (JMeterTreeNode[]) clipboard.getData(JMeterTreeNodeTransferable.JMETER_TREE_NODE_ARRAY_DATA_FLAVOR);
71
                return null;
74
            } catch (Exception ex) {
75
                JOptionPane.showMessageDialog(GuiPackage.getInstance().getMainFrame(), JMeterUtils.getResString("clipboard_node_read_error")+":\n" + ex.getLocalizedMessage(), JMeterUtils.getResString("error_title"), JOptionPane.ERROR_MESSAGE);
72
            }
76
            }
73
        }
77
        }
74
        return cloneTreeNodes(copiedNodes);
78
        return null;
75
    }
76
77
    public static JMeterTreeNode getCopiedNode() {
78
        if (copiedNode == null) {
79
            return null;
80
        }
81
        return cloneTreeNode(copiedNode);
82
    }
83
84
    public static void setCopiedNode(JMeterTreeNode node) {
85
        copiedNode = cloneTreeNode(node);
86
    }
79
    }
87
80
88
    public static JMeterTreeNode cloneTreeNode(JMeterTreeNode node) {
81
    public static JMeterTreeNode cloneTreeNode(JMeterTreeNode node) {
Lines 93-101 Link Here
93
    }
86
    }
94
87
95
    public static void setCopiedNodes(JMeterTreeNode nodes[]) {
88
    public static void setCopiedNodes(JMeterTreeNode nodes[]) {
96
        copiedNodes = new JMeterTreeNode[nodes.length];
89
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
97
        for (int i = 0; i < nodes.length; i++) {
90
        try {
98
            copiedNodes[i] = cloneTreeNode(nodes[i]);
91
            JMeterTreeNodeTransferable transferable = new JMeterTreeNodeTransferable();
92
            transferable.setTransferData(nodes);
93
            clipboard.setContents(transferable, null);
94
        } catch (Exception ex) {
95
            JOptionPane.showMessageDialog(GuiPackage.getInstance().getMainFrame(), JMeterUtils.getResString("clipboard_node_read_error")+":\n" + ex.getLocalizedMessage(), JMeterUtils.getResString("error_title"), JOptionPane.ERROR_MESSAGE);
99
        }
96
        }
100
    }
97
    }
101
98

Return to bug 46677