/*****************************************************************
* 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.apache.cayenne.access.jdbc.reader;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.Map;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.map.EntityInheritanceTree;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.reflect.ClassDescriptor;
/**
* Deals with DataRow type conversion in inheritance situations.
*
* @since 1.2
*/
class DataRowPostProcessor {
private EntityInheritanceTree inheritanceTree;
private Map<String, Collection<ColumnOverride>> columnOverrides;
private Collection<ColumnOverride> defaultOverrides;
DataRowPostProcessor(ClassDescriptor classDescriptor, Map<String, Collection<ColumnOverride>> columnOverrides) {
if (classDescriptor != null && classDescriptor.hasSubclasses()) {
this.inheritanceTree = classDescriptor.getEntityInheritanceTree();
this.columnOverrides = columnOverrides;
} else {
if (columnOverrides.size() != 1) {
throw new IllegalArgumentException("No inheritance - there must be only one override set");
}
defaultOverrides = columnOverrides.values().iterator().next();
}
}
void postprocessRow(ResultSet resultSet, DataRow row) throws Exception {
Collection<ColumnOverride> overrides = getOverrides(row);
if (overrides != null) {
for (final ColumnOverride override : overrides) {
Object newValue = override.converter.materializeObject(resultSet, override.index, override.jdbcType);
row.put(override.key, newValue);
}
}
}
private final Collection<ColumnOverride> getOverrides(DataRow row) {
if (defaultOverrides != null) {
return defaultOverrides;
} else {
ObjEntity entity = inheritanceTree.entityMatchingRow(row);
return entity != null ? columnOverrides.get(entity.getName()) : null;
}
}
static final class ColumnOverride {
int index;
int jdbcType;
String key;
ExtendedType converter;
ColumnOverride(int index, String key, ExtendedType converter, int jdbcType) {
this.index = index;
this.key = key;
this.converter = converter;
this.jdbcType = jdbcType;
}
}
}