/* * 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.pm.util; import java.io.IOException; import java.io.StringWriter; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.ListIterator; 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 PM 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: PMUtil.java,v 1.3 2009/07/10 18:40:07 mem61 Exp $ * @author rkuttan */ public class PMUtil { /** property file name which holds application directory name **/ public static final String APPLICATION_DIRECTORY_PROPERTIES_FILENAME = "pm_application_directory.properties"; /** application directory property name **/ public static final String APPLICATIONDIR_PROPERTIES = "edu.harvard.i2b2.pm.applicationdir"; /** application property filename**/ public static final String APPLICATION_PROPERTIES_FILENAME = "pm.properties"; /** property name for datasource present in app property file**/ private static final String DATASOURCE_JNDI_PROPERTIES = "pm.jndi.datasource_name"; /** property name for metadata schema name**/ private static final String METADATA_SCHEMA_NAME_PROPERTIES = "pm.bootstrapdb.metadataschema"; /** spring bean name for datasource **/ private static final String DATASOURCE_BEAN_NAME = "dataSource"; /** class instance field**/ private static PMUtil 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 PMUtil() { } /** * Return this class instance * @return OntologyUtil */ public static PMUtil getInstance() { if (thisInstance == null) { thisInstance = new PMUtil(); } 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 + "/" + "PMApplicationContext.xml"); beanFactory = ctx.getBeanFactory(); } else { FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext( "classpath:" + "PMApplicationContext.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 app server datasource * @return datasource * @throws I2B2Exception */ public DataSource getDataSource(String dataSourceName) throws I2B2Exception { dataSource = (DataSource) serviceLocator .getAppServerDataSource(dataSourceName); return dataSource; } public void convertToUppercaseStrings( List< String > list ) { ListIterator< String > iterator = list.listIterator(); while ( iterator.hasNext() ) { String color = iterator.next(); // get item iterator.set( color.toUpperCase() ); // convert to upper case } // end while } public String toHex(byte[] digest) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < digest.length; i++) { buf.append(Integer.toHexString((int) digest[i] & 0x00FF)); } return buf.toString(); } public String generateMessageId() { StringWriter strWriter = new StringWriter(); for(int i=0; i<20; i++) { int num = getValidAcsiiValue(); //System.out.println("Generated number: " + num + " char: "+(char)num); strWriter.append((char)num); } return strWriter.toString(); } private int getValidAcsiiValue() { int number = 48; while(true) { number = 48+(int) Math.round(Math.random() * 74); if((number > 47 && number < 58) || (number > 64 && number < 91) || (number > 96 && number < 123)) { break; } } return number; } public String getHashedPassword(String pass) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(pass.getBytes()); return toHex(md5.digest()); } catch (NoSuchAlgorithmException e) { log.error("NoSuchAlgorithm MD5!", e); } return null; } //--------------------- // 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; } }