-
- public <T extends Object> Object toSerializable() {
- return toSerializable(RaftVersions.CURRENT_VERSION);
- }
-
- public <T extends Object> Object toSerializable(short version) {
- if(version < RaftVersions.LITHIUM_VERSION) {
- return toLegacySerializable();
- } else {
- return this;
- }
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private <T> Object toLegacySerializable() {
- AppendEntriesMessages.AppendEntries.Builder to = AppendEntriesMessages.AppendEntries.newBuilder();
- to.setTerm(this.getTerm())
- .setLeaderId(this.getLeaderId())
- .setPrevLogTerm(this.getPrevLogTerm())
- .setPrevLogIndex(this.getPrevLogIndex())
- .setLeaderCommit(this.getLeaderCommit());
-
- for (ReplicatedLogEntry logEntry : this.getEntries()) {
-
- AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Builder arBuilder =
- AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.newBuilder();
-
- AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload.Builder arpBuilder =
- AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload.newBuilder();
-
- //get the client specific payload extensions and add them to the payload builder
- Map<GeneratedMessage.GeneratedExtension, T> map = logEntry.getData().encode();
- Iterator<Map.Entry<GeneratedMessage.GeneratedExtension, T>> iter = map.entrySet().iterator();
-
- while (iter.hasNext()) {
- Map.Entry<GeneratedMessage.GeneratedExtension, T> entry = iter.next();
- arpBuilder.setExtension(entry.getKey(), entry.getValue());
- }
-
- arpBuilder.setClientPayloadClassName(logEntry.getData().getClientPayloadClassName());
-
- arBuilder.setData(arpBuilder).setIndex(logEntry.getIndex()).setTerm(logEntry.getTerm());
- to.addLogEntries(arBuilder);
- }
-
- return to.build();
- }
-
- public static AppendEntries fromSerializable(Object serialized) {
- if(serialized instanceof AppendEntries) {
- return (AppendEntries)serialized;
- }
- else {
- return fromLegacySerializable((AppendEntriesMessages.AppendEntries) serialized);
- }
- }
-
- private static AppendEntries fromLegacySerializable(AppendEntriesMessages.AppendEntries from) {
- List<ReplicatedLogEntry> logEntryList = new ArrayList<>();
- for (AppendEntriesMessages.AppendEntries.ReplicatedLogEntry leProtoBuff : from.getLogEntriesList()) {
-
- Payload payload = null ;
- try {
- if(leProtoBuff.getData() != null && leProtoBuff.getData().getClientPayloadClassName() != null) {
- String clientPayloadClassName = leProtoBuff.getData().getClientPayloadClassName();
- payload = (Payload) Class.forName(clientPayloadClassName).newInstance();
- payload = payload.decode(leProtoBuff.getData());
- } else {
- LOG.error("Payload is null or payload does not have client payload class name");
- }
-
- } catch (InstantiationException e) {
- LOG.error("InstantiationException when instantiating "+leProtoBuff.getData().getClientPayloadClassName(), e);
- } catch (IllegalAccessException e) {
- LOG.error("IllegalAccessException when accessing "+leProtoBuff.getData().getClientPayloadClassName(), e);
- } catch (ClassNotFoundException e) {
- LOG.error("ClassNotFoundException when loading "+leProtoBuff.getData().getClientPayloadClassName(), e);
- }
- ReplicatedLogEntry logEntry = new ReplicatedLogImplEntry(
- leProtoBuff.getIndex(), leProtoBuff.getTerm(), payload);
- logEntryList.add(logEntry);
- }
-
- AppendEntries to = new AppendEntries(from.getTerm(),
- from.getLeaderId(),
- from.getPrevLogIndex(),
- from.getPrevLogTerm(),
- logEntryList,
- from.getLeaderCommit(), -1);
-
- return to;
- }
-
- public static boolean isSerializedType(Object message) {
- return message instanceof AppendEntries || LEGACY_SERIALIZABLE_CLASS.isInstance(message);
- }