Skip to content

Commit

Permalink
Merge pull request #185 from upb-uc4/feature/instant
Browse files Browse the repository at this point in the history
Feature/instant
  • Loading branch information
matthias-geuchen authored Feb 16, 2021
2 parents 6c1fe1e + a0e59df commit 3758193
Show file tree
Hide file tree
Showing 18 changed files with 292 additions and 309 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,6 @@ public InvalidParameter getInvalidTimestampParam(String param) {
.name(errorPrefix + "." + param)
.reason(param + " must be the following format \"(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z\", e.g. \"2020-12-31T23:59:59.999Z\"");
}
public InvalidParameter getInvalidTimestampParamLocalDateTime(String param) {
return new InvalidParameter()
.name(errorPrefix + "." + param)
.reason(param + " must be the following format \"(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\", e.g. \"2020-12-31T23:59:59\"");
}

public GenericError getInternalError() {
return new GenericError()
Expand Down Expand Up @@ -181,10 +176,6 @@ public String getEnrollmentIdFromClientId(String clientId) {
return clientId.substring(9).split(",")[0];
}

public String getTimestamp(ChaincodeStub stub) {
DateTimeFormatter fm = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.from(ZoneOffset.UTC));
return fm.format(stub.getTxTimestamp().truncatedTo(SECONDS));
}

