org.apache.hadoop.hive.ant.GenHiveTemplate Maven / Gradle / Ivy
/*
* 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.hadoop.hive.ant;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.shims.ShimLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.net.URL;
/**
* Generates hive-default.xml.template from HiveConf.ConfVars
*/
public class GenHiveTemplate extends Task {
private String templateFile;
public String getTemplateFile() {
return templateFile;
}
public void setTemplateFile(String templateFile) {
this.templateFile = templateFile;
}
private void generate() throws Exception {
File current = new File(templateFile);
if (current.exists()) {
ClassLoader loader = GenHiveTemplate.class.getClassLoader();
URL url = loader.getResource("org/apache/hadoop/hive/conf/HiveConf.class");
if (url != null) {
File file = new File(url.getFile());
if (file.exists() && file.lastModified() < current.lastModified()) {
return;
}
}
}
writeToFile(current, generateTemplate());
}
private Document generateTemplate() throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.appendChild(doc.createProcessingInstruction(
"xml-stylesheet", "type=\"text/xsl\" href=\"configuration.xsl\""));
doc.appendChild(doc.createComment("\n" +
" Licensed to the Apache Software Foundation (ASF) under one or more\n" +
" contributor license agreements. See the NOTICE file distributed with\n" +
" this work for additional information regarding copyright ownership.\n" +
" The ASF licenses this file to You under the Apache License, Version 2.0\n" +
" (the \"License\"); you may not use this file except in compliance with\n" +
" the License. You may obtain a copy of the License at\n" +
"\n" +
" http://www.apache.org/licenses/LICENSE-2.0\n" +
"\n" +
" Unless required by applicable law or agreed to in writing, software\n" +
" distributed under the License is distributed on an \"AS IS\" BASIS,\n" +
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" +
" See the License for the specific language governing permissions and\n" +
" limitations under the License.\n"));
Element root = doc.createElement("configuration");
doc.appendChild(root);
root.appendChild(doc.createComment(
" WARNING!!! This file is auto generated for documentation purposes ONLY! "));
root.appendChild(doc.createComment(
" WARNING!!! Any changes you make to this file will be ignored by Hive. "));
root.appendChild(doc.createComment(
" WARNING!!! You must make your changes in hive-site.xml instead. "));
root.appendChild(doc.createComment(" Hive Execution Parameters "));
Thread.currentThread().setContextClassLoader(ShimLoader.class.getClassLoader());
for (HiveConf.ConfVars confVars : HiveConf.ConfVars.values()) {
if (confVars.isExcluded()) {
// thought of creating template for each shims, but I couldn't generate proper mvn script
continue;
}
Element property = appendElement(root, "property", null);
appendElement(property, "name", confVars.varname);
appendElement(property, "value", confVars.getDefaultExpr());
appendElement(property, "description", normalize(confVars.getDescription()));
// wish to add new line here.
}
return doc;
}
private String normalize(String description) {
int index = description.indexOf('\n');
if (index < 0) {
return description;
}
int prev = 0;
StringBuilder builder = new StringBuilder(description.length() << 1);
for (;index > 0; index = description.indexOf('\n', prev = index + 1)) {
builder.append("\n ").append(description.substring(prev, index));
}
if (prev < description.length()) {
builder.append("\n ").append(description.substring(prev));
}
builder.append("\n ");
return builder.toString();
}
private void writeToFile(File template, Document document) throws Exception {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(template);
transformer.transform(source, result);
}
private Element appendElement(Element parent, String name, String text) {
Document document = parent.getOwnerDocument();
Element child = document.createElement(name);
parent.appendChild(child);
if (text != null) {
Text textNode = document.createTextNode(text);
child.appendChild(textNode);
}
return child;
}
@Override
public void execute() throws BuildException {
try {
generate();
} catch (Exception e) {
throw new BuildException(e);
}
}
public static void main(String[] args) throws Exception {
GenHiveTemplate gen = new GenHiveTemplate();
gen.generate();
}
}