/******************************************************************************* * Copyright (c) 2006 Oracle Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.fnmeta; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Function Library collects all the function registries for the given * language in the BPEL context. * * Imagine scripting language "foobar". There may be several registries contributing functions * to the language "foobar" library. The library is the single lookup point for scripting language * and the registry encompasses all the functions for the given language. * * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Aug 4, 2008 * */ public class FunctionLibrary { /** * */ static public FunctionLibrary INSTANCE = new FunctionLibrary(); /** * Index of all registries, by scripting language namespace name. */ Map<String,FunctionRegistry> fRegistries = new HashMap<String,FunctionRegistry>(); /** * List of registered loaders for the function library. This way we can do late loading * of registry information, basically delaying it until needed. */ List<IFunctionRegistryLoader> fLoaders = new ArrayList<IFunctionRegistryLoader>(); /** * * @param language the language. * @return the function registry for the given language. */ public FunctionRegistry getRegistryForLanguage ( String language ) { FunctionRegistry registry = fRegistries.get(language); if (registry != null) { return registry; } synchronized (fRegistries) { registry = fRegistries.get(language); if (registry != null) { return registry; } registry = new FunctionRegistry(language); for(IFunctionRegistryLoader loader : fLoaders) { loader.load( registry ); } fRegistries.put(language, registry); } return registry; } /** * @param registry */ public void add (FunctionRegistry registry) { fRegistries.put(registry.getLanguageNS(), registry); } /** * @param loader */ public void registerLoader ( IFunctionRegistryLoader loader ) { if (fLoaders.contains(loader)) { return ; } fLoaders.add ( loader ); } /** * @param loader * */ public void unregisterLoader( IFunctionRegistryLoader loader ) { fLoaders.remove(loader); } }