/* * Copyright (c) 2006-2007 Massachusetts General Hospital * All rights reserved. This program and the accompanying materials * are made available under the terms of the i2b2 Software License v1.0 * which accompanies this distribution. * * Contributors: * Raj Kuttan * Lori Phillips */ package edu.harvard.i2b2.ontology.util; import java.io.IOException; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.core.io.FileSystemResource; import edu.harvard.i2b2.common.exception.I2B2Exception; import edu.harvard.i2b2.common.util.ServiceLocator; /** * This is the Ontology service's main utility class This utility class provides * support for fetching resources like datasouce, to read application * properties, to get ejb home,etc. $Id: OntologyUtil.java,v 1.15 2009/01/08 * 19:27:01 lcp5 Exp $ * * @author rkuttan */ public class OntologyUtil { /** property file name which holds application directory name **/ public static final String APPLICATION_DIRECTORY_PROPERTIES_FILENAME = "ontology_application_directory.properties"; /** application directory property name **/ public static final String APPLICATIONDIR_PROPERTIES = "edu.harvard.i2b2.ontology.applicationdir"; /** application property filename **/ public static final String APPLICATION_PROPERTIES_FILENAME = "ontology.properties"; /** property name for datasource present in app property file **/ private static final String DATASOURCE_JNDI_PROPERTIES = "ontology.jndi.datasource_name"; /** property name for metadata schema name **/ private static final String METADATA_SCHEMA_NAME_PROPERTIES = "ontology.bootstrapdb.metadataschema"; /** spring bean name for datasource **/ private static final String DATASOURCE_BEAN_NAME = "dataSource"; /** property name for PM endpoint reference **/ private static final String PM_WS_EPR = "ontology.ws.pm.url"; /** property name for PM webservice method **/ private static final String PM_WS_METHOD = "ontology.ws.pm.webServiceMethod"; /** property name for PM bypass **/ private static final String PM_BYPASS = "ontology.ws.pm.bypass"; /** property name for PM bypass project **/ private static final String PM_BYPASS_PROJECT = "ontology.ws.pm.bypass.project"; /** property name for PM bypass role **/ private static final String PM_BYPASS_ROLE = "ontology.ws.pm.bypass.role"; /** property name for ONT_TERM_DELIMITER **/ private static final String ONT_TERM_DELIMITER = "ontology.terminal.delimiter"; private static final String FRCELL_WS_TEMPSPACE_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.tempspace"; private static final String FRCELL_WS_TIMEOUT_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.timeout"; private static final String FRCELL_WS_FILETHRESHOLD_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.filethreshold"; private static final String FRCELL_WS_ATTACHMENTNAME_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.attachmentname"; private static final String FRCELL_WS_OPERATIONNAME_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.operation"; /** property name for metadata schema name* */ private static final String FRCELL_WS_URL_PROPERTIES = "edu.harvard.i2b2.ontology.ws.fr.url"; private static final String CRCCELL_WS_URL_PROPERTIES = "edu.harvard.i2b2.ontology.ws.crc.url"; private static final String SERVICE_ACCOUNT_USER = "edu.harvard.i2b2.ontology.pm.serviceaccount.user"; private static final String SERVICE_ACCOUNT_PASSWORD = "edu.harvard.i2b2.ontology.pm.serviceaccount.password"; /** class instance field **/ private static OntologyUtil thisInstance = null; /** service locator field **/ private static ServiceLocator serviceLocator = null; /** field to store application properties **/ private static Properties appProperties = null; /** log **/ protected final Log log = LogFactory.getLog(getClass()); /** field to store app datasource **/ private DataSource dataSource = null; /** single instance of spring bean factory **/ private BeanFactory beanFactory = null; /** * Private constructor to make the class singleton */ private OntologyUtil() { } /** * Return this class instance * * @return OntologyUtil */ public static OntologyUtil getInstance() { if (thisInstance == null) { thisInstance = new OntologyUtil(); } serviceLocator = ServiceLocator.getInstance(); return thisInstance; } /** * Return the ontology spring config * * @return */ public BeanFactory getSpringBeanFactory() { if (beanFactory == null) { String appDir = null; try { // read application directory property file via classpath Properties loadProperties = ServiceLocator .getProperties(APPLICATION_DIRECTORY_PROPERTIES_FILENAME); // read directory property appDir = loadProperties.getProperty(APPLICATIONDIR_PROPERTIES); } catch (I2B2Exception e) { log.error(APPLICATION_DIRECTORY_PROPERTIES_FILENAME + "could not be located from classpath "); } if (appDir != null) { FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( "file:" + appDir + "/" + "OntologyApplicationContext.xml"); beanFactory = ctx.getBeanFactory(); } else { FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:" + "OntologyApplicationContext.xml"); beanFactory = ctx.getBeanFactory(); } } return beanFactory; } /** * Return metadata schema name * * @return * @throws I2B2Exception */ public String getMetaDataSchemaName() throws I2B2Exception { return getPropertyValue(METADATA_SCHEMA_NAME_PROPERTIES).trim() + "."; } /** * Return PM cell endpoint reference URL * * @return * @throws I2B2Exception */ public String getPmEndpointReference() throws I2B2Exception { return getPropertyValue(PM_WS_EPR).trim(); } /** * Return PM cell web service method * * @return * @throws I2B2Exception */ public String getPmWebServiceMethod() throws I2B2Exception { return getPropertyValue(PM_WS_METHOD).trim(); } /** * Return PM bypass flag * * @return * @throws I2B2Exception */ public Boolean isPmBypass() throws I2B2Exception { return Boolean.valueOf(getPropertyValue(PM_BYPASS).trim()); } /** * Return PM bypass project name * * @return * @throws I2B2Exception */ public String getPmBypassProject() throws I2B2Exception { return getPropertyValue(PM_BYPASS_PROJECT).trim(); } /** * Return PM bypass role assignment * * @return * @throws I2B2Exception */ public String getPmBypassRole() throws I2B2Exception { return getPropertyValue(PM_BYPASS_ROLE).trim(); } /** * Return Ontology terminal delimiter * * @return * @throws I2B2Exception */ public Boolean getOntTerminalDelimiter() throws I2B2Exception { return Boolean.valueOf(getPropertyValue(ONT_TERM_DELIMITER).trim()); } public String getFileRepositoryTempSpace() throws I2B2Exception { return getPropertyValue(FRCELL_WS_TEMPSPACE_PROPERTIES); } public String getFileRepositoryTimeout() throws I2B2Exception { return getPropertyValue(FRCELL_WS_TIMEOUT_PROPERTIES); } public String getFileRepositoryThreshold() throws I2B2Exception { return getPropertyValue(FRCELL_WS_FILETHRESHOLD_PROPERTIES); } public String getFileRepositoryAttachmentName() throws I2B2Exception { return getPropertyValue(FRCELL_WS_ATTACHMENTNAME_PROPERTIES); } public String getFileRepositoryOperationName() throws I2B2Exception { return getPropertyValue(FRCELL_WS_OPERATIONNAME_PROPERTIES); } public String getFileManagentCellUrl() throws I2B2Exception { return getPropertyValue(FRCELL_WS_URL_PROPERTIES); } public String getCRCUrl() throws I2B2Exception { return getPropertyValue(CRCCELL_WS_URL_PROPERTIES); } public String getServiceAccountUser() throws I2B2Exception { return getPropertyValue(SERVICE_ACCOUNT_USER); } public String getServiceAccountPassword() throws I2B2Exception { return getPropertyValue(SERVICE_ACCOUNT_PASSWORD); } /** * Return app server datasource * * @return datasource * @throws I2B2Exception * @throws SQLException */ public DataSource getDataSource(String dataSourceName) throws I2B2Exception { // DataSource dataSource = (DataSource) getSpringBeanFactory() // .getBean(DATASOURCE_BEAN_NAME); dataSource = (DataSource) serviceLocator .getAppServerDataSource(dataSourceName); return dataSource; } // --------------------- // private methods here // --------------------- /** * Load application property file into memory */ private String getPropertyValue(String propertyName) throws I2B2Exception { if (appProperties == null) { // read application directory property file Properties loadProperties = ServiceLocator .getProperties(APPLICATION_DIRECTORY_PROPERTIES_FILENAME); // read application directory property String appDir = loadProperties .getProperty(APPLICATIONDIR_PROPERTIES); if (appDir == null) { throw new I2B2Exception("Could not find " + APPLICATIONDIR_PROPERTIES + "from " + APPLICATION_DIRECTORY_PROPERTIES_FILENAME); } String appPropertyFile = appDir + "/" + APPLICATION_PROPERTIES_FILENAME; try { FileSystemResource fileSystemResource = new FileSystemResource( appPropertyFile); PropertiesFactoryBean pfb = new PropertiesFactoryBean(); pfb.setLocation(fileSystemResource); pfb.afterPropertiesSet(); appProperties = (Properties) pfb.getObject(); } catch (IOException e) { throw new I2B2Exception("Application property file(" + appPropertyFile + ") missing entries or not loaded properly"); } if (appProperties == null) { throw new I2B2Exception("Application property file(" + appPropertyFile + ") missing entries or not loaded properly"); } } String propertyValue = appProperties.getProperty(propertyName); if ((propertyValue != null) && (propertyValue.trim().length() > 0)) { ; } else { throw new I2B2Exception("Application property file(" + APPLICATION_PROPERTIES_FILENAME + ") missing " + propertyName + " entry"); } return propertyValue; } }