Skip to content

Commit e7712ad

Browse files
committed
Considering 'local' access model when retrieving /firehose. Various
enhancements as suggested by @lloydwatkin.
1 parent 01ff69b commit e7712ad

12 files changed

Lines changed: 215 additions & 85 deletions

File tree

src/main/java/org/buddycloud/channelserver/channel/ChannelManagerImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,13 @@ public int getCountRecentItems(JID user, Date since, int maxPerNode,
339339

340340
@Override
341341
public CloseableIterator<NodeItem> getFirehose(int limit,
342-
String afterItemId, boolean isAdmin) throws NodeStoreException {
343-
return nodeStore.getFirehose(limit, afterItemId, isAdmin);
342+
String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException {
343+
return nodeStore.getFirehose(limit, afterItemId, isAdmin, actorDomain);
344344
}
345345

346346
@Override
347-
public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException {
348-
return nodeStore.getFirehoseItemCount(isAdmin);
347+
public int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException {
348+
return nodeStore.getFirehoseItemCount(isAdmin, actorDomain);
349349
}
350350

351351
@Override
@@ -366,6 +366,7 @@ public Affiliations getDefaultNodeAffiliation(String nodeId)
366366
return Affiliations.member;
367367
}
368368

369+
@SuppressWarnings("rawtypes")
369370
@Override
370371
public CloseableIterator<NodeItem> performSearch(JID searcher,
371372
List content, JID author, int page, int rpp)

src/main/java/org/buddycloud/channelserver/channel/LocalDomainChecker.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public static boolean isLocal(String domain, Properties configuration, Set<Strin
4545
return false;
4646
}
4747
}
48-
return localDomains.contains(domain);
48+
return localDomains.contains(domain.toLowerCase());
4949
}
5050

