/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * 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 org.deidentifier.arx.gui.view.impl.common.async; import org.deidentifier.arx.ARXPopulationModel; import org.deidentifier.arx.AttributeType.Hierarchy; import org.deidentifier.arx.DataDefinition; import org.deidentifier.arx.DataHandle; import org.deidentifier.arx.criteria.HierarchicalDistanceTCloseness; import org.deidentifier.arx.criteria.PrivacyCriterion; import org.deidentifier.arx.gui.model.Model; import org.deidentifier.arx.gui.model.ModelConfiguration; import org.deidentifier.arx.gui.model.ModelEvent.ModelPart; /** * This class implements a base class for views that show statistic properties of the data. * * @author Fabian Prasser */ public class AnalysisContext { /** The target (input or output). */ private ModelPart target; /** The model. */ private Model model; /** * Returns the current context, consisting of a consistent combination of * a configuration and a data handle. * * @return */ public AnalysisData getData(){ // Prepare DataHandle handle = null; ModelConfiguration config = null; DataDefinition definition = null; // Check if (model==null) return null; // If input if (target == ModelPart.INPUT){ // If output available if (model.getOutputConfig() != null && model.getOutputConfig().getInput() != null && model.getOutput() != null){ config = model.getOutputConfig(); definition = model.getOutputDefinition(); } else { config = model.getInputConfig(); definition = model.getInputDefinition(); } if (config.getInput() == null) return null; handle = config.getInput().getHandle(); // If output } else { definition = model.getOutputDefinition(); config = model.getOutputConfig(); handle = model.getOutput(); } // If subset view enabled if (model.getViewConfig().isSubset() && model.getOutputConfig() != null && model.getOutputConfig().getConfig() != null && handle != null) { handle = handle.getView(); } // Return return new AnalysisData(config, handle, definition); } /** * Returns a generalization hierarchy for the attribute, if available. * * @param context * @param attribute * @return */ public Hierarchy getHierarchy(AnalysisData context, String attribute) { // We only accept sanitized input if (context.config == null || context.config == model.getInputConfig() || model.getOutputDefinition() == null) { return null; } // First, check hierarchies for attribute Hierarchy hierarchy = model.getOutputDefinition().getHierarchyObject(attribute); if (hierarchy != null){ return hierarchy; } // This is probably not needed anymore, but we leave it just in case... // Second, check for hierarchies associated with t-closeness for (HierarchicalDistanceTCloseness t : context.config.getCriteria(HierarchicalDistanceTCloseness.class)){ if (t.getAttribute().equals(attribute)) { return t.getHierarchy(); } } // Nothing found return null; } /** * Returns the model. * * @return */ public Model getModel() { return model; } /** * Returns a population model for the given context * * @return */ public ARXPopulationModel getPopulationModel() { // First, try to return a model associated with an output criterion if (model.getOutputConfig() != null) { for (PrivacyCriterion c : model.getOutputConfig().getCriteria()) { if (c.getPopulationModel() != null) { return c.getPopulationModel(); } } } // Fall back to the input model return model.getRiskModel().getPopulationModel(); } /** * Gets the target. * * @return */ public ModelPart getTarget() { return target; } /** * Sets the model. * * @param model */ public void setModel(Model model) { this.model = model; } /** * Sets the target. * * @param target */ public void setTarget(ModelPart target) { this.target = target; } }