From f10f4902cd4b9d7b472e7c174be3feef879a650e Mon Sep 17 00:00:00 2001 From: descale Date: Mon, 8 May 2017 20:51:24 +0200 Subject: [PATCH 1/4] Fix typos in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0dc1e5..c426ccb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Atkie +Aktie ===== -**Atkie** is an anonymous file sharing and distributed forums system. +**Aktie** is an anonymous file sharing and distributed forums system. From 09931cbe443e4fd6345bfeacac6d9e70c0ecac7b Mon Sep 17 00:00:00 2001 From: descale Date: Mon, 8 May 2017 22:06:09 +0200 Subject: [PATCH 2/4] Add queries for retrieving members and subscribers of a community. Add methods with two-stage queries to Index for retrieving all members and all subscribers of a community. --- src/aktie/index/Index.java | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/aktie/index/Index.java b/src/aktie/index/Index.java index 49a5af8..7e12c04 100644 --- a/src/aktie/index/Index.java +++ b/src/aktie/index/Index.java @@ -779,6 +779,43 @@ public CObjList getMemberships ( String comid, Sort s ) return search ( builder.build(), Integer.MAX_VALUE, s ); } + + /** + * Queries all members of a community. Retrieves member identities as + * {@code CObj} from {@code Index}. + * + * @param communityID + * The ID of the community. + * @param sort + * Lucene {@code Sort} specifying the sort order of the result + * list or {@code null} if no sorting is desired. + * @return A {@code CObjList} referencing the queried members. + */ + public CObjList getMembers(String communityID, Sort sort) { + CObjList memberships = getMemberships(communityID, null); + + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + + Term typeTerm = new Term(CObj.PARAM_TYPE, CObj.IDENTITY); + builder.add(new TermQuery(typeTerm), BooleanClause.Occur.MUST); + + BooleanQuery.Builder idQuery = new BooleanQuery.Builder(); + + for (int i = 0; i < memberships.size(); i++) { + CObj membership; + try { + membership = memberships.get(i); + } catch (IOException e) { + continue; + } + String id = membership.getPrivate(CObj.MEMBERID); + Term idTerm = new Term(CObj.PARAM_ID, id); + idQuery.add(new TermQuery(idTerm), BooleanClause.Occur.SHOULD); + } + builder.add(idQuery.build(), BooleanClause.Occur.MUST); + memberships.close(); + return search(builder.build(), Integer.MAX_VALUE, sort); + } public CObjList getMyMemberships ( Sort s ) { @@ -1439,6 +1476,43 @@ public CObjList getSubscriptions ( String comid, Sort s ) return search ( builder.build(), Integer.MAX_VALUE, s ); } + + /** + * Queries all subscribers of a community. Retrieves subscriber identities + * as {@code CObj} from {@code Index}. + * + * @param communityID + * The ID of the community. + * @param sort + * Lucene {@code Sort} specifying the sort order of the result + * list or {@code null} if no sorting is desired. + * @return A {@code CObjList} referencing the queried subscribers. + */ + public CObjList getSubscribers(String communityID, Sort sort) { + CObjList subscriptions = getSubscriptions(communityID, null); + + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + + Term typeTerm = new Term(CObj.PARAM_TYPE, CObj.IDENTITY); + builder.add(new TermQuery(typeTerm), BooleanClause.Occur.MUST); + + BooleanQuery.Builder idQuery = new BooleanQuery.Builder(); + + for (int i = 0; i < subscriptions.size(); i++) { + CObj subscription; + try { + subscription = subscriptions.get(i); + } catch (IOException e) { + continue; + } + String id = subscription.getString(CObj.CREATOR); + Term idTerm = new Term(CObj.PARAM_ID, id); + idQuery.add(new TermQuery(idTerm), BooleanClause.Occur.SHOULD); + } + builder.add(idQuery.build(), BooleanClause.Occur.MUST); + subscriptions.close(); + return search(builder.build(), Integer.MAX_VALUE, sort); + } public CObjList getSubsUnsubs ( String comid ) { From 2e205120661efb93f45b8f13e0c942a5ad899da7 Mon Sep 17 00:00:00 2001 From: descale Date: Tue, 9 May 2017 20:48:36 +0200 Subject: [PATCH 3/4] Remove identity name caching from aktie.gui and integrate into aktie.index.Index instead. --- src/aktie/gui/AddFieldDialog.java | 2 +- src/aktie/gui/AddFieldInterface.java | 2 - src/aktie/gui/AdvancedSearchDialog.java | 6 --- src/aktie/gui/ConnectionDialog.java | 4 +- src/aktie/gui/IdentityCache.java | 54 ------------------- src/aktie/gui/NewPostDialog.java | 6 --- src/aktie/gui/PostsTable.java | 2 +- src/aktie/gui/SWTApp.java | 8 --- src/aktie/gui/pm/PMTable.java | 4 +- src/aktie/gui/pm/PrivateMessageDialog.java | 4 +- src/aktie/gui/subtree/SubTreeModel.java | 7 +-- ...ableCellLabelProviderTypeIdentityName.java | 10 ++-- src/aktie/index/Index.java | 45 ++++++++++++++++ 13 files changed, 60 insertions(+), 94 deletions(-) delete mode 100644 src/aktie/gui/IdentityCache.java diff --git a/src/aktie/gui/AddFieldDialog.java b/src/aktie/gui/AddFieldDialog.java index 4954877..d05b3ea 100644 --- a/src/aktie/gui/AddFieldDialog.java +++ b/src/aktie/gui/AddFieldDialog.java @@ -193,7 +193,7 @@ public AddFieldTable ( Composite composite, AddFieldInterface fv ) column.setMoveable ( false ); column.setSortable ( false ); - column = addColumn ( "Creator", 100, new CObjListTableCellLabelProviderTypeIdentityName ( CObj.CREATOR, true, null, fieldAdder.getIdCache() ) ); + column = addColumn ( "Creator", 100, new CObjListTableCellLabelProviderTypeIdentityName ( CObj.CREATOR, true, null, fieldAdder.getIndex() ) ); column.setMoveable ( false ); } diff --git a/src/aktie/gui/AddFieldInterface.java b/src/aktie/gui/AddFieldInterface.java index ab147f3..94ae1e4 100644 --- a/src/aktie/gui/AddFieldInterface.java +++ b/src/aktie/gui/AddFieldInterface.java @@ -12,8 +12,6 @@ public interface AddFieldInterface public CObj getCommunity(); - public IdentityCache getIdCache(); - public TableViewer getTableViewer(); } diff --git a/src/aktie/gui/AdvancedSearchDialog.java b/src/aktie/gui/AdvancedSearchDialog.java index 8a0507f..c10c3d1 100644 --- a/src/aktie/gui/AdvancedSearchDialog.java +++ b/src/aktie/gui/AdvancedSearchDialog.java @@ -1080,12 +1080,6 @@ public CObj getCommunity() return community; } - @Override - public IdentityCache getIdCache() - { - return app.getIdCache(); - } - @Override public TableViewer getTableViewer() { diff --git a/src/aktie/gui/ConnectionDialog.java b/src/aktie/gui/ConnectionDialog.java index 9a15ca6..9a92017 100644 --- a/src/aktie/gui/ConnectionDialog.java +++ b/src/aktie/gui/ConnectionDialog.java @@ -122,14 +122,14 @@ private void setFromTo ( String fromid, String toid ) if ( fromId != null && toId != null && lblFrom != null && !lblFrom.isDisposed() && lblTo != null && !lblTo.isDisposed() ) { - String ln = app.getIdCache().getName ( fromId ); + String ln = app.getNode().getIndex().getDisplayNameForIdentity ( fromId ); if ( ln != null ) { lblFrom.setText ( ln ); } - String rm = app.getIdCache().getName ( toId ); + String rm = app.getNode().getIndex().getDisplayNameForIdentity ( toId ); if ( rm != null ) { diff --git a/src/aktie/gui/IdentityCache.java b/src/aktie/gui/IdentityCache.java deleted file mode 100644 index f4b96b0..0000000 --- a/src/aktie/gui/IdentityCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package aktie.gui; - -import java.util.HashMap; -import java.util.Map; - -import aktie.data.CObj; -import aktie.index.Index; - -public class IdentityCache -{ - - private Index index; - private Map nameMap; - - public IdentityCache ( Index i ) - { - index = i; - nameMap = new HashMap(); - } - - public String getName ( String id ) - { - String nm = null; - - synchronized ( nameMap ) - { - nm = nameMap.get ( id ); - } - - if ( nm == null ) - { - CObj idnt = index.getIdentity ( id ); - - if ( idnt != null ) - { - nm = idnt.getDisplayName(); - - if ( nm != null ) - { - synchronized ( nameMap ) - { - nameMap.put ( id, nm ); - } - - } - - } - - } - - return nm; - } - -} diff --git a/src/aktie/gui/NewPostDialog.java b/src/aktie/gui/NewPostDialog.java index 8f8e3fd..8814162 100644 --- a/src/aktie/gui/NewPostDialog.java +++ b/src/aktie/gui/NewPostDialog.java @@ -1003,12 +1003,6 @@ public Index getIndex() return app.getNode().getIndex(); } - @Override - public IdentityCache getIdCache() - { - return app.getIdCache(); - } - @Override public TableViewer getTableViewer() { diff --git a/src/aktie/gui/PostsTable.java b/src/aktie/gui/PostsTable.java index 997c999..a97ba8f 100644 --- a/src/aktie/gui/PostsTable.java +++ b/src/aktie/gui/PostsTable.java @@ -275,7 +275,7 @@ private String getPostString ( CObj pst ) dsc.replace ( "\r", "" ); String fldline = String.format ( "%15s:%-20s | %20s | %s", nm, vs, - app.getIdCache().getName ( pst.getString ( CObj.CREATOR ) ), + app.getNode().getIndex().getDisplayNameForIdentity ( pst.getString ( CObj.CREATOR ) ), dsc ); fldline = fldline.substring ( 0, Math.min ( fldline.length(), 79 ) ); msg.append ( fldline ); diff --git a/src/aktie/gui/SWTApp.java b/src/aktie/gui/SWTApp.java index 43f71db..337660f 100644 --- a/src/aktie/gui/SWTApp.java +++ b/src/aktie/gui/SWTApp.java @@ -1374,12 +1374,6 @@ private Properties getI2PReady() return i2pDialog.getI2PProps(); } - private IdentityCache idCache; - public IdentityCache getIdCache() - { - return idCache; - } - private void startNodeThread ( final Properties p ) { Thread t = new Thread ( new Runnable() @@ -1408,8 +1402,6 @@ public void run() updateAfterNodeStart(); - idCache = new IdentityCache ( node.getIndex() ); - node.getShareManager().setShareListener ( new ShareListener() { diff --git a/src/aktie/gui/pm/PMTable.java b/src/aktie/gui/pm/PMTable.java index 8f12703..021a459 100644 --- a/src/aktie/gui/pm/PMTable.java +++ b/src/aktie/gui/pm/PMTable.java @@ -102,10 +102,10 @@ public void selectionChanged ( SelectionChangedEvent s ) { StringBuilder sb = new StringBuilder(); sb.append ( "FROM: " ); - sb.append ( PMTable.this.tab.getSWTApp().getIdCache().getName ( pfrom ) ); + sb.append ( PMTable.this.tab.getSWTApp().getNode().getIndex().getDisplayNameForIdentity ( pfrom ) ); sb.append ( "\n" ); sb.append ( "TO: " ); - sb.append ( PMTable.this.tab.getSWTApp().getIdCache().getName ( pto ) ); + sb.append ( PMTable.this.tab.getSWTApp().getNode().getIndex().getDisplayNameForIdentity ( pto ) ); sb.append ( "\n" ); sb.append ( "DATE: " ); Long co = currentMessage.getPrivateNumber ( CObj.CREATEDON ); diff --git a/src/aktie/gui/pm/PrivateMessageDialog.java b/src/aktie/gui/pm/PrivateMessageDialog.java index e17827b..42277eb 100644 --- a/src/aktie/gui/pm/PrivateMessageDialog.java +++ b/src/aktie/gui/pm/PrivateMessageDialog.java @@ -104,8 +104,8 @@ public void updateToFrom ( String from, String to, CObj replytomsg ) lblMsgTo != null && !lblMsgTo.isDisposed() && SubjectText != null && !SubjectText.isDisposed() ) { - lblFrm.setText ( app.getIdCache().getName ( fromIdent ) ); - lblMsgTo.setText ( app.getIdCache().getName ( toIdent ) ); + lblFrm.setText ( app.getNode().getIndex().getDisplayNameForIdentity ( fromIdent ) ); + lblMsgTo.setText ( app.getNode().getIndex().getDisplayNameForIdentity ( toIdent ) ); if ( replyToMessage != null ) { diff --git a/src/aktie/gui/subtree/SubTreeModel.java b/src/aktie/gui/subtree/SubTreeModel.java index c4f7b10..3e21a08 100644 --- a/src/aktie/gui/subtree/SubTreeModel.java +++ b/src/aktie/gui/subtree/SubTreeModel.java @@ -17,7 +17,6 @@ import org.eclipse.jface.viewers.ViewerDropAdapter; import aktie.data.CObj; -import aktie.gui.IdentityCache; import aktie.index.CObjList; import aktie.index.Index; @@ -35,7 +34,6 @@ public class SubTreeModel implements ITreeContentProvider private Map idMap; private SubTreeEntityDBInterface db; private Index index; - private IdentityCache cache; private int type; private int treeId; @@ -52,7 +50,6 @@ public SubTreeModel ( Index idx, SubTreeEntityDBInterface d, int t, int tid ) parents = new HashMap(); fullObj = new HashMap(); idMap = new HashMap(); - cache = new IdentityCache ( idx ); } private synchronized void removeFromChildren ( SubTreeEntity se ) @@ -378,7 +375,7 @@ public synchronized void update ( CObj c ) if ( privname == null ) { - privname = cache.getName ( rid ); + privname = index.getDisplayNameForIdentity ( rid ); if ( privname != null ) { @@ -404,7 +401,7 @@ public synchronized void update ( CObj c ) if ( mcreator != null ) { - String cname = cache.getName ( mcreator ); + String cname = index.getDisplayNameForIdentity ( mcreator ); msg.pushPrivate ( CObj.NAME, cname ); index.index ( msg ); } diff --git a/src/aktie/gui/table/CObjListTableCellLabelProviderTypeIdentityName.java b/src/aktie/gui/table/CObjListTableCellLabelProviderTypeIdentityName.java index c4290f0..e72e592 100644 --- a/src/aktie/gui/table/CObjListTableCellLabelProviderTypeIdentityName.java +++ b/src/aktie/gui/table/CObjListTableCellLabelProviderTypeIdentityName.java @@ -4,18 +4,18 @@ import aktie.data.CObj; import aktie.gui.CObjListGetter; -import aktie.gui.IdentityCache; +import aktie.index.Index; public class CObjListTableCellLabelProviderTypeIdentityName extends CObjListTableCellLabelProvider { - private IdentityCache identityCache; + private Index index; - public CObjListTableCellLabelProviderTypeIdentityName ( String key, boolean privateAttribute, String highlightKey, IdentityCache idCache ) + public CObjListTableCellLabelProviderTypeIdentityName ( String key, boolean privateAttribute, String highlightKey, Index index ) { super ( key, privateAttribute, SortField.Type.STRING, highlightKey ); - identityCache = idCache; + this.index = index; } @Override @@ -32,7 +32,7 @@ public String getFormattedAttribute ( CObj co ) else { - id = identityCache.getName ( id ); + id = index.getDisplayNameForIdentity ( id ); } return id; diff --git a/src/aktie/index/Index.java b/src/aktie/index/Index.java index 7e12c04..5866ad9 100644 --- a/src/aktie/index/Index.java +++ b/src/aktie/index/Index.java @@ -3,9 +3,11 @@ import java.io.File; import java.io.IOException; import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -38,11 +40,19 @@ public class Index implements Runnable private Analyzer analyzer; private IndexWriter writer; //private AktieSearcher searcher; + + /** + * Lookup cache for identity names. + */ + private Map idToIdentityNameMap; + + private File indexdir; public Index() { + idToIdentityNameMap = new HashMap(); } public static List list ( CObjList cl ) @@ -527,6 +537,41 @@ public CObjList getIdentities() return search ( builder.build(), Integer.MAX_VALUE ); } + + /** + * Get the display name for an identity. + * Queried names are cached to speed up further lookups. + * + * @param identityID + * The ID of the identity. + * @return The display name of the identity. + */ + public String getDisplayNameForIdentity(String identityID) { + String name = null; + + synchronized (idToIdentityNameMap) { + name = idToIdentityNameMap.get(identityID); + } + + if (name == null) { + CObj identity = getIdentity(identityID); + + if (identity != null) { + name = identity.getDisplayName(); + + if (name != null) { + synchronized (idToIdentityNameMap) { + idToIdentityNameMap.put(identityID, name); + } + + } + + } + + } + + return name; + } public CObjList getZeroIdentities() { From b9488c471472d576a53c712e389559c9e487f59e Mon Sep 17 00:00:00 2001 From: descale Date: Tue, 16 May 2017 22:02:44 +0200 Subject: [PATCH 4/4] Add e.printStackTrace() to method getMembers() in aktie.index.Index. --- src/aktie/index/Index.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aktie/index/Index.java b/src/aktie/index/Index.java index 5866ad9..c094681 100644 --- a/src/aktie/index/Index.java +++ b/src/aktie/index/Index.java @@ -851,6 +851,7 @@ public CObjList getMembers(String communityID, Sort sort) { try { membership = memberships.get(i); } catch (IOException e) { + e.printStackTrace(); continue; } String id = membership.getPrivate(CObj.MEMBERID);