Package com.eviware.soapui.impl.rest.support

Source Code of com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder

/*
*  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.rest.support;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.xml.namespace.QName;

import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlString;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.config.RestParameterConfig;
import com.eviware.soapui.config.RestParametersConfig;
import com.eviware.soapui.impl.wsdl.support.wsdl.UrlWsdlLoader;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansion;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionUtils;
import com.eviware.soapui.model.testsuite.TestProperty;
import com.eviware.soapui.model.testsuite.TestPropertyListener;
import com.eviware.soapui.support.StringUtils;

public class XmlBeansRestParamsTestPropertyHolder implements RestParamsPropertyHolder
{
  private RestParametersConfig config;
  private List<RestParamProperty> properties = new ArrayList<RestParamProperty>();
  private Map<String, RestParamProperty> propertyMap = new HashMap<String, RestParamProperty>();
  private Set<TestPropertyListener> listeners = new HashSet<TestPropertyListener>();
  private ModelItem modelItem;
  private Properties overrideProperties;
  private String propertiesLabel = "Test Properties";

  public XmlBeansRestParamsTestPropertyHolder( ModelItem modelItem, RestParametersConfig config )
  {
    this.modelItem = modelItem;
    this.config = config;

    for( RestParameterConfig propertyConfig : config.getParameterList() )
    {
      addProperty( propertyConfig, false );
    }
  }

  protected XmlBeansRestParamProperty addProperty( RestParameterConfig propertyConfig, boolean notify )
  {
    XmlBeansRestParamProperty propertiesStepProperty = new XmlBeansRestParamProperty( propertyConfig );
    properties.add( propertiesStepProperty );
    propertyMap.put( propertiesStepProperty.getName().toUpperCase(), propertiesStepProperty );

    if( notify )
    {
      firePropertyAdded( propertiesStepProperty.getName() );
    }

    return propertiesStepProperty;
  }

  private void firePropertyAdded( String name )
  {
    TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
    for( TestPropertyListener listener : listenersArray )
    {
      listener.propertyAdded( name );
    }
  }

  private void firePropertyRemoved( String name )
  {
    TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
    for( TestPropertyListener listener : listenersArray )
    {
      listener.propertyRemoved( name );
    }
  }

  private void firePropertyMoved( String name, int oldIndex, int newIndex )
  {
    TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
    for( TestPropertyListener listener : listenersArray )
    {
      listener.propertyMoved( name, oldIndex, newIndex );
    }
  }

  private void firePropertyRenamed( String oldName, String newName )
  {
    TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
    for( TestPropertyListener listener : listenersArray )
    {
      listener.propertyRenamed( oldName, newName );
    }
  }

  private void firePropertyValueChanged( String name, String oldValue, String newValue )
  {
    TestPropertyListener[] listenersArray = listeners.toArray( new TestPropertyListener[listeners.size()] );
    for( TestPropertyListener listener : listenersArray )
    {
      listener.propertyValueChanged( name, oldValue, newValue );
    }
  }

  public RestParamProperty addProperty( String name )
  {
    if( hasProperty( name ) )
      return getProperty( name );
    RestParameterConfig propertyConfig = config.addNewParameter();
    propertyConfig.setName( name );
    return addProperty( propertyConfig, true );
  }

  public void addTestPropertyListener( TestPropertyListener listener )
  {
    listeners.add( listener );
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#getProperty
   * (java.lang.String)
   */
  public RestParamProperty getProperty( String name )
  {
    return propertyMap.get( name.toUpperCase() );
  }

  public String[] getPropertyNames()
  {
    String[] result = new String[properties.size()];
    for( int c = 0; c < properties.size(); c++ )
      result[c] = properties.get( c ).getName();

    return result;
  }

  public String getPropertyValue( String name )
  {
    TestProperty property = getProperty( name );
    return property == null ? null : property.getValue();
  }

  public RestParamProperty removeProperty( String propertyName )
  {
    RestParamProperty property = getProperty( propertyName );
    if( property != null )
    {
      int ix = properties.indexOf( property );
      propertyMap.remove( propertyName.toUpperCase() );
      properties.remove( ix );

      firePropertyRemoved( propertyName );

      config.removeParameter( ix );
      return property;
    }

    return null;
  }

  public void removeTestPropertyListener( TestPropertyListener listener )
  {
    listeners.remove( listener );
  }

  public void setPropertyValue( String name, String value )
  {
    RestParamProperty property = getProperty( name );
    if( property != null )
      property.setValue( value );
    else
      addProperty( name ).setValue( value );
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#resetValues
   * ()
   */
  public void resetValues()
  {
    for( RestParamProperty property : properties )
    {
      ( ( XmlBeansRestParamProperty )property ).reset();
    }
  }

  public void resetPropertiesConfig( RestParametersConfig config )
  {
    this.config = config;

    for( int c = 0; c < config.sizeOfParameterArray(); c++ )
    {
      ( ( XmlBeansRestParamProperty )properties.get( c ) ).setConfig( config.getParameterArray( c ) );
    }
  }

  public boolean renameProperty( String name, String newName )
  {
    if( getProperty( newName ) != null )
      return false;

    RestParamProperty property = getProperty( name );
    if( property == null )
      return false;

    property.setName( newName );

    firePropertyRenamed( name, newName );
    return true;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#getPropertyIndex
   * (java.lang.String)
   */
  public int getPropertyIndex( String name )
  {
    for( int c = 0; c < properties.size(); c++ )
    {
      if( properties.get( c ).getName().equals( name ) )
      {
        return c;
      }
    }

    return -1;
  }

  public class XmlBeansRestParamProperty implements RestParamProperty
  {
    private RestParameterConfig propertyConfig;
    private PropertyChangeSupport propertySupport;

    public XmlBeansRestParamProperty( RestParameterConfig propertyConfig )
    {
      this.propertyConfig = propertyConfig;

      propertySupport = new PropertyChangeSupport( this );
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.eviware.soapui.impl.rest.support.RestParamProperty#
     * addPropertyChangeListener(java.beans.PropertyChangeListener)
     */
    public void addPropertyChangeListener( PropertyChangeListener listener )
    {
      propertySupport.addPropertyChangeListener( listener );
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.eviware.soapui.impl.rest.support.RestParamProperty#
     * addPropertyChangeListener(java.lang.String,
     * java.beans.PropertyChangeListener)
     */
    public void addPropertyChangeListener( String propertyName, PropertyChangeListener listener )
    {
      propertySupport.addPropertyChangeListener( propertyName, listener );
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.eviware.soapui.impl.rest.support.RestParamProperty#
     * removePropertyChangeListener(java.beans.PropertyChangeListener)
     */
    public void removePropertyChangeListener( PropertyChangeListener listener )
    {
      propertySupport.removePropertyChangeListener( listener );
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.eviware.soapui.impl.rest.support.RestParamProperty#
     * removePropertyChangeListener(java.lang.String,
     * java.beans.PropertyChangeListener)
     */
    public void removePropertyChangeListener( String propertyName, PropertyChangeListener listener )
    {
      propertySupport.removePropertyChangeListener( propertyName, listener );
    }

    public void setConfig( RestParameterConfig restParameterConfig )
    {
      this.propertyConfig = restParameterConfig;
    }

    public String getName()
    {
      return propertyConfig.getName();
    }

    public void setName( String name )
    {
      String oldName = getName();
      propertyConfig.setName( name );

      propertyMap.remove( oldName.toUpperCase() );
      propertyMap.put( name.toUpperCase(), this );

      firePropertyRenamed( oldName, name );
    }

    public String getDescription()
    {
      return propertyConfig.getDescription();
    }

    public void setDescription( String description )
    {
      String old = getDescription();
      propertyConfig.setDescription( description );
      propertySupport.firePropertyChange( "description", old, description );
    }

    public ParameterStyle getStyle()
    {
      if( propertyConfig.xgetStyle() == null )
        propertyConfig.setStyle( RestParameterConfig.Style.QUERY );

      return ParameterStyle.valueOf( propertyConfig.getStyle().toString() );
    }

    public void setStyle( ParameterStyle style )
    {
      ParameterStyle old = getStyle();

      propertyConfig.setStyle( RestParameterConfig.Style.Enum.forString( style.name() ) );
      propertySupport.firePropertyChange( "style", old, style );
    }

    public String getValue()
    {
      if( overrideProperties != null && overrideProperties.containsKey( getName() ) )
        return overrideProperties.getProperty( getName() );

      return propertyConfig.getValue() == null ? "" : propertyConfig.getValue();
    }

    public void setValue( String value )
    {
      String oldValue = getValue();
      propertyConfig.setValue( value );

      if( overrideProperties != null && overrideProperties.containsKey( getName() ) )
      {
        overrideProperties.remove( getName() );
        if( overrideProperties.isEmpty() )
          overrideProperties = null;
      }

      firePropertyValueChanged( getName(), oldValue, value );
    }

    public boolean isReadOnly()
    {
      return false;
    }

    public ModelItem getModelItem()
    {
      return modelItem;
    }

    public String getDefaultValue()
    {
      return propertyConfig.isSetDefault() ? propertyConfig.getDefault() : "";
    }

    public String[] getOptions()
    {
      return propertyConfig.getOptionList().toArray( new String[propertyConfig.sizeOfOptionArray()] );
    }

    public boolean getRequired()
    {
      return propertyConfig.getRequired();
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * com.eviware.soapui.impl.rest.support.RestParamProperty#isDisableUrlEncoding
     * ()
     */
    public boolean isDisableUrlEncoding()
    {
      return propertyConfig.getDisableUrlEncoding();
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.eviware.soapui.impl.rest.support.RestParamProperty#
     * setDisableUrlEncoding(boolean)
     */
    public void setDisableUrlEncoding( boolean encode )
    {
      boolean old = isDisableUrlEncoding();
      if( old == encode )
        return;

      propertyConfig.setDisableUrlEncoding( encode );
      propertySupport.firePropertyChange( "disableUrlEncoding", old, encode );
    }

    public QName getType()
    {
      return propertyConfig.isSetType() ? propertyConfig.getType() : XmlString.type.getName();
    }

    public void setOptions( String[] arg0 )
    {
      String[] old = getOptions();
      propertyConfig.setOptionArray( arg0 );
      propertySupport.firePropertyChange( "options", old, arg0 );
    }

    public void setRequired( boolean arg0 )
    {
      boolean old = getRequired();
      if( old == arg0 )
        return;
      propertyConfig.setRequired( arg0 );
      propertySupport.firePropertyChange( "required", old, arg0 );
    }

    public void setType( QName arg0 )
    {
      propertyConfig.setType( arg0 );
    }

    public void setDefaultValue( String default1 )
    {
      String old = default1;
      propertyConfig.setDefault( default1 );
      propertySupport.firePropertyChange( "defaultValue", old, default1 );
    }

    public RestParameterConfig getConfig()
    {
      return propertyConfig;
    }

    @Override
    public boolean equals( Object obj )
    {
      if( obj instanceof XmlBeansRestParamProperty )
      {
        return propertyConfig.toString().equals( ( ( XmlBeansRestParamProperty )obj ).propertyConfig.toString() );
      }

      return super.equals( obj );
    }

    public void reset()
    {
      setValue( getDefaultValue() );
    }

    @Override
    public String getPath()
    {
      return propertyConfig.getPath();

    }

    @Override
    public void setPath( String path )
    {
      String old = getPath();
      propertyConfig.setPath( path );
      propertySupport.firePropertyChange( "path", old, path );

    }

    @Override
    public boolean isRequestPart()
    {
      return false;
    }

    @Override
    public SchemaType getSchemaType()
    {
      return XmlBeans.getBuiltinTypeSystem().findType( getType() );
    }

  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#saveTo(java
   * .util.Properties)
   */
  public void saveTo( Properties props )
  {
    int cnt = 0;
    for( RestParamProperty p : properties )
    {
      String name = p.getName();
      String value = p.getValue();
      if( value == null )
        value = "";

      props.setProperty( name, value );
      cnt++ ;
    }
  }

  public int getPropertyCount()
  {
    return properties.size();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#getPropertyAt
   * (int)
   */
  public RestParamProperty getPropertyAt( int index )
  {
    return properties.get( index );
  }

  public List<TestProperty> getPropertyList()
  {
    List<TestProperty> result = new ArrayList<TestProperty>();

    for( TestProperty property : properties )
      result.add( property );

    return result;
  }

  public Map<String, TestProperty> getProperties()
  {
    Map<String, TestProperty> result = new HashMap<String, TestProperty>();
    for( RestParamProperty property : propertyMap.values() )
    {
      result.put( property.getName(), property );
    }

    return result;
  }

  public boolean hasProperty( String name )
  {
    return propertyMap.containsKey( name.toUpperCase() );
  }

  public int addPropertiesFromFile( String propFile )
  {
    if( !StringUtils.hasContent( propFile ) )
      return 0;

    try
    {
      InputStream input = null;

      File file = new File( propFile );
      if( file.exists() )
      {
        input = new FileInputStream( file );
      }
      else if( propFile.toLowerCase().startsWith( "http://" ) || propFile.toLowerCase().startsWith( "https://" ) )
      {
        UrlWsdlLoader loader = new UrlWsdlLoader( propFile, getModelItem() );
        loader.setUseWorker( false );
        input = loader.load();
      }

      if( input != null )
      {
        if( overrideProperties == null )
          overrideProperties = new Properties();

        int sz = overrideProperties.size();
        overrideProperties.load( input );

        for( Object key : overrideProperties.keySet() )
        {
          String name = key.toString();
          if( !hasProperty( name ) )
            addProperty( name );
        }

        return overrideProperties.size() - sz;
      }
    }
    catch( Exception e )
    {
      SoapUI.logError( e );
    }

    return 0;
  }

  public ModelItem getModelItem()
  {
    return modelItem;
  }

  /*
   * (non-Javadoc)
   *
   * @seecom.eviware.soapui.impl.rest.support.RestParamsPropertyHolder#
   * getPropertyExpansions()
   */
  public PropertyExpansion[] getPropertyExpansions()
  {
    List<PropertyExpansion> result = new ArrayList<PropertyExpansion>();

    for( RestParamProperty prop : properties )
      result.addAll( PropertyExpansionUtils.extractPropertyExpansions( getModelItem(), prop, "value" ) );

    return result.toArray( new PropertyExpansion[result.size()] );
  }

  public void moveProperty( String propertyName, int targetIndex )
  {
    RestParamProperty property = getProperty( propertyName );
    int ix = properties.indexOf( property );

    if( ix == targetIndex )
      return;

    if( targetIndex < 0 )
      targetIndex = 0;

    String value = property.getValue();
    String defaultValue = property.getDefaultValue();
    String style = property.getStyle().name();
    String[] options = property.getOptions();
    boolean required = property.getRequired();
    QName type = property.getType();
    String description = property.getDescription();
    boolean disableUrlEncoding = property.isDisableUrlEncoding();

    config.removeParameter( ix );

    RestParameterConfig propertyConfig = null;

    if( targetIndex < properties.size() )
    {
      properties.add( targetIndex, properties.remove( ix ) );
      propertyConfig = config.insertNewParameter( targetIndex );
    }
    else
    {
      properties.add( properties.remove( ix ) );
      propertyConfig = config.addNewParameter();
    }

    propertyConfig.setName( propertyName );
    propertyConfig.setValue( value );
    propertyConfig.setDefault( defaultValue );
    propertyConfig.setStyle( RestParameterConfig.Style.Enum.forString( style ) );
    propertyConfig.setOptionArray( options );
    propertyConfig.setRequired( required );
    propertyConfig.setType( type );
    propertyConfig.setDescription( description );
    propertyConfig.setDisableUrlEncoding( disableUrlEncoding );

    resetPropertiesConfig( config );

    if( targetIndex > properties.size() )
      targetIndex = properties.size();

    firePropertyMoved( propertyName, ix, targetIndex );
  }

  public void clear()
  {
    while( size() > 0 )
      removeProperty( getPropertyAt( 0 ).getName() );
  }

  public boolean containsKey( Object key )
  {
    return hasProperty( ( String )key );
  }

  public boolean containsValue( Object value )
  {
    return propertyMap.containsValue( value );
  }

  public Set<java.util.Map.Entry<String, TestProperty>> entrySet()
  {
    HashSet<java.util.Map.Entry<String, TestProperty>> result = new HashSet<Entry<String, TestProperty>>();

    for( TestProperty p : propertyMap.values() )
    {
      // This does not compile on JDK 1.5:
      // result.add( new java.util.HashMap.SimpleEntry<String,
      // TestProperty>(p.getName(), p));
      result.add( new HashMapEntry<String, TestProperty>( p.getName(), p ) );
    }

    return result;
  }

  private static class HashMapEntry<K, V> implements java.util.Map.Entry<K, V>
  {
    private K key;
    private V value;

    public HashMapEntry( K key, V value )
    {
      this.key = key;
      this.value = value;
    }

    public K getKey()
    {
      return key;
    }

    public V getValue()
    {
      return value;
    }

    public V setValue( V value )
    {
      throw new UnsupportedOperationException();
    }
  }

  public RestParamProperty get( Object key )
  {
    return getProperty( ( String )key );
  }

  public boolean isEmpty()
  {
    return propertyMap.isEmpty();
  }

  public Set<String> keySet()
  {
    return new HashSet<String>( Arrays.asList( getPropertyNames() ) );
  }

  public TestProperty put( String key, TestProperty value )
  {
    TestProperty result = addProperty( key );
    result.setValue( value.getValue() );
    return result;
  }

  public void putAll( Map<? extends String, ? extends TestProperty> m )
  {
    for( TestProperty p : m.values() )
    {
      addProperty( p.getName() ).setValue( p.getValue() );
    }
  }

  public TestProperty remove( Object key )
  {
    return removeProperty( ( String )key );
  }

  public int size()
  {
    return propertyMap.size();
  }

  public Collection<TestProperty> values()
  {
    ArrayList<TestProperty> result = new ArrayList<TestProperty>();
    result.addAll( propertyMap.values() );
    return result;
  }

  public String getPropertiesLabel()
  {
    return propertiesLabel;
  }

  public void setPropertiesLabel( String propertiesLabel )
  {
    this.propertiesLabel = propertiesLabel;
  }

  public XmlObject getConfig()
  {
    return config;
  }

  public void addParameters( RestParamsPropertyHolder params )
  {
    for( int c = 0; c < params.getPropertyCount(); c++ )
    {
      RestParamProperty property = params.getPropertyAt( c );
      if( !hasProperty( property.getName() ) )
      {
        addParameter( property );
      }
    }
  }

  public void addParameter( RestParamProperty property )
  {
    RestParamProperty prop = addProperty( property.getName() );
    prop.setStyle( property.getStyle() );
    prop.setValue( property.getValue() );
    prop.setType( property.getType() );
    prop.setDefaultValue( property.getDefaultValue() );
    prop.setDescription( property.getDescription() );
    prop.setOptions( property.getOptions() );
    prop.setPath( property.getPath() );
    prop.setRequired( property.getRequired() );
  }

  public void release()
  {
  }

  public RestParamProperty addProperty( XmlBeansRestParamProperty prop )
  {
    RestParameterConfig propertyConfig = ( RestParameterConfig )config.addNewParameter().set( prop.getConfig() );
    return addProperty( propertyConfig, true );
  }
}
TOP

Related Classes of com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder

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.