/* * 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(); } }