blob: d4a06726f8ba48af8a32fda3f1b6c8205e16e412 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.internal.sequencing;
import java.util.*;
import java.util.concurrent.*;
/**
* Handles the storage and allocation of sequence values.
* This is held by the session (ServerSession) through the SequencingManager.
* @see SequencingManager
*/
class PreallocationHandler implements SequencingLogInOut {
protected Map<String, Queue> preallocatedSequences;
public PreallocationHandler() {
super();
}
/**
* Returns the Queue of sequences from the global sequences for the seqName.
* If there is not one, a new empty Queue is registered.
* This queue is thread-safe, and threads can concurrent poll the queue to remove the first element.
*/
public Queue getPreallocated(String sequenceName) {
Queue sequences = preallocatedSequences.get(sequenceName);
if (sequences == null) {
synchronized (preallocatedSequences) {
sequences = preallocatedSequences.get(sequenceName);
if (sequences == null) {
sequences = new ConcurrentLinkedQueue();
preallocatedSequences.put(sequenceName, sequences);
}
}
}
return sequences;
}
// SequencingLogInOut
public void onConnect() {
initializePreallocated();
}
public void onDisconnect() {
preallocatedSequences = null;
}
public boolean isConnected() {
return preallocatedSequences != null;
}
/**
* Removes all preallocated objects.
* A dangerous method to use in multithreaded environment method,
* but so handy for testing.
*/
public void initializePreallocated() {
preallocatedSequences = new ConcurrentHashMap(20);
}
/**
* Removes all preallocated objects for the specified seqName.
* A dangerous method to use in multithreaded environment method,
* but so handy for testing.
*/
public void initializePreallocated(String seqName) {
preallocatedSequences.remove(seqName);
}
/**
* Add the preallocated sequences to the global sequence pool for the sequence name.
* Although this method is thread-safe, a lock should typically be obtained from the sequence manager before calling this method,
* to ensure sequential numbers.
*/
public void setPreallocated(String seqName, Vector sequences) {
getPreallocated(seqName).addAll(sequences);
}
}