/* * ARX: Powerful Data Anonymization * Copyright 2014 - 2015 Karol Babioch, Fabian Prasser, Florian Kohlmayer * * 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.io; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.deidentifier.arx.DataType; /** * Base adapter for all data sources * * This defines properties and methods that all data source import adapters have * in common. Data sources itself are described by {@link ImportConfiguration}. * * @author Karol Babioch * @author Fabian Prasser */ abstract public class ImportAdapter implements Iterator<String[]> { /** * Factory method * * This will return an appropriate ImportAdapter for each implemented data * source {@link ImportAdapter}. Refer to the specific ImportAdapter itself * for details. * * @param config {@link #config} * * @return Specific ImportAdapter for given configuration * * @throws IOException */ public static ImportAdapter create(ImportConfiguration config) throws IOException { if (config instanceof ImportConfigurationCSV) { return new ImportAdapterCSV((ImportConfigurationCSV) config); } else if (config instanceof ImportConfigurationExcel) { return new ImportAdapterExcel((ImportConfigurationExcel) config); } else if (config instanceof ImportConfigurationJDBC) { return new ImportAdapterJDBC((ImportConfigurationJDBC) config); } else { throw new IllegalArgumentException("No adapter defined for this type of configuration"); } } /** The header. */ protected String[] header; /** Array of datatypes describing the columns. */ protected DataType<?>[] dataTypes; /** * Indexes of columns that should be imported * * This keeps track of columns that should be imported, as not all columns * will necessarily be imported. */ protected int[] indexes; /** Data source configuration used to import actual data. */ private ImportConfiguration config = null; /** * Creates a new instance of this object with given configuration. * * @param config {@link #config} */ protected ImportAdapter(ImportConfiguration config) { this.config = config; if (config.getColumns().isEmpty()) { throw new IllegalArgumentException("No columns specified"); } } /** * Returns the configuration used by the import adapter. * * @return {@link #config} */ public ImportConfiguration getConfig() { return config; } /** * Returns the header. * * @return */ public String[] getHeader() { return header; } /** * Returns the percentage of data has has already been imported. * * @return Percentage of data already imported, 0 - 100 */ public abstract int getProgress(); /** * Returns an array with datatypes of columns that should be imported. * * @return Array containing datatypes of columns that should be imported */ protected DataType<?>[] getColumnDatatypes() { List<DataType<?>> result = new ArrayList<DataType<?>>(); for (ImportColumn column : config.getColumns()) { result.add(column.getDataType()); } return result.toArray(new DataType[result.size()]); } }