50 lines
1.4 KiB
Java
50 lines
1.4 KiB
Java
package net.sf.jasperreports.engine.fill;
|
|
|
|
import java.util.HashSet;
|
|
import java.util.LinkedList;
|
|
import java.util.Set;
|
|
import net.sf.jasperreports.engine.JRRuntimeException;
|
|
|
|
public class JRClonePool {
|
|
private final JRFillCloneable original;
|
|
|
|
private final LinkedList availableClones;
|
|
|
|
private final boolean trackLockedClones;
|
|
|
|
private final Set lockedClones;
|
|
|
|
public JRClonePool(JRFillCloneable original, boolean trackLockedClones, boolean useOriginal) {
|
|
this.original = original;
|
|
this.availableClones = new LinkedList();
|
|
this.trackLockedClones = trackLockedClones;
|
|
if (trackLockedClones) {
|
|
this.lockedClones = new HashSet();
|
|
} else {
|
|
this.lockedClones = null;
|
|
}
|
|
if (useOriginal)
|
|
this.availableClones.add(original);
|
|
}
|
|
|
|
public Object getClone() {
|
|
JRFillCloneable clone;
|
|
if (this.availableClones.isEmpty()) {
|
|
JRFillCloneFactory factory = new JRFillCloneFactory();
|
|
clone = this.original.createClone(factory);
|
|
} else {
|
|
clone = this.availableClones.removeFirst();
|
|
}
|
|
if (this.trackLockedClones)
|
|
this.lockedClones.add(clone);
|
|
return clone;
|
|
}
|
|
|
|
public void releaseClone(Object clone) {
|
|
if (this.trackLockedClones)
|
|
if (!this.lockedClones.remove(clone))
|
|
throw new JRRuntimeException("Cannot release clone.");
|
|
this.availableClones.addLast(clone);
|
|
}
|
|
}
|