eu.esdihumboldt.cst.internal.TransformationTreePool.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.cst.internal.TransformationTreePool.java

Source

/*
 * Copyright (c) 2012 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     HUMBOLDT EU Integrated Project #030962
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.cst.internal;

import java.util.List;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;

import eu.esdihumboldt.hale.common.align.model.Alignment;
import eu.esdihumboldt.hale.common.align.model.Cell;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.TransformationTree;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.context.ContextMatcher;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.impl.TransformationTreeImpl;
import eu.esdihumboldt.hale.common.align.model.transformation.tree.visitor.ResetVisitor;

/**
 * Pool for transformation trees.
 * 
 * @author Simon Templer
 */
public class TransformationTreePool {

    private final Alignment alignment;

    private final ListMultimap<Cell, TransformationTree> trees;

    private final ResetVisitor resetVisitor = new ResetVisitor();

    private final ContextMatcher matcher;

    /**
     * Create a transformation tree pool.
     * 
     * @param alignment the associated alignment
     * @param matcher the context matcher to apply to a created tree
     */
    public TransformationTreePool(Alignment alignment, ContextMatcher matcher) {
        this.alignment = alignment;
        this.matcher = matcher;

        trees = ArrayListMultimap.create();
    }

    /**
     * Get a transformation tree from the pool.
     * 
     * @param typeCell the type cell for the transformation tree
     * @return the transformation tree
     */
    public TransformationTree getTree(Cell typeCell) {
        synchronized (trees) {
            List<TransformationTree> treeList = trees.get(typeCell);
            if (treeList.isEmpty()) {
                TransformationTree tree = new TransformationTreeImpl(alignment, typeCell);
                if (matcher != null) {
                    matcher.findMatches(tree);
                }
                return tree;
            } else {
                TransformationTree tree = treeList.remove(0);
                return tree;
            }
        }
    }

    /**
     * Release a tree to the pool.
     * 
     * @param tree the transformation tree that is no longer needed
     */
    public void releaseTree(TransformationTree tree) {
        tree.accept(resetVisitor); // remove all annotations
        synchronized (trees) {
            trees.put(tree.getTypeCell(), tree);
        }
    }

}