From 5169c935bf994e28d31f35d7bc2af84af5b48bd4 Mon Sep 17 00:00:00 2001 From: Vladimir Eliezer Tokarev Date: Sat, 27 Feb 2016 03:00:14 -0800 Subject: [PATCH] Changed the usage of timestamp to miliseconds and removed the aqurate timestamp --- bulletin-board-server/meerkat | Bin 106496 -> 169984 bytes .../main/proto/meerkat/VoterRegistry.proto | 5 +++ .../meerkat/Registry/AccurateTimestamp.java | 35 ------------------ .../Registry/CollectionMessagesUtils.java | 15 +++++--- .../java/meerkat/Registry/RegistryTags.java | 12 +++--- .../Registry/RelevantDataCallBack.java | 4 +- .../src/main/java/meerkat/SimpleRegistry.java | 21 ++++++++--- .../java/meerkat/VoterRegistryMessage.java | 30 +++++---------- .../src/test/java/SimpleRegistryTest.java | 9 ++--- 9 files changed, 52 insertions(+), 79 deletions(-) delete mode 100644 voter-registry/src/main/java/meerkat/Registry/AccurateTimestamp.java diff --git a/bulletin-board-server/meerkat b/bulletin-board-server/meerkat index 162a2ec263ead26f8d7cf1e68e540b42d0543e91..46153c6d3581fe83d79e36439e604adaa177c801 100644 GIT binary patch delta 49570 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 RvUKaKTr@vnFwJ_5{{f0g>i+-$ delta 3185 zcmZ8j3s}@u7Qg45|2!Cm00RXPm>C!t)C2{LM0u2JI*MgknV}$9rkH?f^|=*dBCe8( z*Sz|fso(nTwhE?bswPX&XN*)m}NvoD5?XeEe*w_S;m8KbyJZhk1-S{XS zqYacyxm1BR8Y~XsLQj-=Aj*yNWyk32OgraH?Mypi^$ivxmgeFc8O< zX4URbIyoxg^3%LmAJx(VPK~t!`GCI*a+Iyo*AG`4jXo_*wiP(72A&g0>sg8k(rS(J zbWbTKxjyjOftVwL#5NNfM$$eSia+Cnuz*%TU$G4ea3oxS&&UaZ;v)V{oTWrMEhfVi z7)|^2z3%ixUmQl$>;sm?@UU+AYkC;^9=7mSIg5vYcB0tbp#wIK?VJL4XKxLV*$VPYfC zdCEJdwE!GONW;A%PVIdF9I`AZPNTQDw>$4^Pd7x8Im0tt~BRtA8 zt-Lr|=DPj5_U+ZXZ(6#ZUX3oX6wlFZx=vTFu!4IT z-rn=#CJd9!5k1U-RIeZQGGmZ$Icq-2`sgP@h${5a@m}y%&{;Y~&7Lq@E6V@a4f57X zr##HUq@x1=Ik+MuPfl;>RCdha4?SB|4*7P&v==W^UT^<;-M9v%Ql()yaWl>(S z%=dT7pYok@-8i@GTCgNak2qY66QWi$agg008(xC>un~?xo2XP#RS>3$anvIF~zYAU2Zvlm(%CUbN{u;L0@c@ zb^cDZTLZVWSrSyO0S5WZ?|x~6N9x9F{k6{QgtAt_Lw@%H=3qHTvSzhYX00ifpW2*q z88_~GvevA?y0w~Fdr-V1q@^ZaCf2;>d9CIJs@tfU(?Z3Eg8z?!5mI41Ncb0A#c0gI zKjS~}7+%6Q3Zrx?qcW{mp@($ zD&Q={sJEjrN^{TA0UXm9sDK)1f;M!Z8>ixO z{0uKqFg-%!XfAE!XbSGdc9K4!Q!0BOe5l3I2$0*Pqw)K@&>7^FU{|AiA8ZAWb{K<( zdW1MC+QA8fp$HbhCO8Z?F&z729?rtG_yvA1JY;2-dWxpgGJRKWC+QSp=)S-B--ttQ zyr9XfI}z&5v0z3>m1FL9QT}BZBirvjp{x;jjT6X}wLTpp5kge@+jv~{EyJ&5WU!;| zqGl}{4rT#n=)}N`dOoO+e5~^VZtc4BmG2ibV2JLCM1V6(aG-42Y z9)l0z!&>K`v^XWag`dUaAs-tbRiw-be&eD%`(-*j(eEWKir`z>&7;=v=uEUUf+6{2m z{bJP8b_f^-#jqGQgO18JjAYLWumV5CJ@}*80SOeuCqF~4({g?byxA4GbgDW#(%|ss zsk%_lQ;IrP3faEQRn62#MyqA7LU%R2lwo;rDvK{l;G@Rnr4S10+El1f|9%w)Yz9qB z(hCfZa2*W9iJS)y9`AssXwu7`s-X?C#Z8@PmH-}Sev?4KC5)s;L{uWMT?VUWt^S5;Llz%8msU)rz`6VxKz8mq4_;-w8{&|E%u zBH>Y(096dPqi`E-q6zp4Zi@h)nvvDXs!xix|*W8;p2N!bX{S|Al0e9e+ zcnDA8d2D5NAqt=_WM?#`PzHxEf?l8(yBetWq|T(W z?*~&Lr?D&*%F*J*QZe*|rK-zxh-^sX+teQ9t749c54`V*5E(wsRP)~DnCA_EQ;?-| zs4D0W#f@15z=RE1y!i1@v0aD@Vmk!F!;lAapq9)14wuaTlgVGaCk zM!_m+pS-v+?RnVS+0_Zs1r)+O#zHd+jK|?P9arM#kd8l4C#JT1AGPWG1cGAfvdXpX zF8M}qglxVLuWs1UB{S|sdI?9azw@JKM|&tt(Jyx(j1(}ES#tuE!VH+r{H9_+P523Zj{CTJzQxOU zg9KS9grdkry(wLlYz9Xer*tF?fn>;F?v7*zGl@H*MOa9BP0 zI&?G4gy-O3W5#q~48H-I)e#7X#QhY(N%_MY28Z;7#6%fGYB0)tR=1~?kc@-@AAK@p21^@s6 diff --git a/meerkat-common/src/main/proto/meerkat/VoterRegistry.proto b/meerkat-common/src/main/proto/meerkat/VoterRegistry.proto index e3f163f..abfea1c 100644 --- a/meerkat-common/src/main/proto/meerkat/VoterRegistry.proto +++ b/meerkat-common/src/main/proto/meerkat/VoterRegistry.proto @@ -20,4 +20,9 @@ message GroupID{ message VoterGroup{ VoterID voterId = 1; GroupID groupId = 2; +} + +message VoterRegistryMessage{ + bytes data = 1; + uint64 CreationMiliseconds = 2; } \ No newline at end of file diff --git a/voter-registry/src/main/java/meerkat/Registry/AccurateTimestamp.java b/voter-registry/src/main/java/meerkat/Registry/AccurateTimestamp.java deleted file mode 100644 index dd67a22..0000000 --- a/voter-registry/src/main/java/meerkat/Registry/AccurateTimestamp.java +++ /dev/null @@ -1,35 +0,0 @@ -package meerkat.Registry; - -import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * Created by Vladimir Eliezer Tokarev on 1/15/2016. - * converts time stamps to strings and the other way - */ -public abstract class AccurateTimestamp { - - private static final String DATE_FORMAT = "yyyy-MM-dd hh:mm:ss.SSS"; - - /** - * Converts current timestamp to string - * @return - */ - public static String GetCurrentTimestampString(){ - return new SimpleDateFormat(DATE_FORMAT).format(new java.util.Date()); - } - - /** - * Convets string timesta,p tp java.sql.timestamp - * @param timestamp string - * @return - * @throws ParseException - */ - public static java.sql.Timestamp GetTimestampFromString(String timestamp) throws ParseException { - Date date = new SimpleDateFormat(DATE_FORMAT).parse(timestamp); - return new Timestamp(date.getTime()); - } - -} diff --git a/voter-registry/src/main/java/meerkat/Registry/CollectionMessagesUtils.java b/voter-registry/src/main/java/meerkat/Registry/CollectionMessagesUtils.java index 03d542c..c44f009 100644 --- a/voter-registry/src/main/java/meerkat/Registry/CollectionMessagesUtils.java +++ b/voter-registry/src/main/java/meerkat/Registry/CollectionMessagesUtils.java @@ -1,5 +1,6 @@ package meerkat.Registry; +import com.google.protobuf.InvalidProtocolBufferException; import meerkat.VoterRegistryMessage; import meerkat.protobuf.BulletinBoardAPI.BulletinBoardMessage; import meerkat.protobuf.BulletinBoardAPI.FilterType; @@ -45,7 +46,8 @@ public abstract class CollectionMessagesUtils { * @return Map{String:VoterRegistryMessage} * @throws ParseException */ - public static Map GetLatestGroupsActions(List messages) throws ParseException { + public static Map GetLatestGroupsActions(List messages) + throws ParseException, InvalidProtocolBufferException { Map groupIdToMessage = new HashMap<>(); // iterate trough all the messages and put into the map the last updated groups actions @@ -55,7 +57,7 @@ public abstract class CollectionMessagesUtils { VoterRegistryMessage temp = groupIdToMessage.get(groupId); if (temp != null && temp != message) { - if (temp.GetBasicMessageActionTimestamp().before(message.GetBasicMessageActionTimestamp())) { + if (temp.GetCreationTime() < message.GetCreationTime()) { groupIdToMessage.put(groupId, message); } } @@ -75,7 +77,7 @@ public abstract class CollectionMessagesUtils { while (entries.hasNext()) { Map.Entry tuple = (Map.Entry) entries.next(); VoterRegistryMessage message = (VoterRegistryMessage) tuple.getValue(); - String groupId = message.GetWantedTagFromBasicMessage(RegistryTags.GROUP_ID_TAG.toString()); + String groupId = message.GetWantedTagFromBasicMessage(RegistryTags.GROUP_ID_TAG); groupsIds.add(groupId); } return groupsIds; @@ -88,15 +90,16 @@ public abstract class CollectionMessagesUtils { * @throws ParseException * @throws EmptyListException */ - public static VoterRegistryMessage GetLatestMessage(List messages) throws ParseException, EmptyListException { + public static VoterRegistryMessage GetLatestMessage(List messages) + throws ParseException, EmptyListException, InvalidProtocolBufferException { + System.out.print("1"); if (messages.size() == 0 ){ throw new EmptyListException("The list of messages passed to GetLatestMessage is empty."); } VoterRegistryMessage LatestMessage = messages.get(0); - for (int i = 0 ; i < messages.size() ; i++) { VoterRegistryMessage message = messages.get(i); - if (message.GetBasicMessageActionTimestamp().before(LatestMessage.GetBasicMessageActionTimestamp())) { + if (message.GetCreationTime() < LatestMessage.GetCreationTime()) { LatestMessage = message; } } diff --git a/voter-registry/src/main/java/meerkat/Registry/RegistryTags.java b/voter-registry/src/main/java/meerkat/Registry/RegistryTags.java index 3f4d36a..8113af6 100644 --- a/voter-registry/src/main/java/meerkat/Registry/RegistryTags.java +++ b/voter-registry/src/main/java/meerkat/Registry/RegistryTags.java @@ -6,12 +6,12 @@ package meerkat.Registry; * Have the tags for the registry messages */ public abstract class RegistryTags { - public final static String ID_TAG = "ID:"; - public final static String VOTER_ENTRY_TAG = "VoterEntry:"; - public final static String GROUP_ID_TAG = "GroupID:"; - public final static String ADD_TO_GROUP_TAG = "AddToGroup:"; - public final static String ACTION_TIMESTAMP_TAG = "ActionTimestamp: "; - public final static String VOTE_ACTION_TAG = "VoteAction:"; + public final static String ID_TAG = "ID: "; + public final static String VOTER_ENTRY_TAG = "VoterEntry: "; + public final static String VOTER_DATA_TAG = "Data: "; + public final static String GROUP_ID_TAG = "GroupID: "; + public final static String ADD_TO_GROUP_TAG = "AddToGroup: "; + public final static String VOTE_ACTION_TAG = "VoteAction: "; } diff --git a/voter-registry/src/main/java/meerkat/Registry/RelevantDataCallBack.java b/voter-registry/src/main/java/meerkat/Registry/RelevantDataCallBack.java index 8339e62..9eabb1b 100644 --- a/voter-registry/src/main/java/meerkat/Registry/RelevantDataCallBack.java +++ b/voter-registry/src/main/java/meerkat/Registry/RelevantDataCallBack.java @@ -1,5 +1,6 @@ package meerkat.Registry; +import com.google.protobuf.InvalidProtocolBufferException; import meerkat.MessageValidator; import meerkat.VoterRegistry.RegistryCallBack; import meerkat.VoterRegistryMessage; @@ -88,7 +89,8 @@ public class RelevantDataCallBack implements ClientCallback tags = base.getTagList(); - for (int i = 0 ; i < tags.size() ; i++) { - String tag = tags.get(i); - if (tag.contains(RegistryTags.ACTION_TIMESTAMP_TAG)) { - String[] tagParts = tag.split(" "); - - String timestamp = tagParts[tagParts.length - 2] + " " + tagParts[tagParts.length - 1]; - return AccurateTimestamp.GetTimestampFromString(timestamp); - } + public long GetCreationTime() throws InvalidProtocolBufferException { + try { + VoterRegistry.VoterRegistryMessage wrapper = VoterRegistry.VoterRegistryMessage.parseFrom(base.getData()); + return wrapper.getCreationMiliseconds(); + } catch (InvalidProtocolBufferException e) { + throw e; } - return null; - } } diff --git a/voter-registry/src/test/java/SimpleRegistryTest.java b/voter-registry/src/test/java/SimpleRegistryTest.java index 80d7500..69c3dc2 100644 --- a/voter-registry/src/test/java/SimpleRegistryTest.java +++ b/voter-registry/src/test/java/SimpleRegistryTest.java @@ -76,6 +76,7 @@ public class SimpleRegistryTest extends TestCase { @Override public void handleFailure(Throwable t){ + System.out.println(t); messages = null; jobSemaphore.release(); } @@ -88,7 +89,7 @@ public class SimpleRegistryTest extends TestCase { private void CommunicatorSetup() { bulletinBoardClient = new ThreadedBulletinBoardClient(); - String BULLETIN_BOARD_SERVER_ADDRESS = "http://localhost:8081"; + String BULLETIN_BOARD_SERVER_ADDRESS = "http://localhost:8081/"; bulletinBoardClient.init(Voting.BulletinBoardClientParams.newBuilder() .addBulletinBoardAddress(BULLETIN_BOARD_SERVER_ADDRESS) .setMinRedundancy((float) 1.0) @@ -169,8 +170,7 @@ public class SimpleRegistryTest extends TestCase { String id = new BigInteger(130, random).toString(32); String data = new BigInteger(130, random).toString(32); - VoterInfo voterInfo = VoterInfo.newBuilder(). - setId(VoterID.newBuilder().setId(id)).setInfo(data).build(); + VoterInfo voterInfo = VoterInfo.newBuilder().setId(VoterID.newBuilder().setId(id)).setInfo(data).build(); SimpleRegistry registry = new SimpleRegistry(signer, bulletinBoardClient, certStream); registry.AddVoter(voterInfo, handler); @@ -301,11 +301,10 @@ public class SimpleRegistryTest extends TestCase { DummyRegistryCallBackHandler personalHandler = new DummyRegistryCallBackHandler<>(); registry.GetPersonIDDetails(VoterID.newBuilder().setId(id).build(), personalHandler); - jobSemaphore.acquire(1); assertEquals(RegistryTags.ID_TAG + id, personalHandler.data.GetWantedTagFromBasicMessage(RegistryTags.ID_TAG)); - assertEquals(data,personalHandler.data.base.getData().toStringUtf8()); + assertTrue(personalHandler.data.GetWantedTagFromBasicMessage(RegistryTags.VOTER_DATA_TAG).contains(data)); } }