All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.objectweb.fractal.mind.adl.CachingDefinitionReferenceResolver Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2009 STMicroelectronics
 *
 * This file is part of "Mind Compiler" is free software: you can redistribute 
 * it and/or modify it 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.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 *
 * Contact: [email protected]
 *
 * Authors: Matthieu Leclercq
 * Contributors: 
 */

package org.objectweb.fractal.mind.adl;

import static org.objectweb.fractal.mind.BindingControllerImplHelper.checkItfName;
import static org.objectweb.fractal.mind.BindingControllerImplHelper.listFcHelper;
import static org.objectweb.fractal.mind.adl.ast.ASTHelper.getResolvedDefinition;
import static org.objectweb.fractal.mind.adl.ast.ASTHelper.setResolvedDefinition;

import java.util.Map;

import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.Definition;
import org.objectweb.fractal.adl.Loader;
import org.objectweb.fractal.api.NoSuchInterfaceException;
import org.objectweb.fractal.api.control.IllegalBindingException;
import org.objectweb.fractal.mind.adl.ast.DefinitionReference;

/**
 * Simple delegating {@link DefinitionReferenceResolver} that attaches resolved
 * definitions as decoration on the given {@link DefinitionReference}. So if
 * latter the same reference is resolved another time, the designated definition
 * is simply retrieved by accessing to this decoration. 
* The decoration attached to the DefinitionReference is * serializable, but only the name of the attached definition is actually * serialized. This means that the decoration may be present on a given * DefinitionReference, but without the designated definition. In * this case, this component will delegate loading of the designated definition * to its {@link #loaderItf} client interface. */ public class CachingDefinitionReferenceResolver extends AbstractDefinitionReferenceResolver { // --------------------------------------------------------------------------- // Client interfaces // --------------------------------------------------------------------------- /** The name of the {@link #loaderItf} client interface. */ public static final String LOADER_ITF_NAME = "loader"; /** The Loader interface used to load referenced definitions. */ public Loader loaderItf; // --------------------------------------------------------------------------- // Implementation of the DefinitionReferenceResolver interface // --------------------------------------------------------------------------- public Definition resolve(final DefinitionReference reference, final Definition encapsulatingDefinition, final Map context) throws ADLException { Definition d = getResolvedDefinition(reference, loaderItf, context); if (d == null) { d = clientResolverItf .resolve(reference, encapsulatingDefinition, context); setResolvedDefinition(reference, d); } return d; } // --------------------------------------------------------------------------- // Overridden BindingController methods // --------------------------------------------------------------------------- @Override public void bindFc(final String itfName, final Object value) throws NoSuchInterfaceException, IllegalBindingException { checkItfName(itfName); if (itfName.equals(LOADER_ITF_NAME)) { loaderItf = (Loader) value; } else { super.bindFc(itfName, value); } } @Override public String[] listFc() { return listFcHelper(super.listFc(), LOADER_ITF_NAME); } @Override public Object lookupFc(final String itfName) throws NoSuchInterfaceException { checkItfName(itfName); if (itfName.equals(LOADER_ITF_NAME)) { return loaderItf; } else { return super.lookupFc(itfName); } } @Override public void unbindFc(final String itfName) throws NoSuchInterfaceException, IllegalBindingException { checkItfName(itfName); if (itfName.equals(LOADER_ITF_NAME)) { loaderItf = null; } else { super.unbindFc(itfName); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy