org.apache.cayenne.modeler.util.Comparators 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.cayenne.modeler.util;
import java.util.Comparator;
import org.apache.cayenne.configuration.DataNodeDescriptor;
import org.apache.cayenne.map.Attribute;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.Procedure;
import org.apache.cayenne.map.Relationship;
import org.apache.cayenne.query.Query;
/**
* A collection of useful Comparators used by the modeler.
*
* @since 1.1
*/
public class Comparators {
private static final Comparator dataDomainChildrenComparator = new DataDomainChildrenComparator();
private static final Comparator dataMapChildrenComparator = new DataMapChildrenComparator();
private static final Comparator entityChildrenComparator = new EntityChildrenComparator();
private static final Comparator namedObjectComparator = new NamedObjectComparator();
/**
* Returns a comparator to order DataMap objects of mixed types. Objects of the same
* type are ordered based on "name" property. Objects of different types are ordered
* based on the following precedence: DataMap, DataNode.
*/
public static Comparator getDataDomainChildrenComparator() {
return dataDomainChildrenComparator;
}
/**
* Returns a comparator to order DataMap objects of mixed types. Objects of the same
* type are ordered based on "name" property. Objects of different types are ordered
* based on the following precedence: DataMap, ObjEntity, DbEntity, Procedure and
* Query.
*/
public static Comparator getDataMapChildrenComparator() {
return dataMapChildrenComparator;
}
/**
* Returns a comparator to order Entity properties such as Attributes and
* Relationships. Objects of the same type are ordered based on "name" property.
* Objects of different types are ordered based on the following precedence:
* Attribute, Relationship.
*/
public static Comparator getEntityChildrenComparator() {
return entityChildrenComparator;
}
/**
* Returns a comparator to order java beans according to their "name" property.
*/
public static Comparator getNamedObjectComparator() {
return namedObjectComparator;
}
static class NamedObjectComparator implements Comparator {
public int compare(Object o1, Object o2) {
String name1 = ModelerUtil.getObjectName(o1);
String name2 = ModelerUtil.getObjectName(o2);
if (name1 == null) {
return (name2 != null) ? -1 : 0;
}
else if (name2 == null) {
return 1;
}
else {
return name1.compareTo(name2);
}
}
}
final static class DataDomainChildrenComparator extends NamedObjectComparator {
public int compare(Object o1, Object o2) {
int delta = getClassWeight(o1) - getClassWeight(o2);
if (delta != 0) {
return delta;
}
else {
return super.compare(o1, o2);
}
}
private static int getClassWeight(Object o) {
if (o instanceof DataMap) {
return 1;
}
else if (o instanceof DataNodeDescriptor) {
return 2;
}
else {
// this should trap nulls among other things
return Integer.MAX_VALUE;
}
}
}
final static class DataMapChildrenComparator extends NamedObjectComparator {
public int compare(Object o1, Object o2) {
int delta = getClassWeight(o1) - getClassWeight(o2);
if (delta != 0) {
return delta;
}
else {
return super.compare(o1, o2);
}
}
private static int getClassWeight(Object o) {
if (o instanceof DataMap) {
return 1;
}
else if (o instanceof ObjEntity) {
return 2;
}
else if (o instanceof Embeddable) {
return 3;
}
else if (o instanceof DbEntity) {
return 4;
}
else if (o instanceof Procedure) {
return 5;
}
else if (o instanceof Query) {
return 6;
}
else {
// this should trap nulls among other things
return Integer.MAX_VALUE;
}
}
}
final static class EntityChildrenComparator extends NamedObjectComparator {
public int compare(Object o1, Object o2) {
int delta = getClassWeight(o1) - getClassWeight(o2);
if (delta != 0) {
return delta;
}
else {
return super.compare(o1, o2);
}
}
private static int getClassWeight(Object o) {
if (o instanceof Entity) {
return 1;
}
else if (o instanceof Attribute) {
return 2;
}
else if (o instanceof Relationship) {
return 3;
}
else {
// this should trap nulls among other things
return Integer.MAX_VALUE;
}
}
}
}