/**
* Copyright 2014 Comcast Cable Communications Management, LLC
*
* This file is part of CATS.
*
* CATS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CATS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CATS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.comcast.cats.domain.configuration;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
/**
*
* @author cfrede001
*
*/
@Named
public class CatsHome implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger( CatsHome.class );
public static final String CATS_HOME_RELATIVE_DIR = "cats";
public static final String CATS_HOME_TEMP_RELATIVE_DIR = "tmp";
public static final String CATS_HOME_TEMP_TOUCH = "touch.txt";
public static final char FILE_SEPERATOR = IOUtils.DIR_SEPARATOR;
public static final String CATS_HOME_SYSTEM_PROPERTY = "cats.home";
public static final String CATS_HOME_ENV_PROPERTY = "CATS_HOME";
protected String catsHome;
protected String tmpHome;
protected String touchFile;
protected CatsHome()
{
displaySystemProperties();
}
/**
* Check if the cats home is specified in the env properties.
* If yes specify those value as cats.home in the system property
* If found empty or null, create a default location at user.home/cats.
*
*/
public static void initializeCatsHome() {
String catsHome = System.getProperty( CATS_HOME_SYSTEM_PROPERTY );
//logger.info( "catsHome from system "+catsHome );
if(null == catsHome || "".equals(catsHome)){
String catsHomeEnv = System.getenv( CATS_HOME_ENV_PROPERTY );
//logger.info( "catsHome from Env "+catsHomeEnv );
if(null != catsHomeEnv && !"".equals(catsHomeEnv)){
//logger.info( "Setting catsHome as "+catsHomeEnv );
System.setProperty( CATS_HOME_SYSTEM_PROPERTY, catsHomeEnv );
}else{
//logger.info( "Creating a temp catsHome " );
String defaultHome = "";
String userHome = System.getProperty( "user.home" );
if ( null != userHome )
{
//logger.info( "user.home is "+userHome );
defaultHome = userHome;
}else{
//logger.info( "user.home not found!" );
}
defaultHome += FILE_SEPERATOR + CATS_HOME_RELATIVE_DIR;
System.setProperty( CATS_HOME_SYSTEM_PROPERTY, defaultHome );
}
}
}
@Value( "#{(systemProperties['cats.home'] != null) ?" + "systemProperties['cats.home'] : "
+ "systemEnvironment['CATS_HOME']}" )
protected void setSystemCatsHome( String catsHome )
{
logger.info( "SetSystemCatsHome[" + catsHome + "]" );
this.catsHome = catsHome;
}
public static void displaySystemProperties()
{
Properties props = System.getProperties();
logger.info( "Found " + Integer.toString( props.size() ) + " System Properties!" );
Iterator< Entry< Object, Object > > iterator = props.entrySet().iterator();
Entry< Object, Object > entry;
while ( iterator.hasNext() )
{
entry = iterator.next();
logger.info( entry.getKey() + "=" + entry.getValue() );
}
}
public String getCatsHomeDirectory()
{
return catsHome;
}
protected void configureCatsTemp()
{
this.tmpHome = catsHome + FILE_SEPERATOR + CATS_HOME_TEMP_RELATIVE_DIR;
}
public String getCatsTempDirectory()
{
return tmpHome;
}
@PostConstruct
protected void configure() throws IOException
{
if ( catsHome == null )
{
catsHome = getDefaultCatsHome();
logger.info( "Setting DefaultCatsHome [" + catsHome + "]" );
}
setCatsHomeSystemProperty();
configureCatsTemp();
configureTouchFile();
createDirectoryStructure();
logger.info( toString() );
}
/**
* Create a touch file that will represent the deepest directory structure
* for cats.home.
*/
protected void configureTouchFile()
{
touchFile = getCatsTempDirectory() + FILE_SEPERATOR + CATS_HOME_TEMP_TOUCH;
}
/**
* The touch file
*
* @return - Our touch file.
*/
public String getTouchFile()
{
return touchFile;
}
/**
* This system property should be set for consistency.
*/
protected void setCatsHomeSystemProperty()
{
System.setProperty( CATS_HOME_SYSTEM_PROPERTY, catsHome );
}
protected String getDefaultCatsHome()
{
String defaultHome = "";
String userHome = System.getProperty( "user.home" );
if ( null != userHome )
{
logger.info( "user.home not found!" );
defaultHome = userHome;
}
defaultHome += FILE_SEPERATOR + CATS_HOME_RELATIVE_DIR;
return defaultHome;
}
/**
* Make sure these directories exist by "touching" a temporary file inside
* tmp.
*
* @throws IOException
*/
protected void createDirectoryStructure() throws IOException
{
FileUtils.touch( new File( getTouchFile() ) );
}
@Override
public String toString()
{
return "CatsHome[" + catsHome + "]\n" + "TmpHome[" + tmpHome + "]\n";
}
}