org.apache.openjpa.persistence.jest.MetamodelHelper Maven / Gradle / Ivy
/*
* 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.openjpa.persistence.jest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.MapAttribute;
import javax.persistence.metamodel.Metamodel;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.JavaTypes;
import org.apache.openjpa.persistence.meta.Members;
/**
* @author Pinaki Poddar
*
*/
public class MetamodelHelper {
public static final char DASH = '-';
public static final char UNDERSCORE = '_';
/**
* Attribute Category makes a finer distinction over PersistentAttributeType declared in
* {@link Attribute.PersistentAttributeType} such as id, version, lob or enum.
*
* Important: The name of the enumerated elements is important because
* a) some of these names are same as in Attribute.PersistentAttributeType enumeration
* b) names are used by XML serialization with underscores replaced by dash and decapitalized
*
*/
public static enum AttributeCategory {
ID, VERSION, BASIC, ENUM, EMBEDDED, LOB,
ONE_TO_ONE, MANY_TO_ONE, ONE_TO_MANY, ELEMENT_COLLECTION, MANY_TO_MANY
}
public static List> getAttributesInOrder(Class> cls, Metamodel model) {
return getAttributesInOrder(model.managedType(cls));
}
public static List> getAttributesInOrder(ClassMetaData meta, Metamodel model) {
return getAttributesInOrder(meta.getDescribedType(), model);
}
/**
* Gets the attributes of the given type in defined order.
* @param type
*/
public static List> getAttributesInOrder(ManagedType> type) {
List> list = new ArrayList>(type.getAttributes());
Collections.sort(list, new AttributeComparator());
return list;
}
public static boolean isId(Attribute,?> a) {
if (a instanceof SingularAttribute)
return ((SingularAttribute,?>)a).isId();
return false;
}
public static boolean isVersion(Attribute,?> a) {
if (a instanceof SingularAttribute)
return ((SingularAttribute,?>)a).isVersion();
return false;
}
public static boolean isEnum(Attribute,?> a) {
if (a instanceof Members.Member) {
int type = ((Members.Member,?>)a).fmd.getDeclaredTypeCode();
return type == JavaTypes.ENUM;
}
return false;
}
public static boolean isLob(Attribute,?> a) {
if (a instanceof Members.Member) {
int type = ((Members.Member,?>)a).fmd.getDeclaredTypeCode();
return type == JavaTypes.INPUT_READER || type == JavaTypes.INPUT_STREAM;
}
return false;
}
/**
* Gets a ordinal value of enumerated persistent attribute category.
*
* @param attr
*/
public static AttributeCategory getAttributeCategory(Attribute,?> attr) {
if (isId(attr))
return AttributeCategory.ID;
if (isVersion(attr))
return AttributeCategory.VERSION;
if (isLob(attr))
return AttributeCategory.LOB;
if (isEnum(attr))
return AttributeCategory.ENUM;
switch (attr.getPersistentAttributeType()) {
case BASIC :
return AttributeCategory.BASIC;
case EMBEDDED:
return AttributeCategory.EMBEDDED;
case ONE_TO_ONE:
return AttributeCategory.ONE_TO_ONE;
case MANY_TO_ONE:
return AttributeCategory.MANY_TO_ONE;
case ONE_TO_MANY:
case ELEMENT_COLLECTION:
return AttributeCategory.ONE_TO_MANY;
case MANY_TO_MANY:
return AttributeCategory.MANY_TO_MANY;
}
throw new RuntimeException(attr.toString());
}
public static String getTagByAttributeType(Attribute, ?> attr) {
return getAttributeCategory(attr).name().replace(UNDERSCORE, DASH).toLowerCase();
}
/**
* Gets name of the attribute type. For collection and map type attribute, the name is
* appended with generic type argument names.
* @param attr
*/
public static String getAttributeTypeName(Attribute, ?> attr) {
StringBuilder name = new StringBuilder(attr.getJavaType().getSimpleName());
switch (attr.getPersistentAttributeType()) {
case ONE_TO_MANY:
case ELEMENT_COLLECTION:
name.append("<")
.append(((PluralAttribute,?,?>)attr).getBindableJavaType().getSimpleName())
.append(">");
break;
case MANY_TO_MANY:
name.append("<")
.append(((MapAttribute,?,?>)attr).getKeyJavaType().getSimpleName())
.append(',')
.append(((MapAttribute,?,?>)attr).getBindableJavaType().getSimpleName())
.append(">");
break;
default:
}
return name.toString();
}
/**
* Compares attribute by their category and within the same category by name.
*
*/
public static class AttributeComparator implements Comparator> {
public int compare(Attribute, ?> a1, Attribute, ?> a2) {
AttributeCategory t1 = getAttributeCategory(a1);
AttributeCategory t2 = getAttributeCategory(a2);
if (t1.equals(t2)) {
return a1.getName().compareTo(a2.getName());
} else {
return t1.compareTo(t2);
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy