/*******************************************************************************
* Copyright (c) 2012, Directors of the Tyndale STEP Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* Neither the name of the Tyndale House, Cambridge (www.TyndaleHouse.com)
* nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
package com.tyndalehouse.step.jsp;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.SortedMap;
import java.util.TreeMap;
import org.crosswire.common.util.Language;
import org.crosswire.jsword.book.Book;
import org.crosswire.jsword.book.BookCategory;
import org.crosswire.jsword.book.Books;
import com.google.inject.Injector;
import com.tyndalehouse.step.core.models.ClientSession;
import com.tyndalehouse.step.core.service.helpers.VersionResolver;
import com.tyndalehouse.step.core.utils.StringUtils;
/**
* A WebCookieRequest stores information from the request and the cookie for easy use in the jsp page
*
* @author chrisburrell
*
*/
// CHECKSTYLE:OFF
public class VersionsStepRequest {
private final Locale userLocale;
private final ResourceBundle bundle;
private final VersionResolver versionResolver;
/**
* wraps around the servlet request for easy access
*
* @param request the servlet request
* @param injector the injector for the application
*/
public VersionsStepRequest(final Injector injector) {
this.userLocale = injector.getInstance(ClientSession.class).getLocale();
this.versionResolver = injector.getInstance(VersionResolver.class);
this.bundle = ResourceBundle.getBundle("HtmlBundle", this.userLocale);
}
/**
* @return a table representing the book list
*/
public String getVersionList() {
final Books installed = Books.installed();
final List<Book> bookList = installed.getBooks();
final List<Book> other = new ArrayList<Book>();
final SortedMap<String, List<Book>> booksByLanguage = new TreeMap<String, List<Book>>();
for (final Book b : bookList) {
final Language language = b.getLanguage();
if (language != null) {
List<Book> list = booksByLanguage.get(language.getCode());
if (list == null) {
list = new ArrayList<Book>(16);
booksByLanguage.put(b.getLanguage().getCode(), list);
}
list.add(b);
} else {
other.add(b);
}
}
final StringBuilder bookListData = new StringBuilder(1024 * 8);
for (final Map.Entry<String, List<Book>> entry : booksByLanguage.entrySet()) {
bookListData.append("<h3>");
bookListData.append(new Locale(entry.getKey()).getDisplayLanguage(this.userLocale));
bookListData.append("</h3>");
outputVersions(bookListData, entry.getValue());
bookListData.append("<p />");
}
bookListData.append("<h3>");
bookListData.append(this.bundle.getString("uncategorised"));
bookListData.append("</h3>");
outputVersions(bookListData, other);
bookListData.append("<p />");
return bookListData.toString();
}
/**
* Outputs the list of books
*
* @param bundle
*
* @param value the list of books
*/
private void outputVersions(final StringBuilder bookList, final List<Book> books) {
bookList.append("<table id='versionListTable' class='listingTable'>");
bookList.append("<tr><th class='versionInitialsColumn'>");
bookList.append(this.bundle.getString("installation_book_initials"));
bookList.append("</th><th class='versionNameColumn'>");
bookList.append(this.bundle.getString("installation_book_name"));
bookList.append("</th><th class='versionCategoryColumn'>");
bookList.append(this.bundle.getString("installation_book_category"));
bookList.append("</th></tr>");
int ii = 0;
for (final Book b : books) {
final String initials = this.versionResolver.getShortName(b.getInitials());
if (!BookCategory.BIBLE.equals(b.getBookCategory())
&& !BookCategory.COMMENTARY.equals(b.getBookCategory())) {
continue;
}
bookList.append("<tr class='");
if (ii % 2 == 0) {
bookList.append("even");
}
bookList.append("'>");
bookList.append("<td>");
bookList.append("<a href='version.jsp?version=");
bookList.append(initials);
bookList.append("' class='info' title='");
final String shortCopyright = (String) b.getBookMetaData().getProperty("ShortCopyright");
if (StringUtils.isNotBlank(shortCopyright)) {
bookList.append(shortCopyright);
}
bookList.append("'>ⓘ ");
bookList.append(initials);
bookList.append("</a>");
bookList.append("</td>");
bookList.append("<td>");
bookList.append(b.getName());
bookList.append("</td>");
bookList.append("<td>");
bookList.append(b.getBookCategory().getName());
bookList.append("</td>");
bookList.append("</tr>");
ii++;
}
bookList.append("</table>");
}
}