/****************************************************************************** * 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 java.util.Locale; import org.eclipse.gemini.blueprint.bundle.BundleActionEnum; import org.eclipse.gemini.blueprint.bundle.BundleFactoryBean; import org.eclipse.gemini.blueprint.config.internal.util.AttributeCallback; import org.eclipse.gemini.blueprint.config.internal.util.ParserUtils; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * BundleFactoryBean definition. * * @author Andy Piper * @author Costin Leau */ public class BundleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { static class BundleActionCallback implements AttributeCallback { public boolean process(Element parent, Attr attribute, BeanDefinitionBuilder builder) { String name = attribute.getLocalName(); if (ACTION.equals(name)) { builder.addPropertyValue(ACTION_PROP, parseAction(parent, attribute)); return false; } if (DESTROY_ACTION.equals(name)) { builder.addPropertyValue(DESTROY_ACTION_PROP, parseAction(parent, attribute)); return false; } return true; } // do upper case to make sure the constants match private Object parseAction(Element parent, Attr attribute) { return Enum.valueOf(BundleActionEnum.class, attribute.getValue().toUpperCase(Locale.ENGLISH)); } }; private static final String ACTION = "action"; private static final String DESTROY_ACTION = "destroy-action"; // class properties private static final String ACTION_PROP = "bundleAction"; private static final String DESTROY_ACTION_PROP = "bundleDestroyAction"; private static final String BUNDLE_PROP = "bundle"; protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { BundleActionCallback callback = new BundleActionCallback(); ParserUtils.parseCustomAttributes(element, builder, new AttributeCallback[] { callback }); // parse nested definition (in case there is any) if (element.hasChildNodes()) { NodeList nodes = element.getChildNodes(); boolean foundElement = false; for (int i = 0; i < nodes.getLength() && !foundElement; i++) { Node nd = nodes.item(i); if (nd instanceof Element) { foundElement = true; Object obj = parserContext.getDelegate().parsePropertySubElement((Element) nd, builder.getBeanDefinition()); builder.addPropertyValue(BUNDLE_PROP, obj); } } } builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); } protected Class getBeanClass(Element element) { return BundleFactoryBean.class; } }