Skip to content
This repository has been archived by the owner on Apr 11, 2023. It is now read-only.

Commit

Permalink
feat: Manage properly event triggers and obligations (#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
federicozanardo committed Jan 28, 2023
1 parent 86b7d84 commit 4f6b8b0
Show file tree
Hide file tree
Showing 7 changed files with 209 additions and 121 deletions.
12 changes: 6 additions & 6 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import vm.RequestQueue;
import vm.VirtualMachine;

import java.io.IOException;

class Main {
public static void main(String[] args) {
// Set up the requests queue
Expand All @@ -25,34 +27,32 @@ public static void main(String[] args) {
} catch (IOException e) {
throw new RuntimeException(e);
}*/
// assetId => 09c137f0-6ffc-425c-9657-de4577d8502c
PropertiesStorage propertiesStorage = new PropertiesStorage();
/*try {
propertiesStorage.seed();
} catch (IOException e) {
throw new RuntimeException(e);
}*/
// propertyId => a86d2ed2-a455-43e1-b3be-264c05d7fc20

// Set up the Event trigger handler
EventTriggerHandler eventTriggerHandler = new EventTriggerHandler();

// Set up the virtual machine handler
VirtualMachine virtualMachine = new VirtualMachine(
requestQueue,
sharedMemory,
eventTriggerHandler,
contractsStorage,
contractInstancesStorage,
assetsStorage,
propertiesStorage
);

// Set up the Event trigger handler
EventTriggerHandler eventTriggerHandler = new EventTriggerHandler(requestQueue, virtualMachine);

// Set up the server
Thread server = new Thread(
new MessageServer(
61000,
requestQueue,
eventTriggerHandler,
virtualMachine,
sharedMemory,
contractsStorage,
Expand Down
56 changes: 19 additions & 37 deletions src/main/java/compiler/StipulaCompiler.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package compiler;

import constants.Constants;
import event.EventTriggerHandler;
import lib.datastructures.Pair;
import models.address.Address;
import models.contract.Contract;
import models.dto.requests.contract.deploy.DeployContract;
import models.dto.requests.event.EventTriggerRequest;
import models.dto.requests.event.EventTriggerSchedulingRequest;
import models.dto.responses.Response;
import models.dto.responses.SuccessDataResponse;
import shared.SharedMemory;
import storage.ContractsStorage;
import vm.dfa.ContractCallByEvent;
import vm.dfa.ContractCallByParty;
import vm.dfa.DfaState;

Expand All @@ -25,22 +23,19 @@
public class StipulaCompiler extends Thread {
private final Thread clientHandler;
private final DeployContract contractToDeploy;
private final EventTriggerHandler eventTriggerHandler;
private final SharedMemory<Response> sharedMemory;
private final ContractsStorage contractsStorage;

public StipulaCompiler(
String name,
Thread clientHandler,
DeployContract contractToDeploy,
EventTriggerHandler eventTriggerHandler,
SharedMemory<Response> sharedMemory,
ContractsStorage contractsStorage
) {
super(name);
this.clientHandler = clientHandler;
this.contractToDeploy = contractToDeploy;
this.eventTriggerHandler = eventTriggerHandler;
this.sharedMemory = sharedMemory;
this.contractsStorage = contractsStorage;
}
Expand Down Expand Up @@ -89,8 +84,18 @@ public void run() {
transitions.add(new Pair<String, DfaState>("Inactive", new ContractCallByParty("Proposal", authorizedParties1)));
transitions.add(new Pair<String, DfaState>("Proposal", new ContractCallByParty("Using", authorizedParties2)));
transitions.add(new Pair<String, DfaState>("Using", new ContractCallByParty("End", authorizedParties2)));
transitions.add(new Pair<String, DfaState>("Using", new ContractCallByEvent("End", "accept_obl_1")));

Contract contract = new Contract("", bytecode, "Inactive", "End", transitions);
ArrayList<String> endStates = new ArrayList<>();
endStates.add("End");

Contract contract = new Contract(
"",
bytecode,
"Inactive",
endStates,
transitions
);

String contractId;
try {
Expand All @@ -101,27 +106,6 @@ public void run() {

System.out.println("StipulaCompiler: contractId = " + contractId);

System.out.println("StipulaCompiler: Set up event triggers...");

for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

EventTriggerRequest request = new EventTriggerRequest(
"a" + i,
"b" + i,
"call" + i
);
EventTriggerSchedulingRequest schedulingRequest = new EventTriggerSchedulingRequest(request, 5);
this.eventTriggerHandler.addTask(schedulingRequest);
System.out.println("StipulaCompiler: added " + schedulingRequest);
}

System.out.println("StipulaCompiler: get => " + this.sharedMemory.get(this.getName()));

if (this.sharedMemory.containsKey(this.clientHandler.getName())) {
this.sharedMemory.set(
this.clientHandler.getName(),
Expand All @@ -140,12 +124,12 @@ public void run() {
}

private boolean compile() throws NoSuchAlgorithmException {
this.setupContract();
//this.setupContract();
System.out.println("StipulaCompiler:compile => " + this.contractToDeploy);
return true;
}

private void setupContract() throws NoSuchAlgorithmException {
/*private void setupContract() throws NoSuchAlgorithmException {
String bytecode = readProgram(Constants.EXAMPLES_PATH + "contract1.sb");
// Load the DFA
Expand Down Expand Up @@ -174,19 +158,17 @@ private void setupContract() throws NoSuchAlgorithmException {
)
);
ArrayList<String> endStates = new ArrayList<>();
endStates.add("End");
Contract contract = new Contract(
"",
bytecode,
"Inactive",
"End",
endStates,
transitions
);

// Save the contract
// String contractId = contractsStorage.addContract(contract);

// System.out.println("setupContract: contractId = " + contractId);
}
}*/

private String readProgram(String pathname) {
String bytecode = "";
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/event/EventTrigger.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,25 @@
import exceptions.queue.QueueOverflowException;
import models.dto.requests.event.EventTriggerSchedulingRequest;
import vm.RequestQueue;
import vm.VirtualMachine;

import java.util.TimerTask;

public class EventTrigger extends TimerTask {
private final EventTriggerSchedulingRequest schedulingRequest;
private final EventTriggerHandler handler;
private final RequestQueue requestQueue;
private final VirtualMachine virtualMachine;
private final Thread virtualMachineThread;

public EventTrigger(
EventTriggerSchedulingRequest schedulingRequest,
EventTriggerHandler handler,
RequestQueue requestQueue,
VirtualMachine virtualMachine) {
Thread virtualMachineThread
) {
this.schedulingRequest = schedulingRequest;
this.handler = handler;
this.requestQueue = requestQueue;
this.virtualMachine = virtualMachine;
this.virtualMachineThread = virtualMachineThread;
}

@Override
Expand All @@ -35,13 +35,13 @@ public void run() {
}

System.out.println("EventTrigger: notifying the virtual machine...");
synchronized (this.virtualMachine) {
this.virtualMachine.notify();
synchronized (this.virtualMachineThread) {
this.virtualMachineThread.notify();
}
System.out.println("EventTrigger: virtual machine notified");

System.out.println("EventTrigger: removing the request from EventTriggerHandler...");
this.handler.removeTask(schedulingRequest.getRequest());
this.handler.removeTask(schedulingRequest);
}

public EventTriggerSchedulingRequest getSchedulingRequest() {
Expand Down
32 changes: 13 additions & 19 deletions src/main/java/event/EventTriggerHandler.java
Original file line number Diff line number Diff line change
@@ -1,52 +1,46 @@
package event;

import models.dto.requests.event.EventTriggerRequest;
import models.dto.requests.event.EventTriggerSchedulingRequest;
import vm.RequestQueue;
import vm.VirtualMachine;

import java.util.ArrayList;
import java.util.Date;
import java.util.Timer;
import java.util.concurrent.locks.ReentrantLock;

public class EventTriggerHandler {
private final ArrayList<EventTrigger> tasks;
private final Timer timer;
private final RequestQueue requestQueue;
private final VirtualMachine virtualMachine;
private final ReentrantLock mutex;

public EventTriggerHandler(RequestQueue requestQueue, VirtualMachine virtualMachine) {
this.requestQueue = requestQueue;
this.virtualMachine = virtualMachine;
public EventTriggerHandler() {
this.tasks = new ArrayList<>();
this.timer = new Timer();
mutex = new ReentrantLock();
this.mutex = new ReentrantLock();
}

public void addTask(EventTriggerSchedulingRequest schedulingRequest) {
EventTrigger task = new EventTrigger(schedulingRequest, this, requestQueue, virtualMachine);
public void addTask(EventTrigger task) {
mutex.lock();

this.timer.schedule(task, schedulingRequest.getSecondsBeforeCalling() * 1000L);
this.tasks.add(task);
// timer.schedule(task, task.getSchedulingRequest().getRequest().getTime() * 1000L);
timer.schedule(task, new Date(task.getSchedulingRequest().getRequest().getTime() * 1000L));
tasks.add(task);

mutex.unlock();
}

public void removeTask(EventTriggerRequest request) {
public void removeTask(EventTriggerSchedulingRequest schedulingRequest) {
mutex.lock();

int i = 0;
boolean found = false;

while (i < tasks.size() && !found) {
EventTrigger task = tasks.get(i);
EventTriggerRequest taskRequest = task.getSchedulingRequest().getRequest();
EventTriggerSchedulingRequest taskRequest = task.getSchedulingRequest();

if (taskRequest.getContractId().equals(request.getContractId()) &&
taskRequest.getContractInstanceId().equals(request.getContractInstanceId()) &&
taskRequest.getObligationName().equals(request.getObligationName())) {
if (taskRequest.getContractId().equals(schedulingRequest.getContractId()) &&
taskRequest.getContractInstanceId().equals(schedulingRequest.getContractInstanceId()) &&
taskRequest.getRequest().getObligationFunctionName().equals(schedulingRequest.getRequest().getObligationFunctionName())) {
found = true;
} else {
i++;
Expand All @@ -57,7 +51,7 @@ public void removeTask(EventTriggerRequest request) {
throw new Error();
}

this.tasks.remove(i);
tasks.remove(i);
mutex.unlock();
}

Expand Down
Loading

0 comments on commit 4f6b8b0

Please sign in to comment.