public void finishOperation(
final ChaincodeStub stub,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
import org.hyperledger.fabric.shim.ChaincodeStub;

import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Contract(
Expand All @@ -43,7 +42,6 @@ public class AdmissionContract extends ContractBase {
@Transaction()
public String addAdmission(final Context ctx, String admissionJson) {
String transactionName = HyperledgerManager.getTransactionName(ctx.getStub());
String timeStamp = cUtil.getTimestamp(ctx.getStub());
final String[] args = new String[]{admissionJson};
try {
cUtil.checkParamsAddAdmission(ctx, args);
Expand All @@ -53,7 +51,7 @@ public String addAdmission(final Context ctx, String admissionJson) {

ChaincodeStub stub = ctx.getStub();
AbstractAdmission newAdmission = GsonWrapper.fromJson(admissionJson, AbstractAdmission.class);
newAdmission.setTimestamp(LocalDateTime.parse(timeStamp));
newAdmission.setTimestamp(ctx.getStub().getTxTimestamp());
newAdmission.resetAdmissionId();

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import de.upb.cs.uc4.chaincode.contract.ContractBase;
import de.upb.cs.uc4.chaincode.exceptions.SerializableError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ParameterError;
import de.upb.cs.uc4.chaincode.helper.DateSerializer;
import de.upb.cs.uc4.chaincode.helper.GsonWrapper;
import de.upb.cs.uc4.chaincode.helper.HyperledgerManager;
import de.upb.cs.uc4.chaincode.model.Exam;
Expand All @@ -15,6 +14,7 @@

import java.lang.reflect.Type;
import java.text.ParseException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
Expand Down Expand Up @@ -107,8 +107,8 @@ public String getExams(
GsonWrapper.fromJson(lecturerIds, listType),
GsonWrapper.fromJson(moduleIds, listType),
GsonWrapper.fromJson(types, listType),
GsonWrapper.fromJson(admittableAt, Date.class),
GsonWrapper.fromJson(droppableAt, Date.class));
GsonWrapper.fromJson(admittableAt, Instant.class),
GsonWrapper.fromJson(droppableAt, Instant.class));
return GsonWrapper.toJson(examList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
import de.upb.cs.uc4.chaincode.contract.examinationregulation.ExaminationRegulationContractUtil;
import de.upb.cs.uc4.chaincode.exceptions.SerializableError;
import de.upb.cs.uc4.chaincode.exceptions.serializable.ParameterError;
import de.upb.cs.uc4.chaincode.helper.DateSerializer;
import de.upb.cs.uc4.chaincode.helper.GsonWrapper;
import de.upb.cs.uc4.chaincode.model.Exam;
import de.upb.cs.uc4.chaincode.model.errors.InvalidParameter;
import org.hyperledger.fabric.contract.Context;
import org.hyperledger.fabric.shim.ChaincodeStub;

import java.lang.reflect.Type;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Date;
Expand Down Expand Up @@ -81,7 +81,7 @@ public ArrayList<InvalidParameter> getSemanticErrorsForExam(
invalidParameters.add(getInvalidModuleAvailable("moduleId"));
}

Date now = Date.from(ZonedDateTime.now().toInstant());
Instant now = ZonedDateTime.now().toInstant();

if (initializedAndBefore(exam.getDate(), now)) {
invalidParameters.add(getInvalidDate("date"));
Expand All @@ -104,8 +104,8 @@ public ArrayList<InvalidParameter> getSemanticErrorsForExam(
return invalidParameters;
}

private boolean initializedAndBefore (Date before, Date after) {
return before != null && after != null && before.before(after);
private boolean initializedAndBefore (Instant before, Instant after) {
return before != null && after != null && before.isBefore(after);
}

/**
Expand Down Expand Up @@ -155,25 +155,25 @@ public List<Exam> getExams(
final List<String> lecturerIds,
final List<String> moduleIds,
final List<String> types,
final Date admittableAt,
final Date droppableAt) {

return this.getAllStates(stub, Exam.class).stream()
.filter(item -> examIds.isEmpty() ||
examIds.contains(item.getExamId()))
.filter(item -> courseIds.isEmpty() ||
courseIds.contains(item.getCourseId()))
.filter(item -> lecturerIds.isEmpty() ||
lecturerIds.contains(item.getLecturerEnrollmentId()))
.filter(item -> moduleIds.isEmpty() ||
moduleIds.contains(item.getModuleId()))
.filter(item -> types.isEmpty() ||
types.contains(item.getType()))
.filter(item -> admittableAt == null ||
item.getAdmittableUntil().after(admittableAt))
.filter(item -> droppableAt == null ||
item.getDroppableUntil().after(droppableAt))
.collect(Collectors.toList());
final Instant admittableAt,
final Instant droppableAt) {

return this.getAllStates(stub, Exam.class).stream()
.filter(item -> examIds.isEmpty() ||
examIds.contains(item.getExamId()))
.filter(item -> courseIds.isEmpty() ||
courseIds.contains(item.getCourseId()))
.filter(item -> lecturerIds.isEmpty() ||
lecturerIds.contains(item.getLecturerEnrollmentId()))
.filter(item -> moduleIds.isEmpty() ||
moduleIds.contains(item.getModuleId()))
.filter(item -> types.isEmpty() ||
types.contains(item.getType()))
.filter(item -> valueUnset(admittableAt) ||
item.getAdmittableUntil().isAfter(admittableAt))
.filter(item -> valueUnset(droppableAt) ||
item.getDroppableUntil().isAfter(droppableAt))
.collect(Collectors.toList());
}

public void checkParamsAddExam(Context ctx, String[] params) throws ParameterError {
Expand Down Expand Up @@ -245,10 +245,10 @@ public void checkParamsGetExams(Context ctx, String[] params) throws Serializabl
} catch (Exception e) {
invalidParams.add(getUnparsableParam("types"));
}
if (GsonWrapper.fromJson(admittableAt, Date.class) == null && !admittableAt.isEmpty()) {
if (GsonWrapper.fromJson(admittableAt, Instant.class) == null && !admittableAt.isEmpty()) {
invalidParams.add(getUnparsableParam("admittableAt"));
}
if (GsonWrapper.fromJson(droppableAt, Date.class) == null && ! droppableAt.isEmpty()) {
if (GsonWrapper.fromJson(droppableAt, Instant.class) == null && ! droppableAt.isEmpty()) {
invalidParams.add(getUnparsableParam("droppableAt"));
}
if (!invalidParams.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public OperationData approveOperation(Context ctx, OperationData operationData)
existingApprovals.addGroupsItems(clientGroups);

ApprovalList missingApprovals = OperationContractUtil.getMissingApprovalList(requiredApprovals, existingApprovals);
return operationData.lastModifiedTimestamp(this.getTimestamp(ctx.getStub()))
return operationData.lastModifiedTimestamp(ctx.getStub().getTxTimestamp())
.existingApprovals(existingApprovals)
.missingApprovals(missingApprovals);
}
Expand Down Expand Up @@ -161,14 +161,13 @@ public GenericError getRejectionImpossibleError(){
public OperationData getOrInitializeOperationData(Context ctx, String initiator, String contractName, String transactionName, String params) throws NoSuchAlgorithmException {
String key = OperationContractUtil.getDraftKey(contractName, transactionName, params);
OperationData operationData;
String timeStamp = getTimestamp(ctx.getStub());
try {
operationData = getState(ctx.getStub(), key, OperationData.class);
} catch (LedgerAccessError ledgerAccessError) {
operationData = new OperationData()
.initiator(initiator)
.operationId(key)
.initiatedTimestamp(timeStamp)
.initiatedTimestamp(ctx.getStub().getTxTimestamp())
.transactionInfo(new TransactionInfo().contractName(contractName).transactionName(transactionName).parameters(params))
.state(OperationDataState.PENDING)
.reason("");
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@

import java.io.Reader;
import java.lang.reflect.Type;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;

public class GsonWrapper {

Expand All @@ -35,7 +35,7 @@ public class GsonWrapper {
(JsonSerializer<LocalDateTime>) (date, typeOfSrc, context) -> {
return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); // "YYYY-MM-DDThh:mm:ss"
})
.registerTypeAdapter(Date.class, new DateSerializer())
.registerTypeAdapter(Instant.class, new InstantAdapter())
.registerTypeAdapter(
Integer.class,
(JsonDeserializer<Integer>) (json, type, jsonDeserializationContext) -> {
Expand Down Expand Up @@ -78,15 +78,15 @@ public class GsonWrapper {
.create();

public static <T> T fromJson(String json, Class<T> t) throws JsonSyntaxException {
if (t.equals(Date.class)) {
return (T) DateSerializer.internalDeserialize(json);
if (t.equals(Instant.class)) {
return (T) InstantAdapter.internalDeserialize(json);
}
return gson.fromJson(json, t);
}

public static <T> String toJson(T object) {
if (object instanceof Date) {
return DateSerializer.internalSerialize((Date) object);
if (object instanceof Instant) {
return InstantAdapter.internalSerialize((Instant) object);
}
return gson.toJson(object);
}
Expand All @@ -102,8 +102,8 @@ public static <T> T fromJson(String json, Type type) {
return cleanGson.fromJson("[]", type);
}
}
if (type.equals(Date.class)) {
return (T) DateSerializer.internalDeserialize(json);
if (type.equals(Instant.class)) {
return (T) InstantAdapter.internalDeserialize(json);
}
return gson.fromJson(json, type);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package de.upb.cs.uc4.chaincode.helper;

import java.lang.reflect.Type;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.TimeZone;

import com.google.gson.*;

public class InstantAdapter implements JsonDeserializer<Instant>, JsonSerializer<Instant> {

private static final TimeZone tz = TimeZone.getTimeZone("UTC");

@Override
public Instant deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
String dateString = element.getAsString();
return internalDeserialize(dateString);
}

@Override
public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(internalSerialize(src));
}

public static String internalSerialize(Instant src){
return DateTimeFormatter.ISO_INSTANT.format(src);
}

public static Instant internalDeserialize(String src) {
try {
return Instant.from(DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(src));
} catch (DateTimeParseException e) {
return null;
}
}
}
Loading

0 comments on commit 3758193

Please sign in to comment.