/*
* 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.ambari.server.collections.functors;
import org.apache.ambari.server.collections.Predicate;
import org.apache.commons.collections.Transformer;
/**
* OperationPredicate is an abstract class providing functionality of transforming the input context
* before executing the implementation-specific
* {@link org.apache.commons.collections.Predicate#evaluate(Object)} method.
*/
abstract class OperationPredicate extends Predicate {
/**
* The {@link Transformer} to use to transform the data before evaluation
*/
private ContextTransformer transformer = null;
/**
* Constructor
*
* @param name the name of this {@link Predicate}
* @param transformer the {@link Transformer} to use to transform the data before evaluation
*/
OperationPredicate(String name, ContextTransformer transformer) {
super(name);
this.transformer = transformer;
}
/**
* Gets the {@link Transformer}
*
* @return the assigned {@link ContextTransformer}
*/
public ContextTransformer getTransformer() {
return transformer;
}
/**
* Sets the {@link Transformer}
*
* @param transformer a {@link ContextTransformer}
*/
public void setTransformer(ContextTransformer transformer) {
this.transformer = transformer;
}
/**
* Gets the context key assigned to the {@link ContextTransformer}.
* <p>
* This key is used to identify which value from the context a passed to the
* {@link org.apache.commons.collections.Predicate#evaluate(Object)} method
*
* @return a key name
*/
public String getContextKey() {
return (this.transformer == null) ? null : this.transformer.getKey();
}
@Override
public boolean evaluate(Object o) {
Object data = (transformer == null) ? o : transformer.transform(o);
return evaluateTransformedData(data);
}
@Override
public int hashCode() {
return super.hashCode() + (37 * ((transformer == null) ? 0 : transformer.hashCode()));
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
} else if (obj == null) {
return false;
} else if (super.equals(obj) && (obj instanceof OperationPredicate) && (hashCode() == obj.hashCode())) {
OperationPredicate p = (OperationPredicate) obj;
return (transformer == null) ? (p.transformer == null) : transformer.equals(p.transformer);
} else {
return false;
}
}
/**
* Abstract method used internally to process the {@link #evaluate(Object)} logic after the
* input data is transformed.
*
* @param data the transformed data to use
* @return the result of the evaluation (<code>true</code>, <code>false</code>)
* @see org.apache.commons.collections.Predicate#evaluate(Object)
*/
protected abstract boolean evaluateTransformedData(Object data);
}