/* * Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de) * * Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://creativecommons.org/licenses/by-nc-sa/3.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 de.knurt.fam.template.model; import java.util.ArrayList; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import de.knurt.fam.core.model.config.Logbook; import de.knurt.fam.core.persistence.dao.LogbookEntryDao; import de.knurt.fam.core.persistence.dao.config.LogbookConfigDao; import de.knurt.fam.core.util.mvc.QueryKeys; import de.knurt.fam.core.util.mvc.QueryStringBuilder; import de.knurt.fam.core.util.mvc.RedirectResolver; import de.knurt.fam.core.util.mvc.RequestInterpreter; import de.knurt.fam.core.view.html.LogbookEntriesTrHtml; import de.knurt.heinzelmann.util.query.QueryString; /** * produce the model for tutorials * * @see TemplateContentProperties#getTemplateModel(TemplateResource) * @author Daniel Oltmanns * @since 1.3.0 (10/21/2010) */ @SuppressWarnings("deprecation") // TODO #11 kill uses of deprecations public class LogbookModelFactory { public Properties getProperties(TemplateResource templateResource) { Properties result = new Properties(); if (this.isQueryForLogbookEntriesOfLogbook(templateResource.getRequest())) { String logbookKey = templateResource.getRequest().getParameter(QueryKeys.QUERY_KEY_LOGBOOK); Logbook lb = LogbookConfigDao.getInstance().get(logbookKey); result.put("entryView", true); result.put("logbookKey", logbookKey); result.put("logbook_trhtml", new LogbookEntriesTrHtml(logbookKey, this.getShowFromEntry(templateResource.getRequest(), logbookKey), this.getShowToEntry(templateResource.getRequest(), logbookKey))); result.put("logbook_name", lb.getLabel()); result.put("logbook_description", lb.getDescription()); result.put("logbook_pageshownfromtooptions", this.getPageFromToNavi(templateResource.getRequest(), logbookKey)); result.put("logbook_link2post", RedirectResolver.getLogbookMakePostURLWithQueryString(logbookKey)); result.put("logbook_postingsuccess", this.getShowSuccessfullPosting(templateResource.getRequest())); } else { // query for overview result.put("entryView", false); result.put("logbooks", LogbookConfigDao.getInstance().getAllVisibleFor(templateResource.getAuthUser())); } return result; } private int getCurrentPageNumber(HttpServletRequest rq, String logbookKey) { String result = rq.getParameter(QueryKeys.QUERY_KEY_PAGENO); if (result == null || Integer.parseInt(result) > this.getTotalPageNumber(rq, logbookKey)) { result = QueryStringBuilder.QUERY_LOGBOOK_DEFAULT_VALUE_PAGENO; } return Math.abs(Integer.parseInt(result)); } /** * returns the little page selection navigation. XXX not a controller element -> put in content / view * * @param rq * @param logbookKey * @return */ private String getPageFromToNavi(HttpServletRequest rq, String logbookKey) { int actpno = this.getCurrentPageNumber(rq, logbookKey); int totpno = this.getTotalPageNumber(rq, logbookKey); String result = ""; Logbook lb = LogbookConfigDao.getInstance().get(logbookKey); if (lb.getEntryCount() > 0) { // create numbers to show as link ArrayList<Integer> showNumbersCandidates = new ArrayList<Integer>(); showNumbersCandidates.add(1); showNumbersCandidates.add(2); showNumbersCandidates.add(actpno - 1); showNumbersCandidates.add(actpno); showNumbersCandidates.add(actpno + 1); showNumbersCandidates.add(totpno - 1); showNumbersCandidates.add(totpno); String tmp = ""; // create previous page link String text = "previous"; // INTLANG if (actpno > 1) { // previous page exists tmp = this.getQueryString(logbookKey, (actpno - 1) + "", rq, logbookKey).getAsHtmlLinkHref(); result += "<a href=\"" + tmp + "\">" + text + "</a>"; } else { result += text; } result += "-"; // create links ArrayList<Integer> setLinks = new ArrayList<Integer>(); Integer before = null; for (Integer showNumbersCandidate : showNumbersCandidates) { if (setLinks.contains(showNumbersCandidate) || showNumbersCandidate <= 0 || showNumbersCandidate > totpno) { continue; } if (before != null && before + 1 < showNumbersCandidate) { result += "..."; } before = showNumbersCandidate; if (showNumbersCandidate == actpno) { result += "<strong>" + actpno + "</strong>"; } else { tmp = this.getQueryString(logbookKey, showNumbersCandidate + "", rq, logbookKey).getAsHtmlLinkHref(); result += "<a href=\"" + tmp + "\">" + showNumbersCandidate + "</a>"; } setLinks.add(showNumbersCandidate); result += "-"; } // create next page link text = "next"; // INTLANG if (actpno != totpno) { // next page exists tmp = this.getQueryString(logbookKey, (actpno + 1) + "", rq, logbookKey).getAsHtmlLinkHref(); result += "<a href=\"" + tmp + "\">" + text + "</a>"; } else { result += text; } } return result; } private QueryString getQueryString(String key, String pageno, HttpServletRequest rq, String logbookKey) { return QueryStringBuilder.getLogbookQueryString(key, pageno, this.getCountOfEntriesPerPage(rq, logbookKey) + ""); } /** * return the number of the first entry of the overview. * * @see LogbookEntriesTrHtml * @see LogbookEntryDao#get(String, int, int) * @param rq got * @return the number of the first entry of the overview. */ private int getShowFromEntry(HttpServletRequest rq, String logbookKey) { int pageno = this.getCurrentPageNumber(rq, logbookKey); int entrysize = this.getCountOfEntriesPerPage(rq, logbookKey); int result = (pageno - 1) * entrysize; if (result < 0) { // someone manipulated url result = 0; } return result; } private boolean getShowSuccessfullPosting(HttpServletRequest rq) { boolean result = false; String success = rq.getParameter(QueryKeys.QUERY_KEY_POST_REQUEST_SUCCEEDED); if (success != null && success.equals(QueryKeys.QUERY_DEFAULT_VALUE_POST_REQUEST_SUCCEEDED)) { result = true; } return result; } /** * return the number of the last entry of the overview. * * @see LogbookEntriesTrHtml * @see LogbookEntryDao#get(String, int, int) * @param rq got * @return the number of the last entry of the overview. */ private int getShowToEntry(HttpServletRequest rq, String logbookKey) { return this.getShowFromEntry(rq, logbookKey) + this.getCountOfEntriesPerPage(rq, logbookKey); } private int getCountOfEntriesPerPage(HttpServletRequest rq, String logbookKey) { int result = RequestInterpreter.getCountOfEntriesPerPage(rq); Logbook lb = LogbookConfigDao.getInstance().get(logbookKey); int entryCount = lb.getEntryCount(); if (result > entryCount) { result = entryCount; } return result; } private int getTotalPageNumber(HttpServletRequest rq, String logbookKey) { int pagesize = this.getCountOfEntriesPerPage(rq, logbookKey); Logbook lb = LogbookConfigDao.getInstance().get(logbookKey); int allentriessize = lb.getEntryCount(); int result = 1; if (pagesize > 0) { result = Math.round(allentriessize / pagesize); if (allentriessize % pagesize != 0) { result++; } } return result; } /** * return true, if it is not a query for the overview page. * * @param rq the request * @return true, if it is not a query for the overview page. */ private boolean isQueryForLogbookEntriesOfLogbook(HttpServletRequest rq) { String logbookKey = rq.getParameter(QueryKeys.QUERY_KEY_LOGBOOK); return logbookKey != null && LogbookConfigDao.getInstance().keyExists(logbookKey); } }