/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.plugins.modcluster.config; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Attr; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * @author Stefan Negrea * */ public class ModClusterBeanFile extends AbstractConfigurationFile { private Node beanNode; /** * @param className * @param configurationFileName * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public ModClusterBeanFile(String className, String configurationFileName) throws ParserConfigurationException, SAXException, IOException { this(className, new File(configurationFileName)); } /** * @param className * @param configurationFile * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public ModClusterBeanFile(String className, File configurationFile) throws ParserConfigurationException, SAXException, IOException { super(configurationFile); beanNode = this.getBeanNodeByClass(className); } /** * @param className * @param constructorArgumentClassName * @param configurationFileName * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public ModClusterBeanFile(String className, String constructorArgumentClassName, String configurationFileName) throws ParserConfigurationException, SAXException, IOException { this(className, constructorArgumentClassName, new File(configurationFileName)); } /** * @param className * @param constructorArgumentClassName * @param configurationFile * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public ModClusterBeanFile(String className, String constructorArgumentClassName, File configurationFile) throws ParserConfigurationException, SAXException, IOException { super(configurationFile); Node primaryBeanNode = this.getBeanNodeByClass(className); String dependencyName = this.getBeanFromConstructorArgument(primaryBeanNode, constructorArgumentClassName); beanNode = this.getBeanNodeByName(dependencyName); } /** * @param propertyName * @param value */ public void setPropertyValue(String propertyName, String value) { boolean propertyFound = false; NodeList nodeList = beanNode.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node currentNode = nodeList.item(i); if (currentNode.getNodeName().equals("property") && currentNode.getAttributes().getNamedItem("name") != null && propertyName.equals(currentNode.getAttributes().getNamedItem("name").getTextContent())) { if (value != null) { currentNode.setTextContent(value); } else { beanNode.removeChild(currentNode); } propertyFound = true; } } if (value != null && !propertyFound) { Node propertyChild = this.getDocument().createElement("property"); Attr nameProperty = this.getDocument().createAttribute("name"); nameProperty.setValue(propertyName); propertyChild.setTextContent(value); propertyChild.getAttributes().setNamedItem(nameProperty); beanNode.appendChild(propertyChild); } } /** * @param propertyName * @return */ public String getPropertyValue(String propertyName) { NodeList nodeList = beanNode.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node currentNode = nodeList.item(i); if (currentNode.getNodeName().equals("property") && currentNode.getAttributes().getNamedItem("name") != null && propertyName.equals(currentNode.getAttributes().getNamedItem("name").getTextContent())) { return currentNode.getTextContent(); } } return null; } /** * @param className * @return */ private Node getBeanNodeByClass(String className) { NodeList nodeList = this.getDocument().getElementsByTagName("bean"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getAttributes().getNamedItem("class") != null && className.equals(node.getAttributes().getNamedItem("class").getTextContent())) { return node; } } return null; } /** * @param beanName * @return */ private Node getBeanNodeByName(String beanName) { NodeList nodeList = this.getDocument().getElementsByTagName("bean"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getAttributes().getNamedItem("name") != null && beanName.equals(node.getAttributes().getNamedItem("name").getTextContent())) { return node; } } return null; } /** * @param beanNode * @param constructorArgumentClassName * @return */ private String getBeanFromConstructorArgument(Node beanNode, String constructorArgumentClassName) { List<Node> nodeList = this.getChildrenNodesByName(beanNode, "constructor"); if (nodeList.size() > 0) { Node constructorNode = nodeList.get(0); nodeList = this.getChildrenNodesByName(constructorNode, "parameter"); if (nodeList.size() > 0) { Node parameterNode = null; for (Node currentNode : nodeList) { if (currentNode.getAttributes().getNamedItem("class") != null && constructorArgumentClassName.equals(currentNode.getAttributes().getNamedItem("class") .getTextContent())) { parameterNode = currentNode; break; } } if (parameterNode != null) { nodeList = this.getChildrenNodesByName(parameterNode, "inject"); if (nodeList.size() > 0) { Node injectNode = nodeList.get(0); Node beanAttribute = injectNode.getAttributes().getNamedItem("bean"); if (beanAttribute != null) { return beanAttribute.getTextContent(); } } } } } return null; } /** * @param node * @param nodeName * @return */ private List<Node> getChildrenNodesByName(Node node, String nodeName) { List<Node> nodeList = new ArrayList<Node>(); for (int i = 0; i < node.getChildNodes().getLength(); i++) { Node currentNode = node.getChildNodes().item(i); if (nodeName.equals(currentNode.getNodeName())) { nodeList.add(currentNode); } } return nodeList; } }