Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 
   * Copyright 2012,2013 International Business Machines Corp.
   * 
   * See the NOTICE file distributed with this work for additional information
   * regarding copyright ownership. Licensed under the Apache License, 
   * Version 2.0 (the "License"); you may not use this file except in compliance
   * with the License. You may obtain a copy of the License at
   * 
  *   http://www.apache.org/licenses/LICENSE-2.0
  * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.ibm.jbatch.container.servicesmanager;
 
 import java.util.Map;
 import java.util.Set;
 
 
 
 	private final static String sourceClass = ServicesManagerImpl.class.getName();
 	private final static Logger logger = Logger.getLogger();
 	
 	private ServicesManagerImpl() { } 
 	
 	// Lazily-loaded singleton.
 	private static class ServicesManagerImplHolder {
 		private static final ServicesManagerImpl INSTANCE = new ServicesManagerImpl();
 	}
 
 	public static ServicesManager getInstance() {
 	}
 	
 	// Declared 'volatile' to allow use in double-checked locking.  This 'isInited'
 	// refers to whether the configuration has been hardened and possibly the
 	// first service impl loaded, not whether the instance has merely been instantiated.
 	private final byte[] isInitedLock = new byte[0];
 	private volatile Boolean isInited = .;
 
 	private Properties batchContainerProps = null;
 
 	
 	private Map<StringNamepropertyNameTable = ServiceTypes.getServicePropertyNames();
 
 	// Registry of all current services
Init doesn't actually load the service impls, which are still loaded lazily. What it does is it hardens the config. This is necessary since the batch runtime by and large is not dynamically configurable, (e.g. via MBeans). Things like the database config used by the batch runtime's persistent store are hardened then, as are the names of the service impls to use.
 
 	private void initIfNecessary() {
 			.config("In initIfNecessary().");
 		}
 		// Use double-checked locking with volatile.
 		if (!) {
 			synchronized () {
 				if (!) {
 					.config("--- Initializing ServicesManagerImpl ---");
 
					.config("--- Completed initialization of ServicesManagerImpl ---");
				}
			}
		}
		.config("Exiting initIfNecessary()");
	}
	private void initFromPropertiesFiles() {
		Properties serviceIntegratorProps = new Properties();
		InputStream batchServicesListInputStream = this.getClass()
		if (batchServicesListInputStream != null) {
			try {
				.config("Batch Integrator Config File exists! loading it..");
				serviceIntegratorProps.load(batchServicesListInputStream);
				batchServicesListInputStream.close();
catch (IOException e) {
				.config("Error loading " + "/META-INF/services/" +  + " IOException=" + e.toString());
catch (Exception e) {
				.config("Error loading " + "/META-INF/services/" +  + " Exception=" + e.toString());
			}
else {
			.config("Could not find batch integrator config file: " + "/META-INF/services/" + );
		}
		// See if any do not map to service impls.
		Set<StringremoveThese = new HashSet<String>();
		for (Object key : serviceIntegratorProps.keySet()) {
			String keyStr = (Stringkey;
				.warning("Found property named: " + keyStr
" with value: " + serviceIntegratorProps.get(keyStr)
" in " +  + " , but did not find a corresponding service type "
"in the internal table of service types.\n Ignoring this property then.   Maybe this should have been set in batch-config.properties instead.");
				removeThese.add(keyStr);
			}
		}
		for (String s : removeThese) {
			serviceIntegratorProps.remove(s);
		}
		Properties adminProps = new Properties();
		InputStream batchAdminConfigListInputStream = this.getClass().getResourceAsStream("/META-INF/services/" + );
		if (batchServicesListInputStream != null) {
			try {
				.config("Batch Admin Config File exists! loading it..");
				adminProps.load(batchAdminConfigListInputStream);
				batchAdminConfigListInputStream.close();
catch (IOException e) {
				.config("Error loading " + "/META-INF/services/" +  + " IOException=" + e.toString());
catch (Exception e) {
				.config("Error loading " + "/META-INF/services/" +  + " Exception=" + e.toString());
			}
else {
			.config("Could not find batch admin config file: " + "/META-INF/services/" + );
		}
		// See if any DO map to service impls, which would be a mistake
		Set<StringremoveTheseToo = new HashSet<String>();
		for (Object key : adminProps.keySet()) {
			String keyStr = (Stringkey;
				.warning("Found property named: " + keyStr + " with value: " + adminProps.get(keyStr) + " in "
 + " , but this is a batch runtime service configuration.\n"
"Ignoring this property then, since this should have been set in batch-services.properties instead.");
				removeThese.add(keyStr);
			}
		}
		for (String s : removeTheseToo) {
			adminProps.remove(s);
		}
		// Merge the two into 'batchContainerProps'
		.putAll(serviceIntegratorProps);
		.fine("Dumping contents of batchContainerProps after reading properties files.");
		for (Object key : .keySet()) {
			.config("key = " + key);
			.config("value = " + .get(key));
		}
		// Set this on the config. 
		// 
		// WARNING:  This sets us up for collisions since this is just a single holder of properties
		// potentially used by any service impl.
	}
	private void initServiceImplOverrides() {
		// For each property we care about (i.e that defines one of our service impls)
		for (String propKey : .keySet()) {
			// If the property is defined
			if (value != null) {
				// Get the corresponding serviceType enum and store the value of
				// the key/value property pair in the table where we store the service impl classnames.
				Name serviceType = .get(propKey);
				String defaultServiceImplClassName = .get(serviceType); // For logging.
				.put(serviceTypevalue.trim());
				.config("Overriding serviceType: " + serviceType + ", replacing default impl classname: " + 
							defaultServiceImplClassName + " with override impl class name: " + value.trim());
			}
		}
	}
	private void initDatabaseConfig() {
		if ( == null) { 
			.config("First try to load 'suggested config' from BatchSPIManager");
			if ( == null) { 
				.fine("Loading database config from configuration properties file.");
				// Initialize database-related properties
			}
		}  else {
			// Currently we do not expected this path to be used by Glassfish
			.config("Database config has been set directly from SPI, do NOT load from properties file.");
		}
		// In either case, set this bean on the main config bean
	}
	private void initOtherConfig() {
		if (seMode.equalsIgnoreCase("true")) {
		}
	}
	// Look up registry and return requested service if exist
	// If not exist, create a new one, add to registry and return that one
	/* (non-Javadoc)
	 * @see com.ibm.jbatch.container.config.ServicesManager#getService(com.ibm.jbatch.container.config.ServicesManagerImpl.ServiceType)
	 */
		String sourceMethod = "getService";
			.entering(sourceMethod + ", serviceType=" + serviceType);
		IBatchServiceBase service = new ServiceLoader(serviceType).getService();
			.exiting(sourceMethod);
		return service;
	}
	/*
	 * 	public enum Name {
		JAVA_EDITION_IS_SE_DUMMY_SERVICE, 
		TRANSACTION_SERVICE, 
		PERSISTENCE_MANAGEMENT_SERVICE, 
		JOB_STATUS_MANAGEMENT_SERVICE, 
		BATCH_THREADPOOL_SERVICE, 
		BATCH_KERNEL_SERVICE, 
		JOB_ID_MANAGEMENT_SERVICE, 
		CALLBACK_SERVICE, 
		JOBXML_LOADER_SERVICE,                // Preferred
		DELEGATING_JOBXML_LOADER_SERVICE,      // Delegating wrapper
		CONTAINER_ARTIFACT_FACTORY_SERVICE,   // Preferred
		DELEGATING_ARTIFACT_FACTORY_SERVICE  // Delegating wrapper
	 */
	}
	}
	}
	}
	}
	}
	}
	}
	}
	}
	}
	private class ServiceLoader {
		volatile IBatchServiceBase service = null;
		private Name serviceType = null;
		private ServiceLoader(Name name) {
			this. = name;
		}
			if ( == null) {
				// Probably don't want to be loading two on two different threads so lock the whole table.
				synchronized () {
					if ( == null) {
					}
				}
			}
			return ;
		}
