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

org.springframework.webflow.execution.repository.continuation.FlowExecutionContinuationGroup Maven / Gradle / Ivy

There is a newer version: 1.0.6
Show newest version
/*
 * Copyright 2002-2006 the original author or authors.
 *
 * 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 org.springframework.webflow.execution.repository.continuation;

import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * A group of flow execution continuations. Simple typed data structure backed
 * by a map and linked list. Supports expelling the oldest continuation once a
 * maximum group size is met.
 * 
 * @author Keith Donald
 */
class FlowExecutionContinuationGroup implements Serializable {

	/**
	 * A map of continuations; the key is the continuation id, and the value is
	 * the {@link FlowExecutionContinuation} object.
	 */
	private Map continuations = new HashMap();

	/**
	 * An ordered list of continuation ids. Each continuation id represents an
	 * pointer to a continuation in the map. The first element is the oldest 
	 * continuation and the last is the youngest. 
	 */
	private LinkedList continuationIds = new LinkedList();

	/**
	 * The maximum number of continuations allowed in this group.
	 */
	private int maxContinuations = -1;

	/**
	 * Creates a new flow execution continuation group.
	 * @param maxContinuations the maximum number of continuations that can be
	 * stored in this group, -1 for unlimited
	 */                                                                            
	public FlowExecutionContinuationGroup(int maxContinuations) {
		this.maxContinuations = maxContinuations;
	}
	
	/**
	 * Returns the count of continuations in this group.
	 */
	public int getContinuationCount() {
		return continuationIds.size();
	}

	/**
	 * Returns the continuation with the provided id, or
	 * null if no such continuation exists with that id.
	 * @param id the continuation id
	 * @return the continuation
	 * @throws ContinuationNotFoundException if the id does not match a
	 * continuation in this group
	 */
	public FlowExecutionContinuation get(Serializable id) throws ContinuationNotFoundException {
		FlowExecutionContinuation continuation = (FlowExecutionContinuation)continuations.get(id);
		if (continuation == null) {
			throw new ContinuationNotFoundException(id);
		}
		return continuation;
	}

	/**
	 * Add a flow execution continuation with given id to this group.
	 * @param continuationId the continuation id
	 * @param continuation the continuation
	 */
	public void add(Serializable continuationId, FlowExecutionContinuation continuation) {
		continuations.put(continuationId, continuation);
		continuationIds.add(continuationId);
		// remove the oldest continuation if them maximium number of
		// continuations has been exceeded
		if (maxExceeded()) {
			removeOldestContinuation();
		}
	}

	/**
	 * Has the maximum number of allowed continuations in this group been exceeded?
	 */
	private boolean maxExceeded() {
		return maxContinuations > 0 && continuationIds.size() > maxContinuations;
	}

	/**
	 * Remove the olders continuation from this group.
	 */
	private void removeOldestContinuation() {
		continuations.remove(continuationIds.removeFirst());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy