/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed 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 signature.io.html;
import org.antlr.stringtemplate.StringTemplate;
import signature.Version;
import signature.compare.model.IApiDelta;
import signature.compare.model.IClassDefinitionDelta;
import signature.compare.model.IDelta;
import signature.compare.model.IPackageDelta;
import signature.compare.model.impl.SigDelta;
import signature.io.IApiDeltaExternalizer;
import signature.model.IClassDefinition;
import signature.model.IPackage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HtmlDeltaExternalizer implements IApiDeltaExternalizer {
private static final String OVERVIEW_PAGE_NAME = "changes.html";
private static final String STYLE_SHEET_NAME = "styles.css";
private static final String DELTA_FOLDER = "changes" + File.separator;
public void externalize(String location, IApiDelta apiDelta)
throws IOException {
if (!location.endsWith(File.separator)) {
location += File.separator;
}
File directory = new File(location);
if (!directory.exists()) {
directory.mkdirs();
}
copyStyleSheet(location);
Map<String, String> commonInfos = new HashMap<String, String>();
commonInfos.put("creation_time", DateFormat.getDateTimeInstance()
.format(new Date()));
commonInfos.put("from_desc", apiDelta.getFrom().getName());
commonInfos.put("to_desc", apiDelta.getTo().getName());
// write overview page
StringBuilder content = new StringBuilder();
ApiOverviewPage apiOverviewPage = new ApiOverviewPage(apiDelta,
commonInfos);
apiOverviewPage.writeTo(content);
writeToFile(location + OVERVIEW_PAGE_NAME, content.toString());
// write package overview
Set<IPackageDelta> changedPackages = SigDelta.getChanged(apiDelta
.getPackageDeltas());
if (!changedPackages.isEmpty()) {
File file = new File(location + DELTA_FOLDER);
if (!file.exists()) {
file.mkdir();
}
for (IPackageDelta packageDelta : changedPackages) {
content = new StringBuilder();
PackageOverviewPage packagePage = new PackageOverviewPage(
packageDelta, commonInfos);
packagePage.writeTo(content);
IPackage aPackage = getAnElement(packageDelta);
String packageOverviewFileName = location + DELTA_FOLDER
+ "pkg_" + aPackage.getName() + ".html";
writeToFile(packageOverviewFileName, content.toString());
// write class overviews
for (IClassDefinitionDelta classDelta : packageDelta
.getClassDeltas()) {
content = new StringBuilder();
ClassOverviewPage classPage = new ClassOverviewPage(
classDelta, commonInfos);
classPage.writeTo(content);
IClassDefinition aClass = getAnElement(classDelta);
String classOverviewFileName = location + DELTA_FOLDER
+ aPackage.getName() + "." + aClass.getName()
+ ".html";
writeToFile(classOverviewFileName, content.toString());
}
}
}
// write class overview
}
private static <T> T getAnElement(IDelta<T> delta) {
if (delta.getFrom() != null) {
return delta.getFrom();
} else {
return delta.getTo();
}
}
private void copyStyleSheet(String directory) throws IOException {
StringTemplate template = TemplateStore.getStringTemplate("Styles");
template.setAttribute("version", Version.VERSION);
writeToFile(directory + STYLE_SHEET_NAME, template.toString());
}
private void writeToFile(String fileName, String content)
throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
fileOutputStream.write(content.getBytes());
fileOutputStream.flush();
fileOutputStream.close();
}
}