/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.tables.io; import java.util.List; import com.opendoorlogistics.api.ExecutionReport; import com.opendoorlogistics.api.tables.ODLColumnType; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLTableAlterable; import com.opendoorlogistics.api.tables.ODLTableDefinition; import com.opendoorlogistics.api.tables.ODLTableReadOnly; import com.opendoorlogistics.api.tables.beans.annotations.ODLColumnOrder; import com.opendoorlogistics.api.tables.beans.annotations.ODLNullAllowed; import com.opendoorlogistics.core.tables.beans.BeanMappedRowImpl; import com.opendoorlogistics.core.tables.beans.BeanMapping; import com.opendoorlogistics.core.tables.beans.BeanMapping.BeanTableMappingImpl; import com.opendoorlogistics.core.tables.utils.ExampleData; import com.opendoorlogistics.core.tables.utils.TableUtils; import com.opendoorlogistics.core.utils.strings.Strings; final public class SchemaIO { static final String KEY_COLUMN = "Key"; static final String VALUE_COLUMN = "Value"; static final String APP_VERSION_KEY = "AppVersion"; private final List<SchemaColumnDefinition> cols; private SchemaIO(List<SchemaColumnDefinition> cols) { this.cols = cols; } SchemaColumnDefinition findDefinition(String tableName, String columnName){ for(SchemaColumnDefinition cd:cols){ if(Strings.equalsStd(tableName, cd.tableName) && Strings.equalsStd(columnName, cd.columnName)){ return cd; } } return null; } /** * Schema column definition. All variables are String as the schema * table itself is always read from the Excel sheet within the benefit of * a schema (chicken and egg) and hence column types are unknown. * @author Phil * */ public static class SchemaColumnDefinition extends BeanMappedRowImpl{ private String tableName; private String columnName; private String type; private String description; private String defaultValue; private String flags; private String tags; public String getTableName() { return tableName; } @ODLColumnOrder(1) public void setTableName(String tableName) { this.tableName = tableName; } public String getColumnName() { return columnName; } @ODLColumnOrder(2) public void setColumnName(String columnName) { this.columnName = columnName; } public String getType() { return type; } @ODLColumnOrder(3) @ODLNullAllowed public void setType(String type) { this.type = type; } public String getDescription() { return description; } @ODLColumnOrder(4) @ODLNullAllowed public void setDescription(String description) { this.description = description; } public String getDefaultValue() { return defaultValue; } @ODLColumnOrder(5) @ODLNullAllowed public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public String getFlags() { return flags; } @ODLColumnOrder(6) @ODLNullAllowed public void setFlags(String flags) { this.flags = flags; } public String getTags() { return tags; } @ODLColumnOrder(7) @ODLNullAllowed public void setTags(String tags) { this.tags = tags; } } private static final BeanTableMappingImpl schemaMapping = BeanMapping.buildTable(SchemaColumnDefinition.class, "Schema"); public static void main(String[]args){ ODLDatastore<? extends ODLTableDefinition> ds = ExampleData.createTerritoriesExample(2); ODLTableReadOnly table = createSchemaTable(ds); System.out.println(table); } static ODLTableReadOnly createSchemaTable(ODLDatastore<? extends ODLTableDefinition> ds){ ODLTableAlterable ret = schemaMapping.createTable(); for(ODLTableDefinition table : TableUtils.getAlphabeticallySortedTables(ds)){ for(int i=0;i<table.getColumnCount() ; i++){ SchemaColumnDefinition cd = new SchemaColumnDefinition(); cd.setTableName(table.getName()); cd.setColumnName(table.getColumnName(i)); cd.setDescription(table.getColumnDescription(i)); cd.setFlags(Long.toString(table.getColumnFlags(i))); Object val = table.getColumnDefaultValue(i); if(val!=null){ cd.setDefaultValue(val.toString()); } cd.setType(table.getColumnType(i).name()); if(table.getColumnTags(i)!=null){ cd.setTags(Strings.toString(",", table.getColumnTags(i))); } schemaMapping.writeObjectToTable(cd, ret); } } return ret; } static SchemaIO load(ODLTableReadOnly tableReadOnly, ExecutionReport report){ try { List<SchemaColumnDefinition> list = schemaMapping.readObjectsFromTable(tableReadOnly); return new SchemaIO(list); } catch (Throwable e) { if(report!=null){ report.log("Could not load schema from worksheet. Schema table was corrupted."); } return null; } } static ODLColumnType getOdlColumnType(SchemaColumnDefinition dfn){ ODLColumnType type = ODLColumnType.STRING; for (ODLColumnType test : ODLColumnType.values()) { if (Strings.equalsStd(test.name(), dfn.getType())) { type = test; } } return type; } }