/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2015 ForgeRock AS. */ package org.forgerock.opendj.maven.doc; import static com.forgerock.opendj.ldap.CoreMessages.*; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.forgerock.opendj.ldap.schema.CoreSchemaSupportedLocales; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; /** * Generate schema-related reference documentation sources. */ @Mojo(name = "generate-schema-ref") public class GenerateSchemaDocMojo extends AbstractMojo { /** The locale for which to generate the documentation. */ @Parameter(defaultValue = "en") private String locale; /** Output directory for source files. */ @Parameter(defaultValue = "${project.build.directory}/docbkx-sources/shared") private File outputDirectory; /** * Writes schema reference documentation source files. * @throws MojoExecutionException Not used. * @throws MojoFailureException Failed to write a file. */ @Override public void execute() throws MojoExecutionException, MojoFailureException { final Locale currentLocale = Locale.forLanguageTag(locale); final String localeReference = getLocalesAndSubTypesDocumentation(currentLocale); final File localeReferenceFile = new File(outputDirectory, "sec-locales-subtypes.xml"); try { createOutputDirectory(); writeStringToFile(localeReference, localeReferenceFile); } catch (FileNotFoundException e) { throw new MojoFailureException("Failed to write doc reference file.", e); } catch (IOException e) { throw new MojoExecutionException("Failed to create output directory"); } } /** * Create the output directory if it does not exist. * @throws IOException Failed to create the directory. */ private void createOutputDirectory() throws IOException { if (outputDirectory != null && !outputDirectory.exists()) { if (!outputDirectory.mkdirs()) { throw new IOException("Failed to create output directory."); } } } /** * Writes a string to a file. * @param string The string to write. * @param file The file to write to. * @throws FileNotFoundException The file did not exist, or could not be created for writing. */ private void writeStringToFile(final String string, final File file) throws FileNotFoundException { PrintWriter printWriter = new PrintWriter(file); printWriter.print(string); printWriter.close(); } private final Map localeTagsToOids = CoreSchemaSupportedLocales.getJvmSupportedLocaleNamesToOids(); /** * Returns a DocBook XML VariableList element documenting supported locales. * @param currentLocale The locale for which to generate the documentation. * @return A DocBook XML VariableList element documenting supported locales. */ private String getLocalesDocumentation(final Locale currentLocale) { class LocaleDoc { String tag; String language; String oid; } Map locales = new HashMap(); for (String tag : localeTagsToOids.keySet()) { final Locale locale = Locale.forLanguageTag(tag); final LocaleDoc localeDoc = new LocaleDoc(); localeDoc.tag = tag; localeDoc.language = locale.getDisplayName(currentLocale); localeDoc.oid = localeTagsToOids.get(tag); if (!localeDoc.language.equals(localeDoc.tag)) { // No display language so must not be supported in current JVM locales.put(localeDoc.language, localeDoc); } else { if (localeDoc.tag.equals("sh")) { localeDoc.language = DOC_LANGUAGE_SH.get().toString(currentLocale); locales.put(localeDoc.language, localeDoc); } } } if (locales.isEmpty()) { return ""; } final String eol = System.getProperty("line.separator"); final StringBuilder stringBuilder = new StringBuilder(); stringBuilder .append(" ").append(eol) .append(" ").append(DOC_SUPPORTED_LOCALES_TITLE.get()).append("").append(eol) .append(" ").append(DOC_SUPPORTED_LOCALES_INDEXTERM.get()) .append("").append(eol); Set sortedLanguages = new TreeSet(locales.keySet()); for (String language : sortedLanguages) { LocaleDoc locale = locales.get(language); stringBuilder .append(" ").append(eol) .append(" ").append(locale.language).append("").append(eol) .append(" ").append(eol) .append(" ").append(DOC_LOCALE_TAG.get(locale.tag)).append("").append(eol) .append(" ").append(DOC_LOCALE_OID.get(locale.oid)).append("").append(eol) .append(" ").append(eol) .append(" ").append(eol); } stringBuilder.append(" ").append(eol); return stringBuilder.toString(); } /** * Returns a DocBook XML ItemizedList element documenting supported language subtypes. * @param currentLocale The locale for which to generate the documentation. * @return A DocBook XML ItemizedList element documenting supported language subtypes. */ private String getSubTypesDocumentation(final Locale currentLocale) { Map map = new TreeMap(); for (String tag : localeTagsToOids.keySet()) { int idx = tag.indexOf('-'); if (idx == -1) { final Locale locale = Locale.forLanguageTag(tag); final String language = locale.getDisplayName(currentLocale); if (!language.equals(tag)) { map.put(language, tag); } else { if (tag.equals("sh")) { map.put(DOC_LANGUAGE_SH.get().toString(currentLocale), tag); } } } } final String eol = System.getProperty("line.separator"); final StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(" ").append(eol) .append(" ").append(DOC_SUPPORTED_SUBTYPES_TITLE.get()).append("").append(eol) .append(" ").append(DOC_SUPPORTED_SUBTYPES_INDEXTERM.get()) .append("").append(eol); for (String language: map.keySet()) { stringBuilder .append(" ").append(language).append(", ") .append(map.get(language)).append("").append(eol); } stringBuilder.append(" ").append(eol); return stringBuilder.toString(); } /** * Returns a DocBook XML Section element documenting supported locales and language subtypes. * @param currentLocale The locale for which to generate the documentation. * @return A DocBook XML Section element documenting supported locales and language subtypes. */ private String getLocalesAndSubTypesDocumentation(final Locale currentLocale) { final String eol = System.getProperty("line.separator"); return "
" + eol + " " + DOC_LOCALE_SECTION_TITLE.get() + "" + eol + " " + DOC_LOCALE_SECTION_INFO.get() + "" + eol + getLocalesDocumentation(currentLocale) + eol + getSubTypesDocumentation(currentLocale) + eol + "
"; } }