/*
* Copyright 2005 Assaf Arkin, Thomas Yip, Bruce Snyder, Werner Guttmann, Ralf Joachim
*
* Licensed 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.
*
* $Id$
*/
package org.exolab.castor.jdo.engine;
import org.exolab.castor.jdo.engine.nature.ClassDescriptorJDONature;
import org.exolab.castor.jdo.engine.nature.FieldDescriptorJDONature;
import org.exolab.castor.mapping.ClassDescriptor;
import org.exolab.castor.mapping.FieldDescriptor;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.ClassDescriptorImpl;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
/**
* @author <a href="mailto:arkin AT intalio DOT com">Assaf Arkin</a>
* @author <a href="mailto:yip AT intalio DOT com">Thomas Yip</a>
* @author <a href="mailto:ferret AT frii DOT com">Bruce Snyder</a>
* @author <a href="mailto:werner DOT guttmann AT gmx DOT net">Werner Guttmann</a>
* @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
* @version $Revision$ $Date: 2006-01-21 04:05:17 -0700 (Sat, 21 Jan 2006) $
* @since 1.0
*/
public class SQLFieldInfo {
private final String _tableName;
/** Variable holding the alias for this table. */
private String _tableAlias;
private final boolean _store;
private final boolean _multi;
private final boolean _joined;
private final boolean _dirtyCheck;
private final String[] _joinFields;
private final SQLColumnInfo[] _columns;
private final FieldDescriptor _fieldDescriptor;
public SQLFieldInfo(final ClassDescriptor clsDesc,
final FieldDescriptor fieldDesc,
final String classTable, final boolean ext)
throws MappingException {
_fieldDescriptor = fieldDesc;
ClassDescriptor related = fieldDesc.getClassDescriptor();
if (related != null) {
if (!(related.hasNature(ClassDescriptorJDONature.class.getName()))) {
throw new MappingException("Related class is not JDOClassDescriptor");
}
FieldDescriptor[] relids = ((ClassDescriptorImpl) related).getIdentities();
String[] relnames = new String[relids.length];
for (int i = 0; i < relids.length; i++) {
relnames[i] = new FieldDescriptorJDONature(relids[i]).getSQLName()[0];
if (relnames[i] == null) {
throw new MappingException("Related class identities field does "
+ "not contains sql information!");
}
}
FieldDescriptor[] classids = ((ClassDescriptorImpl) clsDesc).getIdentities();
String[] classnames = new String[classids.length];
for (int i = 0; i < classids.length; i++) {
classnames[i] = new FieldDescriptorJDONature(classids[i]).getSQLName()[0];
if (classnames[i] == null) {
throw new MappingException("Related class identities field does "
+ "not contains sql information!");
}
}
String[] names = relnames;
if (!(fieldDesc.hasNature(FieldDescriptorJDONature.class.getName()))) {
_tableName = new ClassDescriptorJDONature(related).getTableName();
_store = false;
_multi = fieldDesc.isMultivalued();
_joined = true;
_joinFields = classnames;
_dirtyCheck = true;
} else {
final FieldDescriptorJDONature jdoFieldNature =
new FieldDescriptorJDONature(fieldDesc);
names = jdoFieldNature.getSQLName();
if ((names != null) && (names.length != relids.length)) {
throw new MappingException("The number of column of foreign keys "
+ "doesn't not match with what specified in manyKey");
}
names = (names != null) ? names : relnames;
String[] joins = jdoFieldNature.getManyKey();
if ((joins != null) && (joins.length != classids.length)) {
throw new MappingException("The number of column of foreign keys "
+ "doesn't not match with what specified in manyKey");
}
if (jdoFieldNature.getManyTable() != null) {
_tableName = jdoFieldNature.getManyTable();
_store = false;
_multi = fieldDesc.isMultivalued();
_joined = true;
_joinFields = (joins != null) ? joins : classnames;
} else if (jdoFieldNature.getSQLName() != null) {
_tableName = classTable;
_store = !ext && !jdoFieldNature.isReadonly();
_multi = false;
_joined = false;
_joinFields = classnames;
} else {
_tableName = new ClassDescriptorJDONature(related).getTableName();
_store = false;
_multi = fieldDesc.isMultivalued();
_joined = true;
_joinFields = (joins != null) ? joins : classnames;
}
_dirtyCheck = jdoFieldNature.isDirtyCheck();
}
_columns = new SQLColumnInfo[relids.length];
for (int i = 0; i < relids.length; i++) {
if (!(relids[i].hasNature(FieldDescriptorJDONature.class.getName()))) {
throw new MappingException("Related class identities field does "
+ "not contains sql information!");
}
FieldDescriptor relId = relids[i];
FieldHandlerImpl fh = (FieldHandlerImpl) relId.getHandler();
_columns[i] = new SQLColumnInfo(names[i],
new FieldDescriptorJDONature(relId).getSQLType()[0],
fh.getConvertTo(), fh.getConvertFrom());
}
} else {
final FieldDescriptorJDONature jdoFieldNature =
new FieldDescriptorJDONature(fieldDesc);
_tableName = classTable;
_store = !ext && !new FieldDescriptorJDONature(fieldDesc).isReadonly();
_multi = false;
_joined = false;
_joinFields = null;
_dirtyCheck = jdoFieldNature.isDirtyCheck();
_columns = new SQLColumnInfo[1];
String sqlName = fieldDesc.getFieldName();
if (jdoFieldNature.getSQLName() != null) {
sqlName = jdoFieldNature.getSQLName()[0];
}
FieldHandlerImpl fh = (FieldHandlerImpl) fieldDesc.getHandler();
_columns[0] = new SQLColumnInfo(sqlName,
jdoFieldNature.getSQLType()[0],
fh.getConvertTo(), fh.getConvertFrom());
}
}
public String getTableName() { return _tableName; }
/**
* Method returning table-alias currently set.
*
* @return Table-alias currently set.
*/
public String getTableAlias() { return _tableAlias; }
/**
* Method setting current table-alias.
*
* @param tableAlias Table-alias to be set.
*/
public void setTableAlias(final String tableAlias) { _tableAlias = tableAlias; }
public boolean isStore() { return _store; }
public boolean isMulti() { return _multi; }
public boolean isJoined() { return _joined; }
public boolean isDirtyCheck() { return _dirtyCheck; }
public String[] getJoinFields() { return _joinFields; }
public SQLColumnInfo[] getColumnInfo() { return _columns; }
public FieldDescriptor getFieldDescriptor() { return _fieldDescriptor; }
public String toString() {
return _tableName + "." + _fieldDescriptor.getFieldName();
}
}