/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.smscserver.config.spring; import java.io.File; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.apache.smscserver.SmscServerConfigurationException; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Various util methods for the Spring config parsing and configuration * * @author hceylan */ public class SpringUtil { /** * Get the first child element matching the local name and namespace * * @param parent * The element for which to locate the child * @param ns * The namespace to match, or null for any namespace * @param localName * The local name to match, or null for any local name * @return The first child matching the criteria */ public static Element getChildElement(final Element parent, final String ns, final String localName) { List<Element> elements = SpringUtil.getChildElements(parent); for (Element element : elements) { if (((ns == null) || (ns.equals(element.getNamespaceURI()) && ((localName == null) || localName .equals(element.getLocalName()))))) { return element; } } return null; } /** * Get all child elements for the element * * @param elm * The element for which to locate children * @return All children */ public static List<Element> getChildElements(final Element elm) { List<Element> elements = new ArrayList<Element>(); NodeList childs = elm.getChildNodes(); for (int i = 0; i < childs.getLength(); i++) { Node child = childs.item(i); if (child instanceof Element) { elements.add((Element) child); } } return elements; } /** * Get the text context of first child element matching the local name and namespace * * @param parent * The element for which to locate the child * @param ns * The namespace to match, or null for any namespace * @param localName * The local name to match, or null for any local name * @return The text content of the first child matching the criteria or null if element not found */ public static String getChildElementText(final Element parent, final String ns, final String localName) { List<Element> elements = SpringUtil.getChildElements(parent); for (Element element : elements) { if (((ns == null) || (ns.equals(element.getNamespaceURI()) && ((localName == null) || localName .equals(element.getLocalName()))))) { return DomUtils.getTextValue(element); } } return null; } /** * Parses a attribute value into a boolean. If the attribute is missing or has no content, a default value is * returned * * @param parent * The element * @param attrName * The attribute name * @param defaultValue * The default value * @return The value, or the default value */ public static boolean parseBoolean(final Element parent, final String attrName, final boolean defaultValue) { if (StringUtils.hasText(parent.getAttribute(attrName))) { return Boolean.parseBoolean(parent.getAttribute(attrName)); } return defaultValue; } /** * Return an attribute value as a {@link File} * * @param parent * The element * @param attrName * The attribute name * @return The file representing the path used in the attribute */ public static File parseFile(final Element parent, final String attrName) { if (StringUtils.hasText(parent.getAttribute(attrName))) { return new File(parent.getAttribute(attrName)); } return null; } /** * Return an attribute value as an {@link InetAddress} * * @param parent * The element * @param attrName * The attribute name * @return The attribute value parsed into a {@link InetAddress} */ public static InetAddress parseInetAddress(final Element parent, final String attrName) { if (StringUtils.hasText(parent.getAttribute(attrName))) { try { return InetAddress.getByName(parent.getAttribute(attrName)); } catch (UnknownHostException e) { throw new SmscServerConfigurationException("Unknown host", e); } } return null; } /** * Parses a attribute value into an integer. * * @param parent * The element * @param attrName * The attribute name * @return The value * @throws NumberFormatException * If the attribute does not contain a number */ public static int parseInt(final Element parent, final String attrName) { return Integer.parseInt(parent.getAttribute(attrName)); } /** * Parses a attribute value into an integer. If the attribute is missing or has no content, a default value is * returned * * @param parent * The element * @param attrName * The attribute name * @param defaultValue * The default value * @return The value, or the default value */ public static int parseInt(final Element parent, final String attrName, final int defaultValue) { if (StringUtils.hasText(parent.getAttribute(attrName))) { return Integer.parseInt(parent.getAttribute(attrName)); } return defaultValue; } /** * Parse specific Spring elements, bean and ref * * @param parent * The element in which we will look for Spring elements * @param parserContext * The Spring parser context * @param builder * The Spring bean definition builder * @return The Spring bean definition */ public static Object parseSpringChildElement(final Element parent, final ParserContext parserContext, final BeanDefinitionBuilder builder) { Element springElm = SpringUtil.getChildElement(parent, null, null); String ln = springElm.getLocalName(); if ("bean".equals(ln)) { return parserContext.getDelegate().parseBeanDefinitionElement(springElm, builder.getBeanDefinition()); } else if ("ref".equals(ln)) { return parserContext.getDelegate().parsePropertySubElement(springElm, builder.getBeanDefinition()); } else { throw new SmscServerConfigurationException("Unknown spring element " + ln); } } /** * Return the string value of an attribute, or null if the attribute is missing * * @param parent * The element * @param attrName * The attribute name * @return The attribute string value */ public static String parseString(final Element parent, final String attrName) { if (parent.hasAttribute(attrName)) { return parent.getAttribute(attrName); } else { return null; } } /** * Return an attribute value after checking it is a valid {@link InetAddress} * * @param parent * The element * @param attrName * The attribute name * @return The attribute string value. */ public static String parseStringFromInetAddress(final Element parent, final String attrName) { if (SpringUtil.parseInetAddress(parent, attrName) != null) { return parent.getAttribute(attrName); } return null; } }