package org.etk.orm.plugins.bean.mapping;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.etk.orm.api.NameConflictResolution;
import org.etk.orm.plugins.bean.BeanInfo;
import org.etk.reflect.api.ClassTypeInfo;
public class BeanMapping {
/** . */
final BeanInfo bean;
/** . */
BeanMapping parent;
/** . */
final Map<String, PropertyMapping<?, ?, ?>> properties;
/** . */
final Map<String, PropertyMapping<?, ?, ?>> unmodifiableProperties;
/** . */
final List<MethodMapping> methods;
/** . */
final List<MethodMapping> unmodifiableMethods;
/** . */
final NodeTypeKind nodeTypeKind;
/** . */
final ClassTypeInfo formatterClassType;
/** . */
final String nodeTypeName;
/** . */
final boolean orderable;
/** . */
final boolean abstract_;
/** . */
final NameConflictResolution onDuplicate;
/** . */
final String prefix;
public BeanMapping(
BeanInfo bean,
NodeTypeKind nodeTypeKind,
String nodeTypeName,
NameConflictResolution onDuplicate,
ClassTypeInfo formatterClassType,
boolean orderable,
boolean abstract_,
String prefix) {
this.bean = bean;
this.nodeTypeKind = nodeTypeKind;
this.nodeTypeName = nodeTypeName;
this.orderable = orderable;
this.abstract_ = abstract_;
this.properties = new HashMap<String, PropertyMapping<?, ?, ?>>();
this.unmodifiableProperties = Collections.unmodifiableMap(properties);
this.methods = new ArrayList<MethodMapping>();
this.unmodifiableMethods = Collections.unmodifiableList(methods);
this.onDuplicate = onDuplicate;
this.formatterClassType = formatterClassType;
this.prefix = prefix;
}
public NodeTypeKind getNodeTypeKind() {
return nodeTypeKind;
}
public String getNodeTypeName() {
return nodeTypeName;
}
public ClassTypeInfo getFormatterClassType() {
return formatterClassType;
}
public NameConflictResolution getOnDuplicate() {
return onDuplicate;
}
public boolean isOrderable() {
return orderable;
}
public boolean isAbstract() {
return abstract_;
}
public BeanInfo getBean() {
return bean;
}
public Map<String, PropertyMapping<?, ?, ?>> getProperties() {
return properties;
}
public Collection<MethodMapping> getMethods() {
return methods;
}
public String getPrefix() {
return prefix;
}
public <M extends PropertyMapping<?, ?, ?>> M getPropertyMapping(String name, Class<M> type) {
PropertyMapping<?, ?, ?> mapping = properties.get(name);
if (type.isInstance(mapping)) {
return type.cast(mapping);
} else {
return null;
}
}
public void accept(MappingVisitor visitor) {
visitor.startBean(this);
for (PropertyMapping<?, ?, ?> property : properties.values()) {
property.accept(visitor);
}
for (MethodMapping method : methods) {
method.accept(visitor);
}
visitor.endBean();
}
@Override
public String toString() {
return "BeanMapping[info=" + bean + "]";
}
}