Package com.eviware.soapui.impl.support.http

Source Code of com.eviware.soapui.impl.support.http.HttpRequestContentView

/*
*  soapUI, copyright (C) 2004-2011 eviware.com
*
*  soapUI is free software; you can redistribute it and/or modify it under the
*  terms of version 2.1 of the GNU Lesser General Public License as published by
*  the Free Software Foundation.
*
*  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
*  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details at gnu.org.
*/

package com.eviware.soapui.impl.support.http;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.swing.text.Document;

import com.eviware.soapui.impl.rest.panels.resource.RestParamsTable;
import com.eviware.soapui.impl.rest.panels.resource.RestParamsTableModel;
import com.eviware.soapui.impl.rest.support.RestParamProperty;
import com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.panels.AbstractHttpXmlRequestDesktopPanel.HttpRequestDocument;
import com.eviware.soapui.impl.support.panels.AbstractHttpXmlRequestDesktopPanel.HttpRequestMessageEditor;
import com.eviware.soapui.support.DocumentListenerAdapter;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.support.editor.views.AbstractXmlEditorView;
import com.eviware.soapui.support.propertyexpansion.PropertyExpansionPopupListener;
import com.eviware.soapui.support.xml.JXEditTextArea;

@SuppressWarnings( "unchecked" )
public class HttpRequestContentView extends AbstractXmlEditorView<HttpRequestDocument> implements
    PropertyChangeListener
{
  private final HttpRequestInterface<?> httpRequest;
  private JPanel contentPanel;
  private JXEditTextArea contentEditor;
  private boolean updatingRequest;
  private JComponent panel;
  private JComboBox mediaTypeCombo;
  private JSplitPane split;
  private RestParamsTable paramsTable;
  private JCheckBox postQueryCheckBox;

  public HttpRequestContentView( HttpRequestMessageEditor httpRequestMessageEditor, HttpRequestInterface<?> httpRequest )
  {
    super( "Request", httpRequestMessageEditor, HttpRequestContentViewFactory.VIEW_ID );
    this.httpRequest = httpRequest;

    httpRequest.addPropertyChangeListener( this );
  }

  public JComponent getComponent()
  {
    if( panel == null )
    {
      buildComponent();
    }

    return panel;
  }

  protected void buildComponent()
  {
    JPanel p = new JPanel( new BorderLayout() );

    p.add( buildToolbar(), BorderLayout.NORTH );
    p.add( buildContent(), BorderLayout.CENTER );

    paramsTable = buildParamsTable();

    split = UISupport.createVerticalSplit( paramsTable, p );

    panel = new JPanel( new BorderLayout() );
    panel.add( split );

    fixRequestPanel();
  }

  protected RestParamsTable buildParamsTable()
  {
    paramsTable = new RestParamsTable( httpRequest.getParams(), false )
    {
      protected RestParamsTableModel createTableModel( RestParamsPropertyHolder params )
      {
        return new RestParamsTableModel( params )
        {
          @Override
          public String getColumnName( int column )
          {
            return column == 0 ? "Name" : "Value";
          }

          public int getColumnCount()
          {
            return 2;
          }

          public Object getValueAt( int rowIndex, int columnIndex )
          {
            RestParamProperty prop = params.getPropertyAt( rowIndex );
            return columnIndex == 0 ? prop.getName() : prop.getValue();
          }

          @Override
          public void setValueAt( Object value, int rowIndex, int columnIndex )
          {
            RestParamProperty prop = params.getPropertyAt( rowIndex );
            if( columnIndex == 0 )
              prop.setName( value.toString() );
            else
              prop.setValue( value.toString() );
          }
        };
      }
    };
    return paramsTable;
  }

  @Override
  public void release()
  {
    super.release();
    httpRequest.removePropertyChangeListener( this );
    paramsTable.release();
  }

  public HttpRequestInterface<?> getRestRequest()
  {
    return httpRequest;
  }

  protected Component buildContent()
  {
    contentPanel = new JPanel( new BorderLayout() );

    contentEditor = JXEditTextArea.createXmlEditor( true );
    contentEditor.setText( httpRequest.getRequestContent() );

    contentEditor.getDocument().addDocumentListener( new DocumentListenerAdapter()
    {

      @Override
      public void update( Document document )
      {
        if( !updatingRequest )
        {
          updatingRequest = true;
          httpRequest.setRequestContent( getText( document ) );
          updatingRequest = false;
        }
      }
    } );

    contentPanel.add( new JScrollPane( contentEditor ) );

    PropertyExpansionPopupListener.enable( contentEditor, httpRequest );

    return contentPanel;
  }

  private void enableBodyComponents()
  {
    httpRequest.setPostQueryString( httpRequest.hasRequestBody() && httpRequest.isPostQueryString() );
    postQueryCheckBox.setSelected( httpRequest.isPostQueryString() );
    mediaTypeCombo.setEnabled( httpRequest.hasRequestBody() && !httpRequest.isPostQueryString() );
    contentEditor.setEnabledAndEditable( httpRequest.hasRequestBody() && !httpRequest.isPostQueryString() );
    postQueryCheckBox.setEnabled( httpRequest.hasRequestBody() );
  }

  protected Component buildToolbar()
  {
    JXToolBar toolbar = UISupport.createToolbar();

    addMediaTypeCombo( toolbar );
    toolbar.addSeparator();

    addPostQueryCheckBox( toolbar );

    toolbar.setMinimumSize( new Dimension( 50, 20 ) );

    return toolbar;
  }

  protected void addPostQueryCheckBox( JXToolBar toolbar )
  {
    postQueryCheckBox = new JCheckBox( "Post QueryString", httpRequest.isPostQueryString() );
    postQueryCheckBox.setToolTipText( "Controls if Query-parameters should be put in message body" );
    postQueryCheckBox.setOpaque( false );
    postQueryCheckBox.addItemListener( new ItemListener()
    {
      public void itemStateChanged( ItemEvent e )
      {
        httpRequest.setPostQueryString( postQueryCheckBox.isSelected() );
        enableBodyComponents();
      }
    } );

    postQueryCheckBox.setPreferredSize( new Dimension( 130, 20 ) );
    toolbar.addFixed( postQueryCheckBox );
  }

  protected void addMediaTypeCombo( JXToolBar toolbar )
  {
    mediaTypeCombo = new JComboBox( getRequestMediaTypes() );
    mediaTypeCombo.setPreferredSize( new Dimension( 120, 20 ) );
    mediaTypeCombo.setEnabled( httpRequest.hasRequestBody() );
    mediaTypeCombo.setEditable( true );
    if( httpRequest.getMediaType() != null )
      mediaTypeCombo.setSelectedItem( httpRequest.getMediaType() );

    mediaTypeCombo.addItemListener( new ItemListener()
    {
      public void itemStateChanged( ItemEvent e )
      {
        httpRequest.setMediaType( String.valueOf( mediaTypeCombo.getSelectedItem() ) );
      }
    } );

    toolbar.addLabeledFixed( "Media Type", mediaTypeCombo );
  }

  protected Object[] getRequestMediaTypes()
  {
    return new String[] { "application/xml", "text/xml", "multipart/form-data" };
  }

  public void propertyChange( PropertyChangeEvent evt )
  {
    if( evt.getPropertyName().equals( AbstractHttpRequest.REQUEST_PROPERTY ) && !updatingRequest )
    {
      updatingRequest = true;
      contentEditor.setText( ( String )evt.getNewValue() );
      updatingRequest = false;
    }
    else if( evt.getPropertyName().equals( "method" ) )
    {
      fixRequestPanel();
    }
    else if( evt.getPropertyName().equals( "mediaType" ) )
    {
      mediaTypeCombo.setSelectedItem( evt.getNewValue() );
    }
    else if( evt.getPropertyName().equals( AbstractHttpRequest.ATTACHMENTS_PROPERTY ) )
    {
      mediaTypeCombo.setModel( new DefaultComboBoxModel( getRequestMediaTypes() ) );
      mediaTypeCombo.setSelectedItem( httpRequest.getMediaType() );
    }

    super.propertyChange( evt );
  }

  private void fixRequestPanel()
  {
    if( httpRequest.hasRequestBody() )
    {
      panel.remove( paramsTable );
      split.setLeftComponent( paramsTable );
      panel.add( split );
      enableBodyComponents();
      SwingUtilities.invokeLater( new Runnable()
      {
        public void run()
        {
          // wait for panel to get shown..
          if( panel.getHeight() == 0 )
          {
            SwingUtilities.invokeLater( this );
          }
          else
          {
            split.setDividerLocation( 0.5F );
          }
        }
      } );
    }
    else
    {
      panel.remove( split );
      panel.add( paramsTable );
    }
  }

  @Override
  public void setXml( String xml )
  {
  }

  public boolean saveDocument( boolean validate )
  {
    return false;
  }

  public void setEditable( boolean enabled )
  {
    contentEditor.setEnabledAndEditable( enabled ? httpRequest.hasRequestBody() : false );
    mediaTypeCombo.setEnabled( enabled && !httpRequest.isPostQueryString() );
    postQueryCheckBox.setEnabled( enabled );
  }

  public RestParamsTable getParamsTable()
  {
    return paramsTable;
  }

}
TOP

Related Classes of com.eviware.soapui.impl.support.http.HttpRequestContentView

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.