/* * 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.wizard; import java.text.ParseException; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; import org.deidentifier.arx.DataType; import org.deidentifier.arx.aggregates.HierarchyBuilder; import org.deidentifier.arx.aggregates.HierarchyBuilderOrderBased; /** * A model for order-based builders. * * @author Fabian Prasser * @param <T> */ public class HierarchyWizardModelOrder<T> extends HierarchyWizardModelGrouping<T> { /** Locale. */ private Locale locale; /** * Constructor to create an initial definition. * * @param dataType * @param locale * @param data */ public HierarchyWizardModelOrder(final DataType<T> dataType, final Locale locale, String[] data) { super(data, dataType, false); this.locale = locale; this.update(); } @Override public HierarchyBuilderOrderBased<T> getBuilder(boolean serializable) throws Exception { HierarchyBuilderOrderBased<T> builder; if (serializable) { builder = HierarchyBuilderOrderBased.create(super.getDataType(), data); } else { builder = HierarchyBuilderOrderBased.create(super.getDataType(), false); } builder.setAggregateFunction(this.getDefaultFunction()); int level = 0; for (List<HierarchyWizardGroupingGroup<T>> list : super.getModelGroups()) { for (HierarchyWizardGroupingGroup<T> group : list){ builder.getLevel(level).addGroup(group.size, group.function); } level++; } return builder; } /** * Returns the current locale. * * @return */ public Locale getLocale() { if (locale == null) { return Locale.getDefault(); } else { return locale; } } /** * Moves an item down. * * @param index * @return */ public boolean moveDown(int index) { if (index>=data.length-1 || index<0) return false; String temp = data[index+1]; data[index+1] = data[index]; data[index] = temp; update(); return true; } /** * Moves an item up. * * @param index * @return */ public boolean moveUp(int index) { if (index<=0) return false; String temp = data[index-1]; data[index-1] = data[index]; data[index] = temp; update(); return true; } @Override public void parse(HierarchyBuilder<T> builder) throws IllegalArgumentException { if (!(builder instanceof HierarchyBuilderOrderBased)) { return; } super.parse((HierarchyBuilderOrderBased<T>)builder); } /** * Sorts the data. * * @param type * @return */ public boolean sort(final DataType<?> type){ boolean result = true; try { Arrays.sort(this.data, new Comparator<String>(){ @Override public int compare(String o1, String o2) { try { return type.compare(o1, o2); } catch (NumberFormatException | ParseException e) { throw new RuntimeException(e); } } }); } catch (Exception e) { result = false; } update(); return result; } @Override protected void build() { super.hierarchy = null; super.error = null; super.groupsizes = null; if (data==null) return; HierarchyBuilderOrderBased<T> builder = null; try { builder = getBuilder(false); } catch (Exception e){ super.error = e.getMessage(); return; } String error = builder.isValid(); if (error != null) { super.error = error; return; } try { super.groupsizes = builder.prepare(data); } catch(Exception e){ super.error = e.getMessage(); return; } try { super.hierarchy = builder.build(); } catch(Exception e){ super.error = e.getMessage(); return; } } }