blob: 29c441e01dd7969e5254ec230df931c5951a3b4a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.dbschema;
import java.sql.Types;
import org.netbeans.modules.dbschema.util.SQLTypeUtil;
/** Describes a column in a table.
*/
public class ColumnElement extends DBMemberElement {
/** Create a new column element represented in memory.
*/
public ColumnElement () {
this(new Memory(), null);
}
/** Creates a new column element.
* @param impl the pluggable implementation
* @param declaringTable declaring table of this column, or <code>null</code>
*/
public ColumnElement (Impl impl, TableElement declaringTable) {
super(impl, declaringTable);
}
/** Indicates whether some other object is "equal to" this one.
* @param obj the reference object with which to compare.
* @return true if this object is the same as the obj argument; false otherwise.
*/
public boolean equals(Object obj) {
Integer iThis, iArg;
if(!(obj instanceof ColumnElement))
return false;
ColumnElement ce = (ColumnElement) obj;
if(!getName().getFullName().equals(ce.getName().getFullName()))
return false;
if(getType() != ce.getType())
return false;
if(isNullable() != ce.isNullable())
return false;
// handle length
iThis = getLength();
iArg = ce.getLength();
if (iThis != null ^ iArg != null)
// return false, if one length is null and the other is not null
return false;
if (iThis != null && iArg != null && iThis.compareTo(iArg) != 0)
// return false, if both lengths are defined but do not compare equal
return false;
// handle scale
iThis = getScale();
iArg = ce.getScale();
if (iThis != null ^ iArg != null)
// return false, if one scale is null and the other is not null
return false;
if (iThis != null && iArg != null && iThis.compareTo(iArg) != 0)
// return false, if both scales are defined but do not compare equal
return false;
// handle precision
iThis = getPrecision();
iArg = ce.getPrecision();
if (iThis != null ^ iArg != null)
// return false, if one precision is null and the other is not null
return false;
if (iThis != null && iArg != null && iThis.compareTo(iArg) != 0)
// return false, if both precisions are defined but do not compare equal
return false;
return true;
}
/** Clone the column element.
* @return a new element that has the same values as the original but is represented in memory
*/
public Object clone () {
return new ColumnElement(new Memory(this), null);
}
/** Returns the implementation for the column.
* @return implementation for the column
*/
final Impl getColumnImpl() {
return (Impl)getElementImpl();
}
/** Get the value type of the column.
* @return the type
*/
public int getType () {
return getColumnImpl().getType();
}
/** Set the value type of the column.
* @param type the type
* @throws DBException if impossible
*/
public void setType (int type) throws DBException {
getColumnImpl().setType(type);
}
//convenience methods
/** Returns whether the data type is numeric.
* @return true if tha data type is numeric; false otherwise.
*/
public boolean isNumericType () {
return SQLTypeUtil.isNumeric(getType());
}
/** Returns whether the data type is character.
* @return true if tha data type is character; false otherwise.
*/
public boolean isCharacterType () {
return SQLTypeUtil.isCharacter(getType());
}
/** Returns whether the data type is blob type.
* @return true if tha data type is blob type; false otherwise.
*/
public boolean isBlobType () {
return SQLTypeUtil.isBlob(getType());
}
//end convenience methods
/**
* Returns whether the column is an auto-increment column
*
* @return true if the column is an auto-increment column; false otherwise,
* Also returns false if the underlying implementation does not provide
* that information.
*/
public boolean isAutoIncrement() {
return getColumnImpl().isAutoIncrement();
}
/** Returns whether the column is nullable.
* @return a flag representing whether the column is nullable
*/
public boolean isNullable () {
return getColumnImpl().isNullable();
}
/** Set whether the column is nullable.
* @param flag flag representing whether the column is nullable
* @throws DBException if impossible
*/
public void setNullable (boolean flag) throws DBException {
getColumnImpl().setNullable(flag);
}
/** Get the length of the column - for character type fields only.
* @return the length, <code>null</code> if it is not a character type
* field or there is no length.
*/
public Integer getLength () {
if (isCharacterType() || isBlobType())
return getColumnImpl().getLength();
else
return null;
}
/** Set the length of the column - for character type fields only.
* @param length the length for the column if it a character type
* @throws DBException if impossible
*/
public void setLength (Integer length) throws DBException {
if (isCharacterType() || isBlobType())
getColumnImpl().setLength(length);
}
/** Get the precision of the column - for numeric type fields only.
* @return the precision, <code>null</code> if it is not a numeric type
* field or there is no precision.
*/
public Integer getPrecision () {
if (isNumericType())
return getColumnImpl().getPrecision();
else
return null;
}
/** Set the precision of the column - for numeric type fields only.
* @param precision the precision for the column if it a numeric type
* @throws DBException if impossible
*/
public void setPrecision (Integer precision) throws DBException {
if (isNumericType())
getColumnImpl().setPrecision(precision);
}
/** Get the scale of the column - for numeric type fields only.
* @return the scale, <code>null</code> if it is not a numeric type
* field or there is no scale.
*/
public Integer getScale () {
if (isNumericType())
return getColumnImpl().getScale();
else
return null;
}
/** Set the scale of the column - for numeric type fields only.
* @param scale the scale for the column if it a numeric type
* @throws DBException if impossible
*/
public void setScale (Integer scale) throws DBException {
if (isNumericType())
getColumnImpl().setScale(scale);
}
/** Returns a string representation of the object.
* @return a string representation of the object.
*/
public String toString() {
return getName().toString();
}
/** Implementation of a column element.
* @see ColumnElement
*/
public interface Impl extends DBMemberElement.Impl {
/** Get the value type of the column.
* @return the type
*/
public int getType ();
public boolean isAutoIncrement();
/** Set the value type of the column.
* @param type the type
* @throws DBException if impossible
*/
public void setType (int type) throws DBException;
/** Returns whether the column is nullable.
* @return a flag representing whether the column is nullable
*/
public boolean isNullable ();
/** Set whether the column is nullable.
* @param flag flag representing whether the column is nullable
* @throws DBException if impossible
*/
public void setNullable (boolean flag) throws DBException;
/** Get the length of the column - for character type fields only.
* @return the length, <code>null</code> if it is not a character type
* field or there is no length.
*/
public Integer getLength ();
/** Set the length of the column - for character type fields only.
* @param length the length for the column if it a character type
* @throws DBException if impossible
*/
public void setLength (Integer length) throws DBException;
/** Get the precision of the column - for numeric type fields only.
* @return the precision, <code>null</code> if it is not a numeric type
* field or there is no precision.
*/
public Integer getPrecision ();
/** Set the precision of the column - for numeric type fields only.
* @param precision the precision for the column if it a numeric type
* @throws DBException if impossible
*/
public void setPrecision (Integer precision) throws DBException;
/** Get the scale of the column - for numeric type fields only.
* @return the scale, <code>null</code> if it is not a numeric type
* field or there is no scale.
*/
public Integer getScale ();
/** Set the scale of the column - for numeric type fields only.
* @param scale the scale for the column if it a numeric type
* @throws DBException if impossible
*/
public void setScale (Integer scale) throws DBException;
}
static class Memory extends DBMemberElement.Memory implements Impl {
/** Type of column */
private int _type;
/** Nullability flag */
private boolean _nullable;
/** Length of column */
private Integer _length;
/** Precision of column */
private Integer _precision;
/** Scale of column */
private Integer _scale;
/** Whether column is auto-increment */
private boolean _autoIncrement;
/** Default constructor.
*/
Memory () {
super();
_type = Types.NULL;
}
/** Copy constructor.
* @param column the object from which to read values
*/
Memory (ColumnElement column) {
super(column);
_type = column.getType();
_nullable = column.isNullable();
_length = column.getLength();
_precision = column.getPrecision();
_scale = column.getScale();
_autoIncrement = column.isAutoIncrement();
}
/** Type of the column.
* @return the type
*/
public int getType () {
return _type;
}
/** Setter for type of the column.
* @param type the column type
*/
public void setType (int type) {
int old = _type;
_type = type;
firePropertyChange (PROP_TYPE, new Integer(old), new Integer(type));
}
/** Returns whether the column is nullable.
* @return a flag representing whether the column is nullable
*/
public boolean isNullable () {
return _nullable;
}
/** Set whether the column is nullable.
* @param flag flag representing whether the column is nullable
* @throws DBException if impossible
*/
public void setNullable (boolean flag) throws DBException {
boolean old = _nullable;
_nullable = flag;
firePropertyChange (PROP_NULLABLE, Boolean.valueOf(old), Boolean.valueOf(flag));
}
/** Get the length of the column - for character type fields only.
* @return the length, <code>null</code> if it is not a character type
* field or there is no length.
*/
public Integer getLength () {
return _length;
}
/** Set the length of the column - for character type fields only.
* @param length the length for the column if it a character type
* @throws DBException if impossible
*/
public void setLength (Integer length) throws DBException {
Integer old = _length;
_length = length;
firePropertyChange (PROP_LENGTH, old, length);
}
/** Get the precision of the column - for numeric type fields only.
* @return the precision, <code>null</code> if it is not a numeric type
* field or there is no precision.
*/
public Integer getPrecision () {
return _precision;
}
/** Set the precision of the column - for numeric type fields only.
* @param precision the precision for the column if it a numeric type
* @throws DBException if impossible
*/
public void setPrecision (Integer precision) throws DBException {
Integer old = _precision;
_precision = precision;
firePropertyChange (PROP_PRECISION, old, precision);
}
/** Get the scale of the column - for numeric type fields only.
* @return the scale, <code>null</code> if it is not a numeric type
* field or there is no scale.
*/
public Integer getScale () {
return _scale;
}
/** Set the scale of the column - for numeric type fields only.
* @param scale the scale for the column if it a numeric type
* @throws DBException if impossible
*/
public void setScale (Integer scale) throws DBException {
Integer old = _scale;
_scale = scale;
firePropertyChange (PROP_SCALE, old, scale);
}
public boolean isAutoIncrement() {
return _autoIncrement;
}
}
}