package org.jsondoc.core.scanner.builder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Set;
import org.jsondoc.core.annotation.global.ApiChangelog;
import org.jsondoc.core.annotation.global.ApiChangelogSet;
import org.jsondoc.core.annotation.global.ApiGlobal;
import org.jsondoc.core.annotation.global.ApiGlobalSection;
import org.jsondoc.core.annotation.global.ApiMigration;
import org.jsondoc.core.annotation.global.ApiMigrationSet;
import org.jsondoc.core.pojo.global.ApiChangelogDoc;
import org.jsondoc.core.pojo.global.ApiChangelogsDoc;
import org.jsondoc.core.pojo.global.ApiGlobalDoc;
import org.jsondoc.core.pojo.global.ApiGlobalSectionDoc;
import org.jsondoc.core.pojo.global.ApiMigrationDoc;
import org.jsondoc.core.pojo.global.ApiMigrationsDoc;
public class JSONDocApiGlobalDocBuilder {
public static ApiGlobalDoc build(Set<Class<?>> globalClasses, Set<Class<?>> changelogClasses, Set<Class<?>> migrationClasses) {
ApiGlobalDoc apiGlobalDoc = new ApiGlobalDoc();
apiGlobalDoc = buildGlobalDoc(apiGlobalDoc, globalClasses);
apiGlobalDoc = buildChangelogDoc(apiGlobalDoc, changelogClasses);
apiGlobalDoc = buildMigrationDoc(apiGlobalDoc, migrationClasses);
if(apiGlobalDoc.getSections().isEmpty() && apiGlobalDoc.getChangelogset().getChangelogs().isEmpty() && apiGlobalDoc.getMigrationset().getMigrations().isEmpty()) {
return null;
} else {
return apiGlobalDoc;
}
}
private static ApiGlobalDoc buildGlobalDoc(ApiGlobalDoc apiGlobalDoc, Set<Class<?>> globalClasses) {
if(!globalClasses.isEmpty()) {
Class<?> clazz = globalClasses.iterator().next();
ApiGlobal apiGlobal = clazz.getAnnotation(ApiGlobal.class);
for (ApiGlobalSection section : apiGlobal.sections()) {
ApiGlobalSectionDoc sectionDoc = new ApiGlobalSectionDoc();
sectionDoc.setTitle(section.title());
for (String paragraph : section.paragraphs()) {
if(paragraph.startsWith("/jsondocfile:")) {
String path = paragraph.replace("/jsondocfile:", "");
try {
InputStream resourceAsStream = JSONDocApiGlobalDocBuilder.class.getResourceAsStream(path);
if(resourceAsStream != null) {
String content = getStringFromInputStream(resourceAsStream);
sectionDoc.addParagraph(content);
} else {
sectionDoc.addParagraph("Unable to find file in path: " + path);
}
} catch (IOException e) {
sectionDoc.addParagraph("Unable to find file in path: " + path);
}
} else {
sectionDoc.addParagraph(paragraph);
}
}
apiGlobalDoc.addApiGlobalSectionDoc(sectionDoc);
}
}
return apiGlobalDoc;
}
private static ApiGlobalDoc buildChangelogDoc(ApiGlobalDoc apiGlobalDoc, Set<Class<?>> changelogClasses) {
if(!changelogClasses.isEmpty()) {
Class<?> clazz = changelogClasses.iterator().next();
ApiChangelogSet apiChangelogSet = clazz.getAnnotation(ApiChangelogSet.class);
ApiChangelogsDoc apiChangelogsDoc = new ApiChangelogsDoc();
for (ApiChangelog apiChangelog : apiChangelogSet.changlogs()) {
ApiChangelogDoc apiChangelogDoc = new ApiChangelogDoc();
apiChangelogDoc.setVersion(apiChangelog.version());
apiChangelogDoc.setChanges(apiChangelog.changes());
apiChangelogsDoc.addChangelog(apiChangelogDoc);
}
apiGlobalDoc.setChangelogset(apiChangelogsDoc);
}
return apiGlobalDoc;
}
private static ApiGlobalDoc buildMigrationDoc(ApiGlobalDoc apiGlobalDoc, Set<Class<?>> migrationClasses) {
if(!migrationClasses.isEmpty()) {
Class<?> clazz = migrationClasses.iterator().next();
ApiMigrationSet apiMigrationSet = clazz.getAnnotation(ApiMigrationSet.class);
ApiMigrationsDoc apiMigrationsDoc = new ApiMigrationsDoc();
for (ApiMigration apiMigration : apiMigrationSet.migrations()) {
ApiMigrationDoc apiMigrationDoc = new ApiMigrationDoc();
apiMigrationDoc.setFromVersion(apiMigration.fromversion());
apiMigrationDoc.setToVersion(apiMigration.toversion());
apiMigrationDoc.setSteps(apiMigration.steps());
apiMigrationsDoc.addMigration(apiMigrationDoc);
}
apiGlobalDoc.setMigrationset(apiMigrationsDoc);
}
return apiGlobalDoc;
}
private static String getStringFromInputStream(InputStream is) throws IOException {
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
throw e;
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
throw e;
}
}
}
return sb.toString();
}
}