/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc., Oracle Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. * Oracle Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.config.internal; import org.eclipse.gemini.blueprint.config.internal.util.AttributeCallback; import org.eclipse.gemini.blueprint.config.internal.util.ParserUtils; import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean; import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.w3c.dom.Attr; import org.w3c.dom.Element; /** * <osgi:reference> element parser. * * @author Andy Piper * @author Costin Leau */ public class ReferenceBeanDefinitionParser extends AbstractReferenceDefinitionParser { /** * Reference attribute callback extension that looks for 'singular' reference attributes (such as timeout). * * @author Costin Leau */ static class TimeoutAttributeCallback implements AttributeCallback { boolean isTimeoutSpecified = false; public boolean process(Element parent, Attr attribute, BeanDefinitionBuilder builder) { String name = attribute.getLocalName(); if (TIMEOUT.equals(name)) { isTimeoutSpecified = true; } return true; } } // call properties private static final String TIMEOUT_PROP = "timeout"; // XML attributes/elements protected static final String TIMEOUT = "timeout"; protected Class getBeanClass(Element element) { return OsgiServiceProxyFactoryBean.class; } protected void parseAttributes(Element element, BeanDefinitionBuilder builder, AttributeCallback[] callbacks, OsgiDefaultsDefinition defaults) { // add timeout callback TimeoutAttributeCallback timeoutCallback = new TimeoutAttributeCallback(); super.parseAttributes(element, builder, ParserUtils.mergeCallbacks(callbacks, new AttributeCallback[] { timeoutCallback }), defaults); // look for defaults if (!timeoutCallback.isTimeoutSpecified) { applyDefaultTimeout(builder, defaults); } } /** * Apply default definitions to the existing bean definition. In this case, it means applying the timeout. * * This method is called when a certain expected element is not present. * * @param element * @param context * @param builder */ protected void applyDefaultTimeout(BeanDefinitionBuilder builder, OsgiDefaultsDefinition defaults) { builder.addPropertyValue(TIMEOUT_PROP, new TypedStringValue(defaults.getTimeout())); } }