/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.portal.tools.propertiesdoc;
import com.liferay.portal.freemarker.FreeMarkerUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.tools.ArgumentsUtil;
import com.liferay.portal.util.FileImpl;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Jesse Rao
* @author James Hinkey
*/
public class PropertiesDocBuilder {
public static void main(String[] args) throws Exception {
Map<String, String> arguments = ArgumentsUtil.parseArguments(args);
try {
new PropertiesDocBuilder(arguments);
}
catch (Exception e) {
ArgumentsUtil.processMainException(arguments, e);
}
}
public PropertiesDocBuilder(Map<String, String> arguments)
throws IOException {
String propertiesDestDirName = GetterUtil.getString(
arguments.get("properties.dest.dir"));
String propertiesFileName = GetterUtil.getString(
arguments.get("properties.file"));
String title = GetterUtil.getString(arguments.get("properties.title"));
boolean toc = GetterUtil.getBoolean(arguments.get("properties.toc"));
System.out.println("Converting " + propertiesFileName + " to HTML");
File propertiesFile = new File(propertiesFileName);
Map<String, Object> context = new HashMap<>();
context.put("pageTitle", title);
int pos = propertiesFileName.lastIndexOf(StringPool.SLASH);
if (pos != -1) {
propertiesFileName = propertiesFileName.substring(pos + 1);
}
context.put("propertiesFileName", propertiesFileName);
List<PropertiesSection> propertiesSections = getPropertiesSections(
propertiesFile);
if (propertiesSections == null) {
return;
}
context.put("sections", propertiesSections);
context.put("toc", toc);
try {
StringBundler sb = new StringBundler(4);
sb.append(propertiesDestDirName);
sb.append(StringPool.SLASH);
sb.append(propertiesFileName);
sb.append(".html");
String propertiesHTMLFileName = sb.toString();
File propertiesHTMLFile = new File(propertiesHTMLFileName);
System.out.println("Writing " + propertiesHTMLFile);
Writer writer = new FileWriter(propertiesHTMLFile);
try {
FreeMarkerUtil.process(
"com/liferay/portal/tools/propertiesdoc/dependencies" +
"/properties.ftl",
context, writer);
}
catch (Exception e) {
e.printStackTrace();
}
writer.flush();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
protected void addPropertyComment(
List<PropertyComment> propertyComments, String comment) {
if (Validator.isNotNull(comment)) {
PropertyComment propertyComment = new PropertyComment(comment);
propertyComments.add(propertyComment);
}
}
protected List<String> extractComments(String[] lines) {
List<String> comments = new ArrayList<>();
StringBundler sb = new StringBundler();
for (String line : lines) {
String trimmedLine = line.trim();
if (trimmedLine.startsWith("## ")) {
trimmedLine = trimmedLine.substring(2);
sb.append(trimmedLine.trim());
}
if (trimmedLine.length() < 3) {
if (sb.index() == 0) {
continue;
}
comments.add(sb.toString());
sb = new StringBundler();
}
}
return comments;
}
protected String extractDefaultProperties(String[] lines) {
StringBundler sb = new StringBundler();
boolean previousLineIsDefaultProperty = false;
for (String line : lines) {
if (!previousLineIsDefaultProperty) {
if (!line.startsWith("#") && !line.startsWith(INDENT + "#")) {
previousLineIsDefaultProperty = true;
sb.append(line);
sb.append(StringPool.NEW_LINE);
}
}
else {
if (line.startsWith("#") || line.startsWith(INDENT + "#")) {
previousLineIsDefaultProperty = false;
continue;
}
sb.append(line);
sb.append(StringPool.NEW_LINE);
}
}
return sb.toString();
}
protected String extractExampleProperties(String[] lines) {
StringBundler sb = new StringBundler();
boolean previousLineIsExample = false;
for (String line : lines) {
String trimmedLine = line.trim();
if (!previousLineIsExample) {
if (line.startsWith(INDENT + "# ") || trimmedLine.equals("#")) {
continue;
}
if (line.startsWith(INDENT + "#")) {
previousLineIsExample = true;
String exampleProperty =
StringUtil.replaceFirst(line, '#', StringPool.BLANK) +
StringPool.NEW_LINE;
sb.append(exampleProperty);
}
}
else {
if (!trimmedLine.startsWith("#")) {
previousLineIsExample = false;
continue;
}
String exampleProperty =
line.replaceFirst("#", StringPool.BLANK) +
StringPool.NEW_LINE;
sb.append(exampleProperty);
}
}
return sb.toString();
}
protected List<PropertyComment> extractPropertyComments(String[] lines) {
List<PropertyComment> propertyComments = new ArrayList<>();
StringBundler sb = new StringBundler();
boolean previousLineIsPreformatted = false;
for (String line : lines) {
line = StringUtil.trimTrailing(line);
if (line.startsWith(DOUBLE_INDENT + "#")) {
break;
}
String trimmedLine = line.trim();
if (trimmedLine.startsWith("# " + INDENT)) {
if (previousLineIsPreformatted) {
sb.append(
StringUtil.replaceFirst(
trimmedLine, '#', StringPool.BLANK));
}
else {
addPropertyComment(propertyComments, sb.toString());
sb = new StringBundler();
sb.append(
StringUtil.replaceFirst(
trimmedLine, '#', StringPool.BLANK));
}
sb.append(StringPool.NEW_LINE);
previousLineIsPreformatted = true;
}
else if (trimmedLine.startsWith("# ")) {
if (previousLineIsPreformatted) {
addPropertyComment(propertyComments, sb.toString());
sb = new StringBundler();
trimmedLine = StringUtil.replaceFirst(
trimmedLine, '#', StringPool.BLANK);
sb.append(trimmedLine.trim());
}
else {
if (sb.length() > 0) {
sb.append(StringPool.SPACE);
}
line = StringUtil.replaceFirst(line, '#', StringPool.BLANK);
sb.append(line.trim());
}
sb.append(StringPool.NEW_LINE);
previousLineIsPreformatted = false;
}
else if (trimmedLine.startsWith("#") &&
(trimmedLine.length() < 2)) {
addPropertyComment(propertyComments, sb.toString());
sb = new StringBundler();
}
else {
addPropertyComment(propertyComments, sb.toString());
break;
}
}
return propertyComments;
}
protected String extractTitle(String[] lines) {
if ((lines == null) || (lines.length <= 1)) {
return null;
}
String title = lines[1];
title = StringUtil.replaceFirst(title, "##", StringPool.BLANK);
return title.trim();
}
protected int getLineCount(String sectionString) {
String[] lines = sectionString.split("\r\n|\r|\n");
return lines.length;
}
protected List<PropertiesSection> getPropertiesSections(File propertiesFile)
throws IOException {
String content = _fileUtil.read(propertiesFile);
String[] sections = content.split("\n\n");
List<PropertiesSection> propertiesSections = new ArrayList<>(
sections.length);
for (String section : sections) {
section = StringUtil.trimLeading(section, CharPool.SPACE);
PropertiesSection propertiesSection = new PropertiesSection(
section);
String[] lines = section.split(StringPool.NEW_LINE);
if (section.startsWith("##")) {
int lineCount = getLineCount(section);
if (lineCount == 3) {
propertiesSection.setTitle(extractTitle(lines));
propertiesSections.add(propertiesSection);
}
else if (lineCount > 3) {
propertiesSection.setComments(extractComments(lines));
propertiesSections.add(propertiesSection);
}
else {
StringBundler sb = new StringBundler(8);
sb.append("Properties section should consist of 3 or ");
sb.append("more lines:");
sb.append(StringPool.NEW_LINE);
sb.append("##");
sb.append(StringPool.NEW_LINE);
sb.append("## Comments");
sb.append(StringPool.NEW_LINE);
sb.append("##");
System.out.println(sb.toString());
return null;
}
}
else {
propertiesSection.setDefaultProperties(
extractDefaultProperties(lines));
propertiesSection.setExampleProperties(
extractExampleProperties(lines));
propertiesSection.setPropertyComments(
extractPropertyComments(lines));
propertiesSections.add(propertiesSection);
}
}
return propertiesSections;
}
protected static final String DOUBLE_INDENT =
PropertiesDocBuilder.INDENT + PropertiesDocBuilder.INDENT;
protected static final String INDENT = StringPool.FOUR_SPACES;
private static final FileImpl _fileUtil = FileImpl.getInstance();
}