/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.github.geophile.erdo.util;
import java.util.ArrayDeque;
import java.util.Deque;
// A pool of interchangeable resources
public abstract class AbstractPool<RESOURCE>
{
public final synchronized RESOURCE takeResource()
{
RESOURCE resource;
if (resourceList.isEmpty()) {
resource = newResource();
} else {
resource = resourceList.removeFirst();
RESOURCE removed = resourceSet.remove(resource);
assert removed == resource : resource;
}
activate(resource);
return resource;
}
public final synchronized void returnResource(RESOURCE resource)
{
deactivate(resource);
resourceList.addLast(resource);
RESOURCE replaced = resourceSet.add(resource);
assert replaced == null : resource;
}
public abstract RESOURCE newResource();
public void activate(RESOURCE resource)
{}
public void deactivate(RESOURCE resource)
{}
private final Deque<RESOURCE> resourceList = new ArrayDeque<>();
// To check uniqueness
private final IdentitySet<RESOURCE> resourceSet = new IdentitySet<>();
}