<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="org.crosswire.utils.Sessions" %> <%@ page import="org.crosswire.webtools.RightsAndRoles" %> <%@ page import="org.crosswire.utils.Utils" %> <%@ page import="org.crosswire.utils.HTTPUtils" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Feature" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document.SearchFilter" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document.ShelfInstance" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Page" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Surrogate.SurrogateImage" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Transcription" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Surrogate.SurrogateTranscription" %> <%@ page import="java.net.URL" %> <%@ page import="java.util.List" %> <%@ page import="java.util.Vector" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Set" %> <%@ page import="java.util.HashSet" %> <%@ page import="java.util.Arrays" %> <%@ page import="org.apache.log4j.Logger" %> <%! private static Logger logger = Logger.getLogger("listetable.jsp"); %> <% String userName = Sessions.getSessionStringValue(request, "userName"); String groupNames = Sessions.getSessionStringValue(request, "userGroups"); String requestURI = request.getRequestURI(); int pe = requestURI.lastIndexOf('/', requestURI.length()-2); requestURI = (pe > 0) ? requestURI.substring(0, pe) : ""; URL baseURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), requestURI); URL portalBaseURL = new URL(request.getScheme(), request.getServerName(), request.getServerPort(), "/"); URL appBaseURL = new URL(portalBaseURL, "/community"); int limit = 3200; try { limit = Integer.parseInt(request.getParameter("limit")); } catch (Exception e) {} response.setContentType("text/xml"); Document.SearchFilter searchFilter = new Document.SearchFilter(); Document.SearchFilter secondaryFilter = new Document.SearchFilter(); searchFilter.biblicalContent = request.getParameter("biblicalContent"); if (searchFilter.biblicalContent != null && searchFilter.biblicalContent.length() < 1) searchFilter.biblicalContent = null; int paramCount = searchFilter.biblicalContent != null ? 1 : 0; String featureCodeClipString = request.getParameter("featureCodeClipString"); //if (featureCodeClipString != null) featureCodeClipString = new String(featureCodeClipString.getBytes("iso8859-1"), "UTF-8"); SearchFilter.FeatureCriteria featureCodeClip = featureCodeClipString == null ? null : parseFeatureCodeString(featureCodeClipString); String featureCodesStrings[] = request.getParameterValues("featureCode"); String featureAuthor = request.getParameter("featureAuthor"); //for (int i = 0; featureCodesStrings != null && i < featureCodesStrings.length; ++i) if (featureCodesStrings[i] != null) featureCodesStrings[i] = new String(featureCodesStrings[i].getBytes("iso8859-1"), "UTF-8"); paramCount += ((featureCodesStrings != null) ? featureCodesStrings.length : 0); if ("true".equals(request.getParameter("listeOnly"))) { secondaryFilter.docID = 10000; secondaryFilter.maxDocID = 49999; } //logger.info("secondaryFilter: " + secondaryFilter); // this is all to handle to common case where docID=min-maxDocID is part of an addQuery string but also a docID is sent as a query. // String docIDStrings[] = request.getParameterValues("docID"); String docIDString = docIDStrings != null && docIDStrings.length > 0 ? docIDStrings[0] : null; try { searchFilter.docID = Integer.parseInt(docIDString); ++paramCount; } catch (Exception e) { if (docIDString != null) ++paramCount; } if (docIDStrings != null && docIDStrings.length > 1) { try { secondaryFilter.docID = Integer.parseInt(docIDStrings[1]); } catch (Exception e) { } } try { searchFilter.lineCountMin = Integer.parseInt(request.getParameter("lineCountMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.documentGroupID = Integer.parseInt(request.getParameter("documentGroupID")); ++paramCount; } catch (Exception e) {} try { searchFilter.lineCountMax = Integer.parseInt(request.getParameter("lineCountMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.columnsMin = Integer.parseInt(request.getParameter("columnsMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.columnsMax = Integer.parseInt(request.getParameter("columnsMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageWidthMin = Integer.parseInt(request.getParameter("pageWidthMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageWidthMax = Integer.parseInt(request.getParameter("pageWidthMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageHeightMin = Integer.parseInt(request.getParameter("pageHeightMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageHeightMax = Integer.parseInt(request.getParameter("pageHeightMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageCountMin = Integer.parseInt(request.getParameter("pageCountMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.pageCountMax = Integer.parseInt(request.getParameter("pageCountMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.folioCountMin = Integer.parseInt(request.getParameter("folioCountMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.folioCountMax = Integer.parseInt(request.getParameter("folioCountMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.dateMin = Integer.parseInt(request.getParameter("dateMin")); ++paramCount; } catch (Exception e) {} try { searchFilter.dateMax = Integer.parseInt(request.getParameter("dateMax")); ++paramCount; } catch (Exception e) {} try { searchFilter.instID = Integer.parseInt(request.getParameter("instID")); ++paramCount; } catch (Exception e) {} try { searchFilter.shelfID = Integer.parseInt(request.getParameter("shelfID")); ++paramCount; } catch (Exception e) {} try { if ("true".equals(request.getParameter("hasImages"))) searchFilter.hasImages = true; } catch (Exception e) {} try { if ("false".equals(request.getParameter("hasImages"))) searchFilter.hasImages = false; } catch (Exception e) {} if (searchFilter.hasImages != null) ++paramCount; try { if ("true".equals(request.getParameter("hasTranscriptions"))) searchFilter.hasTranscriptions = true; } catch (Exception e) {} try { if ("false".equals(request.getParameter("hasTranscriptions"))) searchFilter.hasTranscriptions = false; } catch (Exception e) {} if (searchFilter.hasTranscriptions != null) ++paramCount; searchFilter.lang = request.getParameter("lang"); if (searchFilter.lang != null) ++paramCount; searchFilter.contentDesc = request.getParameter("contentDesc"); if (searchFilter.contentDesc != null) ++paramCount; searchFilter.country = request.getParameter("country"); if (searchFilter.country != null) { searchFilter.country = new String(searchFilter.country.getBytes("iso8859-1"), "UTF-8"); ++paramCount; } searchFilter.place = request.getParameter("place"); if (searchFilter.place != null) { searchFilter.place = new String(searchFilter.place.getBytes("iso8859-1"), "UTF-8"); ++paramCount; } searchFilter.currentUserID = userName; searchFilter.currentGroupIDs = groupNames; searchFilter.gaNum = request.getParameter("gaNum"); if (searchFilter.gaNum != null) { searchFilter.gaNum = Transcription.assureUnicode(searchFilter.gaNum); if (searchFilter.gaNum.length() > 0) ++paramCount; } boolean pageDetail = false; try { pageDetail = "page".equals(request.getParameter("detail")); } catch (Exception e) {} if (paramCount > 0) { // let's check to see if we're a privileged user int contentAccessLevel = 0; contentAccessLevel = RightsAndRoles.hasRole(request, response, "Internal User") ? Math.max(2, contentAccessLevel) : contentAccessLevel; contentAccessLevel = RightsAndRoles.hasRole(request, response, "Expert User") ? Math.max(1, contentAccessLevel) : contentAccessLevel; boolean isAdmin = RightsAndRoles.hasRole(request, response, "VMR Administrator"); // --------------------------------------------- Document docs[] = null; if (docIDStrings != null) { for (int i = 0; i < docIDStrings.length; ++i) { Document.SearchFilter sf = i == 0 ? searchFilter : secondaryFilter; String docIDStr = docIDStrings[i]; if (docIDStr != null && docIDStr.indexOf("-") > -1) { String range[] = docIDStr.split("-"); sf.docID = Integer.parseInt(range[0]); sf.maxDocID = Integer.parseInt(range[1]); } } } if (docIDString != null && docIDString.indexOf("-") > -1) { String range[] = docIDString.split("-"); searchFilter.docID = Integer.parseInt(range[0]); searchFilter.maxDocID = Integer.parseInt(range[1]); } // let's let admin see all user's docs if (searchFilter.userID == null && isAdmin) searchFilter.userID = "*"; if (featureCodesStrings != null && featureCodesStrings.length > 0) { for (String fc : featureCodesStrings) { SearchFilter.FeatureCriteria featureCriteria = parseFeatureCodeString(fc); searchFilter.addFeatureCriteria(featureCriteria); } } if (docIDString != null && (docIDString.startsWith("crosswire:") || docIDString.indexOf("|") > -1)) { Vector docSet = new Vector(); for (String did : docIDString.split("\\|")) { try { //System.out.println("******* did: " + did); if (did.startsWith("crosswire:")) { did = did.substring("crosswire:".length()); docSet.add(new Document.CrossWireDocument(did)); } else { searchFilter.docID = Integer.parseInt(did); Document docss[] = Document.searchDocuments(pageDetail, searchFilter, secondaryFilter); if (docss.length > 0) docSet.add(docss[0]); } } catch (Exception e) {} } docs = docSet.toArray(new Document[0]); } else { if (docIDString != null && searchFilter.docID == -1 && paramCount == 1) { docs = new Document[0]; } else docs = Document.searchDocuments(pageDetail, searchFilter, secondaryFilter); } if (!pageDetail) { %> Results:  ; Filters:                         <% } int docCount = 0; int pageCount = 0; for (Document doc : docs) { if (!pageDetail) { // this takes longer. Worth it? doc = Document.getDocument(doc.getDocumentID()); String rtolClassAdd = rtolLangs.contains(doc.getLanguage())?" rtol":""; Feature f = doc.getFeature("Removed"); boolean removed = f != null; boolean skip = f != null && !"Display".equals(f.getStringVal1()); String gaNumHint = ""; String afterText = ""; if (skip) continue; if (removed) { gaNumHint = "Removed"; String reason = f.getStringVal2(); if ("Other".equals(reason)) reason = ""; String prose = f.getProse(); if (prose != null && prose.trim().length() > 0) { if (reason.length() > 0) reason += "; "; reason += prose; } if (reason.length() > 0) gaNumHint += "; " + reason; Document.SearchFilter seeAlsoSearch = new Document.SearchFilter(); String primaryName = doc.getPrimaryName(); seeAlsoSearch.addFeatureCriteria(new SearchFilter.FeatureCriteria( "FormerGA", Feature.AuxDataField.STRINGVAL1, SearchFilter.FeatureCriteria.OPERATOR_EQUALS, primaryName)); List seeAlsoResults = new ArrayList(); seeAlsoResults.addAll(Arrays.asList(Document.searchDocuments(false, seeAlsoSearch, secondaryFilter))); if (primaryName.startsWith("L")) { seeAlsoSearch = new Document.SearchFilter(); seeAlsoSearch.addFeatureCriteria(new SearchFilter.FeatureCriteria( "FormerGA", Feature.AuxDataField.STRINGVAL1, SearchFilter.FeatureCriteria.OPERATOR_EQUALS, "l " + primaryName.substring(1))); seeAlsoResults.addAll(Arrays.asList(Document.searchDocuments(false, seeAlsoSearch, secondaryFilter))); } if (!seeAlsoResults.isEmpty()) { String sdocs = ""; for (Document seeDoc: seeAlsoResults) { if (sdocs.length() > 0) sdocs += "; "; sdocs += seeDoc.getGANumber(); } gaNumHint += "; See: " + sdocs; afterText = "data-afterText=\" "+gaNumHint+"\""; } } ++docCount; %> <%=doc.getDocumentID()%> 0 ? ("title=\""+gaNumHint+"\"") : ""%>> class="gaNum<%=removed?" removed":""%>"><%=doc.getGANumber()%><%=gaNumHint.length() > 0 ? "          ":""%> <%=doc.getOriginYearDescription()%> <%=doc.getLeavesDisplay()%> <% int i = 0; for (ShelfInstance si : doc.getShelfInstances()) { %> <% ++i; } %> <% } else { Page pgs[] = (paramCount > 1 || searchFilter.docID == -1) ? doc.getPages() : doc.getPages(true); doc.addCSNTMSurrogates(pgs); for (Page p : pgs) { Feature showFeature = null; if (featureCodeClip != null) { for (Feature f : Feature.getFeatures(p.getDocumentID(), p.getPageID())) { if (featureCodeClip.matches(f)) { //logger.info("showFeature is true! " + f); showFeature = f; break; } } } SurrogateImage[] images = p.getSurrogateImages(); p.setContentAccessLevel(contentAccessLevel); SurrogateTranscription trans = (p.getSurrogateTranscriptions() != null && p.getSurrogateTranscriptions().length > 0) ? p.getSurrogateTranscriptions()[0] : null; int pi = 0; for (SurrogateImage image : p.getSurrogateImages()) { String imageThumb = null; if (showFeature != null) { imageThumb = showFeature.getClipThumbURL(); } if (imageThumb == null || imageThumb.length() < 1) { imageThumb = image.getThumbURL(); } int rowCount = showFeature == null ? images.length : 1; %> <% if (pi==0) { ++pageCount; %> <%=doc.getDocumentID()%> <%=p.getPageID() + ((p.getFolioNumber() != null && p.getFolioNumber().length() > 0) ? (" ("+p.getFolioNumber()+")") : "")%>
<% if (p.getNoIdx()) { if (p.isLectionaryText()) { %> <%=p.getLectionaryText()%> <% } if (p.isCommentaryText()) { %> Commentary Text <% } else { %> No Index Content <% } } else { String bc = p.getBiblicalContent(); out.print(bc); if (p.isCommentaryText()) { %> <%= (bc.length() > 0) ? " + " : ""%>Commentary Text <% } if (p.isLectionaryText()) { %> <%= ((bc.length() > 0) ? "; ": "") %><%= p.getLectionaryText() %> <% } } %> <% } %>
... <% if (p.getContentAccessLevel() < image.getDistributionLicenseID()) { %> Locked
<% } String shelfIDs = ""; if (image.getShelfID() != 0) shelfIDs = Integer.toString(image.getShelfID()); else { if (p.getFirstShelfID() != 0) shelfIDs = Integer.toString(p.getFirstShelfID()); if (p.getSecondShelfID() != 0) shelfIDs += (shelfIDs.length() > 0 ? " ":"") + p.getSecondShelfID(); if (p.getThirdShelfID() != 0) shelfIDs += (shelfIDs.length() > 0 ? " ":"") + p.getThirdShelfID(); } %> <% if (showFeature != null) break; } // if we have no images, let's still output something if (p.getSurrogateImages().length == 0) { %> <%=doc.getDocumentID()%> <%=p.getPageID() + ((p.getFolioNumber() != null && p.getFolioNumber().length() > 0) ? (" ("+p.getFolioNumber()+")") : "")%>
<% if (p.getNoIdx()) { if (p.isLectionaryText()) { %> <%=p.getLectionaryText()%> <% } if (p.isCommentaryText()) { %> Commentary Text <% } else { %> No Index Content <% } } else { out.print(p.getBiblicalContent()); if (p.isCommentaryText()) { %> + Commentary Text <% } if (p.isLectionaryText()) { %> <%= p.getLectionaryText() %> <% } } %>   <% } if (--limit < 1) break; } } if (--limit < 1) break; } %>
<% } %> <%! public static Set rtolLangs = new HashSet(Arrays.asList("ar-ar", "he", "ar", "syc")); public static SearchFilter.FeatureCriteria parseFeatureCodeString(String fc) { SearchFilter.FeatureCriteria retVal = null; int operator = SearchFilter.FeatureCriteria.OPERATOR_PRESENT; int dlen = 2; // AUTHOR: @= String author = null; // chop author off the end, e.g., GeneralManuscriptObservation@=ECM int divide = fc.indexOf("@="); if (divide > -1) { author = fc.substring(divide+2); fc = fc.substring(0, divide); } // NOT PRESENT: we handle two forms of NOT PRESENT: !featureCode or featureCode=! // the latter is easier to program to for clients for consistency: featureCode OPERATOR // the former is more logical. Both are equally supported if (fc.startsWith("!")) { operator = SearchFilter.FeatureCriteria.OPERATOR_NOTPRESENT; fc = fc.substring(1); } // LIKE: %= divide = fc.indexOf("%="); if (divide > -1) { operator = SearchFilter.FeatureCriteria.OPERATOR_LIKE; } else { // GREATER THAN OR EQUAL TO: >= divide = fc.indexOf(">="); if (divide > -1) { operator = SearchFilter.FeatureCriteria.OPERATOR_GREATEREQUALS; } else { // LESS THAN OR EQUAL TO: <= divide = fc.indexOf("<="); if (divide > -1) { operator = SearchFilter.FeatureCriteria.OPERATOR_LESSEQUALS; } else { divide = fc.indexOf("!="); if (divide > -1) { operator = SearchFilter.FeatureCriteria.OPERATOR_NOTEQUALS; } else { // EQUAL TO: = divide = fc.indexOf("="); if (divide > -1) { operator = SearchFilter.FeatureCriteria.OPERATOR_EQUALS; dlen = 1; // NOT PRESENT: =! String val = fc.substring(divide+dlen); if ("!".equals(val)) operator = SearchFilter.FeatureCriteria.OPERATOR_NOTPRESENT; } } } } } if (operator == SearchFilter.FeatureCriteria.OPERATOR_PRESENT) { retVal = new SearchFilter.FeatureCriteria(fc, author); } else if (operator == SearchFilter.FeatureCriteria.OPERATOR_NOTPRESENT) { retVal = new SearchFilter.FeatureCriteria(fc, author); retVal.operator = operator; } else { String featureCode = fc.substring(0,divide); Feature.AuxDataField auxDataField = null; int start = featureCode.indexOf("["); if (start > -1) { int end = featureCode.indexOf("]", start); if (end > -1) { auxDataField = Feature.getAuxDataFieldFromString(featureCode.substring(start+1, end)); featureCode = featureCode.substring(0, start); } } if (auxDataField != null) { retVal = new SearchFilter.FeatureCriteria(featureCode, auxDataField, operator, fc.substring(divide+dlen), author); } else { retVal = new SearchFilter.FeatureCriteria(featureCode, operator, fc.substring(divide+dlen), author); } } return retVal; } %>