Native SQL member list, cleanup

git-svn-id: https://svn.libreccm.org/ccm/trunk@4944 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2017-08-28 18:03:39 +00:00
parent ebc063f2f6
commit ed8aaeae5f
5 changed files with 295 additions and 2 deletions

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.SciMemberInitializer"/>
</requires>
<provides>
<initializer class="com.arsdigita.cms.sciproject.navigation.Initializer"/>
</provides>
</load>

View File

@ -0,0 +1,35 @@
package com.arsdigita.cms.scimember.navigation;
import com.arsdigita.db.DbHelper;
import com.arsdigita.persistence.pdl.ManifestSource;
import com.arsdigita.persistence.pdl.NameFilter;
import com.arsdigita.runtime.CompoundInitializer;
import com.arsdigita.runtime.DomainInitEvent;
import com.arsdigita.runtime.PDLInitializer;
import com.arsdigita.runtime.RuntimeConfig;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class SciMemberInitializer extends CompoundInitializer {
public SciMemberInitializer() {
super();
final String url = RuntimeConfig.getConfig().getJDBCURL();
final int database = DbHelper.getDatabaseFromURL(url);
add(new PDLInitializer(new ManifestSource(
"empty.pdl.mf",
new NameFilter(DbHelper.getDatabaseSuffix(database), "pdl"))));
}
@Override
public void init(final DomainInitEvent event) {
super.init(event);
}
}

View File

@ -0,0 +1,240 @@
package com.arsdigita.cms.scimember.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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class SciMemberList extends AbstractComponent {
private static final String MEMBERS_QUERY_TEMPLATE = ""
+ "SELECT cms_items.item_id, name, version, language, object_type, "
+ "master_id, parent_id, title, cms_pages.description, "
+ "surname, givenname, titlepre, titlepost "
+ "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 cms_persons ON cms_persons.person_id = cms_items.item_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_MEMBERS_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 cms_persons ON cms_persons.person_id = cms_items.item_id "
+ "WHERE parent_id IN (SELECT object_id FROM cat_object_category_map WHERE category_id = ?) AND version = 'live' %s";
private final PreparedStatement contactQueryStatement;
private int limit = 20;
public SciMemberList() {
try {
final Connection connection = SessionManager
.getSession()
.getConnection();
contactQueryStatement = connection.prepareStatement(
"SELECT contactentry_id, key, value "
+ "FROM cms_contactentries "
+ "JOIN cms_contacts ON cms_contactentries.contact_id = cms_contacts.contact_id "
+ "JOIN cms_items ON cms_contacts.contact_id = cms_items.item_id "
+ "WHERE cms_items.parent_id IN (SELECT contact_id FROM cms_person_contact_map WHERE person_id = ?)"
);
} 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-member-list");
final Element filtersElem = listElem.newChildElement("filters");
final PreparedStatement membersQueryStatement;
final StringBuffer whereBuffer = new StringBuffer();
final int page;
final int offset;
try {
final String surnameFilter = request.getParameter("surname");
if (surnameFilter != null && !surnameFilter.trim().isEmpty()) {
whereBuffer
.append(" AND ")
.append("LOWER(surname) LIKE '%%")
.append(surnameFilter.toLowerCase())
.append("%%' ");
final Element surnameFilterElem = filtersElem
.newChildElement("surname");
surnameFilterElem.setText(surnameFilter);
}
final String orderBy = "ORDER BY surname, givenname ";
membersQueryStatement = connection
.prepareStatement(String.format(MEMBERS_QUERY_TEMPLATE,
whereBuffer.toString(),
orderBy));
membersQueryStatement.setString(1, categoryId);
membersQueryStatement.setInt(2, limit);
if (request.getParameter("page") == null) {
page = 1;
membersQueryStatement.setInt(3, 0);
offset = 0;
} else {
page = Integer.parseInt(request.getParameter("page"));
offset = (page - 1) * limit;
membersQueryStatement.setInt(3, offset);
}
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
try (final ResultSet mainQueryResult = membersQueryStatement
.executeQuery()) {
final Element paginatorElem = listElem.newChildElement("paginator");
final PreparedStatement countMembersQueryStatement = connection
.prepareStatement(String.format(COUNT_MEMBERS_QUERY_TEMPLATE,
whereBuffer.toString()));
countMembersQueryStatement.setString(1, categoryId);
final ResultSet countResultSet = countMembersQueryStatement
.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 memberElem = parent.newChildElement("member");
final Element itemIdElem = memberElem.newChildElement("item-id");
itemIdElem.setText(resultSet.getBigDecimal("item_id").toString());
final Element parentIdElem = memberElem
.newChildElement("parent-id");
parentIdElem.setText(resultSet.getBigDecimal("parent_id").toString());
final Element nameElem = memberElem.newChildElement("name");
nameElem.setText(resultSet.getString("name"));
memberElem.addAttribute("object-type",
resultSet.getString("object_type"));
final Element titleElem = memberElem.newChildElement("title");
titleElem.setText(resultSet.getString("title"));
final String description = resultSet.getString("description");
if (description != null && !description.trim().isEmpty()) {
final Element descriptionElem = memberElem
.newChildElement("description");
descriptionElem.setText(description);
}
final Element surnameElem = memberElem.newChildElement("surname");
surnameElem.setText(resultSet.getString("surname"));
final Element givenNameElem = memberElem.newChildElement("givenname");
givenNameElem.setText(resultSet.getString("givenname"));
final Element titlePreElem = memberElem.newChildElement("title-pre");
titlePreElem.setText(resultSet.getString("titlepre"));
final Element titlePostElem = memberElem.newChildElement("title-post");
titlePostElem.setText(resultSet.getString("titlePost"));
generateContactEntries(resultSet.getBigDecimal("parent_id"),
memberElem);
}
private void generateContactEntries(final BigDecimal memberId,
final Element memberElem)
throws SQLException {
contactQueryStatement.setBigDecimal(1, memberId);
try (final ResultSet resultSet = contactQueryStatement.executeQuery()) {
final Element contactEntriesElem = memberElem
.newChildElement("contact-entries");
while (resultSet.next()) {
final Element contactEntryElem = contactEntriesElem
.newChildElement("contact-entry");
contactEntryElem.addAttribute("key",
resultSet.getString("key"));
contactEntryElem.setText(resultSet.getString("value"));
}
}
}
}

View File

@ -17,9 +17,9 @@ import com.arsdigita.runtime.RuntimeConfig;
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class Initializer extends CompoundInitializer {
public class SciPublicationInitializer extends CompoundInitializer {
public Initializer() {
public SciPublicationInitializer() {
super();