All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.j256.ormlite.table.DatabaseTableConfigLoader Maven / Gradle / Ivy

package com.j256.ormlite.table;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.j256.ormlite.field.DatabaseFieldConfig;
import com.j256.ormlite.field.DatabaseFieldConfigLoader;
import com.j256.ormlite.misc.SqlExceptionUtil;

/**
 * Database table configuration loader which reads and writes {@link DatabaseTableConfig} from a text file/stream.
 * 
 * @author graywatson
 */
public class DatabaseTableConfigLoader {

	private static final String CONFIG_FILE_START_MARKER = "# --table-start--";
	private static final String CONFIG_FILE_END_MARKER = "# --table-end--";
	private static final String CONFIG_FILE_FIELDS_START = "# --table-fields-start--";
	private static final String CONFIG_FILE_FIELDS_END = "# --table-fields-end--";

	/**
	 * Load in a number of database configuration entries from a buffered reader.
	 */
	public static List> loadDatabaseConfigFromReader(BufferedReader reader) throws SQLException {
		List> list = new ArrayList>();
		while (true) {
			DatabaseTableConfig config = DatabaseTableConfigLoader.fromReader(reader);
			if (config == null) {
				break;
			}
			list.add(config);
		}
		return list;
	}

	/**
	 * Load a table configuration in from a text-file reader.
	 * 
	 * @return A config if any of the fields were set otherwise null if we reach EOF.
	 */
	public static  DatabaseTableConfig fromReader(BufferedReader reader) throws SQLException {
		DatabaseTableConfig config = new DatabaseTableConfig();
		boolean anything = false;
		while (true) {
			String line;
			try {
				line = reader.readLine();
			} catch (IOException e) {
				throw SqlExceptionUtil.create("Could not read DatabaseTableConfig from stream", e);
			}
			if (line == null) {
				break;
			}
			// we do this so we can support multiple class configs per file
			if (line.equals(CONFIG_FILE_END_MARKER)) {
				break;
			}
			// we do this so we can support multiple class configs per file
			if (line.equals(CONFIG_FILE_FIELDS_START)) {
				readFields(reader, config);
				continue;
			}
			// skip empty lines or comments
			if (line.length() == 0 || line.startsWith("#") || line.equals(CONFIG_FILE_START_MARKER)) {
				continue;
			}
			String[] parts = line.split("=", -2);
			if (parts.length != 2) {
				throw new SQLException("DatabaseTableConfig reading from stream cannot parse line: " + line);
			}
			readTableField(config, parts[0], parts[1]);
			anything = true;
		}
		// if we got any config lines then we return the config
		if (anything) {
			return config;
		} else {
			// otherwise we return null for none
			return null;
		}
	}

	/**
	 * Write the table configuration to a buffered writer.
	 */
	public static  void write(BufferedWriter writer, DatabaseTableConfig config) throws SQLException {
		try {
			writeConfig(writer, config);
		} catch (IOException e) {
			throw SqlExceptionUtil.create("Could not write config to writer", e);
		}
	}

	// field names in the config file
	private static final String FIELD_NAME_DATA_CLASS = "dataClass";
	private static final String FIELD_NAME_TABLE_NAME = "tableName";
	private static final String FIELD_NAME_SCHEMA_NAME = "schemaName";

	/**
	 * Write the config to the writer.
	 */
	private static  void writeConfig(BufferedWriter writer, DatabaseTableConfig config) throws IOException,
			SQLException {
		writer.append(CONFIG_FILE_START_MARKER);
		writer.newLine();
		if (config.getDataClass() != null) {
			writer.append(FIELD_NAME_DATA_CLASS).append('=').append(config.getDataClass().getName());
			writer.newLine();
		}
		if (config.getSchemaName() != null) {
			writer.append(FIELD_NAME_SCHEMA_NAME).append('=').append(config.getSchemaName());
			writer.newLine();
		}
		if (config.getTableName() != null) {
			writer.append(FIELD_NAME_TABLE_NAME).append('=').append(config.getTableName());
			writer.newLine();
		}
		writer.append(CONFIG_FILE_FIELDS_START);
		writer.newLine();
		if (config.getFieldConfigs() != null) {
			for (DatabaseFieldConfig field : config.getFieldConfigs()) {
				DatabaseFieldConfigLoader.write(writer, field, config.getTableName());
			}
		}
		writer.append(CONFIG_FILE_FIELDS_END);
		writer.newLine();
		writer.append(CONFIG_FILE_END_MARKER);
		writer.newLine();
	}

	/**
	 * Read a field into our table configuration for field=value line.
	 */
	private static  void readTableField(DatabaseTableConfig config, String field, String value) {
		if (field.equals(FIELD_NAME_DATA_CLASS)) {
			try {
				@SuppressWarnings("unchecked")
				Class clazz = (Class) Class.forName(value);
				config.setDataClass(clazz);
			} catch (ClassNotFoundException e) {
				throw new IllegalArgumentException("Unknown class specified for dataClass: " + value);
			}
		} else if (field.equals(FIELD_NAME_TABLE_NAME)) {
			config.setTableName(value);
		} else if (field.equals(FIELD_NAME_SCHEMA_NAME)){
			config.setSchemaName(value);
		}
	}

	/**
	 * Read all of the fields information from the configuration file.
	 */
	private static  void readFields(BufferedReader reader, DatabaseTableConfig config) throws SQLException {
		List fields = new ArrayList();
		while (true) {
			String line;
			try {
				line = reader.readLine();
			} catch (IOException e) {
				throw SqlExceptionUtil.create("Could not read next field from config file", e);
			}
			if (line == null || line.equals(CONFIG_FILE_FIELDS_END)) {
				break;
			}
			DatabaseFieldConfig fieldConfig = DatabaseFieldConfigLoader.fromReader(reader);
			if (fieldConfig == null) {
				break;
			}
			fields.add(fieldConfig);
		}
		config.setFieldConfigs(fields);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy