blob: 3f753039fe1194ce07972461b8b7e3ff80359f27 [file] [log] [blame]
/*
* 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;
}
}