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