blob: ccfddc414e406b293336ef0ed4d7a0aad60c1949 [file] [log] [blame]
/******************************************************************************
* 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()));
}
}