/* * 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.isis.core.metamodel.layout.memberorderfacet; import java.util.Comparator; import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder; import org.apache.isis.core.metamodel.facets.FacetedMethod; import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet; import org.apache.isis.core.metamodel.layout.DeweyOrderSet; /** * Compares by {@link MemberOrderFacet} obtained from each {@link FacetedMethod} * ). * * <p> * Will also compare {@link OrderSet}s; these are put after any * {@link FacetedMethod}s. If there is more than one OrderSet then these are * compared by an {@link OrderSetGroupNameComparator}. * * <p> * If there is no annotation on either member, then will compare the members by * name instead. * * <p> * Can specify if requires that members are in the same (group) name. */ public class MemberOrderComparator implements Comparator<Object> { private final MemberOrderFacetComparator memberOrderFacetComparator; private final MemberIdentifierComparator memberIdentifierComparator = new MemberIdentifierComparator(); private final OrderSetGroupNameComparator orderSetComparator = new OrderSetGroupNameComparator(true); public MemberOrderComparator(final boolean ensureGroupIsSame) { memberOrderFacetComparator = new MemberOrderFacetComparator(ensureGroupIsSame); } @Override public int compare(final Object o1, final Object o2) { if (o1 instanceof IdentifiedHolder && o2 instanceof IdentifiedHolder) { return compare((IdentifiedHolder) o1, (IdentifiedHolder) o2); } if (o1 instanceof DeweyOrderSet && o2 instanceof DeweyOrderSet) { return orderSetComparator.compare((DeweyOrderSet) o1, (DeweyOrderSet) o2); } if (o1 instanceof IdentifiedHolder && o2 instanceof DeweyOrderSet) { return -1; // members before OrderSets. } if (o1 instanceof DeweyOrderSet && o2 instanceof IdentifiedHolder) { return +1; // members before OrderSets. } throw new IllegalArgumentException("can only compare IdentifiedHolders and DeweyOrderSets"); } public int compare(final IdentifiedHolder o1, final IdentifiedHolder o2) { final MemberOrderFacet m1 = getMemberOrder(o1); final MemberOrderFacet m2 = getMemberOrder(o2); final int memberOrderComparison = memberOrderFacetComparator.compare(m1, m2); if(memberOrderComparison != 0) { return memberOrderComparison; } return memberIdentifierComparator.compare(o1, o2); } private MemberOrderFacet getMemberOrder(final FacetHolder facetHolder) { return facetHolder.getFacet(MemberOrderFacet.class); } }