1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package signature.io.html;
18 
19 import org.antlr.stringtemplate.StringTemplate;
20 
21 import signature.Version;
22 import signature.compare.model.IApiDelta;
23 import signature.compare.model.IClassDefinitionDelta;
24 import signature.compare.model.IDelta;
25 import signature.compare.model.IPackageDelta;
26 import signature.compare.model.impl.SigDelta;
27 import signature.io.IApiDeltaExternalizer;
28 import signature.model.IClassDefinition;
29 import signature.model.IPackage;
30 
31 import java.io.File;
32 import java.io.FileOutputStream;
33 import java.io.IOException;
34 import java.text.DateFormat;
35 import java.util.Date;
36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.Set;
39 
40 public class HtmlDeltaExternalizer implements IApiDeltaExternalizer {
41 
42     private static final String OVERVIEW_PAGE_NAME = "changes.html";
43     private static final String STYLE_SHEET_NAME = "styles.css";
44     private static final String DELTA_FOLDER = "changes" + File.separator;
45 
externalize(String location, IApiDelta apiDelta)46     public void externalize(String location, IApiDelta apiDelta)
47             throws IOException {
48         if (!location.endsWith(File.separator)) {
49             location += File.separator;
50         }
51 
52         File directory = new File(location);
53         if (!directory.exists()) {
54             directory.mkdirs();
55         }
56 
57         copyStyleSheet(location);
58 
59         Map<String, String> commonInfos = new HashMap<String, String>();
60         commonInfos.put("creation_time", DateFormat.getDateTimeInstance()
61                 .format(new Date()));
62         commonInfos.put("from_desc", apiDelta.getFrom().getName());
63         commonInfos.put("to_desc", apiDelta.getTo().getName());
64 
65         // write overview page
66         StringBuilder content = new StringBuilder();
67         ApiOverviewPage apiOverviewPage = new ApiOverviewPage(apiDelta,
68                 commonInfos);
69         apiOverviewPage.writeTo(content);
70         writeToFile(location + OVERVIEW_PAGE_NAME, content.toString());
71 
72         // write package overview
73         Set<IPackageDelta> changedPackages = SigDelta.getChanged(apiDelta
74                 .getPackageDeltas());
75         if (!changedPackages.isEmpty()) {
76 
77             File file = new File(location + DELTA_FOLDER);
78             if (!file.exists()) {
79                 file.mkdir();
80             }
81 
82             for (IPackageDelta packageDelta : changedPackages) {
83                 content = new StringBuilder();
84                 PackageOverviewPage packagePage = new PackageOverviewPage(
85                         packageDelta, commonInfos);
86                 packagePage.writeTo(content);
87                 IPackage aPackage = getAnElement(packageDelta);
88                 String packageOverviewFileName = location + DELTA_FOLDER
89                         + "pkg_" + aPackage.getName() + ".html";
90                 writeToFile(packageOverviewFileName, content.toString());
91 
92                 // write class overviews
93                 for (IClassDefinitionDelta classDelta : packageDelta
94                         .getClassDeltas()) {
95                     content = new StringBuilder();
96                     ClassOverviewPage classPage = new ClassOverviewPage(
97                             classDelta, commonInfos);
98                     classPage.writeTo(content);
99                     IClassDefinition aClass = getAnElement(classDelta);
100                     String classOverviewFileName = location + DELTA_FOLDER
101                             + aPackage.getName() + "." + aClass.getName()
102                             + ".html";
103                     writeToFile(classOverviewFileName, content.toString());
104                 }
105             }
106         }
107         // write class overview
108     }
109 
getAnElement(IDelta<T> delta)110     private static <T> T getAnElement(IDelta<T> delta) {
111         if (delta.getFrom() != null) {
112             return delta.getFrom();
113         } else {
114             return delta.getTo();
115         }
116     }
117 
copyStyleSheet(String directory)118     private void copyStyleSheet(String directory) throws IOException {
119         StringTemplate template = TemplateStore.getStringTemplate("Styles");
120         template.setAttribute("version", Version.VERSION);
121         writeToFile(directory + STYLE_SHEET_NAME, template.toString());
122     }
123 
writeToFile(String fileName, String content)124     private void writeToFile(String fileName, String content)
125             throws IOException {
126         FileOutputStream fileOutputStream = new FileOutputStream(fileName);
127         fileOutputStream.write(content.getBytes());
128         fileOutputStream.flush();
129         fileOutputStream.close();
130     }
131 }
132