/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     bdoughan - Mar 17/2009 - 2.0 - Initial implementation
package org.eclipse.persistence.testing.sdo.helper.classgen.dynamicimpl;

public interface DataTypes {

   public java.lang.Object getAnySimpleTypeProperty();

   public void setAnySimpleTypeProperty(java.lang.Object value);

   public commonj.sdo.DataObject getAnyTypeProperty();

   public void setAnyTypeProperty(commonj.sdo.DataObject value);

   public java.lang.String getAnyURIProperty();

   public void setAnyURIProperty(java.lang.String value);

   public byte[] getBase64BinaryProperty();

   public void setBase64BinaryProperty(byte[] value);

   public boolean isBooleanProperty();

   public void setBooleanProperty(boolean value);

   public byte getByteProperty();

   public void setByteProperty(byte value);

   public java.lang.String getDateProperty();

   public void setDateProperty(java.lang.String value);

   public java.lang.String getDateTimeProperty();

   public void setDateTimeProperty(java.lang.String value);

   public java.math.BigDecimal getDecimalProperty();

   public void setDecimalProperty(java.math.BigDecimal value);

   public double getDoubleProperty();

   public void setDoubleProperty(double value);

   public java.lang.String getDurationProperty();

   public void setDurationProperty(java.lang.String value);

   public java.util.List getENTITIESProperty();

   public void setENTITIESProperty(java.util.List value);

   public java.lang.String getENTITYProperty();

   public void setENTITYProperty(java.lang.String value);

   public float getFloatProperty();

   public void setFloatProperty(float value);

   public java.lang.String getGDayProperty();

   public void setGDayProperty(java.lang.String value);

   public java.lang.String getGMonthProperty();

   public void setGMonthProperty(java.lang.String value);

   public java.lang.String getGMonthDayProperty();

   public void setGMonthDayProperty(java.lang.String value);

   public java.lang.String getGYearProperty();

   public void setGYearProperty(java.lang.String value);

   public java.lang.String getGYearMonthProperty();

   public void setGYearMonthProperty(java.lang.String value);

   public byte[] getHexBinaryProperty();

   public void setHexBinaryProperty(byte[] value);

   public java.lang.String getIDProperty();

   public void setIDProperty(java.lang.String value);

   public java.lang.String getIDREFProperty();

   public void setIDREFProperty(java.lang.String value);

   public int getIntProperty();

   public void setIntProperty(int value);

   public java.math.BigInteger getIntegerProperty();

   public void setIntegerProperty(java.math.BigInteger value);

   public java.lang.String getLanguageProperty();

   public void setLanguageProperty(java.lang.String value);

   public long getLongProperty();

   public void setLongProperty(long value);

   public java.lang.String getNameProperty();

   public void setNameProperty(java.lang.String value);

   public java.lang.String getNCNameProperty();

   public void setNCNameProperty(java.lang.String value);

   public java.math.BigInteger getNegativeIntegerProperty();

   public void setNegativeIntegerProperty(java.math.BigInteger value);

   public java.lang.String getNMTOKENProperty();

   public void setNMTOKENProperty(java.lang.String value);

   public java.util.List getNMTOKENSProperty();

   public void setNMTOKENSProperty(java.util.List value);

   public java.math.BigInteger getNonNegativeIntegerProperty();

   public void setNonNegativeIntegerProperty(java.math.BigInteger value);

   public java.math.BigInteger getNonPositiveIntegerProperty();

   public void setNonPositiveIntegerProperty(java.math.BigInteger value);

   public java.lang.String getNormalizedStringProperty();

   public void setNormalizedStringProperty(java.lang.String value);

   public java.lang.String getNOTATION();

   public void setNOTATION(java.lang.String value);

   public java.math.BigInteger getPositiveIntegerProperty();

   public void setPositiveIntegerProperty(java.math.BigInteger value);

   public java.lang.String getQName();

   public void setQName(java.lang.String value);

   public short getShort();

   public void setShort(short value);

   public java.lang.String getString();

   public void setString(java.lang.String value);

   public java.lang.String getTime();

   public void setTime(java.lang.String value);

   public java.lang.String getToken();

   public void setToken(java.lang.String value);

   public short getUnsignedByte();

   public void setUnsignedByte(short value);

   public long getUnsignedInt();

   public void setUnsignedInt(long value);

   public java.math.BigInteger getUnsignedLong();

   public void setUnsignedLong(java.math.BigInteger value);

   public int getUnsignedShort();

   public void setUnsignedShort(int value);


}