5151
public static Set<String> getLocalDomains(Properties configuration) {
@@ -64,12 +64,11 @@ public static Set<String> getLocalDomains(Properties configuration) {
6464

6565
String csvDomains = IOUtils.toString(inputStream);
6666
for (String eachDomain : csvDomains.split(COMMA)) {
67-
localDomains.add(eachDomain.trim());
67+
localDomains.add(eachDomain.trim().toLowerCase());
6868
}
6969
inputStream.close();
7070
} catch (Exception e) {
7171
// Return empty set
72-
e.printStackTrace();
7372
}
7473

7574
return localDomains;

src/main/java/org/buddycloud/channelserver/db/NodeStore.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ void deleteNodeItemById(String nodeId, String nodeItemId)
526526
* @return
527527
* @throws NodeStoreException
528528
*/
529+
@SuppressWarnings("rawtypes")
529530
CloseableIterator<NodeItem> performSearch(JID searcher, List content,
530531
JID author, int page, int rpp) throws NodeStoreException;
531532

@@ -538,20 +539,24 @@ CloseableIterator<NodeItem> performSearch(JID searcher, List content,
538539
* after item ID#
539540
* @param isAdmin
540541
* show items from non-open nodes
542+
* @param actorDomain
543+
* the domain of the actor
541544
* @return
542545
* @throws NodeStoreException
543546
*/
544547
CloseableIterator<NodeItem> getFirehose(int limit, String afterItemId,
545-
boolean isAdmin) throws NodeStoreException;
548+
boolean isAdmin, String actorDomain) throws NodeStoreException;
546549

547550
/**
548551
* Get count of items from public channels "firehose"
549552
*
550553
* @param isAdmin
551554
* counts items from non-open nodes
555+
* @param actorDomain
556+
* the domain of the actor
552557
* @throws NodeStoreException
553558
*/
554-
int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException;
559+
int getFirehoseItemCount(boolean isAdmin, String actorDomain) throws NodeStoreException;
555560

556561
/**
557562
* Get a list of posts for a user

src/main/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStore.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.List;
1616
import java.util.Map;
1717
import java.util.Map.Entry;
18-
import java.util.regex.Pattern;
1918

2019
import org.apache.commons.lang.StringUtils;
2120
import org.apache.log4j.Logger;
@@ -27,6 +26,7 @@
2726
import org.buddycloud.channelserver.db.NodeStore;
2827
import org.buddycloud.channelserver.db.exception.ItemNotFoundException;
2928
import org.buddycloud.channelserver.db.exception.NodeStoreException;
29+
import org.buddycloud.channelserver.pubsub.accessmodel.AccessModels;
3030
import org.buddycloud.channelserver.pubsub.affiliation.Affiliations;
3131
import org.buddycloud.channelserver.pubsub.model.GlobalItemID;
3232
import org.buddycloud.channelserver.pubsub.model.NodeAffiliation;
@@ -709,7 +709,7 @@ public NodeItem convertRow(java.sql.ResultSet rs)
709709

710710
@Override
711711
public CloseableIterator<NodeItem> getFirehose(int limit,
712-
String afterItemId, boolean isAdmin) throws NodeStoreException {
712+
String afterItemId, boolean isAdmin, String actorDomain) throws NodeStoreException {
713713

714714
PreparedStatement stmt = null;
715715
Date beforeDate = null;
@@ -726,16 +726,17 @@ public CloseableIterator<NodeItem> getFirehose(int limit,
726726
"Invalid value for parameter count: " + limit);
727727
}
728728

729-
String accessModel = "open";
730-
if (true == isAdmin)
731-
accessModel = "%";
732729
try {
733730
stmt = conn.prepareStatement(dialect.selectItemsForLocalNodesBeforeDate());
734731
stmt.setTimestamp(1, new java.sql.Timestamp(beforeDate.getTime()));
735732
stmt.setString(2, Conf.ACCESS_MODEL);
736-
stmt.setString(3, accessModel);
737-
stmt.setString(4, getLocalDomainRegex());
738-
stmt.setInt(5, limit);
733+
stmt.setBoolean(3, isAdmin);
734+
stmt.setString(4, AccessModels.open.toString());
735+
stmt.setString(5, AccessModels.local.toString());
736+
stmt.setString(6, getDomainRegex(actorDomain));
737+
stmt.setBoolean(7, isAdmin);
738+
stmt.setString(8, getLocalDomainRegex());
739+
stmt.setInt(9, limit);
739740

740741
java.sql.ResultSet rs = stmt.executeQuery();
741742

@@ -755,17 +756,19 @@ public CloseableIterator<NodeItem> getFirehose(int limit,
755756
}
756757

757758
@Override
758-
public int getFirehoseItemCount(boolean isAdmin) throws NodeStoreException {
759+
public int getFirehoseItemCount(boolean isAdmin, String actorDomain)
760+
throws NodeStoreException {
759761
PreparedStatement stmt = null;
760762

761-
String accessModel = "open";
762-
if (true == isAdmin)
763-
accessModel = "%";
764763
try {
765764
stmt = conn.prepareStatement(dialect.countItemsForLocalNodes());
766765
stmt.setString(1, Conf.ACCESS_MODEL);
767-
stmt.setString(2, accessModel);
768-
stmt.setString(3, getLocalDomainRegex());
766+
stmt.setBoolean(2, isAdmin);
767+
stmt.setString(3, AccessModels.open.toString());
768+
stmt.setString(4, AccessModels.local.toString());
769+
stmt.setString(5, getDomainRegex(actorDomain));
770+
stmt.setBoolean(6, isAdmin);
771+
stmt.setString(7, getLocalDomainRegex());
769772

770773
java.sql.ResultSet rs = stmt.executeQuery();
771774
if (!rs.next()) {
@@ -804,10 +807,14 @@ private static String getLocalDomainRegex() {
804807
}
805808

806809
String domainRegex = localDomains.isEmpty() ? ".*" :
807-
".*@(" + StringUtils.join(localDomains, "|") + ")\\/.*";
810+
getDomainRegex(StringUtils.join(localDomains, "|"));
808811
return domainRegex;
809812
}
810813

814+
private static String getDomainRegex(String localDomains) {
815+
return ".*@(" + localDomains + ")\\/.*";
816+
}
817+
811818
@Override
812819
public CloseableIterator<NodeItem> getUserFeedItems(JID user, Date since,
813820
int limit, GlobalItemID afterItemId, boolean parentOnly)

src/main/java/org/buddycloud/channelserver/db/jdbc/dialect/Sql92NodeStoreDialect.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
package org.buddycloud.channelserver.db.jdbc.dialect;
22

3-
import java.util.ArrayList;
4-
import java.util.Iterator;
5-
import java.util.LinkedList;
6-
import java.util.List;
7-
8-
import org.apache.commons.lang.StringUtils;
93
import org.buddycloud.channelserver.db.jdbc.JDBCNodeStore.NodeStoreSQLDialect;
104

115
public class Sql92NodeStoreDialect implements NodeStoreSQLDialect {
@@ -84,9 +78,6 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect {
8478

8579
private static final String DELETE_AFFILIATION = "DELETE FROM \"affiliations\" WHERE \"node\" = ? AND \"user\" = ?;";
8680

87-
private static final String SELECT_SUBSCRIPTION = "SELECT \"node\", \"user\", \"listener\", \"subscription\", \"updated\""
88-
+ " FROM \"subscriptions\" WHERE \"node\" = ? AND (\"user\" = ? OR \"listener\" = ? ) ORDER BY \"updated\" ASC";
89-
9081
private static final String SELECT_SUBSCRIPTIONS_FOR_USER = "SELECT \"node\", \"user\", \"listener\", \"subscription\", \"updated\""
9182
+ " FROM \"subscriptions\" WHERE \"user\" = ? OR \"listener\" = ? ORDER BY \"updated\" ASC";
9283

@@ -234,32 +225,42 @@ public class Sql92NodeStoreDialect implements NodeStoreSQLDialect {
234225

235226
private static final String DELETE_ITEMS = "DELETE FROM \"items\" WHERE \"node\" = ?;";
236227

237-
private static final String COUNT_ITEMS_FROM_LOCAL_NODES =
238-
"SELECT COUNT(\"id\") " +
239-
"FROM \"items\", \"node_config\" " +
240-
"WHERE \"items\".\"node\" = \"node_config\".\"node\" " +
241-
"AND \"key\" = ? AND \"value\" LIKE ? " +
242-
"AND \"items\".\"node\" ~ ? ";
243-
244228
private static final String SELECT_LOCAL_NODES =
245229
"SELECT \"node\" " +
246-
"FROM \"items\" " +
247-
"WHERE \"items\".\"node\" ~ ? ";
230+
"FROM \"nodes\" " +
231+
"WHERE \"node\" ~ ? ";
248232

249233
private static final String SELECT_REMOTE_NODES =
250234
"SELECT \"node\" " +
251-
"FROM \"items\" " +
252-
"WHERE \"items\".\"node\" !~ ? ";
235+
"FROM \"nodes\" " +
236+
"WHERE \"node\" !~ ?";
253237

254238
private static final String SELECT_ITEMS_FROM_LOCAL_NODES_BEFORE_DATE =
255239
"SELECT \"items\".\"node\", \"id\", \"items\".\"updated\", \"xml\", \"in_reply_to\", \"created\" " +
256240
"FROM \"items\", \"node_config\" " +
257241
"WHERE \"items\".\"updated\" < ? " +
258-
"AND \"items\".\"node\" = \"node_config\".\"node\" " +
259-
"AND \"key\" = ? AND \"value\" LIKE ? " +
242+
"AND \"items\".\"node\" = \"node_config\".\"node\" "+
243+
"AND \"key\" = ? " +
244+
"AND ((" +
245+
"NOT ? AND " +
246+
"(\"value\" LIKE ?) OR " +
247+
"(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " +
248+
"OR ?) " +
260249
"AND \"items\".\"node\" ~ ? " +
261250
"ORDER BY \"updated\" DESC, \"id\" ASC LIMIT ?";
262251

252+
private static final String COUNT_ITEMS_FROM_LOCAL_NODES =
253+
"SELECT COUNT(\"id\") " +
254+
"FROM \"items\", \"node_config\" " +
255+
"WHERE \"items\".\"node\" = \"node_config\".\"node\" "+
256+
"AND \"key\" = ? " +
257+
"AND ((" +
258+
"NOT ? AND " +
259+
"(\"value\" LIKE ?) OR " +
260+
"(\"value\" LIKE ? AND \"items\".\"node\" ~ ?)) " +
261+
"OR ?) " +
262+
"AND \"items\".\"node\" ~ ?";
263+
263264
private static final String SELECT_USER_ITEMS = "SELECT \"node\", \"id\", \"updated\", \"xml\", \"in_reply_to\", \"created\"" +
264265
" FROM \"items\" WHERE (CAST(xpath('//atom:author/atom:name/text()', xmlparse(document \"xml\")," +
265266
" ARRAY[ARRAY['atom', 'http://www.w3.org/2005/Atom']]) AS TEXT[]))[1] = ?";

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/namespace/pubsub/get/items/special/FirehoseGet.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,16 @@ private void addRsmElement() throws NodeStoreException {
108108
rsm.addElement("first").setText(firstItemId);
109109
rsm.addElement("last").setText(lastItemId);
110110
rsm.addElement("count").setText(
111-
String.valueOf(channelManager.getFirehoseItemCount(isAdmin)));
111+
String.valueOf(channelManager.getFirehoseItemCount(
112+
isAdmin, actor.getDomain())));
112113
}
113114

114115
private void addItems() throws NodeStoreException {
115116
if (-1 == maxResults) {
116117
maxResults = DEFAULT_MAX_RESULTS;
117118
}
118-
CloseableIterator<NodeItem> items = channelManager.getFirehose(maxResults, afterItemId, isAdmin);
119+
CloseableIterator<NodeItem> items = channelManager.getFirehose(
120+
maxResults, afterItemId, isAdmin, actor.getDomain());
119121
String lastNode = "";
120122
Element itemsElement = null;
121123
while (items.hasNext()) {

src/test/java/org/buddycloud/channelserver/db/jdbc/DatabaseTester.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@
1818
import java.util.Map;
1919
import java.util.Map.Entry;
2020

21-
import org.apache.log4j.Logger;
2221
import org.mockito.Mockito;
2322
import org.mockito.invocation.InvocationOnMock;
2423
import org.mockito.stubbing.Answer;
2524

2625
public class DatabaseTester {
27-
private static Logger log = Logger.getLogger(DatabaseTester.class);
2826

2927
public class Assertions {
3028
private DatabaseTester tester;
@@ -114,8 +112,8 @@ public Connection getConnection() throws SQLException {
114112
public PreparedStatement answer(InvocationOnMock invocation)
115113
throws Throwable {
116114
String originalSQL = (String) invocation.getArguments()[0];
117-
String replacedSQL = originalSQL.replaceFirst("(\\S+) ~ \\?", "regexp_matches($1, ?)");
118-
replacedSQL = replacedSQL.replaceFirst("(\\S+) !~ \\?", "not regexp_matches($1, ?)");
115+
String replacedSQL = originalSQL.replaceAll("(\\S+) ~ \\?", "regexp_matches($1, ?)");
116+
replacedSQL = replacedSQL.replaceAll("(\\S+) !~ \\?", "regexp_matches($1, ?) = FALSE");
119117
return originalConn.prepareStatement(replacedSQL);
120118
}
121119
}).when(conn).prepareStatement(Mockito.anyString());

src/test/java/org/buddycloud/channelserver/db/jdbc/JDBCNodeStoreAbstract.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Map;
1010
import java.util.Map.Entry;
1111

12-
import org.apache.bcel.generic.NEW;
1312
import org.buddycloud.channelserver.db.jdbc.dialect.Sql92NodeStoreDialect;
1413
import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler;
1514
import org.buddycloud.channelserver.pubsub.model.NodeItem;

0 commit comments

Comments
 (0)