/*
* RHQ Management Platform
* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.enterprise.server.resource.disambiguation;
import java.util.EnumSet;
/**
* Defines a strategy for updating a results list with the disambiguation information.
* <p>
* See {@link DefaultDisambiguationUpdateStrategies} for a couple of implemented strategies.
*
* @see DefaultDisambiguationUpdateStrategies
*
* @author Lukas Krejci
*/
public interface DisambiguationUpdateStrategy {
/**
* Updates the report using the policy. It is guaranteed that the resource and its parents
* in the report are already processed using the
* {@link ResourceResolution#update(MutableDisambiguationReport.Resource)}
* method. This method is then called to ensure that the report as a whole conforms to the policy *and* this
* strategy. This might entail removing some elements from the parent list for example.
*
* @param <T>
* @param policy
* @param report
*/
<T> void update(DisambiguationPolicy policy, MutableDisambiguationReport<T> report);
/**
* @return a set of resolutions for which the unique reports need to be repartitioned at the resource level.
* In another words this forces the disambiguation to continue on up the disambiguation chain even if the
* it disambiguates the resuts successfully at the resource level.
*/
EnumSet<ResourceResolution> resourceLevelRepartitionableResolutions();
/**
* @return a set of resolutions for which uniquely disambiguated reports are to be repartitioned further.
* The resolutions from this set apply on the parents (on any level), unlike the resolutions from {@link #resourceLevelRepartitionableResolutions()}.
*/
EnumSet<ResourceResolution> alwaysRepartitionableResolutions();
/**
* The disambiguation procedure calls this method for every not yet fully unique
* partitions set when it determines that further disambiguation should be performed.
* <p>
* But this is not always necessary, depending on the update strategy implementation.
* <p>
* This method is therefore the means for the update strategy to short-circuit the disambiguation
* procedure when it determines that further disambiguation would not make sense for this strategy.
*
* @param <T>
* @param partitions the partitions object holding a subset of the results being disambiguated along
* with the policy that is used to disambiguate them
* @return true if further disambiguation is useful, false otherwise
*/
<T> boolean partitionFurther(ReportPartitions<T> partitions);
}