--- /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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.Map;
+
+import org.antlr.stringtemplate.StringTemplate;
+
+import signature.compare.model.IAnnotationFieldDelta;
+import signature.compare.model.IClassDefinitionDelta;
+import signature.compare.model.IConstructorDelta;
+import signature.compare.model.IEnumConstantDelta;
+import signature.compare.model.IFieldDelta;
+import signature.compare.model.IMethodDelta;
+import signature.compare.model.impl.SigDelta;
+
+public class ClassOverviewPage implements IEmitter {
+
+ private static final String PAGE = "ClassOverviewPage";
+
+ private final IClassDefinitionDelta classDelta;
+
+ private FieldByNameComparator<IFieldDelta> fieldComparator =
+ new FieldByNameComparator<IFieldDelta>();
+ private ArrayList<IFieldDelta> removedFields;
+ private ArrayList<IFieldDelta> addedFields;
+ private ArrayList<IFieldDelta> changedFields;
+
+ private FieldByNameComparator<IAnnotationFieldDelta> annotationfieldComparator =
+ new FieldByNameComparator<IAnnotationFieldDelta>();
+ private ArrayList<IAnnotationFieldDelta> removedAnnotationFields;
+ private ArrayList<IAnnotationFieldDelta> addedAnnotationFields;
+ private ArrayList<IAnnotationFieldDelta> changedAnnotationFields;
+
+ private FieldByNameComparator<IEnumConstantDelta> enumConstantComparator =
+ new FieldByNameComparator<IEnumConstantDelta>();
+ private ArrayList<IEnumConstantDelta> removedEnumConstants;
+ private ArrayList<IEnumConstantDelta> addedEnumConstants;
+ private ArrayList<IEnumConstantDelta> changedEnumConstants;
+
+ private ExecutableMemberComparator constructorComparator =
+ new ExecutableMemberComparator();
+ private ArrayList<IConstructorDelta> removedConstructors;
+ private ArrayList<IConstructorDelta> addedConstructors;
+ private ArrayList<IConstructorDelta> changedConstructors;
+
+ private ExecutableMemberComparator methodComparator =
+ new ExecutableMemberComparator();
+ private ArrayList<IMethodDelta> removedMethods;
+ private ArrayList<IMethodDelta> addedMethods;
+ private ArrayList<IMethodDelta> changedMethods;
+
+ private final Map<String, String> commonInfos;
+
+ public ClassOverviewPage(IClassDefinitionDelta classDelta,
+ Map<String, String> commonInfos) {
+ this.classDelta = classDelta;
+ this.commonInfos = commonInfos;
+ prepareData();
+ }
+
+ private void prepareData() {
+ if (classDelta.getFieldDeltas() != null) {
+ prepareFieldDeltas();
+ }
+ if (classDelta.getAnnotationFieldDeltas() != null) {
+ prepareAnnotationFieldDeltas();
+ }
+ if (classDelta.getEnumConstantDeltas() != null) {
+ prepareEnumConstantDeltas();
+ }
+ if (classDelta.getConstructorDeltas() != null) {
+ prepareConstructorDeltas();
+ }
+ if (classDelta.getMethodDeltas() != null) {
+ prepareMethodDeltas();
+ }
+ }
+
+ private void prepareFieldDeltas() {
+ removedFields = new ArrayList<IFieldDelta>(SigDelta
+ .getRemoved(classDelta.getFieldDeltas()));
+ Collections.sort(removedFields, fieldComparator);
+
+ addedFields = new ArrayList<IFieldDelta>(SigDelta.getAdded(classDelta
+ .getFieldDeltas()));
+ Collections.sort(addedFields, fieldComparator);
+
+ changedFields = new ArrayList<IFieldDelta>(SigDelta
+ .getChanged(classDelta.getFieldDeltas()));
+ Collections.sort(changedFields, fieldComparator);
+ }
+
+ private void prepareAnnotationFieldDeltas() {
+ removedAnnotationFields = new ArrayList<IAnnotationFieldDelta>(SigDelta
+ .getRemoved(classDelta.getAnnotationFieldDeltas()));
+ Collections.sort(removedAnnotationFields, annotationfieldComparator);
+
+ addedAnnotationFields = new ArrayList<IAnnotationFieldDelta>(SigDelta
+ .getAdded(classDelta.getAnnotationFieldDeltas()));
+ Collections.sort(addedAnnotationFields, annotationfieldComparator);
+
+ changedAnnotationFields = new ArrayList<IAnnotationFieldDelta>(SigDelta
+ .getChanged(classDelta.getAnnotationFieldDeltas()));
+ Collections.sort(changedAnnotationFields, annotationfieldComparator);
+ }
+
+ private void prepareEnumConstantDeltas() {
+ removedEnumConstants = new ArrayList<IEnumConstantDelta>(SigDelta
+ .getRemoved(classDelta.getEnumConstantDeltas()));
+ Collections.sort(removedEnumConstants, enumConstantComparator);
+
+ addedEnumConstants = new ArrayList<IEnumConstantDelta>(SigDelta
+ .getAdded(classDelta.getEnumConstantDeltas()));
+ Collections.sort(addedEnumConstants, enumConstantComparator);
+
+ changedEnumConstants = new ArrayList<IEnumConstantDelta>(SigDelta
+ .getChanged(classDelta.getEnumConstantDeltas()));
+ Collections.sort(changedEnumConstants, enumConstantComparator);
+ }
+
+ private void prepareConstructorDeltas() {
+ removedConstructors = new ArrayList<IConstructorDelta>(SigDelta
+ .getRemoved(classDelta.getConstructorDeltas()));
+ Collections.sort(removedConstructors, constructorComparator);
+
+ addedConstructors = new ArrayList<IConstructorDelta>(SigDelta
+ .getAdded(classDelta.getConstructorDeltas()));
+ Collections.sort(addedConstructors, constructorComparator);
+
+ changedConstructors = new ArrayList<IConstructorDelta>(SigDelta
+ .getChanged(classDelta.getConstructorDeltas()));
+ Collections.sort(changedConstructors, constructorComparator);
+ }
+
+ private void prepareMethodDeltas() {
+ removedMethods = new ArrayList<IMethodDelta>(SigDelta
+ .getRemoved(classDelta.getMethodDeltas()));
+ Collections.sort(removedMethods, methodComparator);
+
+ addedMethods = new ArrayList<IMethodDelta>(SigDelta.getAdded(classDelta
+ .getMethodDeltas()));
+ Collections.sort(addedMethods, methodComparator);
+
+ changedMethods = new ArrayList<IMethodDelta>(SigDelta
+ .getChanged(classDelta.getMethodDeltas()));
+ Collections.sort(changedMethods, methodComparator);
+ }
+
+ public void writeTo(StringBuilder b) {
+ StringTemplate template = TemplateStore.getStringTemplate(PAGE);
+
+ template.setAttribute("class_delta", classDelta);
+ boolean annotationDelta = classDelta.getAnnotationDeltas() != null;
+ boolean modifierDelta = classDelta.getModifierDeltas() != null;
+ boolean typeVariableDelta = classDelta.getTypeVariableDeltas() != null;
+ boolean superClassDelta = classDelta.getSuperClassDelta() != null;
+ boolean interfaceDelta = classDelta.getInterfaceDeltas() != null;
+ boolean hasSignatureDelta = annotationDelta || modifierDelta
+ || typeVariableDelta || superClassDelta || interfaceDelta;
+
+ template.setAttribute("has_class_signature_delta", hasSignatureDelta);
+
+ template.setAttribute("removed_fields", removedFields);
+ template.setAttribute("added_fields", addedFields);
+ template.setAttribute("changed_fields", changedFields);
+
+ template.setAttribute("removed_annotation_fields",
+ removedAnnotationFields);
+ template.setAttribute("added_annotation_fields", addedAnnotationFields);
+ template.setAttribute("changed_annotation_fields",
+ changedAnnotationFields);
+
+ template.setAttribute("removed_enum_constants", removedEnumConstants);
+ template.setAttribute("added_enum_constants", addedEnumConstants);
+ template.setAttribute("changed_enum_constants", changedEnumConstants);
+
+ template.setAttribute("removed_constructors", removedConstructors);
+ template.setAttribute("added_constructors", addedConstructors);
+ template.setAttribute("changed_constructors", changedConstructors);
+
+ template.setAttribute("removed_methods", removedMethods);
+ template.setAttribute("added_methods", addedMethods);
+ template.setAttribute("changed_methods", changedMethods);
+
+ template.setArgumentContext(commonInfos);
+ b.append(template.toString());
+ }
+}