| /* |
| * 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.ftpserver.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.ftpserver.FtpServerConfigurationException; |
| 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 <a href="http://mina.apache.org">Apache MINA Project</a> |
| */ |
| public class SpringUtil { |
| |
| /** |
| * 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<>(); |
| 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 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 = getChildElements(parent); |
| |
| for (Element element : elements) { |
| if ((ns == null || ns.equals(element.getNamespaceURI()) |
| && (localName == null || localName.equals(element |
| .getLocalName())))) { |
| return element; |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * 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 = 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; |
| } |
| |
| /** |
| * 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 = 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 FtpServerConfigurationException("Unknown spring element " |
| + ln); |
| } |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * 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 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 FtpServerConfigurationException("Unknown host", e); |
| } |
| } |
| 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 ( parseInetAddress(parent, attrName)!=null){ |
| return parent.getAttribute(attrName); |
| } |
| return null; |
| } |
| } |