diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19659f2d79..f81c1ad8b1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: build: strategy: matrix: - java-version: [8, 11] + java-version: [8, 11, 17] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: diff --git a/tez-tools/pom.xml b/tez-tools/pom.xml index 8811d80687..8640957497 100644 --- a/tez-tools/pom.xml +++ b/tez-tools/pom.xml @@ -50,6 +50,25 @@ tez-tfile-parser + + jdk8-16 + + [8,16] + + + tez-javadoc-tools-base-jdk8 + + + + jdk17plus + + + [17,) + + + tez-javadoc-tools-base + + diff --git a/tez-tools/tez-javadoc-tools-base-jdk8/findbugs-exclude.xml b/tez-tools/tez-javadoc-tools-base-jdk8/findbugs-exclude.xml new file mode 100644 index 0000000000..d6e84af607 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base-jdk8/findbugs-exclude.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + diff --git a/tez-tools/tez-javadoc-tools-base-jdk8/pom.xml b/tez-tools/tez-javadoc-tools-base-jdk8/pom.xml new file mode 100644 index 0000000000..f611309e63 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base-jdk8/pom.xml @@ -0,0 +1,106 @@ + + + + + 4.0.0 + + org.apache.tez + tez-tools + 0.10.5-SNAPSHOT + + tez-javadoc-tools-base-jdk8 + + + + org.slf4j + slf4j-api + + + org.apache.tez + tez-api + + + org.apache.hadoop + hadoop-annotations + + + commons-lang + commons-lang + + + + + + platform-macosx + + + ${java.home}/../Classes/classes.jar + + + + + com.sun + tools + ${java.version} + system + ${java.home}/../Classes/classes.jar + + + + + other-os + + + ${java.home}/../lib/tools.jar + + + + + com.sun + tools + ${java.version} + system + ${java.home}/../lib/tools.jar + + + + + + + + + + org.apache.rat + apache-rat-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + maven-javadoc-plugin + + org.apache.tez.tools.javadoc.doclet + + + + + + diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java similarity index 83% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java index 0713467c73..13d377cf01 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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. @@ -21,6 +21,15 @@ import java.io.IOException; import java.util.Map; +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.AnnotationDesc.ElementValuePair; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.DocErrorReporter; +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.LanguageVersion; +import com.sun.javadoc.RootDoc; +import com.sun.tools.doclets.standard.Standard; + import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Evolving; import org.apache.hadoop.classification.InterfaceStability.Unstable; @@ -31,21 +40,13 @@ import org.apache.tez.tools.javadoc.util.HtmlWriter; import org.apache.tez.tools.javadoc.util.XmlWriter; -import com.sun.javadoc.AnnotationDesc; -import com.sun.javadoc.AnnotationDesc.ElementValuePair; -import com.sun.javadoc.ClassDoc; -import com.sun.javadoc.DocErrorReporter; -import com.sun.javadoc.FieldDoc; -import com.sun.javadoc.LanguageVersion; -import com.sun.javadoc.RootDoc; -import com.sun.tools.doclets.standard.Standard; - public final class ConfigStandardDoclet { private static final String DEBUG_SWITCH = "-debug"; private static boolean debugMode = false; - private ConfigStandardDoclet() {} + private ConfigStandardDoclet() { + } public static LanguageVersion languageVersion() { return LanguageVersion.JAVA_1_5; @@ -144,16 +145,16 @@ private static void processDoc(ClassDoc doc) { + ", name=" + name + ", field=" + field.name() + ", val=" + field.constantValueExpression()); - configProperty.defaultValue = field.constantValueExpression(); + configProperty.setDefaultValue(field.constantValueExpression()); } else { - configProperty.defaultValue = field.constantValue().toString(); + configProperty.setDefaultValue(field.constantValue().toString()); } - configProperty.inferredType = field.type().simpleTypeName(); + configProperty.setInferredType(field.type().simpleTypeName()); - if (name.equals("TEZ_AM_STAGING_DIR") && configProperty.defaultValue != null) { - String defaultValue = configProperty.defaultValue; + if (name.equals("TEZ_AM_STAGING_DIR") && configProperty.getDefaultValue() != null) { + String defaultValue = configProperty.getDefaultValue(); defaultValue = defaultValue.replace(System.getProperty("user.name"), "${user.name}"); - configProperty.defaultValue = defaultValue; + configProperty.setDefaultValue(defaultValue); } continue; @@ -164,7 +165,7 @@ private static void processDoc(ClassDoc doc) { configProperties.put(name, new ConfigProperty()); } ConfigProperty configProperty = configProperties.get(name); - configProperty.propertyName = field.constantValue().toString(); + configProperty.setPropertyName(field.constantValue().toString()); AnnotationDesc[] annotationDescs = field.annotations(); @@ -172,53 +173,49 @@ private static void processDoc(ClassDoc doc) { if (annotationDesc.annotationType().qualifiedTypeName().equals( Private.class.getCanonicalName())) { - configProperty.isPrivate = true; + configProperty.setPrivate(true); } if (annotationDesc.annotationType().qualifiedTypeName().equals( Unstable.class.getCanonicalName())) { - configProperty.isUnstable = true; + configProperty.setUnstable(true); } if (annotationDesc.annotationType().qualifiedTypeName().equals( Evolving.class.getCanonicalName())) { - configProperty.isEvolving = true; + configProperty.setEvolving(true); } if (annotationDesc.annotationType().qualifiedTypeName().equals( ConfigurationProperty.class.getCanonicalName())) { - configProperty.isValidConfigProp = true; + configProperty.setValidConfigProp(true); for (ElementValuePair element : annotationDesc.elementValues()) { if (element.element().name().equals("type")) { - configProperty.type = stripQuotes(element.value().toString()); + configProperty.setType(stripQuotes(element.value().toString())); } else { logMessage("Unhandled annotation property: " + element.element().name()); } } } - } - - configProperty.description = field.commentText(); - } - - HtmlWriter writer = new HtmlWriter(); - try { - writer.write(config); - } catch (IOException e) { - throw new RuntimeException(e); - } + HtmlWriter writer = new HtmlWriter(); + try { + writer.write(config); + } catch (IOException e) { + throw new RuntimeException(e); + } - XmlWriter xmlWriter = new XmlWriter(); - try { - xmlWriter.write(config); - } catch (IOException e) { - throw new RuntimeException(e); + XmlWriter xmlWriter = new XmlWriter(); + try { + xmlWriter.write(config); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } - } private static String stripQuotes(String s) { - if (s.charAt(0) == '"' && s.charAt(s.length()-1) == '"') { - return s.substring(1, s.length()-1); + if (s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"') { + return s.substring(1, s.length() - 1); } return s; } diff --git a/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java new file mode 100644 index 0000000000..190ae4622e --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +@Private +package org.apache.tez.tools.javadoc.doclet; + +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/Config.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/Config.java similarity index 95% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/Config.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/Config.java index 604d48ac5e..834c3ab1c2 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/Config.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/Config.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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. @@ -36,5 +36,4 @@ public Config(String configName, String templateName) { public Config() { this(null, null); } - } diff --git a/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java new file mode 100644 index 0000000000..4b4e9a7d53 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java @@ -0,0 +1,125 @@ +/** + * 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.tez.tools.javadoc.model; + +public class ConfigProperty { + + private String propertyName; + private String defaultValue; + private String description; + private String type = "string"; + private boolean isPrivate = false; + private boolean isUnstable = false; + private boolean isEvolving = false; + private boolean isValidConfigProp = false; + private String[] validValues; + private String inferredType; + + public String getPropertyName() { + return propertyName; + } + + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isPrivate() { + return isPrivate; + } + + public void setPrivate(boolean aPrivate) { + isPrivate = aPrivate; + } + + public boolean isUnstable() { + return isUnstable; + } + + public void setUnstable(boolean unstable) { + isUnstable = unstable; + } + + public boolean isEvolving() { + return isEvolving; + } + + public void setEvolving(boolean evolving) { + isEvolving = evolving; + } + + public boolean isValidConfigProp() { + return isValidConfigProp; + } + + public void setValidConfigProp(boolean validConfigProp) { + isValidConfigProp = validConfigProp; + } + + public String[] getValidValues() { + return validValues; + } + + public void setValidValues(String[] validValues) { + this.validValues = validValues; + } + + public String getInferredType() { + return inferredType; + } + + public void setInferredType(String inferredType) { + this.inferredType = inferredType; + } + + @Override + public String toString() { + return "name=" + getPropertyName() + + ", defaultValue=" + getDefaultValue() + + ", description=" + getDescription() + + ", type=" + getType() + + ", inferredType=" + getInferredType() + + ", private=" + isPrivate() + + ", validValues=" + (getValidValues() == null ? "null" : getValidValues()) + + ", isConfigProp=" + isValidConfigProp(); + } +} diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java similarity index 52% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java index 89490c4a51..76acd05258 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java @@ -16,32 +16,7 @@ * limitations under the License. */ +@Private package org.apache.tez.tools.javadoc.model; -public class ConfigProperty { - - public String propertyName; - public String defaultValue; - public String description; - public String type = "string"; - public boolean isPrivate = false; - public boolean isUnstable = false; - public boolean isEvolving = false; - public boolean isValidConfigProp = false; - public String[] validValues; - public String inferredType; - - @Override - public String toString() { - return "name=" + propertyName - + ", defaultValue=" + defaultValue - + ", description=" + description - + ", type=" + type - + ", inferredType=" + inferredType - + ", private=" + isPrivate - + ", validValues=" + (validValues == null ? "null" : validValues) - + ", isConfigProp=" + isValidConfigProp; - } -} - - +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java similarity index 81% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java index 4b531e87e5..8723076de6 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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. @@ -19,13 +19,11 @@ package org.apache.tez.tools.javadoc.util; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import org.apache.tez.dag.api.TezException; import org.apache.tez.tools.javadoc.model.Config; import org.apache.tez.tools.javadoc.model.ConfigProperty; @@ -52,7 +50,7 @@ public void write(Config config) throws IOException { out.println(""); out.println(""); - out.println(""+ config.configName +""); + out.println("" + config.configName + ""); // out.println(""); out.println(""); @@ -103,7 +101,7 @@ public void write(Config config) throws IOException { out.println("

"); out.println("
"); - out.println("

"+ config.configName +"

"); + out.println("

" + config.configName + "

"); out.println("
"); out.println(""); @@ -124,23 +122,29 @@ public void write(Config config) throws IOException { } String altClass = ""; - if (configProperty.isPrivate) { + if (configProperty.isPrivate()) { altClass = "class=\"tr_private\""; - } else if (configProperty.isEvolving || configProperty.isUnstable) { + } else if (configProperty.isEvolving() || configProperty.isUnstable()) { altClass = "class=\"tr_evolve_unstable\""; } out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); // Re-enable after adding values // out.println(""); - out.println(""); - out.println(""); - out.println(""); + out.println( + ""); + out.println( + ""); + out.println( + ""); out.println(""); } @@ -150,12 +154,10 @@ public void write(Config config) throws IOException { out.println(""); out.println(""); out.println(""); - } finally { if (out != null) { out.close(); } } } - } diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java similarity index 85% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java index cfb0c92738..bc16a34188 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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. @@ -28,10 +28,10 @@ public abstract class Writer { public abstract void write(Config config) throws IOException; public boolean isValidConfigProperty(ConfigProperty configProperty) { - if (!configProperty.isValidConfigProp) { + if (!configProperty.isValidConfigProp()) { return false; } - if (configProperty.propertyName == null || configProperty.propertyName.isEmpty()) { + if (configProperty.getPropertyName() == null || configProperty.getPropertyName().isEmpty()) { return false; } return true; diff --git a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java similarity index 78% rename from tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java rename to tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java index e9bdeb3999..d4f9b7d982 100644 --- a/tez-tools/tez-javadoc-tools/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java @@ -6,9 +6,9 @@ * 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 - * + *

+ * 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. @@ -66,24 +66,23 @@ public void write(Config config) throws IOException { } out.println(); out.println(" "); - out.println(" " + configProperty.propertyName + ""); - if (configProperty.defaultValue != null && !configProperty.defaultValue.isEmpty()) { - out.println(" " + configProperty.defaultValue + ""); + out.println(" " + configProperty.getPropertyName() + ""); + if (configProperty.getDefaultValue() != null && !configProperty.getDefaultValue().isEmpty()) { + out.println(" " + configProperty.getDefaultValue() + ""); } - if (configProperty.description != null && !configProperty.description.isEmpty()) { - out.println(" " + StringEscapeUtils.escapeXml(configProperty.description) - + ""); + if (configProperty.getDescription() != null && !configProperty.getDescription().isEmpty()) { + out.println(" " + StringEscapeUtils.escapeXml(configProperty.getDescription()) + ""); } - if (configProperty.type != null && !configProperty.type.isEmpty()) { - out.println(" " + configProperty.type + ""); + if (configProperty.getType() != null && !configProperty.getType().isEmpty()) { + out.println(" " + configProperty.getType() + ""); } - if (configProperty.isUnstable) { + if (configProperty.isUnstable()) { out.println(" true"); } - if (configProperty.isEvolving) { + if (configProperty.isEvolving()) { out.println(" true"); } - if (configProperty.isPrivate) { + if (configProperty.isPrivate()) { out.println(" true"); } out.println(" "); @@ -91,7 +90,6 @@ public void write(Config config) throws IOException { out.println(); out.println(""); - } finally { if (out != null) { out.close(); @@ -101,7 +99,7 @@ public void write(Config config) throws IOException { private void writeApacheHeader(File file) throws IOException { try (InputStream in = this.getClass().getClassLoader().getResourceAsStream("apache-licence.xml.header"); - OutputStream out = new FileOutputStream(file)) { + OutputStream out = new FileOutputStream(file)) { ByteStreams.copy(in, out); } } diff --git a/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java new file mode 100644 index 0000000000..d458619729 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base-jdk8/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +@Private +package org.apache.tez.tools.javadoc.util; + +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools-base/findbugs-exclude.xml b/tez-tools/tez-javadoc-tools-base/findbugs-exclude.xml new file mode 100644 index 0000000000..d6e84af607 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/findbugs-exclude.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + diff --git a/tez-tools/tez-javadoc-tools-base/pom.xml b/tez-tools/tez-javadoc-tools-base/pom.xml new file mode 100644 index 0000000000..123c46ca30 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/pom.xml @@ -0,0 +1,78 @@ + + + + + 4.0.0 + + org.apache.tez + tez-tools + 0.10.5-SNAPSHOT + + tez-javadoc-tools-base + + + + org.slf4j + slf4j-api + + + org.apache.tez + tez-api + + + org.apache.hadoop + hadoop-annotations + + + commons-lang + commons-lang + + + + + + + + + org.apache.rat + apache-rat-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + maven-javadoc-plugin + + org.apache.tez.tools.javadoc.doclet + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java new file mode 100644 index 0000000000..8197e4bb7f --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/ConfigStandardDoclet.java @@ -0,0 +1,291 @@ +/** + * 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.tez.tools.javadoc.doclet; + +import com.sun.source.util.DocTrees; +import jdk.javadoc.doclet.Doclet; +import jdk.javadoc.doclet.DocletEnvironment; +import jdk.javadoc.doclet.Reporter; +import org.apache.hadoop.classification.InterfaceAudience.Private; +import org.apache.hadoop.classification.InterfaceStability.Evolving; +import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.tez.common.annotation.ConfigurationClass; +import org.apache.tez.common.annotation.ConfigurationProperty; +import org.apache.tez.tools.javadoc.model.Config; +import org.apache.tez.tools.javadoc.model.ConfigProperty; +import org.apache.tez.tools.javadoc.util.HtmlWriter; +import org.apache.tez.tools.javadoc.util.XmlWriter; + +import javax.lang.model.SourceVersion; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.tools.Diagnostic; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +public class ConfigStandardDoclet implements Doclet { + + private static boolean debugMode = false; + + private Reporter reporter; + + private static String stripQuotes(String s) { + if (s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"') { + return s.substring(1, s.length() - 1); + } + return s; + } + + @Override + public void init(Locale locale, Reporter reporter) { + this.reporter = reporter; + } + + @Override + public String getName() { + return "Tez"; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_9; + } + + private void logMessage(String message) { + if (!debugMode) { + return; + } + reporter.print(Diagnostic.Kind.NOTE, message); + } + + @Override + public boolean run(DocletEnvironment docEnv) { + logMessage("Running doclet " + ConfigStandardDoclet.class.getSimpleName()); + DocTrees docTrees = docEnv.getDocTrees(); + for (Element element : docEnv.getIncludedElements()) { + if (element.getKind().equals(ElementKind.CLASS) && element instanceof TypeElement) { + processDoc(docTrees, (TypeElement) element); + } + } + + return true; + } + + private void processDoc(DocTrees docTrees, TypeElement doc) { + logMessage("Parsing : " + doc); + if (!doc.getKind().equals(ElementKind.CLASS)) { + logMessage("Ignoring non-class: " + doc); + return; + } + + List annotations = doc.getAnnotationMirrors(); + boolean isConfigClass = false; + String templateName = null; + for (AnnotationMirror annotation : annotations) { + logMessage("Checking annotation: " + annotation.getAnnotationType()); + if (annotation.getAnnotationType().asElement().toString().equals( + ConfigurationClass.class.getName())) { + isConfigClass = true; + Map elementValues = annotation.getElementValues(); + for (Map.Entry element : elementValues.entrySet()) { + if (element.getKey().getSimpleName().toString().equals("templateFileName")) { + templateName = stripQuotes(element.getValue().getValue().toString()); + } + } + break; + } + } + + if (!isConfigClass) { + logMessage("Ignoring non-config class: " + doc); + return; + } + + logMessage("Processing config class: " + doc); + Config config = new Config(doc.getSimpleName().toString(), templateName); + Map configProperties = config.configProperties; + + processElements(docTrees, doc, configProperties); + + HtmlWriter writer = new HtmlWriter(); + try { + writer.write(config); + } catch (IOException e) { + throw new RuntimeException(e); + } + + XmlWriter xmlWriter = new XmlWriter(); + try { + xmlWriter.write(config); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void processElements(DocTrees docTrees, TypeElement doc, Map configProperties) { + List elements = doc.getEnclosedElements(); + for (Element f : elements) { + if (!(f instanceof VariableElement)) { + continue; + } + + if (!f.getKind().equals(ElementKind.FIELD)) { + continue; + } + + VariableElement field = (VariableElement) f; + + if (field.getModifiers().contains(Modifier.PRIVATE)) { + logMessage("Skipping private field: " + field); + continue; + } + if (field.getModifiers().contains(Modifier.STATIC)) { + logMessage("Skipping non-static field: " + field); + continue; + } + + String fieldName = field.getSimpleName().toString(); + if (fieldName.endsWith("_PREFIX")) { + logMessage("Skipping non-config prefix constant field: " + field); + continue; + } + if (fieldName.equals("TEZ_SITE_XML")) { + logMessage("Skipping constant field: " + field); + continue; + } + + if (fieldName.endsWith("_DEFAULT")) { + + String name = fieldName.substring(0, fieldName.lastIndexOf("_DEFAULT")); + if (!configProperties.containsKey(name)) { + configProperties.put(name, new ConfigProperty()); + } + ConfigProperty configProperty = configProperties.get(name); + if (field.getConstantValue() == null) { + String val = field.getConstantValue().toString(); + logMessage("Got null constant value" + + ", name=" + name + + ", field=" + fieldName + + ", val=" + val); + configProperty.setDefaultValue(val); + } else { + configProperty.setDefaultValue(field.getConstantValue().toString()); + } + configProperty.setInferredType(field.getSimpleName().toString()); + + if (name.equals("TEZ_AM_STAGING_DIR") && configProperty.getDefaultValue() != null) { + String defaultValue = configProperty.getDefaultValue(); + defaultValue = defaultValue.replace(System.getProperty("user.name"), "${user.name}"); + configProperty.setDefaultValue(defaultValue); + } + + continue; + } + + if (!configProperties.containsKey(fieldName)) { + configProperties.put(fieldName, new ConfigProperty()); + } + ConfigProperty configProperty = configProperties.get(fieldName); + configProperty.setPropertyName(field.getConstantValue().toString()); + + List annotationDescs = field.getAnnotationMirrors(); + + for (AnnotationMirror annotationDesc : annotationDescs) { + String elementFqName = annotationDesc.getAnnotationType().asElement().toString(); + if (elementFqName.equals(Private.class.getCanonicalName())) { + configProperty.setPrivate(true); + } + if (elementFqName.equals(Unstable.class.getCanonicalName())) { + configProperty.setUnstable(true); + } + if (elementFqName.equals(Evolving.class.getCanonicalName())) { + configProperty.setEvolving(true); + } + if (elementFqName.equals(ConfigurationProperty.class.getCanonicalName())) { + configProperty.setValidConfigProp(true); + + for (Map.Entry element + : annotationDesc.getElementValues().entrySet()) { + if (element.getKey().getSimpleName().toString().equals("type")) { + configProperty.setType(stripQuotes(element.getValue().getValue().toString())); + } else { + logMessage("Unhandled annotation property: " + element.getKey().getSimpleName()); + } + } + } + } + configProperty.setDescription(docTrees.getDocCommentTree(field).getFullBody().toString()); + } + } + + @Override + public Set getSupportedOptions() { + Option[] options = { + new Option() { + private final List someOption = Arrays.asList( + "-debug", + "--debug" + ); + + @Override + public int getArgumentCount() { + return 0; + } + + @Override + public String getDescription() { + return "Debug mode"; + } + + @Override + public Option.Kind getKind() { + return Kind.STANDARD; + } + + @Override + public List getNames() { + return someOption; + } + + @Override + public String getParameters() { + return ""; + } + + @Override + public boolean process(String opt, List arguments) { + debugMode = true; + return true; + } + } + }; + return new HashSet<>(Arrays.asList(options)); + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java new file mode 100644 index 0000000000..190ae4622e --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/doclet/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +@Private +package org.apache.tez.tools.javadoc.doclet; + +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/Config.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/Config.java new file mode 100644 index 0000000000..834c3ab1c2 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/Config.java @@ -0,0 +1,39 @@ +/** + * 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.tez.tools.javadoc.model; + +import java.util.Map; +import java.util.TreeMap; + +public class Config { + + public final String templateName; + public final String configName; + public Map configProperties; + + public Config(String configName, String templateName) { + this.configName = configName; + this.templateName = templateName; + this.configProperties = new TreeMap(); + } + + public Config() { + this(null, null); + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java new file mode 100644 index 0000000000..4b4e9a7d53 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/ConfigProperty.java @@ -0,0 +1,125 @@ +/** + * 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.tez.tools.javadoc.model; + +public class ConfigProperty { + + private String propertyName; + private String defaultValue; + private String description; + private String type = "string"; + private boolean isPrivate = false; + private boolean isUnstable = false; + private boolean isEvolving = false; + private boolean isValidConfigProp = false; + private String[] validValues; + private String inferredType; + + public String getPropertyName() { + return propertyName; + } + + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isPrivate() { + return isPrivate; + } + + public void setPrivate(boolean aPrivate) { + isPrivate = aPrivate; + } + + public boolean isUnstable() { + return isUnstable; + } + + public void setUnstable(boolean unstable) { + isUnstable = unstable; + } + + public boolean isEvolving() { + return isEvolving; + } + + public void setEvolving(boolean evolving) { + isEvolving = evolving; + } + + public boolean isValidConfigProp() { + return isValidConfigProp; + } + + public void setValidConfigProp(boolean validConfigProp) { + isValidConfigProp = validConfigProp; + } + + public String[] getValidValues() { + return validValues; + } + + public void setValidValues(String[] validValues) { + this.validValues = validValues; + } + + public String getInferredType() { + return inferredType; + } + + public void setInferredType(String inferredType) { + this.inferredType = inferredType; + } + + @Override + public String toString() { + return "name=" + getPropertyName() + + ", defaultValue=" + getDefaultValue() + + ", description=" + getDescription() + + ", type=" + getType() + + ", inferredType=" + getInferredType() + + ", private=" + isPrivate() + + ", validValues=" + (getValidValues() == null ? "null" : getValidValues()) + + ", isConfigProp=" + isValidConfigProp(); + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java new file mode 100644 index 0000000000..76acd05258 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/model/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +@Private +package org.apache.tez.tools.javadoc.model; + +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java new file mode 100644 index 0000000000..779722e845 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/HtmlWriter.java @@ -0,0 +1,160 @@ +/** + * 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.tez.tools.javadoc.util; + +import org.apache.tez.tools.javadoc.model.Config; +import org.apache.tez.tools.javadoc.model.ConfigProperty; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +public class HtmlWriter extends Writer { + + private static final String DEFAULT_STYLESHEET = "default-stylesheet.css"; + + public void write(Config config) throws IOException { + PrintWriter out = null; + + if (config.configName == null || config.configName.isEmpty()) { + throw new RuntimeException("Config Name is null or empty"); + } + + try { + File file = new File(config.configName + ".html"); + out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)); + + out.println(""); + out.println(""); + + out.println(""); + + out.println(""); + out.println(""); + out.println("" + config.configName + ""); +// out.println(""); + out.println(""); + + out.println(""); + + out.println(""); + + out.println("

"); + out.println("
"); + + out.println("

" + config.configName + "

"); + out.println("
"); + + out.println("
" + configProperty.propertyName + "" + configProperty.defaultValue + "" + configProperty.description + "" + configProperty.type + "" + configProperty.getPropertyName() + "" + configProperty.getDefaultValue() + "" + configProperty.getDescription() + "" + configProperty.getType() + "" + configProperty.validValues + "" + configProperty.isPrivate + "" + configProperty.isEvolving + "" + configProperty.isUnstable + "" + configProperty.isPrivate() + "" + + configProperty.isEvolving() + "" + + configProperty.isUnstable() + "
"); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + // out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + + for (ConfigProperty configProperty : config.configProperties.values()) { + if (!isValidConfigProperty(configProperty)) { + continue; + } + + String altClass = ""; + if (configProperty.isPrivate()) { + altClass = "class=\"tr_private\""; + } else if (configProperty.isEvolving() || configProperty.isUnstable()) { + altClass = "class=\"tr_evolve_unstable\""; + } + + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + // Re-enable after adding values + // out.println(""); + + out.println( + ""); + out.println( + ""); + out.println( + ""); + out.println(""); + } + + out.println("
" + "Property Name" + "" + "Default Value" + "" + "Description" + "" + "Type" + "" + "Valid Values" + "" + "Is Private?" + "" + "Is Unstable?" + "" + "Is Evolving?" + "
" + configProperty.getPropertyName() + "" + configProperty.getDefaultValue() + "" + configProperty.getDescription() + "" + configProperty.getType() + "" + configProperty.validValues + "" + + configProperty.isPrivate() + "" + + configProperty.isEvolving() + "" + + configProperty.isUnstable() + "
"); + + out.println("
"); + out.println("
"); + out.println(""); + out.println(""); + } finally { + if (out != null) { + out.close(); + } + } + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java new file mode 100644 index 0000000000..baef10f902 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/Writer.java @@ -0,0 +1,36 @@ +/** + * 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.tez.tools.javadoc.util; + +import org.apache.tez.tools.javadoc.model.Config; +import org.apache.tez.tools.javadoc.model.ConfigProperty; + +import java.io.IOException; + +public abstract class Writer { + + public abstract void write(Config config) throws IOException; + + public boolean isValidConfigProperty(ConfigProperty configProperty) { + if (!configProperty.isValidConfigProp()) { + return false; + } + return configProperty.getPropertyName() != null && !configProperty.getPropertyName().isEmpty(); + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java new file mode 100644 index 0000000000..601ac1d52c --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/XmlWriter.java @@ -0,0 +1,108 @@ +/** + * 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.tez.tools.javadoc.util; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.tez.tools.javadoc.model.Config; +import org.apache.tez.tools.javadoc.model.ConfigProperty; + +import com.google.common.io.ByteStreams; + +public class XmlWriter extends Writer { + + public void write(Config config) throws IOException { + PrintWriter out = null; + + if (config.configName == null || config.configName.isEmpty()) { + throw new RuntimeException("Config Name is null or empty"); + } + + String fileName = config.templateName == null || + config.templateName.isEmpty() ? config.configName : config.templateName; + if (!fileName.endsWith(".xml")) { + fileName += ".xml"; + } + + try { + File file = new File(fileName); + writeApacheHeader(file); + + out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), StandardCharsets.UTF_8)); + + out.println(""); + out.println(); + out.println(""); + out.println(); + out.println(""); + + for (ConfigProperty configProperty : config.configProperties.values()) { + if (!isValidConfigProperty(configProperty)) { + continue; + } + out.println(); + out.println(" "); + out.println(" " + configProperty.getPropertyName() + ""); + if (configProperty.getDefaultValue() != null && !configProperty.getDefaultValue().isEmpty()) { + out.println(" " + configProperty.getDefaultValue() + ""); + } + if (configProperty.getDescription() != null && !configProperty.getDescription().isEmpty()) { + out.println(" " + StringEscapeUtils.escapeXml(configProperty.getDescription()) + ""); + } + if (configProperty.getType() != null && !configProperty.getType().isEmpty()) { + out.println(" " + configProperty.getType() + ""); + } + if (configProperty.isUnstable()) { + out.println(" true"); + } + if (configProperty.isEvolving()) { + out.println(" true"); + } + if (configProperty.isPrivate()) { + out.println(" true"); + } + out.println(" "); + } + + out.println(); + out.println(""); + } finally { + if (out != null) { + out.close(); + } + } + } + + private void writeApacheHeader(File file) throws IOException { + try (InputStream in = this.getClass().getClassLoader().getResourceAsStream("apache-licence.xml.header"); + OutputStream out = Files.newOutputStream(file.toPath())) { + ByteStreams.copy(in, out); + } + } +} diff --git a/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java new file mode 100644 index 0000000000..d458619729 --- /dev/null +++ b/tez-tools/tez-javadoc-tools-base/src/main/java/org/apache/tez/tools/javadoc/util/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +@Private +package org.apache.tez.tools.javadoc.util; + +import org.apache.hadoop.classification.InterfaceAudience.Private; \ No newline at end of file diff --git a/tez-tools/tez-javadoc-tools/pom.xml b/tez-tools/tez-javadoc-tools/pom.xml index 1ef4d13089..369c3bcbb6 100644 --- a/tez-tools/tez-javadoc-tools/pom.xml +++ b/tez-tools/tez-javadoc-tools/pom.xml @@ -78,6 +78,33 @@ + + jdk8-16 + + [8,16] + + + + org.apache.tez + tez-javadoc-tools-base-jdk8 + ${project.version} + + + + + jdk17plus + + + [17,) + + + + org.apache.tez + tez-javadoc-tools-base + ${project.version} + + +