/*
 * Copyright (c) 2013, 2014 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.model6.impl;

import org.eclipse.emf.cdo.tests.model6.Model6Package;
import org.eclipse.emf.cdo.tests.model6.UnsettableAttributes;

import org.eclipse.emf.internal.cdo.CDOObjectImpl;

import org.eclipse.emf.ecore.EClass;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Unsettable Attributes</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrBigDecimal <em>Attr Big Decimal</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrBigInteger <em>Attr Big Integer</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#isAttrBoolean <em>Attr Boolean</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrBooleanObject <em>Attr Boolean Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrByte <em>Attr Byte</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrByteArray <em>Attr Byte Array</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrByteObject <em>Attr Byte Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrChar <em>Attr Char</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrCharacterObject <em>Attr Character Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrDate <em>Attr Date</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrDouble <em>Attr Double</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrDoubleObject <em>Attr Double Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrFloat <em>Attr Float</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrFloatObject <em>Attr Float Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrInt <em>Attr Int</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrIntegerObject <em>Attr Integer Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrJavaClass <em>Attr Java Class</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrJavaObject <em>Attr Java Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrLong <em>Attr Long</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrLongObject <em>Attr Long Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrShort <em>Attr Short</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrShortObject <em>Attr Short Object</em>}</li>
 *   <li>{@link org.eclipse.emf.cdo.tests.model6.impl.UnsettableAttributesImpl#getAttrString <em>Attr String</em>}</li>
 * </ul>
 *
 * @generated
 */
public class UnsettableAttributesImpl extends CDOObjectImpl implements UnsettableAttributes
{
  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  protected UnsettableAttributesImpl()
  {
    super();
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  protected EClass eStaticClass()
  {
    return Model6Package.Literals.UNSETTABLE_ATTRIBUTES;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  protected int eStaticFeatureCount()
  {
    return 0;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public BigDecimal getAttrBigDecimal()
  {
    return (BigDecimal)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_DECIMAL, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrBigDecimal(BigDecimal newAttrBigDecimal)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_DECIMAL, newAttrBigDecimal);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrBigDecimal()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_DECIMAL);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrBigDecimal()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_DECIMAL);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public BigInteger getAttrBigInteger()
  {
    return (BigInteger)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_INTEGER, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrBigInteger(BigInteger newAttrBigInteger)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_INTEGER, newAttrBigInteger);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrBigInteger()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_INTEGER);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrBigInteger()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BIG_INTEGER);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isAttrBoolean()
  {
    return (Boolean)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrBoolean(boolean newAttrBoolean)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN, newAttrBoolean);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrBoolean()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrBoolean()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Boolean getAttrBooleanObject()
  {
    return (Boolean)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrBooleanObject(Boolean newAttrBooleanObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN_OBJECT, newAttrBooleanObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrBooleanObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrBooleanObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BOOLEAN_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public byte getAttrByte()
  {
    return (Byte)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrByte(byte newAttrByte)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE, newAttrByte);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrByte()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrByte()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public byte[] getAttrByteArray()
  {
    return (byte[])eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_ARRAY, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrByteArray(byte[] newAttrByteArray)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_ARRAY, newAttrByteArray);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrByteArray()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_ARRAY);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrByteArray()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_ARRAY);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Byte getAttrByteObject()
  {
    return (Byte)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrByteObject(Byte newAttrByteObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_OBJECT, newAttrByteObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrByteObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrByteObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_BYTE_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public char getAttrChar()
  {
    return (Character)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHAR, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrChar(char newAttrChar)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHAR, newAttrChar);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrChar()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHAR);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrChar()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHAR);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Character getAttrCharacterObject()
  {
    return (Character)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHARACTER_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrCharacterObject(Character newAttrCharacterObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHARACTER_OBJECT, newAttrCharacterObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrCharacterObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHARACTER_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrCharacterObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_CHARACTER_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Date getAttrDate()
  {
    return (Date)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DATE, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrDate(Date newAttrDate)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DATE, newAttrDate);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrDate()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DATE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrDate()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DATE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public double getAttrDouble()
  {
    return (Double)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrDouble(double newAttrDouble)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE, newAttrDouble);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrDouble()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrDouble()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Double getAttrDoubleObject()
  {
    return (Double)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrDoubleObject(Double newAttrDoubleObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE_OBJECT, newAttrDoubleObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrDoubleObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrDoubleObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_DOUBLE_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public float getAttrFloat()
  {
    return (Float)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrFloat(float newAttrFloat)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT, newAttrFloat);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrFloat()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrFloat()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Float getAttrFloatObject()
  {
    return (Float)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrFloatObject(Float newAttrFloatObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT_OBJECT, newAttrFloatObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrFloatObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrFloatObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_FLOAT_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public int getAttrInt()
  {
    return (Integer)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrInt(int newAttrInt)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INT, newAttrInt);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrInt()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrInt()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Integer getAttrIntegerObject()
  {
    return (Integer)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INTEGER_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrIntegerObject(Integer newAttrIntegerObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INTEGER_OBJECT, newAttrIntegerObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrIntegerObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INTEGER_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrIntegerObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_INTEGER_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Class<?> getAttrJavaClass()
  {
    return (Class<?>)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_CLASS, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrJavaClass(Class<?> newAttrJavaClass)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_CLASS, newAttrJavaClass);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrJavaClass()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_CLASS);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrJavaClass()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_CLASS);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Object getAttrJavaObject()
  {
    return eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrJavaObject(Object newAttrJavaObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_OBJECT, newAttrJavaObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrJavaObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrJavaObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_JAVA_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public long getAttrLong()
  {
    return (Long)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrLong(long newAttrLong)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG, newAttrLong);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrLong()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrLong()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Long getAttrLongObject()
  {
    return (Long)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrLongObject(Long newAttrLongObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG_OBJECT, newAttrLongObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrLongObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrLongObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_LONG_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public short getAttrShort()
  {
    return (Short)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrShort(short newAttrShort)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT, newAttrShort);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrShort()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrShort()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public Short getAttrShortObject()
  {
    return (Short)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT_OBJECT, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrShortObject(Short newAttrShortObject)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT_OBJECT, newAttrShortObject);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrShortObject()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrShortObject()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_SHORT_OBJECT);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public String getAttrString()
  {
    return (String)eGet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_STRING, true);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAttrString(String newAttrString)
  {
    eSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_STRING, newAttrString);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void unsetAttrString()
  {
    eUnset(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_STRING);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public boolean isSetAttrString()
  {
    return eIsSet(Model6Package.Literals.UNSETTABLE_ATTRIBUTES__ATTR_STRING);
  }

} // UnsettableAttributesImpl
