Package com.eviware.soapui.impl.rest.panels.method

Source Code of com.eviware.soapui.impl.rest.panels.method.RestRepresentationsTable$AddRepresentationAction

/*
* Copyright 2004-2014 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/

package com.eviware.soapui.impl.rest.panels.method;

import com.eviware.soapui.impl.rest.RestMethod;
import com.eviware.soapui.impl.rest.RestRepresentation;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.swing.JTableFactory;
import com.eviware.soapui.support.types.StringList;

import javax.swing.AbstractAction;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RestRepresentationsTable extends JPanel implements PropertyChangeListener {
    private RestMethod restMethod;
    private List<RestRepresentation.Type> types;
    private JTable representationsTable;
    private RepresentationsTableModel tableModel;
    private AddRepresentationAction addRepresentationAction;
    private RemoveRepresentationAction removeRepresentationAction;
    private boolean readOnly;

    public RestRepresentationsTable(RestMethod restMethod, RestRepresentation.Type[] types, boolean readOnly) {
        super(new BorderLayout());
        this.restMethod = restMethod;
        this.types = Arrays.asList(types);
        this.readOnly = readOnly;

        tableModel = new RepresentationsTableModel();
        representationsTable = JTableFactory.getInstance().makeJTable(tableModel);
        representationsTable.setRowHeight(18);

        add(buildToolbar(), BorderLayout.NORTH);
        add(new JScrollPane(representationsTable), BorderLayout.CENTER);

        restMethod.addPropertyChangeListener("representations", this);
    }

    protected JXToolBar buildToolbar() {
        JXToolBar toolbar = UISupport.createToolbar();
        if (!readOnly) {
            addRepresentationAction = new AddRepresentationAction();
            toolbar.addFixed(UISupport.createToolbarButton(addRepresentationAction));

            removeRepresentationAction = new RemoveRepresentationAction();
            removeRepresentationAction.setEnabled(false);
            representationsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e) {
                    removeRepresentationAction.setEnabled(representationsTable.getSelectedRow() != -1);
                }
            });
            toolbar.addFixed(UISupport.createToolbarButton(removeRepresentationAction));
        }

        return toolbar;
    }

    public class RepresentationsTableModel extends AbstractTableModel implements PropertyChangeListener {
        private List<RestRepresentation> data = new ArrayList<RestRepresentation>();

        public RepresentationsTableModel() {
            initData();
        }

        private void initData() {
            if (!data.isEmpty()) {
                release();
                data.clear();
            }

            for (RestRepresentation representation : restMethod.getRepresentations()) {
                if (types.contains(representation.getType())) {
                    representation.addPropertyChangeListener(this);
                    data.add(representation);
                }
            }
        }

        public int getColumnCount() {
            return 4;
        }

        public int getRowCount() {
            return data.size();
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            RestRepresentation representation = data.get(rowIndex);

            switch (columnIndex) {
                case 0:
                    return representation.getType().toString();
                case 1:
                    return representation.getMediaType();
                case 2:
                    return representation.getType().equals(RestRepresentation.Type.REQUEST) ? "n/a" : representation
                            .getStatus().toString();
                case 3:
                    return representation.getElement() == null ? null : representation.getElement().toString();
            }

            return null;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return !readOnly && columnIndex > 0 && columnIndex < 3
                    && !(data.get(rowIndex).getType().equals(RestRepresentation.Type.REQUEST) && columnIndex == 2);
        }

        @Override
        public void setValueAt(Object value, int rowIndex, int columnIndex) {
            if (readOnly) {
                return;
            }
            RestRepresentation representation = data.get(rowIndex);

            switch (columnIndex) {
                case 1:
                    representation.setMediaType(value == null ? "" : value.toString());
                    break;
                case 2: {
                    if (value == null) {
                        value = "";
                    }

                    String[] items = value.toString().split(" ");
                    List<Integer> status = new ArrayList<Integer>();

                    for (String item : items) {
                        try {
                            if (StringUtils.hasContent(item)) {
                                status.add(Integer.parseInt(item.trim()));
                            }
                        } catch (NumberFormatException e) {
                        }
                    }

                    representation.setStatus(status);
                    break;
                }
            }
        }

        @Override
        public String getColumnName(int column) {
            switch (column) {
                case 0:
                    return "Type";
                case 1:
                    return "Media-Type";
                case 2:
                    return "Status Codes";
                case 3:
                    return "QName";
            }

            return null;
        }

        public void refresh() {
            initData();
            fireTableDataChanged();
        }

        public void propertyChange(PropertyChangeEvent evt) {
            fireTableDataChanged();
        }

        public void release() {
            for (RestRepresentation representation : data) {
                representation.removePropertyChangeListener(this);
            }
        }

        public RestRepresentation getRepresentationAtRow(int rowIndex) {
            return data.get(rowIndex);
        }
    }

    public RestRepresentation getRepresentationAtRow(int rowIndex) {
        return tableModel.getRepresentationAtRow(rowIndex);
    }

    private class AddRepresentationAction extends AbstractAction {
        private AddRepresentationAction() {
            putValue(SMALL_ICON, UISupport.createImageIcon("/add_property.gif"));
            putValue(SHORT_DESCRIPTION, "Adds a new Response Representation to this Method");
        }

        public void actionPerformed(ActionEvent e) {
            String type = types.size() == 1 ? types.get(0).toString() : UISupport.prompt(
                    "Specify type of Representation to add", "Add Representation", new StringList(types).toStringArray());

            if (type != null) {
                restMethod.addNewRepresentation(RestRepresentation.Type.valueOf(type));
            }
        }
    }

    private class RemoveRepresentationAction extends AbstractAction {
        private RemoveRepresentationAction() {
            putValue(SMALL_ICON, UISupport.createImageIcon("/remove_property.gif"));
            putValue(SHORT_DESCRIPTION, "Removes selected Representation from this Method");
        }

        public void actionPerformed(ActionEvent e) {
            if (UISupport.confirm("Remove selected Representation?", "Remove Representation")) {
                restMethod
                        .removeRepresentation(tableModel.getRepresentationAtRow(representationsTable.getSelectedRow()));
            }
        }
    }

    public void propertyChange(PropertyChangeEvent arg0) {
        tableModel.refresh();
    }

    public void release() {
        tableModel.release();
        restMethod.removePropertyChangeListener("representations", this);
    }

    public void refresh() {
        tableModel.refresh();
    }

    public int getSelectedRow() {
        return representationsTable.getSelectedRow();
    }
}
TOP

Related Classes of com.eviware.soapui.impl.rest.panels.method.RestRepresentationsTable$AddRepresentationAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.