All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.commons.runtime.impl.AbstractRuntimeFactory Maven / Gradle / Ivy

/*
 * © Copyright IBM Corp. 2012
 * 
 * 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.commons.runtime.impl;

import java.util.HashMap;
import java.util.Map;

import com.ibm.commons.runtime.Application;
import com.ibm.commons.runtime.Context;
import com.ibm.commons.runtime.RuntimeFactory;



/**
 * Abstract Runtime factory for J2EE servers.
 * 
 * Implementation of a runtime factory to be used in a regular J2EE application. 
 * 
 * @author Philippe Riand
 */
public abstract class AbstractRuntimeFactory extends RuntimeFactory {

	private Map applications = new HashMap();
	private ThreadLocal contexts = new ThreadLocal();
	
	
	//
	//
	// Application
	//
	//
	
	protected ClassLoader getContextClassLoader() {
		return Thread.currentThread().getContextClassLoader();
	}
	
	public Map getApplicationMap() {
		return applications;
	}

	@Override
	public Application getApplicationUnchecked() {
		ClassLoader cl = getContextClassLoader();
		return applications.get(cl);
	}

	@Override
	public synchronized Application initApplication(Object servletContext) {
		ClassLoader cl = getContextClassLoader();
		AbstractApplication app = applications.get(cl);
		if(app==null) {
			RuntimeFactory rtFactory = RuntimeFactory.get();
			app = (AbstractApplication)rtFactory.createApplication(servletContext);
			applications.put(cl,app);
		}
		app._incReferences();
		return app;
	}

	@Override
	public synchronized void destroyApplication(Application application) {
		ClassLoader cl = getContextClassLoader();
		AbstractApplication app = applications.get(cl);
		if(app==null || app!=application) { // should not happen
			throw new IllegalStateException("Cannot destroy an application that doesn't exist");
		}
		app._decReferences();
		if(app._references()==0) {
			app.close();
			applications.remove(cl);
		}
	}	
	
	
	//
	//
	// Context
	//
	//
	
	public ThreadLocal getContextThreadLocal() {
		return contexts;
	}

	@Override
	public Context getContextUnchecked() {
		return contexts.get();
	}
	@Override
	public Context initContext(Application application, Object request, Object response) {
		AbstractContext ctx = contexts.get();
		if(ctx==null) {
			RuntimeFactory rtFactory = RuntimeFactory.get();
			ctx = (AbstractContext)rtFactory.createContext(application, request, response);
			contexts.set(ctx);
		}
		ctx._incReferences();
		return ctx;
	}
	@Override
	public Context initContext(Context context) {
		AbstractContext ctx = contexts.get();
		ctx = (AbstractContext)context;
		contexts.set(ctx);
		ctx._incReferences();
		return ctx;
	}
	@Override
	public void destroyContext(Context context) {
		AbstractContext ctx = contexts.get();
		if(ctx==null || ctx!=context) { // should not happen
			throw new IllegalStateException("Cannot destroy a context that doesn't exist");
		}
		ctx._decReferences();
		if(ctx._references()==0) {
			ctx.close();
			contexts.remove();
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy