/* * Copyright 1999-2009 University of Chicago * * Licensed 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.nimbustools.auto_common.confmgr; import org.w3c.dom.Document; import org.w3c.dom.Node; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import java.io.File; import java.util.HashMap; import java.util.Map; /*** * Adjusts resource parameters in globus-style jndi-config.xml files. */ public class ServiceResourceAdjust { public void adjust(File jndiConfig, String serviceName, String resourceName, Map<String,String> pairs) throws Exception { if (jndiConfig == null) { throw new IllegalArgumentException("jndiConfig may not be null"); } if (serviceName == null || serviceName.length() == 0) { throw new IllegalArgumentException("serviceName may not be null or empty"); } if (resourceName == null || resourceName.length() == 0) { throw new IllegalArgumentException("resourceName may not be null or empty"); } if (pairs == null || pairs.size() == 0) { throw new IllegalArgumentException("pairs may not be null or empty"); } final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); final Document doc = docBuilder.parse(jndiConfig); doc.normalizeDocument(); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); final Node paramsNode = (Node) xpath.evaluate( "//service[@name='"+serviceName+"']/resource[@name='"+resourceName+"']/resourceParams", doc, XPathConstants.NODE); if (paramsNode == null) { throw new Exception("Could not find resourceParams node for specified service resource"); } boolean dirty = false; for (Map.Entry<String, String> pair : pairs.entrySet()) { Node node = (Node) xpath.evaluate( "parameter[name='"+pair.getKey()+"']/value", paramsNode, XPathConstants.NODE); if (node == null) { throw new Exception("Could not find a resource parameter named '"+pair.getKey()+"'"); } if (!pair.getValue().equals(node.getTextContent())){ node.setTextContent(pair.getValue()); dirty = true; } } if (dirty) { new DomWriter().writeDOM(doc, jndiConfig.getAbsolutePath()); } } public static void main(String[] args) { if (args == null || args.length < 5 || args.length % 2 == 0) { System.err.println("Needs these arguments:\n" + "1 - the jndi-config.xml path\n" + "2 - the <service> name\n" + "3 - the <resource> name\n" + "4 - the parameter name\n" + "5 - the parameter value\n" + "[additional parameter name/value pairs]" ); System.exit(1); } try { final File file = new File(args[0]); if (! (file.exists() && file.canRead() && file.canWrite())) { System.err.println("the config XML file must exist and be readable/writeable"); System.exit(1); } final HashMap<String,String> pairs = new HashMap<String, String>(); for (int i=3; i < args.length; i+=2) { final String key = args[i]; final String value = args[i+1]; pairs.put(key, value); } new ServiceResourceAdjust().adjust(file, args[1], args[2], pairs); } catch (Exception e) { System.err.println("Problem replacing key-file value: " + e.getMessage()); System.exit(1); } } }