View Javadoc
1 /* ==================================================================== 2 * License: 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * 3. The end-user documentation included with the redistribution, 17 * if any, must include the following acknowledgment: 18 * "This product includes software developed by 19 * Robert Half International (http://www.rhi.com/)." 20 * Alternately, this acknowledgment may appear in the software itself, 21 * if and wherever such third-party acknowledgments normally appear. 22 * 23 * 4. The names "Parc", "RHI", and "Robert Half International" must 24 * not be used to endorse or promote products derived from this 25 * software without prior written permission. For written 26 * permission, please contact pete.mckinstry@rhi.com. 27 * 28 * 5. Products derived from this software may not be called "PARC", 29 * nor may "PARC" appear in their name, without prior written 30 * permission of Robert Half International. 31 * 32 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 33 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 34 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 35 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 36 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 37 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 38 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 39 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 40 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 41 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 42 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 43 * SUCH DAMAGE. 44 * ==================================================================== 45 * 46 */ 47 package com.rhi.architecture.parc; 48 49 import com.rhi.architecture.logging.LogUtil; 50 import com.rhi.architecture.logging.Logger; 51 import com.rhi.architecture.config.ConfigurationException; 52 import com.rhi.architecture.resource.InitializationException; 53 54 import java.util.Properties; 55 56 /*** 57 * Run once Application Strategy 58 * 59 * @author Pete McKinstry 60 * @copyright 2002, Robert Half Int'l., Inc. All rights reserved. 61 * 62 * @since 1.0 63 */ 64 public final class SingleCallApplicationStrategy 65 implements ApplicationStrategy { 66 67 // for normal logging activities, use the log category. 68 private static Logger log = null; 69 70 // for the few cycle statistics messages that are logged, 71 // use the stats category. 72 private static Logger stats = null; 73 74 // The process we should run 75 private Process process; 76 private static final String ROOT_PROCESS = "RootProcess"; 77 78 /*** 79 * Init method will be called prior to run to allow the 80 * strategy to initialize itself & acquire any necessary 81 * resources. 82 * 83 * @param p 84 * @throws InitializationException 85 * @since 1.0 86 */ 87 public void init(Properties p) throws InitializationException { 88 try { 89 log = LogUtil.getLogger(); 90 stats = LogUtil.getLogger(PARCApplication.CYCLE_STATS); 91 } 92 catch (ConfigurationException e) { 93 throw new InitializationException("ConfigurationException", e); 94 } 95 96 try { 97 /* 98 * The process type is the name of the class that should be 99 * loaded to jump-start this class. 100 */ 101 String processClassName = 102 p.getProperty(ROOT_PROCESS + Process.SEPARATOR + Process.TYPE); 103 if (processClassName == null) { 104 throw new InitializationException("Missing root process type from config settings"); 105 } 106 Class processClass = Class.forName(processClassName); 107 process = (Process) processClass.newInstance(); 108 109 /* 110 * This name is used as the program name by the config mixin 111 * classes. This is done so that you can have a PBApplication 112 * reference pseudo-PARCApplication configuration settings w/o 113 * requiring a complete duplication of the settings. 114 * Additionally, it eliminates the possibility of name 115 * collisions for discrete processes. 116 */ 117 String configName = 118 p.getProperty(ROOT_PROCESS + Process.SEPARATOR + Process.NAME); 119 if (configName == null) { 120 throw new InitializationException("Missing root process name from config settings"); 121 } 122 process.setName(configName); 123 /* 124 * properties are copied so that each process may add 125 * or replace whatever properties are required w/o affecting 126 * other process definitions. 127 */ 128 Properties processProperties = new Properties(p); 129 process.init(processProperties); 130 } 131 catch (ClassNotFoundException cnfe) { 132 throw new InitializationException("ClassNotFoundException", cnfe); 133 } 134 catch (InstantiationException ie) { 135 throw new InitializationException("InstantiationException", ie); 136 } 137 catch (IllegalAccessException iae) { 138 throw new InitializationException("IllegalAccessException", iae); 139 } 140 141 } 142 143 /*** 144 * The SingleCallApplicationStrategy does a single execution of the 145 * Process. 146 * 147 * @exception ProcessingException 148 * 149 * @since 1.0 150 */ 151 public void run() throws ProcessingException { 152 try { 153 stats.info("Strategy::run() - process started."); 154 process.run(); 155 } 156 finally { 157 process.cleanup(); 158 stats.info("Strategy::run() - process complete."); 159 } 160 } 161 162 }

This page was automatically generated by Maven