| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.metamodel.factory; |
| |
| import java.net.URI; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import javax.sql.DataSource; |
| |
| import org.apache.metamodel.schema.TableType; |
| import org.apache.metamodel.util.BooleanComparator; |
| import org.apache.metamodel.util.NumberComparator; |
| import org.apache.metamodel.util.SimpleTableDef; |
| import org.apache.metamodel.util.SimpleTableDefParser; |
| |
| public class DataContextPropertiesImpl implements DataContextProperties { |
| |
| private static final long serialVersionUID = 1L; |
| |
| public static final String PROPERTY_USERNAME = "username"; |
| public static final String PROPERTY_PASSWORD = "password"; |
| public static final String PROPERTY_DRIVER_CLASS = "driver-class"; |
| public static final String PROPERTY_HOSTNAME = "hostname"; |
| public static final String PROPERTY_PORT = "port"; |
| public static final String PROPERTY_DATABASE = "database"; |
| public static final String PROPERTY_URL = "url"; |
| public static final String PROPERTY_CATALOG_NAME = "catalog"; |
| public static final String PROPERTY_RESOURCE_PROPERTIES = "resource"; |
| public static final String PROPERTY_IS_MULTILINE_VALUES_ENABLED = "multiline-values"; |
| public static final String PROPERTY_IS_FAIL_ON_INCONSISTENT_ROW_LENGTH = "fail-on-inconsistent-row-length"; |
| public static final String PROPERTY_ESCAPE_CHAR = "escape-char"; |
| public static final String PROPERTY_QUOTE_CHAR = "quote-char"; |
| public static final String PROPERTY_SEPARATOR_CHAR = "separator-char"; |
| public static final String PROPERTY_ENCODING = "encoding"; |
| public static final String PROPERTY_SKIP_EMPTY_COLUMNS = "skip-empty-columns"; |
| public static final String PROPERTY_SKIP_EMPTY_LINES = "skip-empty-lines"; |
| public static final String PROPERTY_COLUMN_NAME_LINE_NUMBER = "column-name-line-number"; |
| public static final String PROPERTY_DATA_CONTEXT_TYPE = "type"; |
| public static final String PROPERTY_TABLE_TYPES = "table-types"; |
| public static final String PROPERTY_DATA_SOURCE = "data-source"; |
| public static final String PROPERTY_TABLE_DEFS = "table-defs"; |
| |
| private final Map<String, Object> map; |
| |
| public DataContextPropertiesImpl() { |
| this(new HashMap<String, Object>()); |
| } |
| |
| public DataContextPropertiesImpl(Properties properties) { |
| this(); |
| final Set<String> propertyNames = properties.stringPropertyNames(); |
| for (String key : propertyNames) { |
| put(key, properties.get(key)); |
| } |
| } |
| |
| public DataContextPropertiesImpl(Map<String, Object> map) { |
| this.map = map; |
| } |
| |
| public Object get(String key) { |
| return map.get(key); |
| } |
| |
| public Object put(String key, Object value) { |
| return map.put(key, value); |
| } |
| |
| public String getString(String key) { |
| final Object value = map.get(key); |
| if (value == null) { |
| return null; |
| } |
| return value.toString(); |
| } |
| |
| public Character getChar(String key) { |
| final String str = getString(key); |
| if (str == null || str.isEmpty()) { |
| return null; |
| } |
| return str.charAt(0); |
| } |
| |
| public Integer getInt(String key) { |
| final Object obj = get(key); |
| if (obj == null) { |
| return null; |
| } |
| return NumberComparator.toNumber(obj).intValue(); |
| } |
| |
| private Boolean getBoolean(String key) { |
| final Object obj = get(key); |
| if (obj == null) { |
| return null; |
| } |
| return BooleanComparator.toBoolean(obj); |
| } |
| |
| @SuppressWarnings("unchecked") |
| public Map<String, Object> getMap(String key) { |
| final Object obj = get(key); |
| if (obj == null) { |
| return null; |
| } |
| if (obj instanceof Map) { |
| return (Map<String, Object>) obj; |
| } |
| if (obj instanceof String) { |
| // TODO: Try parse as JSON |
| } |
| throw new IllegalStateException("Expected Map value for property '" + key + "'. Found " + obj.getClass() |
| .getName()); |
| } |
| |
| @Override |
| public String getDataContextType() { |
| return getString(PROPERTY_DATA_CONTEXT_TYPE); |
| } |
| |
| public void setDataContextType(String type) { |
| put(PROPERTY_DATA_CONTEXT_TYPE, type); |
| } |
| |
| @Override |
| public Map<String, Object> toMap() { |
| return map; |
| } |
| |
| @Override |
| public ResourceProperties getResourceProperties() { |
| final Object resourceValue = get(PROPERTY_RESOURCE_PROPERTIES); |
| if (resourceValue == null) { |
| return null; |
| } |
| if (resourceValue instanceof String) { |
| return new SimpleResourceProperties((String) resourceValue); |
| } |
| if (resourceValue instanceof URI) { |
| return new SimpleResourceProperties((URI) resourceValue); |
| } |
| if (resourceValue instanceof Map) { |
| @SuppressWarnings("unchecked") |
| final Map<String, Object> resourceMap = (Map<String, Object>) resourceValue; |
| return new ResourcePropertiesImpl(resourceMap); |
| } |
| throw new IllegalStateException("Expected String, URI or Map value for property 'resource'. Found: " |
| + resourceValue); |
| } |
| |
| @Override |
| public Integer getColumnNameLineNumber() { |
| return getInt(PROPERTY_COLUMN_NAME_LINE_NUMBER); |
| } |
| |
| @Override |
| public Boolean isSkipEmptyLines() { |
| return getBoolean(PROPERTY_SKIP_EMPTY_LINES); |
| } |
| |
| @Override |
| public Boolean isSkipEmptyColumns() { |
| return getBoolean(PROPERTY_SKIP_EMPTY_COLUMNS); |
| } |
| |
| @Override |
| public String getEncoding() { |
| return getString(PROPERTY_ENCODING); |
| } |
| |
| @Override |
| public Character getSeparatorChar() { |
| return getChar(PROPERTY_SEPARATOR_CHAR); |
| } |
| |
| @Override |
| public Character getQuoteChar() { |
| return getChar(PROPERTY_QUOTE_CHAR); |
| } |
| |
| @Override |
| public Character getEscapeChar() { |
| return getChar(PROPERTY_ESCAPE_CHAR); |
| } |
| |
| @Override |
| public Boolean isFailOnInconsistentRowLength() { |
| return getBoolean(PROPERTY_IS_FAIL_ON_INCONSISTENT_ROW_LENGTH); |
| } |
| |
| @Override |
| public Boolean isMultilineValuesEnabled() { |
| return getBoolean(PROPERTY_IS_MULTILINE_VALUES_ENABLED); |
| } |
| |
| @Override |
| public TableType[] getTableTypes() { |
| final Object obj = get(PROPERTY_TABLE_TYPES); |
| if (obj == null) { |
| return null; |
| } |
| if (obj instanceof TableType[]) { |
| return (TableType[]) obj; |
| } |
| if (obj instanceof TableType) { |
| return new TableType[] { (TableType) obj }; |
| } |
| if (obj instanceof String) { |
| String str = (String) obj; |
| if (str.startsWith("[") && str.endsWith("]")) { |
| str = str.substring(1, str.length() - 2); |
| } |
| final String[] tokens = str.split(","); |
| final TableType[] tableTypes = new TableType[tokens.length]; |
| for (int i = 0; i < tableTypes.length; i++) { |
| tableTypes[i] = TableType.getTableType(tokens[i]); |
| } |
| } |
| throw new IllegalStateException("Expected TableType[] value for property '" + PROPERTY_TABLE_TYPES + "'. Found " |
| + obj.getClass().getName()); |
| } |
| |
| @Override |
| public String getCatalogName() { |
| return getString(PROPERTY_CATALOG_NAME); |
| } |
| |
| @Override |
| public String getUrl() { |
| return getString(PROPERTY_URL); |
| } |
| |
| @Override |
| public DataSource getDataSource() { |
| return (DataSource) get(PROPERTY_DATA_SOURCE); |
| } |
| |
| @Override |
| public String getUsername() { |
| return getString(PROPERTY_USERNAME); |
| } |
| |
| @Override |
| public String getPassword() { |
| return getString(PROPERTY_PASSWORD); |
| } |
| |
| @Override |
| public String getDriverClassName() { |
| return getString(PROPERTY_DRIVER_CLASS); |
| } |
| |
| @Override |
| public String getHostname() { |
| return getString(PROPERTY_HOSTNAME); |
| } |
| |
| @Override |
| public Integer getPort() { |
| return getInt(PROPERTY_PORT); |
| } |
| |
| @Override |
| public String getDatabaseName() { |
| return getString(PROPERTY_DATABASE); |
| } |
| |
| @Override |
| public SimpleTableDef[] getTableDefs() { |
| final Object obj = get(PROPERTY_TABLE_DEFS); |
| if (obj == null) { |
| return null; |
| } |
| if (obj instanceof SimpleTableDef[]) { |
| return (SimpleTableDef[]) obj; |
| } |
| if (obj instanceof SimpleTableDef) { |
| return new SimpleTableDef[] { (SimpleTableDef) obj }; |
| } |
| if (obj instanceof String) { |
| return SimpleTableDefParser.parseTableDefs((String) obj); |
| } |
| throw new IllegalStateException("Expected SimpleTableDef[] value for property '" + PROPERTY_TABLE_DEFS |
| + "'. Found " + obj.getClass().getName()); |
| } |
| |
| } |