class CopyNodes extends BasicNodesManipulator {

    private Node[] nodes;
    private int copies = 1;

    @Override
    public void setup(Node[] nodes, Node clickedNode) {
        this.nodes = nodes;
    }

    @Override
    public void execute() {<FILL_FUNCTION_BODY>}

    @Override
    public String getName() {
        if (nodes.length > 1) {
            return NbBundle.getMessage(CopyNodes.class, "CopyNodes.name.multiple");
        } else {
            return NbBundle.getMessage(CopyNodes.class, "CopyNodes.name.single");
        }
    }

    @Override
    public String getDescription() {
        return "";
    }

    @Override
    public boolean canExecute() {
        return true;
    }

    @Override
    public ManipulatorUI getUI() {
        return new CopyNodesUI();
    }

    @Override
    public int getType() {
        return 500;
    }

    @Override
    public int getPosition() {
        return 200;
    }

    @Override
    public Icon getIcon() {
        return ImageUtilities.loadImageIcon("DataLaboratoryPlugin/duplicate.png", false);
    }

    public int getCopies() {
        return copies;
    }

    public void setCopies(int copies) {
        this.copies = copies;
    }

    public Node[] getNodes() {
        return nodes;
    }

    public void setNodes(Node[] nodes) {
        this.nodes = nodes;
    }
}

        GraphElementsController gec = Lookup.getDefault().lookup(GraphElementsController.class);
        for (int i = 0; i < copies; i++) {
            gec.duplicateNodes(nodes);
        }
    
<methods>public non-sealed void <init>() ,public java.lang.Integer getMnemonicKey() ,public org.gephi.datalab.spi.ContextMenuItemManipulator[] getSubItems() ,public boolean isAvailable() <variables>