/* * Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com> * * 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 com.obidea.semantika.app; import static com.obidea.semantika.database.connection.ConnectionProviderFactory.getConnectionProperties; import java.io.InputStream; import java.lang.ref.WeakReference; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; import org.apache.commons.configuration.PropertiesConfiguration; import com.obidea.semantika.database.JdbcDatabase; import com.obidea.semantika.database.connection.ConnectionProviderFactory; import com.obidea.semantika.database.connection.IConnectionProvider; import com.obidea.semantika.database.sql.dialect.DialectFactory; import com.obidea.semantika.database.sql.dialect.IDialect; import com.obidea.semantika.exception.ConfigurationException; import com.obidea.semantika.exception.SemantikaException; import com.obidea.semantika.knowledgebase.DefaultPrefixManager; import com.obidea.semantika.knowledgebase.IPrefixManager; import com.obidea.semantika.mapping.IMappingSet; import com.obidea.semantika.mapping.MappingSet; import com.obidea.semantika.mapping.parser.MappingParserConfiguration; import com.obidea.semantika.ontology.IOntology; import com.obidea.semantika.util.ConfigHelper; import com.obidea.semantika.util.StringUtils; public class DefaultSettingFactory extends SettingFactory { @Override /* package */ void loadSystemProperties(PropertiesConfiguration properties, Settings settings) throws SemantikaException { settings.addSystemProperties(Environment.APPLICATION_FACTORY_NAME, properties.getString(Environment.APPLICATION_FACTORY_NAME)); settings.addSystemProperties(Environment.CONNECTION_URL, properties.getString(Environment.CONNECTION_URL)); settings.addSystemProperties(Environment.POOL_INITIAL_SIZE, properties.getString(Environment.POOL_INITIAL_SIZE, "-1")); settings.addSystemProperties(Environment.POOL_MIN_SIZE, properties.getString(Environment.POOL_MIN_SIZE, "-1")); settings.addSystemProperties(Environment.POOL_MAX_SIZE, properties.getString(Environment.POOL_MAX_SIZE, "-1")); settings.addSystemProperties(Environment.POOL_TIMEOUT, properties.getString(Environment.POOL_TIMEOUT, "-1")); settings.addSystemProperties(Environment.TRANSACTION_TIMEOUT, properties.getString(Environment.TRANSACTION_TIMEOUT, "-1")); settings.addSystemProperties(Environment.TRANSACTION_FETCH_SIZE, properties.getString(Environment.TRANSACTION_FETCH_SIZE, "-1")); settings.addSystemProperties(Environment.TRANSACTION_MAX_ROWS, properties.getString(Environment.TRANSACTION_MAX_ROWS, "-1")); settings.addSystemProperties(Environment.ONTOLOGY_SOURCE, properties.getString(Environment.ONTOLOGY_SOURCE)); settings.addSystemProperties(Environment.MAPPING_SOURCE, Arrays.asList(properties.getStringArray(Environment.MAPPING_SOURCE))+""); } @Override /* package */ void loadDatabaseFromProperties(PropertiesConfiguration properties, Settings settings) throws SemantikaException { try { /* * Register the Connection object as a weak reference to ease garbage collection. This * connection is used to fetch database metadata on-demand when parsing the mappings. Manual * connection closing is not feasible. */ IConnectionProvider provider = createConnectionProvider(properties); WeakReference<Connection> weakConnection = new WeakReference<Connection>(provider.getConnection()); JdbcDatabase database = new JdbcDatabase(weakConnection.get()); database.setDialect(determineDialect(properties, weakConnection.get())); settings.setDatabase(database); settings.setConnectionProvider(provider); } catch (SQLException e) { throw new SemantikaException("Exception occurred when initializing database object", e); //$NON-NLS-1$ } } private static IConnectionProvider createConnectionProvider(PropertiesConfiguration properties) throws ConfigurationException { return ConnectionProviderFactory.createConnectionProvider(getConnectionProperties(properties)); } @Override /* package */ void loadOntologyFromProperties(PropertiesConfiguration properties, Settings settings) throws SemantikaException { OntologyLoader loader = buildOntologyLoader(settings); String resource = properties.getString(Environment.ONTOLOGY_SOURCE); if (StringUtils.isEmpty(resource)) { LOG.debug("Ontology source is not specified. An empty ontology is created."); //$NON-NLS-1$ IOntology ontology = loader.createEmptyOntology(); settings.setOntology(ontology); } else { LOG.debug("Parsing ontology {}", resource); //$NON-NLS-1$ InputStream in = ConfigHelper.getResourceStream(resource); IOntology ontology = loader.loadOntologyFromDocument(in); settings.setOntology(ontology); } } @Override /* package */ void loadMappingFromProperties(PropertiesConfiguration properties, Settings settings) throws SemantikaException { IMappingSet mappingSet = new MappingSet(); IPrefixManager prefixManager = new DefaultPrefixManager(); MappingLoader loader = buildMappingLoader(settings); /* * feature/multiple-mappings: Support multiple mapping entries in the configuration file. * The iteration will check and parse each mapping resource and collect the results. */ String[] resource = properties.getStringArray(Environment.MAPPING_SOURCE); for (int i = 0; i < resource.length; i++) { LOG.debug("Parsing mapping {}", resource[i]); //$NON-NLS-1$ InputStream in = ConfigHelper.getResourceStream(resource[i]); collectMappingEntries(mappingSet, loader.loadMappingFromDocument(in, createParserConfiguration(properties, i))); collectPrefixEntries(prefixManager, loader.getPrefixManager()); } settings.setMappingSet(mappingSet); settings.setPrefixManager(prefixManager); } /* * Private utility methods */ private static OntologyLoader buildOntologyLoader(Settings settings) { return new OntologyLoader(); } private static MappingLoader buildMappingLoader(Settings settings) { return MappingLoaderFactory.createMappingLoader(settings.getDatabase(), settings.getOntology()); } private static MappingParserConfiguration createParserConfiguration(PropertiesConfiguration properties, int order) { MappingParserConfiguration configuration = new MappingParserConfiguration(); configuration.setStrictParsing(Boolean.parseBoolean(properties.getStringArray(Environment.STRICT_PARSING)[order])); return configuration; } private static IDialect determineDialect(PropertiesConfiguration properties, Connection conn) { String dialectName = properties.getString(Environment.DIALECT); IDialect dialect = DialectFactory.buildDialect(dialectName, conn); LOG.debug("* dialect = " + dialect.getClass().toString()); //$NON-NLS-1$ return dialect; } private static void collectMappingEntries(IMappingSet parent, IMappingSet child) { parent.copy(child); } private static void collectPrefixEntries(IPrefixManager parent, IPrefixManager child) { parent.copy(child.getPrefixMapper()); } }