MigrationStatusReportView.java
- /*
- * Copyright 2010-2022 the original author or authors.
- *
- * 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
- *
- * https://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 org.mybatis.maven.mvnmigrate.report;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.ResourceBundle;
- import org.apache.ibatis.migration.Change;
- import org.apache.maven.doxia.sink.Sink;
- import org.apache.maven.project.MavenProject;
- /**
- * View of status report.
- */
- public final class MigrationStatusReportView {
- /**
- * Generates the report.
- *
- * @param changes
- * list of {@link Change}
- * @param sink
- * the {@link Sink} instance
- * @param bundle
- * the {@link ResourceBundle} instance
- */
- public void generateReport(Map<MavenProject, List<Change>> changes, Sink sink, ResourceBundle bundle,
- boolean isAggregate) {
- sink.head();
- sink.title();
- sink.text(bundle.getString("migration.status.report.header"));
- sink.title_();
- sink.head_();
- sink.body();
- // Generate title
- sink.section1();
- sink.sectionTitle1();
- sink.text(bundle.getString("migration.status.report.mainTitle"));
- sink.sectionTitle1_();
- sink.section1_();
- sink.lineBreak();
- sink.section2();
- sink.sectionTitle2();
- sink.text(bundle.getString("migration.status.report.secondSectionTitle"));
- sink.sectionTitle2_();
- for (Entry<MavenProject, List<Change>> entries : changes.entrySet()) {
- if (isAggregate) {
- sink.section3();
- sink.sectionTitle3();
- sink.text(bundle.getString("migration.status.report.moduleTitle") + entries.getKey().getName());
- sink.sectionTitle3_();
- }
- generateStatisticsTable(sink, entries.getValue());
- }
- sink.section2_();
- sink.lineBreak();
- sink.section3();
- sink.sectionTitle2();
- sink.text(bundle.getString("migration.status.report.thirdSectionTitle"));
- sink.sectionTitle2_();
- for (Entry<MavenProject, List<Change>> entries : changes.entrySet()) {
- if (isAggregate) {
- sink.section3();
- sink.sectionTitle3();
- sink.text(bundle.getString("migration.status.report.moduleTitle") + entries.getKey().getName());
- sink.sectionTitle3_();
- }
- // Generate Unused declared dependencies:
- generateChangesTable(sink, entries.getValue());
- }
- sink.section3_();
- // Closing the report
- sink.body_();
- sink.flush();
- sink.close();
- }
- /**
- * Generates statistic table.
- *
- * @param sink
- * the sink
- * @param changes
- * the changes
- */
- private void generateStatisticsTable(Sink sink, List<Change> changes) {
- sink.table();
- sink.tableRow();
- sink.tableCell();
- sink.text(" Number of migration changes: ");
- sink.tableCell_();
- sink.tableCell();
- sink.text("" + changes.size());
- sink.tableCell_();
- sink.tableRow_();
- sink.tableRow();
- sink.tableCell();
- sink.text(" Number of pending migrations: ");
- sink.tableCell_();
- int nop = numberOfPending(changes);
- sink.tableCell();
- sink.text(nop + " (" + calcPerc(changes.size(), nop) + ") ");
- sink.nonBreakingSpace();
- sink.figure();
- sink.figureGraphics(nop == 0 ? "images/icon_success_sml.gif" : "images/icon_warning_sml.gif");
- sink.figure_();
- sink.tableCell_();
- sink.tableRow_();
- sink.table_();
- }
- /**
- * Calculates the percentage.
- *
- * @param tot
- * the tot
- * @param nop
- * the nop
- *
- * @return the string
- */
- private String calcPerc(int tot, int nop) {
- return "" + ((100 * nop) / tot) + "%";
- }
- /**
- * Return the number of pending change found.
- *
- * @param changes
- * list of {@link Change}
- *
- * @return Return the number of pending change found.
- */
- private int numberOfPending(List<Change> changes) {
- int numberOfPending = 0;
- for (Change change : changes) {
- if (change.getAppliedTimestamp() == null) {
- numberOfPending++;
- }
- }
- return numberOfPending;
- }
- /**
- * Generate a table for the given dependencies iterator.
- *
- * @param sink
- * the {@link Sink} instance
- * @param iter
- * list of {@link Change}
- */
- public void generateChangesTable(Sink sink, List<Change> iter) {
- sink.table();
- sink.tableRow();
- sink.tableCell();
- sink.bold();
- sink.text("ID");
- sink.bold_();
- sink.tableCell_();
- sink.tableCell();
- sink.bold();
- sink.text("Applied At");
- sink.bold_();
- sink.tableCell_();
- sink.tableCell();
- sink.bold();
- sink.text("Description");
- sink.bold_();
- sink.tableCell_();
- sink.tableCell();
- sink.bold();
- sink.text("Filename");
- sink.bold_();
- sink.tableCell_();
- sink.tableCell();
- sink.bold();
- sink.text("Status");
- sink.bold_();
- sink.tableCell_();
- sink.tableRow_();
- for (Change change : iter) {
- sink.tableRow();
- sink.tableCell();
- sink.text("" + change.getId());
- sink.tableCell_();
- sink.tableCell();
- sink.text(change.getAppliedTimestamp() == null ? " ... pending ... " : change.getAppliedTimestamp());
- sink.tableCell_();
- sink.tableCell();
- sink.text(change.getDescription());
- sink.tableCell_();
- sink.tableCell();
- sink.text(change.getFilename());
- sink.tableCell_();
- sink.tableCell();
- sink.figure();
- sink.figureGraphics(
- change.getAppliedTimestamp() != null ? "images/icon_success_sml.gif" : "images/icon_warning_sml.gif");
- sink.figure_();
- sink.tableCell_();
- sink.tableRow_();
- }
- sink.table_();
- sink.horizontalRule();
- }
- }