Import danych odbywa się 3-krokowo:
Za import danych odpowiedzialne sa dwie klasy przedstawione na poniższym diagramie: klasa implementująca interfejs IDataImporter - na diagramie TxtDataImporter (krok 1) oraz klasa implementująca interfejs IDataLoader lub rozszerzająca klasę DataLoaderWithStatistics - na diagramie BillingDataLoader (kroki 2 i 3).
public interface IDataImporter { /** * Transforms the data provided in dataInputStream into TabularData. * * @param dataIS * The data input stream to be transformed * @param rowsLimit * Maximum number of rows which would be imported * @param options * Options passed to data importer * @return Transformed data. * @throws IOException */ public TabularData readData(InputStream dataIS, long rowsLimit, Map<String, String> options) throws IOException; /** * Validate if importer is correct for input stream. This method try to do not change state of * dataIs parameter. If dataIs parameter is null, returns false; */ public boolean validate(InputStream dataIs, Map<String, String> options); }
Metoda readData wczytuje dane ze strumienia dataIS. Mapa options zawiera opcje przekazywane do importera. Ich znaczenie jest zdeterminowane przez konkretną implementację (np. separator plików csv).
Metoda validate sprawdza czy strumień danych wejściowych może zostać wczytany poprawnie za pomocą danej implementacji importera (np. strumień danych oparty o plik csv może być wczytany jedynie za pomocą importera rozumiejącego ten format). Metoda validate (podstawowy algorytm) jest zaimplementowana w abstrakcyjnej klasie bazowej DataImporterBase. Dopuszczalne jest przeciążanie tej metody np. w celu zwiększenia szybkości działania (JxlXlsDataImporter).
public interface IDataLoader { /** * Converts data into IDataSet * * @param data * data to convert * @param modelToDataMapping * mapping between input and output data columns * @return converted data * */ IDataSet loadData(TabularData data, Map<Integer, Integer> modelToDataMapping); }
Metoda loadData konwertuje dane w postaci dwuwymiarowej tablicy (obiekt TabularData) do formatu CASTowego (obiekt IDataSet). Mapa modelToDataMapping zawiera pary liczb (a, b), gdzie liczba a oznacza numer kolumny w tablicy wejściowej, natomiast liczba b identyfikuje typ danych do których mają być skonwertowane dane wejściowe w kolumnie a. Możliwe wartości liczb b są definiowane przez konwerter
Tabela 1 przedstawia listę aktualnie zaimplementowanych konwerterów.
Klasa | Plugin | Walidacja | Zastosowanie | Opis | Lista kolumn (wymagane) |
---|---|---|---|---|---|
DataLoader | castbase | nie | ogólne | Konwertuje wiersze postaci: Źródło, Cel i opcjonalnie Data zdarzenia | Element źródłowy,Element docelowy, Data |
GenericBillingLoaderWithValidator | castbilling | tak | billingi | Ogólny konwerter dla większości znanych billingów. | Numer główny,Numer poboczny, Data, Godzina, Czas trwania sekundy, Data zakończenia, Godzina zakończenia, Kierunek połączenia, Stacja bazowa, Numer powiązany, Rodzaj usługi, Kto w sieci |
Przed kowersją danych do formatu CAST'owego możliwe jest wykonanie sprawdzania poprawności danych i zgłoszenie użytkownikowi błędów lub ostrzeżeń w zbiorze danych wejściowych.
Klasa posiada następujące metody abstrakcyjne:
public abstract class DataLoaderWithStatistics implements IDataLoader { /** * Converts data into IDataSet * * @param data * data to convert * @param modelToDataMapping * mapping between input and output data columns * @param brokenDataInfo * object which contains information about errors and warnings * @return converted data * */ public abstract IDataSet loadData(TabularData data, Map<Integer, Integer> modelToDataMapping, BrokenDataInfo brokenDataInfo); /** * Validates data and creates statistic object which contain all information * about input data * * @param data * data to validate * @param modelToDataMapping * TODO * @return validation statistics */ public abstract BrokenDataInfo validateData(TabularData data, Map<Integer, Integer> modelToDataMapping); /** * Check if row cells are correct for attached mapping. If row is good then * null value is returned. In other case new instance of BrokenRowInfo is * returned. * * @param row - * row to validate * @param stats - * statistic object (if null, <code>BrokenRowInfo</code> * doesn't have statistics) * @param mapping - * model to data mapping * @return broken row info */ public abstract BrokenRowInfo validateRow(DataRow row, Map<Integer, Integer> modelToDataMapping); // ... code skipped }
Metoda loadData podobnie jak metoda interfjesu IDataLoader odpowiedzialna jest za konwersję danych do formatu CASTowego. Otrzymuje jednak dodatkowy parametr brokenDataInfo, który zawiera wszystkie informacje o błędach i ostrzeżeniach, które występiły podczas sprawdzania poprawności danych.
Metody validateData oraz validateRow służą do sprawdzania poprawności wszystkich danych lub pojedyńczego wiersza. Zwracają obiekty BrokenDataInfo lub BrokenRowInfo zawierające informacje o błędnych danych. Reprezentacja błędów i ostrzeżeń opisana jest w dokumentacji technicznej, rodziale opis błędnych danych.