/***********************************************************************************************************************
* Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
*
* Licensed 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 eu.stratosphere.api.common.aggregators;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import eu.stratosphere.types.Value;
/**
* A registry for iteration {@link Aggregator}s.
*/
public class AggregatorRegistry {
private final Map<String, Class<? extends Aggregator<?>>> registry = new HashMap<String, Class<? extends Aggregator<?>>>();
private Class<? extends ConvergenceCriterion<? extends Value>> convergenceCriterion;
private String convergenceCriterionAggregatorName;
// --------------------------------------------------------------------------------------------
public void registerAggregator(String name, Class<? extends Aggregator<?>> aggregator) {
if (name == null || aggregator == null) {
throw new IllegalArgumentException("Name and aggregator must not be null");
}
if (this.registry.containsKey(name)) {
throw new RuntimeException("An aggregator is already registered under the given name.");
}
this.registry.put(name, aggregator);
}
public Class<? extends Aggregator<?>> unregisterAggregator(String name) {
return this.registry.remove(name);
}
public Collection<AggregatorWithName<?>> getAllRegisteredAggregators() {
ArrayList<AggregatorWithName<?>> list = new ArrayList<AggregatorWithName<?>>(this.registry.size());
for (Map.Entry<String, Class<? extends Aggregator<?>>> entry : this.registry.entrySet()) {
@SuppressWarnings("unchecked")
Class<Aggregator<Value>> valAgg = (Class<Aggregator<Value>>) (Class<?>) entry.getValue();
list.add(new AggregatorWithName<Value>(entry.getKey(), valAgg));
}
return list;
}
public <T extends Value> void registerAggregationConvergenceCriterion(
String name, Class<? extends Aggregator<T>> aggregator, Class<? extends ConvergenceCriterion<T>> convergenceCheck)
{
if (name == null || aggregator == null || convergenceCheck == null) {
throw new IllegalArgumentException("Name, aggregator, or convergence criterion must not be null");
}
@SuppressWarnings("unchecked")
Class<Aggregator<?>> genAgg = (Class<Aggregator<?>>) (Class<?>) aggregator;
Class<? extends Aggregator<?>> previous = this.registry.get(name);
if (previous != null && previous != genAgg) {
throw new RuntimeException("An aggregator is already registered under the given name.");
}
this.registry.put(name, genAgg);
this.convergenceCriterion = convergenceCheck;
this.convergenceCriterionAggregatorName = name;
}
public String getConvergenceCriterionAggregatorName() {
return this.convergenceCriterionAggregatorName;
}
public Class<? extends ConvergenceCriterion<?>> getConvergenceCriterion() {
return this.convergenceCriterion;
}
public void addAll(AggregatorRegistry registry) {
this.registry.putAll(registry.registry);
this.convergenceCriterion = registry.convergenceCriterion;
this.convergenceCriterionAggregatorName = registry.convergenceCriterionAggregatorName;
}
}