Try to load the IGridContainerService given by the className. If it fails to load, default to the defaultClass. If the default fails to load, then blow out of here with a RuntimeException.
		private IBatchServiceBase _loadServiceHelper(Name serviceType) {
			IBatchServiceBase service = null;
			Throwable e = null;
			String className = .get(serviceType);
			try {
				if (className != null)
					service = _loadService(className);
catch (PersistenceException pe) {
				// Don't rewrap to make it a bit clearer
				.log(."Caught persistence exception which probably means there is an issue initalizing and/or connecting to the RI database");
				throw pe;
catch (Throwable e1) {
				e = e1;
				.log(."Could not instantiate service: " + className + " due to exception:" + e);
				throw new RuntimeException("Could not instantiate service " + className + " due to exception: " + e);
			}
			if (service == null) {
				throw new RuntimeException("Instantiate of service=: " + className + " returned null. Aborting...");
			}
			return service;
		}
		private IBatchServiceBase _loadService(String classNamethrows Exception {
			IBatchServiceBase service = null;
			Class cls = Class.forName(className);
			if (cls != null) {
				Constructor ctor = cls.getConstructor();
				if (ctor != null) {
					service = (IBatchServiceBasector.newInstance();
else {
					throw new Exception("Service class " + className + " should  have a default constructor defined");
				}
else {
				throw new Exception("Exception loading Service class " + className + " make sure it exists");
			}
			return service;
		}
	}
New to GrepCode? Check out our FAQ X