Skip to content
This repository has been archived by the owner on Feb 5, 2024. It is now read-only.

Commit

Permalink
A lot of stuff... Good luck!
Browse files Browse the repository at this point in the history
  • Loading branch information
Wm. Keith van der Meulen committed Aug 25, 2017
1 parent 2e620ee commit 21b1f97
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 26 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<dependency>
<groupId>de.hasenburg</groupId>
<artifactId>fbasecommons</artifactId>
<version>0.0.4</version>
<version>0.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/control/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class Configuration {

// System
private String system;
private String localOS;
private String folderSeparator;
private String root;

public Configuration() {
Expand All @@ -43,8 +45,23 @@ public Configuration(String configName) {

// System
system = properties.getProperty("system");
localOS = properties.getProperty("localOS", "unix").toLowerCase();
root = properties.getProperty("root", "");

// Set
switch(localOS) {
case "unix":
folderSeparator = "/";
break;
case "windows":
folderSeparator = "\\";
break;
default:
folderSeparator = "/";
break;
}


// TODO Check all fields are properly set
} catch (IOException | NumberFormatException e) {
e.printStackTrace();
Expand Down Expand Up @@ -76,6 +93,14 @@ public String getSystem() {
return system;
}

public String getLocalOS() {
return localOS;
}

public String getFolderSeparator() {
return folderSeparator;
}

public String getRoot() {
return root;
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/control/NamingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public NamingService(IControllable controller, Configuration configuration) {
this.controller = controller;
this.configuration = configuration;
NamespaceReceiver receiver = new NamespaceReceiver(this, configuration.getAddress(), configuration.getPort());
receiver.startReceiving();

try {
initialize();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/control/Starter.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public class Starter {

public static void main(String[] args) {
Configuration configuration = new Configuration();
IControllable controller = new LocalFileController(new File(configuration.getRoot()));
IControllable controller = new LocalFileController(new File(configuration.getRoot()), configuration.getFolderSeparator());
new NamingService(controller, configuration);
}

Expand Down
37 changes: 36 additions & 1 deletion src/main/java/database/TestInterface.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,42 @@ private static void useLocalFiles() {
}
} while (error);

controller = new LocalFileController(f);
System.out.println("Local System Types:\n"
+ "1) Unix\n"
+ "2) Windows");

System.out.print("\nType the number of your local system type: ");
error = false;
String folderSeparator = null;
do {
error = false;

try {
int input = Integer.parseInt(scanner.nextLine());

switch(input) {
case 1:
folderSeparator = "/";
break;
case 2:
folderSeparator = "\\";
break;
default:
error = true;
}

} catch (NumberFormatException e) {
error = true;
}

if(error == true) {
System.out.print("\nNumber not recognized. Please enter the number of your local system type: ");
}

System.out.print("\n");
} while (error);

controller = new LocalFileController(f, folderSeparator);
}

private static void useZooKeeper() {
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/database/localfiles/LocalFileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@

public class LocalFileController implements IControllable {
private File rootDir;
private String dataFileName = "\\data.txt";
private String dataFileName;

public LocalFileController(File rootDir) {
public LocalFileController(File rootDir, String folderSeparator) {
this.rootDir = rootDir;
dataFileName = folderSeparator + "data.txt";
}

@Override
Expand Down
27 changes: 26 additions & 1 deletion src/main/java/namespace/Keygroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ private Response<Boolean> addNodeToKeygroup(IControllable controller, KeygroupMe
try {
if(isActive(controller, keygroupID.toString())) {
// Get current data from key group
String data = controller.readNode(keygroupID.toString());
String data = controller.readNode(pathPrefixActive + keygroupID.toString());

// Parse to object, add nodeID to list, parse back to byte[]
KeygroupConfig keygroup = JSONable.fromJSON(data.toString(), KeygroupConfig.class);
Expand Down Expand Up @@ -165,6 +165,31 @@ Response<Boolean> removeNodeFromKeygroup(IControllable controller, NodeID nodeID
}
}

/**
* Responds with all information about the Keygroup.
*
* @param controller Controller for interfacing with base distributed system
* @param keygroupID The ID to the Keygroup to get information from
* @return Response object with String containing the Keygroup information
*/
Response<String> getKeygroupInfo(IControllable controller, KeygroupID keygroupID) {
try {
String data = null;
if(isActive(controller, keygroupID.toString())) {
data = controller.readNode(activePath(keygroupID.toString())).toString();
} else if (isTombstoned(controller, keygroupID.toString())) {
data = controller.readNode(tombstonedPath(keygroupID.toString())).toString();
} else {
return new Response<String>(null, ResponseCode.ERROR_DOESNT_EXIST);
}

return new Response<String>(data, ResponseCode.SUCCESS);
} catch (InterruptedException e) {
e.printStackTrace();
return new Response<String>(null, ResponseCode.ERROR_INTERNAL);
}
}

/**
* Responds with all information about the Keygroup. This includes the
* encryption key and algorithm, so can only be called by nodes in the Keygroup.
Expand Down
58 changes: 38 additions & 20 deletions src/main/java/namespace/MessageParser.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package namespace;

import com.fasterxml.jackson.core.type.TypeReference;

import crypto.CryptoProvider.EncryptionAlgorithm;
import database.IControllable;
import model.JSONable;
Expand Down Expand Up @@ -63,37 +65,37 @@ public static Response<?> runCommand(IControllable controller, Envelope envelope
}
}

private static Response<?> clientCreate(IControllable controller, String content) {
private static Response<Boolean> clientCreate(IControllable controller, String content) {
ClientConfig client = JSONable.fromJSON(content, ClientConfig.class);
return Client.getInstance().registerClient(controller, client);
}

private static Response<?> clientRead(IControllable controller, String content) {
private static Response<String> clientRead(IControllable controller, String content) {
ClientID clientID = JSONable.fromJSON(content, ClientID.class);
return Client.getInstance().getClientInfo(controller, clientID);
}

private static Response<?> clientUpdate(IControllable controller, String content) {
private static Response<Boolean> clientUpdate(IControllable controller, String content) {
ClientConfig client = JSONable.fromJSON(content, ClientConfig.class);
return Client.getInstance().updateClientInfo(controller, client);
}

private static Response<?> clientDelete(IControllable controller, String content) {
private static Response<Boolean> clientDelete(IControllable controller, String content) {
ClientID clientID = JSONable.fromJSON(content, ClientID.class);
return Client.getInstance().removeClient(controller, clientID);
}

private static Response<?> nodeCreate(IControllable controller, String content) {
private static Response<Boolean> nodeCreate(IControllable controller, String content) {
NodeConfig node = JSONable.fromJSON(content, NodeConfig.class);
return Node.getInstance().registerNode(controller, node);
}

private static Response<?> nodeRead(IControllable controller, String content) {
private static Response<String> nodeRead(IControllable controller, String content) {
NodeID nodeID = JSONable.fromJSON(content, NodeID.class);
return Node.getInstance().getNodeInfo(controller, nodeID);
}

private static Response<?> nodeUpdate(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> nodeUpdate(IControllable controller, String content, NodeID senderID) {
NodeConfig node = JSONable.fromJSON(content, NodeConfig.class);
if(senderID.equals(node.getNodeID())) {
return Node.getInstance().updateNodeInfo(controller, node);
Expand All @@ -102,7 +104,7 @@ private static Response<?> nodeUpdate(IControllable controller, String content,
}
}

private static Response<?> nodeDelete(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> nodeDelete(IControllable controller, String content, NodeID senderID) {
NodeID nodeID = JSONable.fromJSON(content, NodeID.class);
if(senderID.equals(nodeID)) {
return Node.getInstance().removeNode(controller, nodeID);
Expand All @@ -111,14 +113,14 @@ private static Response<?> nodeDelete(IControllable controller, String content,
}
}

private static Response<?> keygroupCreate(IControllable controller, String content) {
private static Response<Boolean> keygroupCreate(IControllable controller, String content) {
KeygroupConfig keygroup = JSONable.fromJSON(content, KeygroupConfig.class);
return Keygroup.getInstance().createKeygroup(controller, keygroup);
}

private static Response<?> keygroupAddReplicaNode(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> keygroupAddReplicaNode(IControllable controller, String content, NodeID senderID) {
// Get KeygroupID and node from JSON via wrapper
ConfigToKeygroupWrapper wrapper = JSONable.fromJSON(content, ConfigToKeygroupWrapper.class);
ConfigToKeygroupWrapper<ReplicaNodeConfig> wrapper = JSONable.fromJSON(content, new TypeReference<ConfigToKeygroupWrapper<ReplicaNodeConfig>>() {});
KeygroupID keygroupID = wrapper.getKeygroupID();
ReplicaNodeConfig replicaNode = (ReplicaNodeConfig) wrapper.getConfig();

Expand All @@ -133,9 +135,9 @@ private static Response<?> keygroupAddReplicaNode(IControllable controller, Stri
}
}

private static Response<?> keygroupAddTriggerNode(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> keygroupAddTriggerNode(IControllable controller, String content, NodeID senderID) {
// Get KeygroupID and node from JSON via wrapper
ConfigToKeygroupWrapper wrapper = JSONable.fromJSON(content, ConfigToKeygroupWrapper.class);
ConfigToKeygroupWrapper<TriggerNodeConfig> wrapper = JSONable.fromJSON(content, new TypeReference<ConfigToKeygroupWrapper<TriggerNodeConfig>>() {});
KeygroupID keygroupID = wrapper.getKeygroupID();
TriggerNodeConfig triggerNode = (TriggerNodeConfig) wrapper.getConfig();

Expand All @@ -150,16 +152,32 @@ private static Response<?> keygroupAddTriggerNode(IControllable controller, Stri
}
}

private static Response<?> keygroupRead(IControllable controller, String content, NodeID senderID) {
KeygroupConfig keygroup = JSONable.fromJSON(content, KeygroupConfig.class);
if(keygroup.containsReplicaNode(senderID) || keygroup.containsTriggerNode(senderID)) {
return Keygroup.getInstance().getKeygroupInfoAuthorized(controller, keygroup.getKeygroupID());
private static Response<String> keygroupRead(IControllable controller, String content, NodeID senderID) {
KeygroupID id = JSONable.fromJSON(content, KeygroupID.class);
Response<String> r = Keygroup.getInstance().getKeygroupInfo(controller, id);

if(r.getResponseCode().equals(ResponseCode.SUCCESS)) {
KeygroupConfig keygroup = JSONable.fromJSON(r.getValue(), KeygroupConfig.class);

if(keygroup.containsReplicaNode(senderID) || keygroup.containsTriggerNode(senderID)) {
return r;
} else {
// Remove encryption algorithm and secret
keygroup.setEncryptionAlgorithm(null);
keygroup.setEncryptionSecret(null);

String data = JSONable.toJSON(keygroup);

return new Response<String>(data, ResponseCode.SUCCESS);
}
} else if (r.getValue() == null){
return r;
} else {
return Keygroup.getInstance().getKeygroupInfoUnauthorized(controller, keygroup.getKeygroupID());
return new Response<String>(null, ResponseCode.ERROR_INTERNAL);
}
}

private static Response<?> keygroupUpdateCrypto(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> keygroupUpdateCrypto(IControllable controller, String content, NodeID senderID) {
// Get KeygroupID and node from JSON via wrapper
CryptoToKeygroupWrapper wrapper = JSONable.fromJSON(content, CryptoToKeygroupWrapper.class);
KeygroupID keygroupID = wrapper.getKeygroupID();
Expand All @@ -177,7 +195,7 @@ private static Response<?> keygroupUpdateCrypto(IControllable controller, String
}
}

private static Response<?> keygroupDelete(IControllable controller, String content, NodeID senderID) {
private static Response<Boolean> keygroupDelete(IControllable controller, String content, NodeID senderID) {
KeygroupID keygroupID = JSONable.fromJSON(content, KeygroupID.class);

// Get keygroup specified from the KeygroupID
Expand Down
16 changes: 16 additions & 0 deletions src/main/resources/sample_local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
! The configuration file for FBaseNamingService
!
! Rename this file local.properties for the system to use it

! General
address: <your computer address>
port: <your communication port>

! Security
publicKey: <your public key>
privateKey: <your private key>

! System
system: <choose either "local" or "zookeeper">
localOS: <choose "unix" or "windows">
root: <path to root testing folder - Windows systems must have "\\" between folders>

0 comments on commit 21b1f97

Please sign in to comment.