/* * [Global.java] * * Summary: Allows all methods to access the current configuration. * * Copyright: (c) 2010-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.0 2010-01-23 initial version */ package com.mindprod.htmlmacros.macro; import com.mindprod.common18.BigDate; import com.mindprod.common18.ST; import com.mindprod.fastcat.FastCat; import com.mindprod.htmlmacros.support.AssignCSSClasses; import com.mindprod.htmlmacros.support.Configuration; import com.mindprod.htmlmacros.support.ConfigurationForCherokeeObama; import com.mindprod.htmlmacros.support.ConfigurationForMindprod; import com.mindprod.htmlmacros.support.ConfigurationForMindprodCa; import com.mindprod.htmlmacros.support.ConfigurationForMindprodCom; import java.io.File; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * Allows all methods to access the current configuration. * * @author Roedy Green, Canadian Mind Products * @version 1.0 2010-01-23 initial version. * @since 2010-01-23 */ public class Global { /** * today's date. used to detect anniversaries of birth/deaths. Keep consistent throughout run over midnight. */ public static final BigDate TODAY = BigDate.localToday(); public static final BigDate DAY_BEFORE_YESTERDAY = BigDate.localToday().addDays( -2 ); public static final BigDate YESTERDAY = BigDate.localToday().addDays( -1 ); public static final int THIS_CALENDAR_YEAR = TODAY.getYYYY(); /** * used to accumulate text to insert at the very bottom of the page just before */ public static final FastCat forBottom = new FastCat( 100 ); public volatile static boolean gracefulStop = false; /** * the current configuration. Known to all methods. * Configuration set in Replacer command line, or programmatically * by ReplaceMindprod or ReplaceCherokeeObama. */ public static Configuration configuration; /** * current config for assigning CSS classes to urls */ public static AssignCSSClasses assignCSSClasses; /** * 5 second periodic timer */ private static ScheduledExecutorService scheduler; /** * shutdown stop probe */ public static void closeStopMonitoring() { scheduler.shutdownNow(); final File stop = new File( configuration.getLocalWebrootWithSlashes() + "/busy/stop.dat" ); if ( stop.exists() ) { stop.delete(); } } /** * Installs configuration on the command line as the current configuration. * * @param args class name of configuration e.g. ConfigurationForMindprod or * ConfigurationForCherokeeObama */ public static void installConfiguration( String[] args ) { if ( args == null || args.length < 1 || ST.isEmpty( args[ 0 ] ) ) { throw new IllegalArgumentException( "The name of the configuration e.g. ConfigurationForMindprod must be first on the commmand line." ); } installConfiguration( args[ 0 ] ); args[ 0 ] = null; } /** * Installs configuration as the current configuration. * * @param configurationName class name of configuration e.g. ConfigurationForMindprod or * ConfigurationForCherokeeObama */ public static void installConfiguration( String configurationName ) { final Configuration c; switch ( configurationName ) { case "ConfigurationForMindprodCom": c = new ConfigurationForMindprodCom(); break; case "ConfigurationForMindprodCa": c = new ConfigurationForMindprodCa(); break; case "ConfigurationForMindprod": c = new ConfigurationForMindprod(); break; case "ConfigurationForCherokeeObama": c = new ConfigurationForCherokeeObama(); break; default: try { // e.g. parm to Class.forName looks like: "ConfigurationForMindprod" final String binaryClassName = "com.mindprod.htmlmacros.support." + configurationName; // Make sure the class we dynamically load implements the Configuration interface. final Class configurationClass = Class.forName( binaryClassName ).asSubclass( Configuration.class ); c = configurationClass.newInstance(); } catch ( ClassCastException e ) { // configuration exists but is screwed up, but the code exists. throw new ClassCastException( "Coding bug: The code to process configuration " + configurationName + " refused access. It needs a public no-arg constructor." ); } catch ( Exception e ) { // might have been ClassNotFoundException, NoClassDefFoundException // Any problem is a failure. throw new IllegalArgumentException( "Fatal error: Configuration " + configurationName + " not found" ); } } // end switch installConfiguration( c ); } /** * Installs configuration as the current configuration. * * @param configuration class name of configuration e.g. new ConfigurationForMindprod() * ConfigurationForCherokeeObama */ public static void installConfiguration( Configuration configuration ) { Global.configuration = configuration; Global.assignCSSClasses = configuration.getAssignCSSClasses(); } /** * keep tabs on stop.dat file to request shutdown */ public static void openStopMonitoring() { final File stop = new File( configuration.getLocalWebrootWithSlashes() + "/busy/stop.dat" ); // check for request to stop every 5 seconds. scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate( new Runnable() { public void run() { if ( stop.exists() ) { Global.gracefulStop = true; stop.delete(); } } }, 5, 5, TimeUnit.SECONDS ); } }