use of com.disney.groovity.model.ModelSkip in project groovity by disney.
the class MetaPropertyLookup method getOrderedGettableProperties.
public static final MetaProperty[] getOrderedGettableProperties(Object o) {
final Class<?> c = o.getClass();
MetaProperty[] properties = orderedPropertiesCache.get(c);
if (properties == null) {
MetaClass mc = GroovySystem.getMetaClassRegistry().getMetaClass(c);
List<MetaProperty> mps = mc.getProperties();
TreeMap<String, MetaProperty> sortedProps;
String[] declaredOrder = null;
ModelOrder order = c.getAnnotation(ModelOrder.class);
if (order != null) {
declaredOrder = order.value();
} else {
XmlType xmlType = c.getAnnotation(XmlType.class);
if (xmlType != null) {
declaredOrder = xmlType.propOrder();
}
}
if (declaredOrder != null && declaredOrder.length > 0) {
final String[] declared = declaredOrder;
final int dl = declared.length;
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int p1 = dl;
int p2 = dl;
for (int i = 0; i < dl; i++) {
String d = declared[i];
if (o1.equals(d)) {
p1 = i;
}
if (o2.equals(d)) {
p2 = i;
}
if (p1 < dl && p2 < dl) {
break;
}
}
if (p1 == p2) {
return o1.compareTo(o2);
}
return p1 - p2;
}
};
sortedProps = new TreeMap<>(comp);
} else {
sortedProps = new TreeMap<>();
}
List<String> skipProperties = new ArrayList<>();
skipProperties.add("class");
skipProperties.add("binding");
if (Map.class.isAssignableFrom(c) || Collection.class.isAssignableFrom(c)) {
skipProperties.add("empty");
if (NavigableMap.class.isAssignableFrom(c)) {
skipProperties.add("firstEntry");
skipProperties.add("lastEntry");
}
}
for (MetaProperty mp : mps) {
if (!skipProperties.contains(mp.getName()) && !Closeable.class.isAssignableFrom(mp.getType())) {
// now check for skip annotations
if (mp instanceof MetaBeanProperty) {
MetaBeanProperty mbp = ((MetaBeanProperty) mp);
if (mbp.getField() != null) {
ModelSkip skipAnn = mbp.getField().field.getAnnotation(ModelSkip.class);
if (skipAnn != null) {
continue;
}
if (mbp.getField().isStatic()) {
continue;
}
}
MetaMethod getter = mbp.getGetter();
if (getter instanceof CachedMethod) {
CachedMethod cm = (CachedMethod) getter;
ModelSkip skipAnn = cm.getCachedMethod().getAnnotation(ModelSkip.class);
if (skipAnn != null) {
continue;
}
if (cm.isStatic()) {
continue;
}
if (!cm.getCachedMethod().getDeclaringClass().equals(c)) {
// we may have an overridden method here
try {
Method override = c.getDeclaredMethod(cm.getCachedMethod().getName(), cm.getCachedMethod().getParameterTypes());
if (override.getAnnotation(ModelSkip.class) != null) {
continue;
}
} catch (NoSuchMethodException | SecurityException e) {
}
}
}
if (mbp.getGetter() == null && mbp.getField() == null) {
continue;
}
}
sortedProps.put(mp.getName(), mp);
}
}
properties = sortedProps.values().toArray(new MetaProperty[0]);
orderedPropertiesCache.putIfAbsent(c, properties);
}
return properties;
}
Aggregations