Native SQL List for SciProject

git-svn-id: https://svn.libreccm.org/ccm/trunk@4939 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2017-08-28 11:37:02 +00:00
parent 36cd21a94e
commit 5aff1fdc51
5 changed files with 361 additions and 3 deletions

View File

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<ccm:application xmlns:ccm="http://ccm.redhat.com/ccm-project"
name="ccm-sci-publications-navigation"
version="6.6.0"
release="1"
webapp="ROOT">
<ccm:dependencies>
<ccm:requires name="ccm-core" version="6.6.0" relation="ge"/>
<ccm:requires name="ccm-cms" version="6.6.6" relation="ge"/>
<ccm:requires name="ccm-navigation" version="6.6.0" relation="ge"/>
<ccm:requires name="ccm-sci-types-project" version="6.6.3" relation="ge"/>
</ccm:dependencies>
<ccm:directories>
<ccm:directory name="src"/>
</ccm:directories>
<ccm:contacts>
<ccm:contact uri="http://www.scientificcms.org" type="website"/>
<ccm:contact uri="mailto:info@scientificcms.org" type="support"/>
</ccm:contacts>
<ccm:description>
Provides special navigation components for displaying lists of publications.
</ccm:description>
</ccm:application>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<registry>
</registry>

View File

@ -0,0 +1,15 @@
<load>
<requires>
<table name="inits"/>
<table name="acs_objects"/>
<table name="cms_items"/>
<table name="ct_publications"/>
<initializer class="com.arsdigita.cms.Initializer"/>
<initializer class="com.arsdigita.navigation.Initializer"/>
<initializer class="com.arsdigita.cms.contenttypes.SciProjectInitializer"/>
</requires>
<provides>
<initializer class="com.arsdigita.cms.sciproject.navigation.Initializer"/>
</provides>
</load>

View File

