/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.adapter.user; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.ralasafe.db.ComplexTable; import org.ralasafe.db.DBPower; import org.ralasafe.db.MapStorageObjectNewer; import org.ralasafe.db.MapStorgeColumnAdapter; import org.ralasafe.db.MapStorgeObject; import org.ralasafe.db.MultiValueTableAdapter; import org.ralasafe.db.SingleValueTableAdapter; import org.ralasafe.db.Table; import org.ralasafe.db.TableNewer; import org.ralasafe.db.impl.ComplexTableDeletorImpl; import org.ralasafe.db.impl.ComplexTableSaverImpl; import org.ralasafe.db.impl.ComplexTableSelectorImpl; import org.ralasafe.db.impl.ComplexTableUpdatorImpl; import org.ralasafe.metadata.user.FieldMetadata; import org.ralasafe.metadata.user.TableMetadata; import org.ralasafe.metadata.user.UserMetadata; import org.ralasafe.user.User; import org.ralasafe.util.Util; public class UserComplexTableAdapter { private UserMetadata userMetadata; private ComplexTable complexTable; private String[] idNames = new String[] { User.idFieldName }; private String idColumnName; private SingleValueTableAdapter[] singleValueTableAdapters; private MultiValueTableAdapter[] multiValueTableAdapters; private ComplexTableDeletorImpl deletor; private ComplexTableSaverImpl saver; private ComplexTableUpdatorImpl updator; private ComplexTableSelectorImpl selector; public UserComplexTableAdapter(UserMetadata userMetadata) { this.userMetadata = userMetadata; adapter(); FieldMetadata[] fields = userMetadata.getMainTableMetadata() .getFields(); for (int i = 0; i < fields.length; i++) { FieldMetadata field = fields[i]; if (field.getName().equals(User.idFieldName)) { idColumnName = field.getColumnName(); } } readySingleValueTableAdapter(); readyMultiValueTableAdapter(); readyDeletor(); readySaver(); readyUpdator(); readySelector(); } public ComplexTableDeletorImpl getDeletor() { return deletor; } public ComplexTableSaverImpl getSaver() { return saver; } public ComplexTableUpdatorImpl getUpdator() { return updator; } public ComplexTableSelectorImpl getSelector() { return selector; } private void readySelector() { selector = new ComplexTableSelectorImpl(); selector.setComplexTable(complexTable); selector.setMainTableObjectNewer(new MapStorageObjectNewer()); selector.setSingleValueAdapters(singleValueTableAdapters); selector.setMultiValueAdapters(multiValueTableAdapters); } private void readySingleValueTableAdapter() { singleValueTableAdapters = complexTable .getDefaultSingleValueTableAdapters(); /** * Table[] singleValueTables=complexTable.getSingleValueTables(); if( * !Util.isEmpty( singleValueTables ) ) { singleValueTableAdapters=new * DefaultSingleValueTableAdapter[singleValueTables.length]; for( int * i=0; i<singleValueTables.length; i++ ) { Table * table=singleValueTables[i]; String mapKey=table.getId()+""; * * DefaultSingleValueTableAdapter adapter=new * DefaultSingleValueTableAdapter( mapKey, idColumnName ); * singleValueTableAdapters[i]=adapter; } } */ } private void readyMultiValueTableAdapter() { multiValueTableAdapters = complexTable .getDefaultMultiValueTableAdapters(); /** * Table[] multiValueTables=complexTable.getMultiValueTables(); if( * !Util.isEmpty( multiValueTables ) ) { multiValueTableAdapters=new * DefaultMultiValueTableAdapter[multiValueTables.length]; for( int i=0; * i<multiValueTables.length; i++ ) { Table table=multiValueTables[i]; * String mapKey=table.getId()+""; * * DefaultMultiValueTableAdapter adapter=new * DefaultMultiValueTableAdapter( mapKey, idColumnName ); * multiValueTableAdapters[i]=adapter; } } */ } private void readyUpdator() { updator = new ComplexTableUpdatorImpl(); updator.setComplexTable(complexTable); updator.setSingleValueAdapters(singleValueTableAdapters); updator.setMultiValueAdapters(multiValueTableAdapters); } private void readySaver() { saver = new ComplexTableSaverImpl(); saver.setComplexTable(complexTable); saver.setSingleValueAdapters(singleValueTableAdapters); saver.setMultiValueAdapters(multiValueTableAdapters); } private void readyDeletor() { deletor = new ComplexTableDeletorImpl(); deletor.setComplexTable(complexTable); } public ComplexTable getComplexTable() { return complexTable; } public User toUser(MapStorgeObject mso) { if (mso == null) return null; User user = new User(); readFromMainTable(mso, user); readFromSingleValueTables(mso, user); readFromMultiValueTables(mso, user); return user; } private void readFromMultiValueTables(MapStorgeObject mso, User user) { TableMetadata[] tableMds = userMetadata.getMultiValueTableMetadatas(); if (Util.isEmpty(tableMds)) return; Table[] tables = complexTable.getMultiValueTables(); for (int tableIndex = 0; tableIndex < tableMds.length; tableIndex++) { TableMetadata tableMd = tableMds[tableIndex]; FieldMetadata[] fields = tableMd.getFields(); String mapKey = tables[tableIndex].getId() + ""; List tableMsos = (List) mso.get(mapKey); if (tableMsos != null) { for (int fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) { FieldMetadata field = fields[fieldIndex]; String columnName = field.getColumnName(); String name = field.getName(); if (!name.equals(User.idFieldName)) { List values = new ArrayList(tableMsos.size()); for (Iterator iter = tableMsos.iterator(); iter .hasNext();) { MapStorgeObject tableMso = (MapStorgeObject) iter .next(); Object value = tableMso.get(columnName); values.add(value); } user.set(name, values); }// end of if }// end of fields for loop }// end of tableMsos if } } private void readFromSingleValueTables(MapStorgeObject mso, User user) { TableMetadata[] tableMds = userMetadata.getSingleValueTableMetadatas(); if (Util.isEmpty(tableMds)) return; Table[] tables = complexTable.getSingleValueTables(); for (int tableIndex = 0; tableIndex < tableMds.length; tableIndex++) { TableMetadata tableMd = tableMds[tableIndex]; FieldMetadata[] fields = tableMd.getFields(); String mapKey = tables[tableIndex].getId() + ""; MapStorgeObject tableMso = (MapStorgeObject) mso.get(mapKey); if (tableMso != null) { for (int fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) { FieldMetadata field = fields[fieldIndex]; String columnName = field.getColumnName(); Object value = tableMso.get(columnName); String name = field.getName(); if (!name.equals(User.idFieldName)) user.set(name, value); } } } } private void readFromMainTable(MapStorgeObject mso, User user) { TableMetadata mainTableMetadata = userMetadata.getMainTableMetadata(); FieldMetadata[] fields = mainTableMetadata.getFields(); for (int i = 0; i < fields.length; i++) { String columnName = fields[i].getColumnName(); Object value = mso.get(columnName); String name = fields[i].getName(); user.set(name, value); } } public MapStorgeObject toMSO(User user) { if (user == null) { return null; } MapStorgeObject mso = new MapStorgeObject(); setMainTableValues(user, mso); setSingleValueTableValues(user, mso); setMultiValueTableValues(user, mso); return mso; } private void setMultiValueTableValues(User user, MapStorgeObject mso) { TableMetadata[] tableMds = userMetadata.getMultiValueTableMetadatas(); if (Util.isEmpty(tableMds)) { return; } Table[] tables = complexTable.getMultiValueTables(); for (int tableIndex = 0; tableIndex < tableMds.length; tableIndex++) { TableMetadata tableMd = tableMds[tableIndex]; FieldMetadata[] fields = tableMd.getFields(); String mapKey = tables[tableIndex].getId() + ""; Object idValue = mso.get(User.idFieldName); List[] values = new List[fields.length - 1]; Iterator[] iters = new Iterator[values.length]; String[] columnNames = new String[values.length]; String idColumnName = ""; int index = 0; int maxSize = 0; for (int fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) { FieldMetadata field = fields[fieldIndex]; String columnName = field.getColumnName(); String name = field.getName(); if (name.equals(User.idFieldName)) { idColumnName = columnName; } else { List fieldValues = (List) user.get(name); if (fieldValues == null) { fieldValues = new ArrayList(0); } values[index] = fieldValues; iters[index] = fieldValues.iterator(); columnNames[index] = columnName; index++; int size = fieldValues.size(); if (size > maxSize) { maxSize = size; } } } if (maxSize > 0) { List tableMsos = new ArrayList(maxSize); mso.put(mapKey, tableMsos); for (int msoIndex = 0; msoIndex < maxSize; msoIndex++) { MapStorgeObject tableMso = new MapStorgeObject(); tableMsos.add(tableMso); tableMso.put(idColumnName, idValue); for (int iterIndex = 0; iterIndex < iters.length; iterIndex++) { Iterator iter = iters[iterIndex]; if (iter.hasNext()) { tableMso.put(columnNames[iterIndex], iter.next()); }/* * else { tableMso.put( columnNames[i], null ); } */ } } } } } private void setSingleValueTableValues(User user, MapStorgeObject mso) { TableMetadata[] tableMds = userMetadata.getSingleValueTableMetadatas(); if (Util.isEmpty(tableMds)) { return; } Table[] tables = complexTable.getSingleValueTables(); for (int i = 0; i < tableMds.length; i++) { TableMetadata tableMd = tableMds[i]; FieldMetadata[] fields = tableMd.getFields(); String mapKey = tables[i].getId() + ""; Object idValue = mso.get(User.idFieldName); String idColumnName = ""; boolean noValue = true; MapStorgeObject tableMso = new MapStorgeObject(); for (int j = 0; j < fields.length; j++) { FieldMetadata field = fields[j]; String columnName = field.getColumnName(); String name = field.getName(); if (name.equals(User.idFieldName)) { idColumnName = columnName; } else { Object value = user.get(name); tableMso.put(columnName, value); if (noValue && value != null) { noValue = false; } } } if (!noValue) { tableMso.put(idColumnName, idValue); mso.put(mapKey, tableMso); } } } private void setMainTableValues(User user, MapStorgeObject mso) { TableMetadata table = userMetadata.getMainTableMetadata(); FieldMetadata[] fields = table.getFields(); for (int i = 0; i < fields.length; i++) { FieldMetadata field = fields[i]; String columnName = field.getColumnName(); String name = field.getName(); Object value = user.get(name); mso.put(columnName, value); } } private ComplexTable adapter() { complexTable = new ComplexTable(); TableMetadata mainTableMetadata = userMetadata.getMainTableMetadata(); Table mainTable = adapter(mainTableMetadata, false); complexTable.setMainTable(mainTable); // complexTable.setIdColumns( mainTable.getIdColumns() ); TableMetadata[] singleValueTableMetadatas = userMetadata .getSingleValueTableMetadatas(); complexTable.setSingleValueTables(adapter(singleValueTableMetadatas, false)); TableMetadata[] multiValueTableMetadatas = userMetadata .getMultiValueTableMetadatas(); complexTable .setMultiValueTables(adapter(multiValueTableMetadatas, true)); return complexTable; } private Table[] adapter(TableMetadata[] tablesMetadatas, boolean isMulti) { if (Util.isEmpty(tablesMetadatas)) return null; Table[] tables = new Table[tablesMetadatas.length]; for (int i = 0; i < tables.length; i++) { tables[i] = adapter(tablesMetadatas[i], isMulti); } return tables; } public Table adapter(TableMetadata table, boolean isMulti) { FieldMetadata[] fields = table.getFields(); FieldMetadata[] uniqueFields = table.getUniqueFields(); TableNewer tn = new TableNewer(); String[] names = getColumnNames(fields); tn.setColumnNames(names); tn.setId(DBPower.getTableId(table.getDatasourceName(), table .getSqlTableName())); String idColumnName=null; for (int i = 0; i < fields.length; i++) { FieldMetadata metadata=fields[i]; if( metadata.getName().equals( User.idFieldName ) ) { idColumnName=metadata.getColumnName(); break; } } if (!isMulti) { tn.setIdColumnNames(new String[]{idColumnName}); } tn.setTableName(table.getSqlTableName()); tn.setUniqueColumnNames(getColumnNames(uniqueFields)); for (int i = 0; i < fields.length; i++) { String name = fields[i].getColumnName(); tn.put(name, new MapStorgeColumnAdapter(name, fields[i] .getJavaType())); } Table table2 = tn.getTable(); table2.setDatasourceName(table.getDatasourceName()); return table2; } private String[] getColumnNames(FieldMetadata[] fields) { if (fields==null||Util.isEmpty(fields)) return null; String[] names = new String[fields.length]; for (int i = 0; i < names.length; i++) { names[i] = fields[i].getColumnName(); } return names; } public User javabeanToUser(MapStorgeObject mso) { if (mso == null) return null; User user = new User(); user.setId( mso.get( User.idFieldName ) ); FieldMetadata[] fields=userMetadata.getMainTableMetadata().getFields(); for( int i=0; i<fields.length; i++ ) { String name=fields[i].getName(); user.set( name, mso.get( name ) ); } return user; } }