Package com.eviware.soapui.impl.settings

Source Code of com.eviware.soapui.impl.settings.XmlBeansSettingsImpl$InternalSettingsListener

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

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.eviware.soapui.config.SettingConfig;
import com.eviware.soapui.config.SettingsConfig;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.model.settings.SettingsListener;
import com.eviware.soapui.support.types.StringToStringMap;

/**
* Settings implementation for XmlBeans generated SettingsConfig
*
* @author Ole.Matzura
*/

public class XmlBeansSettingsImpl implements Settings
{
  private final Settings parent;
  private final SettingsConfig config;
  private final Map<String, SettingConfig> values = Collections.synchronizedMap( new HashMap<String, SettingConfig>() );
  private final Map<String, String> valueCache = Collections.synchronizedMap( new StringToStringMap() );
  private final Set<SettingsListener> listeners = new HashSet<SettingsListener>();
  private final ModelItem item;
  private final SettingsListener settingsListener = new WeakSettingsListener( new InternalSettingsListener() );

  public XmlBeansSettingsImpl( ModelItem item, Settings parent, SettingsConfig config )
  {
    this.item = item;
    this.config = config;
    this.parent = parent;

    List<SettingConfig> settingList = config.getSettingList();
    for( SettingConfig setting : settingList )
    {
      values.put( setting.getId(), setting );
    }

    if( parent != null )
    {
      parent.addSettingsListener( settingsListener );
    }
  }

  public boolean isSet( String id )
  {
    return values.containsKey( id );
  }

  public String getString( String id, String defaultValue )
  {
    String cachedValue = valueCache.get( id );
    if( cachedValue != null )
    {
      return cachedValue;
    }
    else
    {
      SettingConfig setting = values.get( id );
      if( setting != null )
      {
        String value = setting.getStringValue();
        valueCache.put( id, value );
        return value;
      }
    }

    return parent == null ? defaultValue : parent.getString( id, defaultValue );
  }

  public void setString( String id, String value )
  {
    String oldValue = getString( id, null );

    if( oldValue == null && value == null )
      return;

    if( value != null && value.equals( oldValue ) )
      return;

    if( value == null )
    {
      clearSetting( id );
    }
    else
    {
      if( !values.containsKey( id ) )
      {
        SettingConfig setting = config.addNewSetting();
        setting.setId( id );
        values.put( id, setting );
      }

      values.get( id ).setStringValue( value );
      valueCache.put( id, value );
    }

    notifySettingChanged( id, value, oldValue );
  }

  private void notifySettingChanged( String id, String value, String oldValue )
  {
    SettingsListener[] l = listeners.toArray( new SettingsListener[listeners.size()] );
    for( SettingsListener listener : l )
    {
      listener.settingChanged( id, value, oldValue );
    }
  }

  @Override
  public void reloadSettings()
  {
    notifySettingsReloaded();

  }

  private void notifySettingsReloaded()
  {
    SettingsListener[] l = listeners.toArray( new SettingsListener[listeners.size()] );
    for( SettingsListener listener : l )
    {
      listener.settingsReloaded();
    }
  }

  public boolean getBoolean( String id )
  {
    String value = getString( id, null );

    if( value != null )
      return Boolean.parseBoolean( value );

    return parent == null ? false : parent.getBoolean( id );
  }

  public long getLong( String id, long defaultValue )
  {
    String value = getString( id, null );

    if( value != null )
    {
      try
      {
        return Long.parseLong( value );
      }
      catch( NumberFormatException e )
      {
      }
    }

    return parent == null ? defaultValue : parent.getLong( id, defaultValue );
  }

  public void setBoolean( String id, boolean value )
  {
    if( !value )
      setString( id, "false" );
    else
      setString( id, "true" );
  }

  public void addSettingsListener( SettingsListener listener )
  {
    listeners.add( listener );
  }

  public void removeSettingsListener( SettingsListener listener )
  {
    listeners.remove( listener );
  }

  public void clearSetting( String id )
  {
    if( values.containsKey( id ) )
    {
      int ix = config.getSettingList().indexOf( values.get( id ) );
      config.removeSetting( ix );
      values.remove( id );
      valueCache.remove( id );
    }
  }

  public ModelItem getModelItem()
  {
    return item;
  }

  public void release()
  {
    if( listeners != null )
      listeners.clear();

    if( parent != null )
      parent.removeSettingsListener( settingsListener );
  }

  private final class InternalSettingsListener implements SettingsListener
  {
    public void settingChanged( String name, String newValue, String oldValue )
    {
      if( !values.containsKey( name ) )
      {
        notifySettingChanged( name, newValue, oldValue );
      }
    }

    @Override
    public void settingsReloaded()
    {
      notifySettingsReloaded();
    }
  }

  public void setLong( String id, long value )
  {
    setString( id, Long.toString( value ) );
  }

  public void setConfig( SettingsConfig soapuiSettings )
  {
    StringToStringMap changed = new StringToStringMap();

    for( SettingConfig config : soapuiSettings.getSettingList() )
    {
      if( !config.getStringValue().equals( getString( config.getId(), null ) ) )
        changed.put( config.getId(), getString( config.getId(), null ) );
    }

    values.clear();

    config.set( soapuiSettings );
    List<SettingConfig> settingList = config.getSettingList();
    for( SettingConfig setting : settingList )
    {
      values.put( setting.getId(), setting );
    }

    for( String key : changed.keySet() )
    {
      notifySettingChanged( key, getString( key, null ), changed.get( key ) );
    }
    notifySettingsReloaded();
  }

}
TOP

Related Classes of com.eviware.soapui.impl.settings.XmlBeansSettingsImpl$InternalSettingsListener

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.