/* * RHQ Management Platform * Copyright (C) 2005-2008 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.clientapi.agent.metadata.i18n; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Generates localization properties files for a plugin descriptor. Can update existing files by appending properties * that are missing to the end. * * @author Greg Hinkle */ public class PropertiesGenerator { private final Log log = LogFactory.getLog(PropertiesGenerator.class); private Map<String, String> properties = new LinkedHashMap<String, String>(); private boolean update; private File xmlFile; private File propertiesFile; private PrintWriter contentWriter; private Properties previousProperties = new Properties(); private static Map<String, String> TAG_KEY_ATTRIBUTES = new HashMap<String, String>(); private static Map<String, Set<String>> TAG_LOCALIZED_ATTRIBUTES = new HashMap<String, Set<String>>(); static { putLocalization("plugin", "displayName"); putLocalization("server", "displayName", "description"); putLocalization("service", "displayName", "description"); putLocalization("simple-property", "displayName", "description"); putLocalization("list-property", "displayName", "description"); putLocalization("map-property", "displayName", "description"); putLocalization("artifact", "displayName", "description"); TAG_KEY_ATTRIBUTES.put("metric", "property"); putLocalization("metric", "displayName", "description"); putLocalization("operation", "displayName"); } public static Set<String> getLocalizedAttributes(String tagName) { return TAG_LOCALIZED_ATTRIBUTES.get(tagName); } public PropertiesGenerator(File xmlFile, File propertiesFile, boolean update) { this.xmlFile = xmlFile; this.propertiesFile = propertiesFile; this.update = update; } private static void putLocalization(String tagName, String... attributes) { HashSet<String> lp = new HashSet<String>(); for (String attr : attributes) { lp.add(attr); } TAG_LOCALIZED_ATTRIBUTES.put(tagName, lp); } public void generateI18NProperties() { try { if (update) { // First load into properties we can check for existence previousProperties = new Properties(); FileInputStream is = new FileInputStream(propertiesFile); try { previousProperties.load(is); } finally { is.close(); } this.contentWriter.println("\n\n# Contents added " + new Date() + "\n\n"); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(xmlFile); FileOutputStream fos = new FileOutputStream(propertiesFile, this.update); this.contentWriter = new PrintWriter(fos); generateNode(doc.getDocumentElement(), ""); } catch (Exception e) { log.error("Failed to generate i18n properties file.", e); } finally { if (this.contentWriter != null) { this.contentWriter.close(); } } } private void generateNode(Element element, String partialKey) { String childKey = partialKey + element.getTagName(); String keyAttribute = TAG_KEY_ATTRIBUTES.get(element.getNodeName()); if (keyAttribute == null) { keyAttribute = "name"; } String tagKey = element.getAttribute(keyAttribute); if ((tagKey != null) && (tagKey.length() > 0)) { childKey += "[" + tagKey + "]."; } else { childKey += "."; } generateAtributes(element, childKey); generateChildren(element, childKey); } private void generateChildren(Element element, String partialKey) { NodeList nodes = element.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { Node child = nodes.item(i); if (child instanceof Element) { generateNode((Element) child, partialKey); } } } private void generateAtributes(Element element, String partialKey) { if (element.getNodeName().equals("server") || element.getNodeName().equals("service")) { this.contentWriter.println(); } NamedNodeMap attrs = element.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Node n = attrs.item(i); Set<String> localizedProperties = TAG_LOCALIZED_ATTRIBUTES.get(element.getTagName()); if ((localizedProperties != null) && localizedProperties.contains(n.getNodeName())) { String key = partialKey + n.getNodeName(); String value = " # " + n.getNodeValue(); if (!this.previousProperties.containsKey(key)) { this.contentWriter.println(key + "=" + value); properties.put(key, value); } } } } }