/*
* 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.streams.verbs;
import com.google.common.collect.Ordering;
/**
* Orders ObjectCombinations from most specific to most general, without regard
* for degree of match to any specific Activity.
*/
public class ObjectCombinationGenericOrdering extends Ordering<ObjectCombination> {
public ObjectCombinationGenericOrdering() {}
@Override
public int compare(ObjectCombination left, ObjectCombination right) {
if ( wildcardCount(left) < wildcardCount(right)) {
return -1;
} else if ( wildcardCount(left) > wildcardCount(right)) {
return 1;
} else if ( !wildcard(left.getActor()) && wildcard(right.getActor())) {
return -1;
} else if ( wildcard(left.getActor()) && !wildcard(right.getActor())) {
return 1;
} else if ( !wildcard(left.getObject()) && wildcard(right.getObject())) {
return -1;
} else if ( wildcard(left.getObject()) && !wildcard(right.getObject())) {
return 1;
} else if ( !wildcard(left.getTarget()) && wildcard(right.getTarget())) {
return -1;
} else if ( wildcard(left.getTarget()) && !wildcard(right.getTarget())) {
return 1;
} else if ( !wildcard(left.getProvider()) && wildcard(right.getProvider())) {
return -1;
} else if ( wildcard(left.getProvider()) && !wildcard(right.getProvider())) {
return 1;
} else {
return 0;
}
}
/**
* count wildcards in this ObjectCombination.
* @param objectCombination ObjectCombination
* @return count
*/
private int wildcardCount(ObjectCombination objectCombination) {
int wildcardCount = 0;
if ( wildcard(objectCombination.getActor())) {
wildcardCount++;
}
if ( wildcard(objectCombination.getObject())) {
wildcardCount++;
}
if ( wildcard(objectCombination.getTarget())) {
wildcardCount++;
}
if ( wildcard(objectCombination.getProvider())) {
wildcardCount++;
}
return wildcardCount;
}
/**
* is pattern a wildcard.
* @param pattern String
* @return true or false
*/
private boolean wildcard(String pattern) {
return pattern.equals("*");
}
}