diff --git a/JavaAkkaFuCoin/.classpath b/JavaAkkaFuCoin/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..149cb3c90688952162d8c347ea8ee4ac2a23e17b --- /dev/null +++ b/JavaAkkaFuCoin/.classpath @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" output="target/classes" path="src"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="target/classes"/> +</classpath> diff --git a/JavaAkkaFuCoin/.gitignore b/JavaAkkaFuCoin/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..09e3bc9b241c477ea341af9ee029becad0c2148c --- /dev/null +++ b/JavaAkkaFuCoin/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/JavaAkkaFuCoin/.project b/JavaAkkaFuCoin/.project new file mode 100644 index 0000000000000000000000000000000000000000..4610a714e9294dc1ec3988a67610511640c5c0c7 --- /dev/null +++ b/JavaAkkaFuCoin/.project @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>JavaAkkaFuCoin</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/JavaAkkaFuCoin/.settings/org.eclipse.jdt.core.prefs b/JavaAkkaFuCoin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..672496e107ed4e070613aad776b4df5146306bd4 --- /dev/null +++ b/JavaAkkaFuCoin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/JavaAkkaFuCoin/.settings/org.eclipse.m2e.core.prefs b/JavaAkkaFuCoin/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65 --- /dev/null +++ b/JavaAkkaFuCoin/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/JavaAkkaFuCoin/pom.xml b/JavaAkkaFuCoin/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ccdd40ba7e08a14b15f3b932107be1e45b380f39 --- /dev/null +++ b/JavaAkkaFuCoin/pom.xml @@ -0,0 +1,26 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>JavaAkkaFuCoin</groupId> + <artifactId>JavaAkkaFuCoin</artifactId> + <version>0.0.1-SNAPSHOT</version> + <build> + <sourceDirectory>src</sourceDirectory> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>com.typesafe.akka</groupId> + <artifactId>akka-actor_2.11</artifactId> + <version>2.4-M1</version> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/JavaAkkaFuCoin/src/akkateststuff/Main.java b/JavaAkkaFuCoin/src/akkateststuff/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..a07272a1098f4c092ec0a69d5b8382684d8585ea --- /dev/null +++ b/JavaAkkaFuCoin/src/akkateststuff/Main.java @@ -0,0 +1,11 @@ +package akkateststuff; +import akka.actor.*; + +public class Main { +public static void main(String[] args) { + final ActorSystem system = ActorSystem.create("MySystem"); + final ActorRef myActor42 = system.actorOf(Node.props(42),"42"); + final ActorRef myActor43 = system.actorOf(Node.props(43),"43"); + myActor42.tell("test", myActor43); +} +} diff --git a/JavaAkkaFuCoin/src/akkateststuff/MyNodeCreator.java b/JavaAkkaFuCoin/src/akkateststuff/MyNodeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..c20b97fdb1dd0c17add6a241f8634e1b39c0fe41 --- /dev/null +++ b/JavaAkkaFuCoin/src/akkateststuff/MyNodeCreator.java @@ -0,0 +1,18 @@ +package akkateststuff; +import akka.japi.Creator; + + +public class MyNodeCreator implements Creator<Node>{ + private static final long serialVersionUID = 1L; + private int magicNumber; + + public MyNodeCreator(int magicNumber) { + this.magicNumber=magicNumber; + } + + @Override + public Node create() throws Exception { + return new Node(magicNumber); + } + +} diff --git a/JavaAkkaFuCoin/src/akkateststuff/Node.java b/JavaAkkaFuCoin/src/akkateststuff/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..730d92b28fd2bb3a17cf65540615999eb8d78f2b --- /dev/null +++ b/JavaAkkaFuCoin/src/akkateststuff/Node.java @@ -0,0 +1,23 @@ +package akkateststuff; +import akka.actor.*; +import akka.japi.Creator; + +public class Node extends UntypedActor { + + private int magicnumber; + + public Node(int magicnumber) { + this.magicnumber = magicnumber; + } + + @Override + public void onReceive(Object arg0) throws Exception { + System.out.println(magicnumber+" said \""+arg0+"\" to me"); + } + public static int magicNumber=0; + + public static Props props(final int magicNumber) { + Node.magicNumber=magicNumber; + return Props.create(new MyNodeCreator(magicNumber)); + } +} diff --git a/JavaAkkaFuCoin/src/fucoin/IWallet.java b/JavaAkkaFuCoin/src/fucoin/IWallet.java new file mode 100644 index 0000000000000000000000000000000000000000..f1d96a10c113b8a1de4bc27dbc0da472de3ca246 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/IWallet.java @@ -0,0 +1,13 @@ +package fucoin; +import java.util.Vector; + +import fucoin.gui.IWalletControle; + + +public interface IWallet extends IWalletControle{ + Vector<WalletPointer> join(); + void storeOrUpdate(Wallet w); + void invalidateWallet(Wallet w); + void receiveTransaction(int amount); + Vector<WalletPointer> searchWallet(String adress); +} diff --git a/JavaAkkaFuCoin/src/fucoin/Main.java b/JavaAkkaFuCoin/src/fucoin/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..7ac9d2621f7a41ac0aa3e70f1bf7e47348576bfb --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/Main.java @@ -0,0 +1,79 @@ +package fucoin; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.time.Duration; +import java.util.concurrent.Executors; + +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTextField; + +import fucoin.actions.JoinActionRespond; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.dispatch.Dispatcher; +import akka.dispatch.ExecutorServiceFactoryProvider; +import akka.dispatch.MessageDispatcherConfigurator; +import akkateststuff.Node; + + +public class Main { + private static Main singleton; + public static Main getSingleton() { + return singleton; + } + + public final ActorSystem system; + + public ActorSystem getSystem() { + return system; + } + + public Main() { + this.singleton=this; + system = ActorSystem.create("MySystem"); + system.actorOf(Wallet.props(null,"Main"),"main"); + + } + public void start(){ + //43 tells 42 join + } + static int walletCounter = 0; + public static void main(String[] args) { + Main main = new Main(); + main.start(); + JFrame frame = new JFrame("Manager"); + frame.setLayout(new GridLayout(3,2)); + frame.add(new JLabel("Connect to:")); + JTextField input = new JTextField("akka://MySystem/user/main"); + frame.add(input); + frame.add(new JLabel("Name:")); + JTextField name = new JTextField(""+walletCounter); + frame.add(name); + JButton button = new JButton("connect"); + button.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + /*MessageDispatcherConfigurator mc = null; + String id = input.getText()+"-dispatched"; + int hroughput = 1; + Duration d = Duration.ofSeconds(2); + + + Dispatcher d = new Dispatcher(mc,id, 1, d, Executors.newSingleThreadExecutor(),1000);*/ + getSingleton().getSystem().actorOf(Wallet.props(input.getText(),name.getText()),name.getText()); + } + }); + + frame.add(button); + frame.setSize(300, 300); + frame.setVisible(true); + + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/Wallet.java b/JavaAkkaFuCoin/src/fucoin/Wallet.java new file mode 100644 index 0000000000000000000000000000000000000000..89293d23b69569f8c7fc51325db7e503de7c9580 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/Wallet.java @@ -0,0 +1,287 @@ +package fucoin; +import java.util.Collections; +import java.util.Vector; + +import javax.swing.DefaultListModel; + +import fucoin.actions.FindWalletAction; +import fucoin.actions.FindWalletResponseAction; +import fucoin.actions.InvalidateAction; +import fucoin.actions.InvokeExitAction; +import fucoin.actions.InvokeFindWalletAction; +import fucoin.actions.InvokePerformTransactionAction; +import fucoin.actions.PerformTransactionAction; +import fucoin.actions.StoreOrUpdateAction; +import fucoin.actions.JoinAction; +import fucoin.actions.JoinActionRespond; +import fucoin.actions.InvokeStoreOrUpdateAction; +import fucoin.actions.TransactionPerformedAction; +import fucoin.actions.WaitForAnswersAction; +import fucoin.actions.WaitForPerformTransactionAction; +import fucoin.gui.IWalletGuiControle; +import akka.actor.ActorPath; +import akka.actor.ActorRef; +import akka.actor.ActorSelection; +import akka.actor.ActorSystem; +import akka.actor.ActorSystemImpl; +import akka.actor.Props; +import akka.actor.UntypedActor; +import akkateststuff.MyNodeCreator; +import akkateststuff.Node; + + +public class Wallet extends UntypedActor implements IWallet{ + + private ActorRef preknownNeighbour; + private String address ; + private int moneyAmount ; + private Vector<WalletPointer> allKnownNeighbors = new Vector<WalletPointer>(); + private Vector<Wallet> synchronizedNeighbors = new Vector<Wallet>(); + + + public Wallet(String preknownNeighbour) { + + if(preknownNeighbour!=null){ + this.preknownNeighbour=stringToActor(preknownNeighbour); + } + } + + @Override + public Vector<WalletPointer> join() { + Vector<WalletPointer> allKnownNeighbors = new Vector<WalletPointer>(); + for(WalletPointer neighbors : allKnownNeighbors){ + this.allKnownNeighbors.add(neighbors); + gui.addKnownAddress(neighbors.address); + } + return allKnownNeighbors; + } + + @Override + public void storeOrUpdate(Wallet w) { + if(!synchronizedNeighbors.contains(w)){ + synchronizedNeighbors.add(w); + }; + } + + @Override + public void invalidateWallet(Wallet w) { + synchronizedNeighbors.remove(w); + } + + @Override + public void receiveTransaction(int moneyAmount) { + addMoneyAmount(moneyAmount); + } + private Vector<WalletPointer> answers = new Vector<WalletPointer>(); + @Override + public Vector<WalletPointer> searchWallet(String adress) { + for(WalletPointer neighbor : allKnownNeighbors){ + if(!neighbor.address.equals(adress)){ + ActorRef actor = stringToActor(neighbor.address); + actor.tell(new FindWalletAction(adress), getSelf()); + + } + } + //unschoener workaround + getSelf().tell(new WaitForAnswersAction(), getSelf()); + return answers; + } + + private boolean isAlive = false; + private IWalletGuiControle gui; + void performTransaction ( WalletPointer w, int amount ){ + + ActorRef destActor = stringToActor(w.address); + destActor.tell(new PerformTransactionAction(w,amount), getSelf()); + getSelf().tell(new WaitForPerformTransactionAction(w,amount), getSelf()); + //.tell(new Perform<transaction>, sender); + } + + @Override + public void onReceive(Object action) throws Exception { + log(""+action); + boolean contains = false; + String senderName = actorToString(getSender()); + String selfName = actorToString(getSelf()); + WalletPointer selfWP = null; + for(WalletPointer wp : this.allKnownNeighbors){ + if(wp.address.equals(senderName)){ + contains = true; + log("knows allready "+senderName); + } + if(wp.address.equals(selfName)){ + selfWP = wp; + } + } + if(!contains){ + this.allKnownNeighbors.add(new WalletPointer(senderName)); + gui.addKnownAddress(senderName); + + } + if(selfWP!=null){ + this.allKnownNeighbors.remove(selfWP); + } + if(action instanceof JoinAction){ + JoinActionRespond joinaction = new JoinActionRespond(); + joinaction.setKnownNeighbors(join()); + + getSender().tell(joinaction, getSelf()); + }else if(action instanceof JoinActionRespond){ + JoinActionRespond joinaction = (JoinActionRespond) action; + //allKnownNeighbors.addAll(joinaction.getAllKnownNeighbors()); + for(WalletPointer neighbor:joinaction.getAllKnownNeighbors()){ + gui.addKnownAddress(neighbor.address); + allKnownNeighbors.add(neighbor); + } + log(actorToString(getSelf())+"ah there are new neighbours"+joinaction.getAllKnownNeighbors()); + log("now i know these "+allKnownNeighbors); + getSelf().tell(new InvokeFindWalletAction(), getSelf()); + }else if(action instanceof StoreOrUpdateAction){ + StoreOrUpdateAction storeOrUpdateAction = (StoreOrUpdateAction) action; + storeOrUpdate(storeOrUpdateAction.getWallet()); + }else if(action instanceof InvokeStoreOrUpdateAction){ + StoreOrUpdateAction storeOrUpdateAction = new StoreOrUpdateAction(); + storeOrUpdateAction.setWallet(this); + for(WalletPointer neighbor : allKnownNeighbors){ + stringToActor(neighbor.address).tell(storeOrUpdateAction, getSelf()); + } + }else if(action instanceof InvokeExitAction){ + getContext().stop(getSelf()); + }else if(action instanceof InvokeFindWalletAction){ + InvokeFindWalletAction invokeFindWalletAction = (InvokeFindWalletAction) action; + + Vector<WalletPointer> wallets = searchWallet(selfName); + + }else if(action instanceof FindWalletAction){ + FindWalletAction findWalletAction = (FindWalletAction) action; + for(Wallet s : synchronizedNeighbors){ + log(findWalletAction.getSearchedName()); + log(s.address); + if(s.address.equals(findWalletAction.getSearchedName())){ + log(""+s.moneyAmount); + getSender().tell(new FindWalletResponseAction(selfName,s.moneyAmount), getSelf()); + } + } + }else if(action instanceof FindWalletResponseAction){ + FindWalletResponseAction findWalletResponseAction = (FindWalletResponseAction) action; + answers.add(new WalletPointer(findWalletResponseAction.getFoundneighbour())); + gui.addKnownAddress(findWalletResponseAction.getFoundneighbour()); + moneyAmount=findWalletResponseAction.getMoneyAmount(); + gui.setAmount(moneyAmount); + }else if(action instanceof WaitForAnswersAction){ + log(""+answers); + for(WalletPointer answer : answers){ + stringToActor(answer.address).tell(new InvalidateAction(actorToString(getSelf())),getSelf()); + } + }else if(action instanceof InvalidateAction){ + InvalidateAction invalidateAction = (InvalidateAction) action; + + Wallet delWallet = null; + + for(Wallet w : synchronizedNeighbors){ + if(w.address.equals(invalidateAction.getInvalidWallet())){ + delWallet=w; + } + } + log(""+synchronizedNeighbors); + invalidateWallet(delWallet); + log(""+synchronizedNeighbors); + }else if(action instanceof InvokePerformTransactionAction){ + InvokePerformTransactionAction invokePerformTransactionAction = (InvokePerformTransactionAction) action; + performTransaction(invokePerformTransactionAction.getWalletPointer(),invokePerformTransactionAction.getAmount()); + addMoneyAmount(-invokePerformTransactionAction.getAmount()); + }else if(action instanceof PerformTransactionAction){ + PerformTransactionAction performTransactionAction = (PerformTransactionAction) action; + if(performTransactionAction.getWalletPointer().address.equals(actorToString(getSelf()))){ + getSender().tell(new TransactionPerformedAction(), getSelf()); + receiveTransaction(performTransactionAction.getAmount()); + }else{ + for(Wallet syncwallet : synchronizedNeighbors){ + if(syncwallet.address.equals(performTransactionAction.getWalletPointer().address)){ + syncwallet.addMoneyAmount(performTransactionAction.getAmount()); + } + } + } + }else if(action instanceof WaitForPerformTransactionAction){ + WaitForPerformTransactionAction waitForPerformTransactionAction = (WaitForPerformTransactionAction) action; + if(!isAlive){ + for(Wallet neighbor : synchronizedNeighbors){ + if(neighbor.address.equals(waitForPerformTransactionAction.getWalletPointer().address)){ + neighbor.addMoneyAmount(waitForPerformTransactionAction.getAmount()); + log("have to update "+neighbor.address+"amount because he is offline"); + } + + } + + } + }else if(action instanceof TransactionPerformedAction){ + isAlive=true; + } + } + + @Override + public void preStart() throws Exception { + super.preStart(); + log("prestart"+preknownNeighbour); + this.address=actorToString(getSelf()); + gui.setAddress(address); + addMoneyAmount(100); + if(preknownNeighbour!=null){ + String p = actorToString(preknownNeighbour); + allKnownNeighbors.add(new WalletPointer(p)); + gui.addKnownAddress(p); + preknownNeighbour.tell(new JoinAction(), getSelf()); + } + } + + private void log(String string) { + String logMsg = actorToString(getSender()).replace("akka://MySystem/user/", "")+" said "+ string+" to me("+actorToString(getSelf()).replace("akka://MySystem/user/", "")+")"; + System.out.println(logMsg); + gui.addLogMsg(string); + + } + + public static Props props(String preknownNeighbour, String walletCounter) { + return Props.create(new WalletCreator(preknownNeighbour,walletCounter)); + } + + public static String actorToString(ActorRef actor){ + return actor.path().toStringWithAddress(actor.path().address()); + } + + public static ActorRef stringToActor(String path){ + return Main.getSingleton().getSystem().actorFor(path); + } + + public void addMoneyAmount(int moneyAmount) { + this.moneyAmount += moneyAmount; + this.gui.setAmount(this.moneyAmount); + } + @Override + public String toString() { + return address+"'s wallet"; + } + + public void invokePerformTransaction(WalletPointer walletPointer, int i) { + getSelf().tell(new InvokePerformTransactionAction(walletPointer, i),getSelf()); + } + + @Override + public void send(String address, int amount) { + invokePerformTransaction(new WalletPointer(address), amount); + } + + public void store() { + getSelf().tell(new InvokeStoreOrUpdateAction(), getSelf()); + } + + public void leave() { + store(); + getSelf().tell(new InvokeExitAction(), getSelf()); + } + + public void setGui(IWalletGuiControle gui) { + this.gui=gui; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/WalletCreator.java b/JavaAkkaFuCoin/src/fucoin/WalletCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..19852aa1d5f70e5f6a351f1653d97f476d75ae71 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/WalletCreator.java @@ -0,0 +1,85 @@ +package fucoin; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import fucoin.actions.InvokePerformTransactionAction; +import fucoin.gui.IWalletGuiControle; +import fucoin.gui.WalletGui; +import akka.japi.Creator; +import akkateststuff.Node; + + +public class WalletCreator implements Creator<Wallet>{ + + private String preknownNeighbour; + private String walletCounter; + + public WalletCreator(String preknownNeighbour, String walletCounter) { + this.preknownNeighbour=preknownNeighbour; + this.walletCounter=walletCounter; + } + + @Override + public Wallet create() throws Exception { + + Wallet tempwallet = new Wallet(preknownNeighbour); + IWalletGuiControle gui = new WalletGui(tempwallet); + tempwallet.setGui(gui); + + + /* + Wallet tempwallet = new Wallet(preknownNeighbour,log); + JFrame frame = new JFrame("Wallet:"+walletCounter); + frame.setLayout(new GridLayout(3,1)); + + + JList<String> list = new JList<String>(log); + JTextField dest = new JTextField(); + JPanel panel = new JPanel(); + panel.setLayout(new GridLayout(3, 1)); + JButton storebutton = new JButton("Store"); + storebutton.addActionListener(new ActionListener() { + Wallet wallet = tempwallet; + @Override + public void actionPerformed(ActionEvent e) { + wallet.store(); + } + }); + JButton exitbutton = new JButton("Exit"); + exitbutton.addActionListener(new ActionListener() { + Wallet wallet = tempwallet; + @Override + public void actionPerformed(ActionEvent e) { + wallet.exit(); + frame.dispose(); + } + }); + JButton send10Btn = new JButton("Send10"); + send10Btn.addActionListener(new ActionListener() { + Wallet wallet = tempwallet; + @Override + public void actionPerformed(ActionEvent e) { + + wallet.invokePerformTransaction(new WalletPointer(dest.getText()), 10); + } + }); + panel.add(storebutton); + panel.add(exitbutton); + panel.add(send10Btn); + frame.add(list); + frame.add(dest); + frame.add(panel); + frame.setSize(300, 300); + frame.setVisible(true);*/ + return tempwallet; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/WalletPointer.java b/JavaAkkaFuCoin/src/fucoin/WalletPointer.java new file mode 100644 index 0000000000000000000000000000000000000000..6446f90141184e0466ec239fd314d3adc1a6e2af --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/WalletPointer.java @@ -0,0 +1,20 @@ +package fucoin; + +import akka.actor.ActorRef; + +public class WalletPointer { + public String address; + + public WalletPointer(String address) { + this.address=address; + } + + @Override + public String toString() { + ActorRef actor = Wallet.stringToActor(address); + return actor.path().toStringWithAddress(actor.path().address()); + } + + + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/FindWalletAction.java b/JavaAkkaFuCoin/src/fucoin/actions/FindWalletAction.java new file mode 100644 index 0000000000000000000000000000000000000000..f28dfbd209db8478b3521c32da733bf319ec466d --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/FindWalletAction.java @@ -0,0 +1,15 @@ +package fucoin.actions; + +public class FindWalletAction { + + private String searchedName; + + public FindWalletAction(String searchedName) { + this.searchedName=searchedName; + } + + public String getSearchedName() { + return searchedName; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/FindWalletResponseAction.java b/JavaAkkaFuCoin/src/fucoin/actions/FindWalletResponseAction.java new file mode 100644 index 0000000000000000000000000000000000000000..edbf4f19910fc34bd63242192407ed6ce5f7abd3 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/FindWalletResponseAction.java @@ -0,0 +1,20 @@ +package fucoin.actions; + +public class FindWalletResponseAction { + + private String foundneighbour; + private int moneyAmount; + + public FindWalletResponseAction(String foundneighbour, int moneyAmount) { + this.foundneighbour=foundneighbour; + this.moneyAmount=moneyAmount; + } + + public String getFoundneighbour() { + return foundneighbour; + } + + public int getMoneyAmount() { + return moneyAmount; + } +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/InvalidateAction.java b/JavaAkkaFuCoin/src/fucoin/actions/InvalidateAction.java new file mode 100644 index 0000000000000000000000000000000000000000..b2e025a7e7f900e2fbef476f7e65a13de783f4e9 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/InvalidateAction.java @@ -0,0 +1,15 @@ +package fucoin.actions; + +public class InvalidateAction { + + private String invalidWallet; + + public InvalidateAction(String invalidWallet) { + this.invalidWallet=invalidWallet; + } + + public String getInvalidWallet() { + return invalidWallet; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/InvokeExitAction.java b/JavaAkkaFuCoin/src/fucoin/actions/InvokeExitAction.java new file mode 100644 index 0000000000000000000000000000000000000000..653c97de69131ce03196e35b62358f499ed09e8f --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/InvokeExitAction.java @@ -0,0 +1,9 @@ +package fucoin.actions; + +public class InvokeExitAction { +@Override +public String toString() { + // TODO Auto-generated method stub + return "invoke exit"; +} +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/InvokeFindWalletAction.java b/JavaAkkaFuCoin/src/fucoin/actions/InvokeFindWalletAction.java new file mode 100644 index 0000000000000000000000000000000000000000..72724bba017725e13dba26bfe35356b2af60fbcd --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/InvokeFindWalletAction.java @@ -0,0 +1,5 @@ +package fucoin.actions; + +public class InvokeFindWalletAction { + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/InvokePerformTransactionAction.java b/JavaAkkaFuCoin/src/fucoin/actions/InvokePerformTransactionAction.java new file mode 100644 index 0000000000000000000000000000000000000000..7818d432ef30e8093bb09191d29efe1f80c1fcf4 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/InvokePerformTransactionAction.java @@ -0,0 +1,23 @@ +package fucoin.actions; + +import fucoin.WalletPointer; + +public class InvokePerformTransactionAction { + + private WalletPointer walletPointer; + private int amount; + + public InvokePerformTransactionAction(WalletPointer walletPointer, int amount) { + this.walletPointer=walletPointer; + this.amount=amount; + } + + public WalletPointer getWalletPointer() { + return walletPointer; + } + + public int getAmount() { + return amount; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/InvokeStoreOrUpdateAction.java b/JavaAkkaFuCoin/src/fucoin/actions/InvokeStoreOrUpdateAction.java new file mode 100644 index 0000000000000000000000000000000000000000..0fd2858b0f41434ce585287e845540ab38437bb9 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/InvokeStoreOrUpdateAction.java @@ -0,0 +1,11 @@ +package fucoin.actions; + +import fucoin.Wallet; + +public class InvokeStoreOrUpdateAction { +@Override +public String toString() { + // TODO Auto-generated method stub + return "invoke store or update"; +} +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/JoinAction.java b/JavaAkkaFuCoin/src/fucoin/actions/JoinAction.java new file mode 100644 index 0000000000000000000000000000000000000000..51e37bc875759259e82870aeb932560339854fb9 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/JoinAction.java @@ -0,0 +1,5 @@ +package fucoin.actions; + +public class JoinAction { + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/JoinActionRespond.java b/JavaAkkaFuCoin/src/fucoin/actions/JoinActionRespond.java new file mode 100644 index 0000000000000000000000000000000000000000..768f0efa7f85dadcc54f91d52761dd338f0ee87e --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/JoinActionRespond.java @@ -0,0 +1,22 @@ +package fucoin.actions; + +import java.util.Vector; + +import fucoin.WalletPointer; + +public class JoinActionRespond { + private Vector<WalletPointer> allKnownNeighbors; + + @Override + public String toString() { + return "join"; + } + + public void setKnownNeighbors(Vector<WalletPointer> allKnownNeighbors) { + this.allKnownNeighbors=allKnownNeighbors; + } + + public Vector<WalletPointer> getAllKnownNeighbors() { + return allKnownNeighbors; + } +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/PerformTransactionAction.java b/JavaAkkaFuCoin/src/fucoin/actions/PerformTransactionAction.java new file mode 100644 index 0000000000000000000000000000000000000000..5144911b48e69eaef8a474919a263cce53a38bad --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/PerformTransactionAction.java @@ -0,0 +1,23 @@ +package fucoin.actions; + +import fucoin.WalletPointer; + +public class PerformTransactionAction { + + private WalletPointer walletPointer; + private int amount; + + public PerformTransactionAction(WalletPointer walletPointer, int amount) { + this.walletPointer=walletPointer; + this.amount=amount; + } + + public WalletPointer getWalletPointer() { + return walletPointer; + } + + public int getAmount() { + return amount; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/StoreOrUpdateAction.java b/JavaAkkaFuCoin/src/fucoin/actions/StoreOrUpdateAction.java new file mode 100644 index 0000000000000000000000000000000000000000..694096404d2fb922d60d614a7522fa276ab220b2 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/StoreOrUpdateAction.java @@ -0,0 +1,22 @@ +package fucoin.actions; + +import fucoin.Wallet; + +public class StoreOrUpdateAction { + + private Wallet wallet; + + public void setWallet(Wallet wallet) { + this.wallet=wallet; + } + + public Wallet getWallet() { + return wallet; + } + + @Override + public String toString() { + return "store or update"; + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/TransactionPerformedAction.java b/JavaAkkaFuCoin/src/fucoin/actions/TransactionPerformedAction.java new file mode 100644 index 0000000000000000000000000000000000000000..3c9e1e4c3146385810c94cc815867bba64fa896d --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/TransactionPerformedAction.java @@ -0,0 +1,5 @@ +package fucoin.actions; + +public class TransactionPerformedAction { + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/WaitForAnswersAction.java b/JavaAkkaFuCoin/src/fucoin/actions/WaitForAnswersAction.java new file mode 100644 index 0000000000000000000000000000000000000000..28062a1598331de2abfe8e533462b130ee059a29 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/WaitForAnswersAction.java @@ -0,0 +1,5 @@ +package fucoin.actions; + +public class WaitForAnswersAction { + +} diff --git a/JavaAkkaFuCoin/src/fucoin/actions/WaitForPerformTransactionAction.java b/JavaAkkaFuCoin/src/fucoin/actions/WaitForPerformTransactionAction.java new file mode 100644 index 0000000000000000000000000000000000000000..f197ffbc4e280f007a7919c19b71da8aa099c06b --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/actions/WaitForPerformTransactionAction.java @@ -0,0 +1,21 @@ +package fucoin.actions; + +import fucoin.WalletPointer; + +public class WaitForPerformTransactionAction { + private WalletPointer walletPointer; + private int amount; + + public WaitForPerformTransactionAction(WalletPointer walletPointer, int amount) { + this.walletPointer=walletPointer; + this.amount=amount; + } + + public WalletPointer getWalletPointer() { + return walletPointer; + } + + public int getAmount() { + return amount; + } +} diff --git a/JavaAkkaFuCoin/src/fucoin/gui/IWalletControle.java b/JavaAkkaFuCoin/src/fucoin/gui/IWalletControle.java new file mode 100644 index 0000000000000000000000000000000000000000..ff7f46cd6f47b6a4938fdb7927646a38a4544012 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/gui/IWalletControle.java @@ -0,0 +1,8 @@ +package fucoin.gui; + + +public interface IWalletControle { + public void leave(); + public void store(); + public void send(String address, int amount); +} diff --git a/JavaAkkaFuCoin/src/fucoin/gui/IWalletGuiControle.java b/JavaAkkaFuCoin/src/fucoin/gui/IWalletGuiControle.java new file mode 100644 index 0000000000000000000000000000000000000000..55d46acd3c35a3504d395644486b94f27b8a5a73 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/gui/IWalletGuiControle.java @@ -0,0 +1,12 @@ +package fucoin.gui; + + +public interface IWalletGuiControle { + public void setAddress(String address); + public void setAmount(int amount); + public void addKnownAddress(String address); + public void addLogMsg(String msg); + + + +} diff --git a/JavaAkkaFuCoin/src/fucoin/gui/WalletControle.java b/JavaAkkaFuCoin/src/fucoin/gui/WalletControle.java new file mode 100644 index 0000000000000000000000000000000000000000..a9f72e8ad4bb5ddd85d25d1457c0adf87426bd54 --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/gui/WalletControle.java @@ -0,0 +1,24 @@ +package fucoin.gui; + + +public class WalletControle implements IWalletControle{ + + @Override + public void leave() { + // TODO Auto-generated method stub + + } + + @Override + public void store() { + // TODO Auto-generated method stub + + } + + @Override + public void send(String address, int amount) { + // TODO Auto-generated method stub + + } + +} diff --git a/JavaAkkaFuCoin/src/fucoin/gui/WalletGui.java b/JavaAkkaFuCoin/src/fucoin/gui/WalletGui.java new file mode 100644 index 0000000000000000000000000000000000000000..f6ccfc1eebb5503b426784251547843e048f9d1f --- /dev/null +++ b/JavaAkkaFuCoin/src/fucoin/gui/WalletGui.java @@ -0,0 +1,142 @@ +package fucoin.gui; + +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; + +import javax.swing.ComboBoxModel; +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JTextField; + + +public class WalletGui implements IWalletGuiControle{ + DefaultListModel<String> log = new DefaultListModel<String>(); + + private JFrame window = new JFrame("test"); + JPanel topPanel = new JPanel(); + JLabel lblMyAddress = new JLabel("My Address:"); + JTextField txtMyAddress = new JTextField("<MyAddress>"); + JLabel lblEmpty = new JLabel(""); + JLabel lblMyAmount = new JLabel("My FUCs"); + JTextField txtMyAmount = new JTextField("<MyFUCs>"); + JPanel centerPanel = new JPanel(); + JLabel lblSendTo = new JLabel("Send to:"); + JComboBox<String> txtSendTo = new JComboBox<String>(); + JLabel lblSendAmount = new JLabel("Amount:"); + JTextField txtSendAmount = new JTextField("<Amount>"); + JButton btnSend = new JButton("Send"); + JButton btnSearch = new JButton("Search"); + JButton btnStore = new JButton("Store"); + JButton btnExit = new JButton("Exit"); + JPanel bottomPanel = new JPanel(); + JList<String> txtLog = new JList<String>(log); + +public WalletGui(IWalletControle walletControle) { + + + window.setSize(400, 600); + window.setLayout(new GridLayout(3, 1)); + topPanel.setLayout(new GridLayout(2, 3)); + // Row 1 + topPanel.add(lblMyAddress); + topPanel.add(txtMyAddress); + topPanel.add(lblEmpty); + // Row 2 + topPanel.add(lblMyAmount); + topPanel.add(txtMyAmount); + window.add(topPanel); + //<hr> + centerPanel.setLayout(new GridLayout(3, 1)); + // Row 1 + JPanel centerup = new JPanel(); + centerup.setLayout(new BorderLayout()); + centerup.add(lblSendTo,BorderLayout.WEST); + centerup.add(txtSendTo,BorderLayout.CENTER); + centerPanel.add(centerup); + // Row 2 + JPanel centerdown = new JPanel(); + centerdown.setLayout(new GridLayout(1, 3)); + centerdown.add(lblSendAmount); + centerdown.add(txtSendAmount); + centerdown.add(btnSend); + centerPanel.add(centerdown); + //centerPanel.add(new JLabel("")); + // Row 3 + JPanel centerdown2 = new JPanel(); + centerdown2.setLayout(new GridLayout(1, 3)); + centerdown2.add(btnSearch); + centerdown2.add(btnStore); + centerdown2.add(btnExit); + centerPanel.add(centerdown2); + window.add(centerPanel); + //<hr> + bottomPanel.setLayout(new GridLayout(1, 1)); + bottomPanel.add(txtLog); + window.add(bottomPanel); + window.setVisible(true); + + btnSend.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + walletControle.send(txtSendTo.getSelectedItem().toString(), Integer.parseInt(txtSendAmount.getText())); + } + }); + + btnStore.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + walletControle.store(); + } + }); + + btnExit.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + window.dispose(); + } + }); + + window.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + System.out.println("window closing"); + walletControle.leave(); + } + }); +} +public static void main(String[] args) { + new WalletGui(new WalletControle()); +} +@Override +public void setAddress(String address) { + txtMyAddress.setText(address); + window.setTitle(address); +} +@Override +public void setAmount(int amount) { + txtMyAmount.setText(""+amount); +} + +@Override +public void addKnownAddress(String address) { + + txtSendTo.addItem(address); +} +@Override +public void addLogMsg(String msg) { + log.addElement(msg); +} +}