<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="org.crosswire.community.projects.ntmss.data.ProjectManagement" %> <%@ page import="org.crosswire.community.projects.ntmss.data.ProjectManagement.Project" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Apparatus.Segment" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Transcription" %> <%@ page import="org.crosswire.community.projects.ntmss.data.Document" %> <%@ page import="org.crosswire.data.DataObject" %> <%@ page import="org.crosswire.sword.keys.VerseKey" %> <%@ page import="org.crosswire.sword.keys.ListKey" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Set" %> <%@ page import="java.util.HashSet" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Collections" %> <%@ page import="org.apache.log4j.Logger" %> <%@ page import="org.crosswire.webtools.annotation.*" %> <%@ page import="org.crosswire.webtools.*" %> <%@ page import="javax.validation.constraints.NotNull" %> <%! @Description(value = "Retrieve variant apparatus data", name = "variant/apparatus/get") public static class MyParameters extends Parameters { protected ProjectManagement.Project project = null; @NotNull @Description(value = "which range of apparatus to obtain", example = "Acts.4.5") public String indexContent = null; @Description(value = "limit results to a specific segmentGroupID; -1 = all", defaultValue = "-1", example = "3") public Integer segmentGroupID = null; @Description(value = "Project Name from which data should be retrieved (i.e., lookup the project segmentGroupID by project name)", example = "ECM Matthew") public String projectName; @Description(value = "include only witnesses from a project specified by projectID", example = "1") public Integer includeOnlyProjectWitnesses = null; @Override protected void customValidation() { projectName = Transcription.assureUnicode(projectName); project = segmentGroupID != null ? ProjectManagement.getProject(segmentGroupID) : projectName != null ? ProjectManagement.getProject(projectName) : null; if (segmentGroupID == null && project != null) segmentGroupID = project.getProjectID(); } } %> <% MyParameters params = new MyParameters().loadFromRequest(request, response, false); if (params.getErrors().size() == 0) { String v11n = null; // fix this soon VerseKey vk = new VerseKey(); vk.setIntros(true); if (v11n != null) vk.setVersificationSystem(v11n); ListKey verses = vk.ParseVerseList(params.indexContent, "Mat.1.1", true); Object outputToSerialize = null; boolean firstVerse = true; int verseCount = 0; DataObject query = new DataObject(); /* String sql = "select DOCUMENTID, GROUP_CONCAT(CONCAT(VERSE, '/', CONTEXTDESCRIPTION) order by VERSE, CONTEXTDESCRIPTION SEPARATOR ', ') as LACUNA from SEGMENTREADINGWITNESS SRW left join SEGMENTREADING SR on SR.SEGMENTREADINGID = SRW.SEGMENTREADINGID left join SEGMENT S on S.SEGMENTID = SR.SEGMENTID left join SEGMENTGROUPSEGMENT SGS on SGS.SEGMENTID = S.SEGMENTID where SGS.SEGMENTGROUPID={SEGMENTGROUPID} and SR.READINGNAME = 'zz'"; query.setIntValue("SEGMENTGROUPID", params.segmentGroupID); if (verses.getCount() > 0) sql += " AND ("; for (int i = 0; i < verses.getCount(); ++i) { if (i > 0) sql += " or "; sql += "VERSE BETWEEN {VERSEMIN" + i + "} and {VERSEMAX" + i + "}"; query.setIntValue("VERSEMIN" + i, ((VerseKey)verses.getElement(i)).getLowerBound().getHashNumber()); query.setIntValue("VERSEMAX" + i, ((VerseKey)verses.getElement(i)).getUpperBound().getHashNumber()); } if (verses.getCount() > 0) sql += ")"; sql += " GROUP BY DOCUMENTID ORDER BY DOCUMENTID, VERSE"; query.executeSQL("SET SESSION group_concat_max_len = 4000000"); List rows = query.getDataSet(sql); */ Integer docGroupID = params.project.getTertiaryDocumentGroupID(); Segment fullAppQuery = new Segment(); String fullAppSQL = "select S.VERSE, S.SEGMENTID, S.CONTEXTDESCRIPTION, count(1) WITNESSCOUNT from SEGMENTREADINGWITNESS SRW left join SEGMENTREADING SR on SR.SEGMENTREADINGID = SRW.SEGMENTREADINGID left join SEGMENT S on S.SEGMENTID = SR.SEGMENTID left join SEGMENTGROUPSEGMENT SGS on SGS.SEGMENTID = S.SEGMENTID where SGS.SEGMENTGROUPID={SEGMENTGROUPID}"; fullAppQuery.setIntValue("SEGMENTGROUPID", params.segmentGroupID); if (verses.getCount() > 0) fullAppSQL += " AND ("; for (int i = 0; i < verses.getCount(); ++i) { if (i > 0) fullAppSQL += " or "; fullAppSQL += "VERSE BETWEEN {VERSEMIN" + i + "} and {VERSEMAX" + i + "}"; fullAppQuery.setIntValue("VERSEMIN" + i, ((VerseKey)verses.getElement(i)).getLowerBound().getHashNumber()); fullAppQuery.setIntValue("VERSEMAX" + i, ((VerseKey)verses.getElement(i)).getUpperBound().getHashNumber()); } if (verses.getCount() > 0) fullAppSQL += ")"; fullAppSQL += " GROUP BY VERSE, SEGMENTID ORDER BY VERSE, SEGMENTID"; params.getLogger().info("fullAppSQL: " + fullAppSQL); params.getLogger().info("fullAppSQL params: " + fullAppQuery); List segments = fullAppQuery.getDataSet(fullAppSQL); Collections.sort(segments); Map> lacSegs = new HashMap>(); Map> unsureMajorSegs = new HashMap>(); Map> hSegs = new HashMap>(); Map> aSegs = new HashMap>(); Map providedLacWords = new HashMap(); String sql = "select SRW.DOCUMENTID, SRW.VERSEINSTANCE, SRW.HAND, SRW.SEGMENTID, SR.READINGNAME, SRW.UNSUREMAJOR, SRW.OMCOMABBR, SRW.OMHAP, SRW.SUPPLEMENT, SRW.LACWORDS from SEGMENTREADINGWITNESS SRW left join SEGMENTREADING SR on SR.SEGMENTREADINGID = SRW.SEGMENTREADINGID left join SEGMENT S on S.SEGMENTID = SR.SEGMENTID left join SEGMENTGROUPSEGMENT SGS on SGS.SEGMENTID = S.SEGMENTID where SGS.SEGMENTGROUPID={SEGMENTGROUPID} and (SR.READINGNAME = 'zz'"; sql += " or SRW.UNSUREMAJOR=1"; sql += ")"; query.setIntValue("SEGMENTGROUPID", params.segmentGroupID); if (verses.getCount() > 0) sql += " AND ("; for (int i = 0; i < verses.getCount(); ++i) { if (i > 0) sql += " or "; sql += "VERSE BETWEEN {VERSEMIN" + i + "} and {VERSEMAX" + i + "}"; query.setIntValue("VERSEMIN" + i, ((VerseKey)verses.getElement(i)).getLowerBound().getHashNumber()); query.setIntValue("VERSEMAX" + i, ((VerseKey)verses.getElement(i)).getUpperBound().getHashNumber()); } if (verses.getCount() > 0) sql += ")"; Map handLacs = new HashMap(); for (DataObject r : (List)query.getDataSet(sql)) { int docID = r.getIntValue("DOCUMENTID"); String verseInstance = r.getStringValue("VERSEINSTANCE"); String hand = r.getStringValue("HAND"); String readingName = r.getStringValue("READINGNAME"); boolean omComAbbr = r.getBoolValue("OMCOMABBR"); boolean omHap = r.getBoolValue("OMHAP"); String isSupplement = r.getBoolValue("SUPPLEMENT") ? "S" : ""; // leave off hand String uniqueKey = "" + docID + "-" + verseInstance + "-" + isSupplement + ":" + r.getIntValue("SEGMENTID"); if (hand.length() > 0) handLacs.put(uniqueKey, r); } for (DataObject r : (List)query.getDataSet(sql)) { int docID = r.getIntValue("DOCUMENTID"); String verseInstance = r.getStringValue("VERSEINSTANCE"); String hand = r.getStringValue("HAND"); String readingName = r.getStringValue("READINGNAME"); boolean omComAbbr = r.getBoolValue("OMCOMABBR"); boolean omHap = r.getBoolValue("OMHAP"); String isSupplement = r.getBoolValue("SUPPLEMENT") ? "S" : ""; String uniqueKey = null; if (hand.length() < 1) { uniqueKey = "" + docID + "-" + verseInstance + "-" + isSupplement + ":" + r.getIntValue("SEGMENTID"); if (handLacs.get(uniqueKey) != null) hand="*"; } // ------- unique key ------- uniqueKey = "" + docID + "-" + verseInstance + "-" + isSupplement + "-" + hand; if ("zz".equals(readingName) || r.getBoolValue("UNSUREMAJOR") ) { Set docLacSegs = lacSegs.get(uniqueKey); if (docLacSegs == null) { docLacSegs = new HashSet(); lacSegs.put(uniqueKey, docLacSegs); } docLacSegs.add(r.getIntValue("SEGMENTID")); if (omHap) { docLacSegs = hSegs.get(uniqueKey); if (docLacSegs == null) { docLacSegs = new HashSet(); hSegs.put(uniqueKey, docLacSegs); } docLacSegs.add(r.getIntValue("SEGMENTID")); } if (omComAbbr) { docLacSegs = aSegs.get(uniqueKey); if (docLacSegs == null) { docLacSegs = new HashSet(); aSegs.put(uniqueKey, docLacSegs); } docLacSegs.add(r.getIntValue("SEGMENTID")); } } if (!"zz".equals(readingName)) { if (r.getBoolValue("UNSUREMAJOR")) { Set docUMSegs = unsureMajorSegs.get(uniqueKey); if (docUMSegs == null) { docUMSegs = new HashSet(); unsureMajorSegs.put(uniqueKey, docUMSegs); } docUMSegs.add(r.getIntValue("SEGMENTID")); if (r.getValue("LACWORDS") != null) { providedLacWords.put(uniqueKey + ":" + r.getIntValue("SEGMENTID"), r.getStringValue("LACWORDS")); } } } } List docs = new ArrayList(lacSegs.keySet()); Collections.sort(docs); params.getLogger().info("docs.size: " + docs.size()); params.getLogger().info("unsureMajorSegs.size: " + unsureMajorSegs.keySet().size()); %> <% //out.print("segments.size(): " + segments.size() + "
"); %> <% for (String d : docs) { StringBuffer lacList = new StringBuffer(); StringBuffer umList = new StringBuffer(); int i = 0; for (; i < 2; ++i) { boolean inLac = false; Set docLacSegs = lacSegs.get(d); Set docHSegs = hSegs.get(d); Set docASegs = aSegs.get(d); if (docHSegs == null) docHSegs = Collections.emptySet(); if (docASegs == null) docASegs = Collections.emptySet(); Set docUnsureMajorSegs = unsureMajorSegs.get(d); if (i == 0) { } else { if (docUnsureMajorSegs != null) { docLacSegs = new HashSet(); for (Integer j : docUnsureMajorSegs) { docLacSegs.add(j); } } else docLacSegs = null; } if (docLacSegs == null) continue; StringBuffer docLacList = new StringBuffer(); Segment firstLacSegment = null; Segment lastLacSegment = null; VerseKey dvk = new VerseKey(); dvk.setIntros(true); VerseKey dvk2 = new VerseKey(); dvk2.setIntros(true); for (Segment s : segments) { try { //params.getLogger().info("i: " + i + "; document: " + d + "; segment: " + s.getContextDescription()); // // skip if we are an overlapping segment if (s.getIntValue("WITNESSCOUNT") < 150) continue; if (docLacSegs.contains(s.getSegmentID())) { String lacWords = providedLacWords.get(d + ":" + s.getSegmentID()); if (!inLac || lacWords != null) { firstLacSegment = s; if (lacWords == null || i == 0) { inLac = true; if (docLacList.length() > 0) docLacList.append(". "); dvk.setHashNumber(s.getVerseHash()); docLacList.append(dvk.getChapter()).append(",").append(dvk.getVerse()).append("/"); if (lacWords != null) { docLacList.append("" + lacWords + ""); inLac = false; if (docASegs.contains(s.getSegmentID())) docLacList.append("A"); if (docHSegs.contains(s.getSegmentID())) docLacList.append("H"); } else { docLacList.append(s.getWordStart()); // if (docASegs.contains(s.getSegmentID())) docLacList.append("A"); // if (docHSegs.contains(s.getSegmentID())) docLacList.append("H"); } } } lastLacSegment = s; } else if (inLac && !docLacSegs.contains(s.getSegmentID())) { dvk.setHashNumber(lastLacSegment.getVerseHash()); dvk2.setHashNumber(firstLacSegment.getVerseHash()); Segment.MutableInteger verseEnd = new Segment.MutableInteger(); int wordEnd = lastLacSegment.getWordEnd(null, verseEnd); int wordStart = firstLacSegment.getWordStart(); if (verseEnd.toInteger() == null) verseEnd.set(dvk.getVerse()); boolean dashed = false; String lacWords = providedLacWords.get(d + ":" + firstLacSegment.getSegmentID()); if (dvk.getChapter() != dvk2.getChapter()) { docLacList.append("-"); dashed = true; docLacList.append(dvk.getChapter()).append(","); } if (dvk.getChapter() != dvk2.getChapter() || verseEnd.toInteger() != dvk2.getVerse()) { if (!dashed) { docLacList.append("-"); dashed = true; } docLacList.append(verseEnd.toInteger()).append("/"); } if (dvk.getChapter() != dvk2.getChapter() || verseEnd.toInteger() != dvk2.getVerse() || wordEnd != wordStart) { if (!dashed) { docLacList.append("-"); dashed = true; } if (lacWords != null) { docLacList.append("" + lacWords + ""); try { if ( (firstLacSegment != null && docASegs.contains(firstLacSegment.getSegmentID())) || (lastLacSegment != null && docASegs.contains(lastLacSegment.getSegmentID())) ) docLacList.append("A"); if ( (firstLacSegment != null && docHSegs.contains(firstLacSegment.getSegmentID())) || (lastLacSegment != null && docHSegs.contains(lastLacSegment.getSegmentID())) ) docLacList.append("H"); } catch (Exception e) { e.printStackTrace(); } } else { docLacList.append(wordEnd); try { if ( (firstLacSegment != null && docASegs.contains(firstLacSegment.getSegmentID())) || (lastLacSegment != null && docASegs.contains(lastLacSegment.getSegmentID())) ) docLacList.append("A"); if ( (firstLacSegment != null && docHSegs.contains(firstLacSegment.getSegmentID())) || (lastLacSegment != null && docHSegs.contains(lastLacSegment.getSegmentID())) ) docLacList.append("H"); } catch (Exception e) { e.printStackTrace(); } } } inLac = false; } } catch (Exception e) { e.printStackTrace(); } } if (inLac) { dvk.setHashNumber(lastLacSegment.getVerseHash()); dvk2.setHashNumber(firstLacSegment.getVerseHash()); Segment.MutableInteger verseEnd = new Segment.MutableInteger(); int wordEnd = lastLacSegment.getWordEnd(null, verseEnd); int wordStart = firstLacSegment.getWordStart(); if (verseEnd.toInteger() == null) verseEnd.set(dvk.getVerse()); boolean dashed = false; if (dvk.getChapter() != dvk2.getChapter()) { docLacList.append("-"); dashed = true; docLacList.append(dvk.getChapter()).append(","); } if (dvk.getChapter() != dvk2.getChapter() || verseEnd.toInteger() != dvk2.getVerse()) { if (!dashed) { docLacList.append("-"); dashed = true; } docLacList.append(verseEnd.toInteger()).append("/"); } if (dvk.getChapter() != dvk2.getChapter() || verseEnd.toInteger() != dvk2.getVerse() || wordEnd != wordStart) { if (!dashed) { docLacList.append("-"); dashed = true; } docLacList.append(wordEnd); } String lacWords = providedLacWords.get(d + ":" + firstLacSegment.getSegmentID()); if (lacWords != null) docLacList.append(" [ " + lacWords + " ]"); } String[] docLacListLines = docLacList.toString().split("\\. "); docLacList = new StringBuffer(); String lastChapterVerse = null; for (String line : docLacListLines) { if (line.length() < 1) continue; try { boolean added = false; String[] lineParts = line.split("-"); String start = lineParts[0]; String end = lineParts.length > 1 ? lineParts[1] : null; String startChapter = start.split(",")[0]; String startVerse = ""; if (start.split(",").length > 1) startVerse = start.split(",")[1].split("/")[0]; else System.out.println("BADLINE================: " + line); String endChapter = startChapter; String endVerse = startVerse; if (end != null) { String[] endParts = end.split(","); if (endParts.length > 1) { endChapter = endParts[0]; end = endParts[1]; } endParts = end.split("/"); if (endParts.length > 1) { endVerse = endParts[0]; } } String startAddress = startChapter + ":"+startVerse; String endAddress = endChapter + ":"+endVerse; if (startAddress.equals(endAddress)) { if (startAddress.equals(lastChapterVerse)) { docLacList.append("."); docLacList.append(line.split("/")[1]); added = true; } lastChapterVerse = startAddress; } else { lastChapterVerse = null; } if (!added) { if (docLacList.length() > 0) docLacList.append("
"); docLacList.append(line); } }catch (Exception e) {e.printStackTrace();} } // docLacList = new StringBuffer(docLacList.toString().replaceAll("\\. ", "
")); if (i == 0) lacList = docLacList; else umList = docLacList; } if (d.endsWith("-")) d = d.substring(0,d.length()-1); String docSegs[] = d.split("-"); Integer docID = Integer.parseInt(docSegs[0]); Document doc = Document.getDocument(docID); String documentDisplay = doc.getPrimaryName(); // docID + "-" + verseInstance + "-" + isSupplement + "-" + hand; if (docSegs.length > 1) { String verseInstance = docSegs[1]; String isSupplement = docSegs.length > 2 ? docSegs[2] : ""; String hand = docSegs.length > 3 ? docSegs[3] : ""; documentDisplay += isSupplement; if (verseInstance.length() > 0) documentDisplay += "-" + verseInstance; documentDisplay += hand; } %>
<% } %>
Primary NameLacuna
<%=documentDisplay%> <%=lacList.toString() + (umList.length() > 0 ? ("

UnsureMajors:

" + umList.toString()) : "")%>
<% return; } params.format = "html"; Serializer.reportErrors(request, response, out, params, true); %>