@ -0,0 +1,313 @@
package com.arsdigita.cms.sciproject.navigation;
import com.arsdigita.navigation.Navigation;
import com.arsdigita.navigation.ui.AbstractComponent;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.xml.Element;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class SciProjectList extends AbstractComponent {
private static final String PROJECTS_QUERY_TEMPLATE
= "SELECT cms_items.item_id, name, version, language, object_type, "
+ "master_id, parent_id, title, cms_pages.description as page_description, "
+ "projectbegin, projectbegin_skip_month, projectbegin_skip_day, "
+ "projectend, projectend_skip_month, projectend_skip_day, "
+ "shortdesc, ct_sci_projects.description AS project_description, funding, funding_volume "
+ "FROM cms_items "
+ "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id "
+ "JOIN content_types ON cms_items.type_id = content_types.type_id "
+ "JOIN ct_sci_projects ON cms_items.item_id = ct_sci_projects.project_id "
+ "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' %s"
+ "%s"
+ "LIMIT ? OFFSET ?";
private static final String COUNT_PROJECTS_QUERY_TEMPLATE
= "SELECT COUNT(*) "
+ "FROM cms_items "
+ "JOIN cms_pages ON cms_items.item_id = cms_pages.item_id "
+ "JOIN content_types ON cms_items.type_id = content_types.type_id "
+ "JOIN ct_sci_projects ON cms_items.item_id = ct_sci_projects.project_id "
+ "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' %s";
private final PreparedStatement projectMembersQueryStatement;
private int limit = 20;
public SciProjectList() {
try {
final Connection connection = SessionManager
.getSession()
.getConnection();
projectMembersQueryStatement = connection.prepareStatement(
"SELECT surname, givenname, titlepre, titlepost "
+ "FROM cms_persons "
+ "JOIN cms_items ON cms_persons.person_id = cms_items.item_id "
+ "JOIN cms_bundles ON cms_items.parent_id = cms_bundles.bundle_id "
+ "JOIN cms_orgaunits_person_map ON cms_bundles.bundle_id = cms_orgaunits_person_map.person_id "
+ "WHERE orgaunit_id = ? "
+ "ORDER BY surname, givenname"
);
} catch (SQLException ex) {
throw new UncheckedWrapperException(ex);
}
}
public int getLimit() {
return limit;
}
public void setLimit(final int limit) {
this.limit = limit;
}
@Override
public Element generateXML(final HttpServletRequest request,
final HttpServletResponse response) {
final Connection connection = SessionManager
.getSession()
.getConnection();
final String categoryId = getCategory().getID().toString();
final Element listElem = Navigation.newElement(
"sci-project-list");
final Element filtersElem = listElem.newChildElement("filters");
final Element sortElem = filtersElem.newChildElement("sort");
final PreparedStatement projectsQueryStatement;
final StringBuffer whereBuffer = new StringBuffer();
final int page;
final int offset;
try {
final String titleFilter = request.getParameter("title");
final BigDecimal categoryFilter;
if (request.getParameter("category") == null) {
categoryFilter = null;
} else if (request.getParameter("category").matches("\\d*")) {
categoryFilter
= new BigDecimal(request.getParameter("category"));
} else {
categoryFilter = null;
}
if (titleFilter != null && !titleFilter.trim().isEmpty()
|| categoryFilter != null) {
whereBuffer.append(" AND ");
}
if (titleFilter != null && !titleFilter.trim().isEmpty()) {
whereBuffer
.append("LOWER(title) LIKE '%%")
.append(titleFilter.toLowerCase())
.append("%%' ");
final Element titleFilterElem = filtersElem
.newChildElement("title");
titleFilterElem.setText(titleFilter);
}
if (categoryFilter != null) {
if (titleFilter != null && !titleFilter.trim().isEmpty()) {
whereBuffer.append(" AND ");
}
whereBuffer.append("parent_id IN (SELECT object_id "
+ "FROM cat_object_category_map "
+ "WHERE category_id = ")
.append(categoryFilter.toString())
.append(") ");
}
final String orderBy
= "ORDER BY projectbegin DESC, projectend DESC, title ASC ";
projectsQueryStatement = connection
.prepareStatement(String.format(PROJECTS_QUERY_TEMPLATE,
whereBuffer.toString(),
orderBy));
projectsQueryStatement.setString(1, categoryId);
projectsQueryStatement.setInt(2, limit);
if (request.getParameter("page") == null) {
page = 1;
projectsQueryStatement.setInt(3, 0);
offset = 0;
} else {
page = Integer.parseInt(request.getParameter("page"));
offset = (page - 1) * limit;
projectsQueryStatement.setInt(3, offset);
}
} catch (SQLException ex) {
throw new UncheckedWrapperException(ex);
}
try (final ResultSet mainQueryResult = projectsQueryStatement
.executeQuery()) {
final Element paginatorElem = listElem.newChildElement("paginator");
final PreparedStatement countProjectQueryStatement = connection
.prepareStatement(String.format(COUNT_PROJECTS_QUERY_TEMPLATE,
whereBuffer.toString()));
countProjectQueryStatement.setString(1, categoryId);
final ResultSet countResultSet = countProjectQueryStatement
.executeQuery();
final int count;
if (countResultSet.next()) {
count = countResultSet.getInt(1);
paginatorElem.addAttribute("count", Integer.toString(count));
} else {
count = 0;
}
final int maxPages = (int) Math.ceil(count / (double) limit);
paginatorElem.addAttribute("maxPages", Integer.toString(maxPages));
paginatorElem.addAttribute("currentPage", Integer.toString(page));
paginatorElem.addAttribute("offset", Integer.toString(offset));
paginatorElem.addAttribute("limit", Integer.toString(limit));
while (mainQueryResult.next()) {
generateResultEntry(mainQueryResult, listElem);
}
return listElem;
} catch (SQLException ex) {
throw new UncheckedWrapperException(ex);
}
}
private void generateResultEntry(final ResultSet resultSet,
final Element parent) throws SQLException {
final Element projectElem = parent.newChildElement("project");
final Element itemIdElem = projectElem.newChildElement("item-id");
itemIdElem.setText(resultSet.getBigDecimal("item_id").toString());
final Element parentIdElem = projectElem
.newChildElement("parent-id");
parentIdElem.setText(resultSet.getBigDecimal("parent_id").toString());
final Element nameElem = projectElem.newChildElement("name");
nameElem.setText(resultSet.getString("name"));
projectElem.addAttribute("object-type",
resultSet.getString("object_type"));
final Element titleElem = projectElem.newChildElement("title");
titleElem.setText(resultSet.getString("title"));
final String description = resultSet.getString("page_description");
if (description != null && !description.trim().isEmpty()) {
final Element descriptionElem = projectElem
.newChildElement("description");
descriptionElem.setText(description);
}
if (resultSet.getDate("projectbegin") != null) {
final Element projectBeginElem = projectElem.newChildElement(
"project-begin");
final Calendar projectBegin = Calendar.getInstance();
projectBegin.setTime(resultSet.getDate("projectbegin"));
projectBeginElem.addAttribute("year", Integer.toString(projectBegin
.get(Calendar.YEAR)));
projectBeginElem.addAttribute("month", Integer.toString(projectBegin
.get(Calendar.MONTH)));
projectBeginElem.addAttribute("day", Integer.toString(projectBegin
.get(Calendar.DAY_OF_MONTH)));
projectBeginElem.addAttribute(
"skip-month",
Boolean
.toString(resultSet.getBoolean("projectbegin_skip_month")));
projectBeginElem.addAttribute(
"skip-day",
Boolean.toString(resultSet.getBoolean("projectbegin_skip_day")));
}
if (resultSet.getDate("projectend") != null) {
final Element projectBeginElem = projectElem.newChildElement(
"project-begin");
final Calendar projectBegin = Calendar.getInstance();
projectBegin.setTime(resultSet.getDate("projectend"));
projectBeginElem.addAttribute("year", Integer.toString(projectBegin
.get(Calendar.YEAR)));
projectBeginElem.addAttribute("month", Integer.toString(projectBegin
.get(Calendar.MONTH)));
projectBeginElem.addAttribute("day", Integer.toString(projectBegin
.get(Calendar.DAY_OF_MONTH)));
projectBeginElem.addAttribute(
"skip-month",
Boolean
.toString(resultSet.getBoolean("projectend_skip_month")));
projectBeginElem.addAttribute(
"skip-day",
Boolean.toString(resultSet.getBoolean("projectend_skip_day")));
}
final Element shortDescElem = projectElem.newChildElement("project-short-desc");
shortDescElem.setText(resultSet.getString("shortdesc"));
final Element descriptionElem = projectElem.newChildElement(
"project-description");
descriptionElem.setText(resultSet.getString("project_description"));
generateMembers(resultSet.getBigDecimal("parent_id"),
projectElem);
}
private void generateMembers(final BigDecimal projectId,
final Element projectElem)
throws SQLException {
projectMembersQueryStatement.setBigDecimal(1, projectId);
try (final ResultSet resultSet = projectMembersQueryStatement
.executeQuery()) {
final Element membersElem = projectElem.newChildElement("members");
while (resultSet.next()) {
final Element memberElem = membersElem.newChildElement("member");
memberElem.addAttribute("surname", resultSet
.getString("surname"));
memberElem.addAttribute("givenname",
resultSet.getString("givenname"));
memberElem.addAttribute("titlepre", resultSet.getString(
"titlepre"));
memberElem.addAttribute("titlepost",
resultSet.getString("titlepost"));
}
}
}
}

View File

@ -34,7 +34,7 @@ import javax.servlet.http.HttpServletResponse;
* *
* This component uses native SQL queries to create the list. * This component uses native SQL queries to create the list.
* *
* Note: This is only a temporary soluation which will be removed in Version * Note: This is only a temporary solution which will be removed in Version
* 7.0.0 when we completed the migration to JPA/Hibernate. * 7.0.0 when we completed the migration to JPA/Hibernate.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
@ -410,8 +410,7 @@ public class PublicationList extends AbstractComponent {
count = 0; count = 0;
} }
final int maxPages = (int) Math final int maxPages = (int) Math.ceil(count / (double) limit);
.ceil(count / (double) limit);
paginatorElem.addAttribute("maxPages", Integer.toString(maxPages)); paginatorElem.addAttribute("maxPages", Integer.toString(maxPages));
paginatorElem.addAttribute("currentPage", Integer.toString(page)); paginatorElem.addAttribute("currentPage", Integer.toString(page));