diff options
author | Martin <marcin.j.chrzanowski@gmail.com> | 2019-11-18 14:53:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-18 14:53:44 +0100 |
commit | e742bf9b8d1bc5ee7a97586510643db6fd3174f2 (patch) | |
tree | f1bf701c819a842e1f82e328cf3118556411502f /src/main/java/pl/edu/mimuw/cloudatlas/agent | |
parent | 015e46aa190a36c593eeff8b09cea43d9902de0d (diff) |
Implement basic API (#15)
Diffstat (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent')
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java | 5 | ||||
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/agent/ApiImplementation.java | 71 |
2 files changed, 69 insertions, 7 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java index 95ede6e..8eb8b4f 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java @@ -6,11 +6,14 @@ import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import pl.edu.mimuw.cloudatlas.api.Api; +import pl.edu.mimuw.cloudatlas.interpreter.Main; +import pl.edu.mimuw.cloudatlas.model.ZMI; public class Agent { public static void main(String[] args) { try { - ApiImplementation api = new ApiImplementation(); + ZMI root = Main.createTestHierarchy2(); + ApiImplementation api = new ApiImplementation(root); Api apiStub = (Api) UnicastRemoteObject.exportObject(api, 0); Registry registry = LocateRegistry.getRegistry(); diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/ApiImplementation.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/ApiImplementation.java index fd52052..12682a6 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/ApiImplementation.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/ApiImplementation.java @@ -5,32 +5,91 @@ import java.rmi.RemoteException; import java.util.Set; import java.util.HashSet; +import pl.edu.mimuw.cloudatlas.model.Attribute; import pl.edu.mimuw.cloudatlas.model.AttributesMap; +import pl.edu.mimuw.cloudatlas.model.PathName; import pl.edu.mimuw.cloudatlas.model.ValueContact; import pl.edu.mimuw.cloudatlas.model.Value; +import pl.edu.mimuw.cloudatlas.model.ValueQuery; import pl.edu.mimuw.cloudatlas.model.ValueSet; import pl.edu.mimuw.cloudatlas.model.ValueNull; import pl.edu.mimuw.cloudatlas.model.TypePrimitive; +import pl.edu.mimuw.cloudatlas.model.ZMI; import pl.edu.mimuw.cloudatlas.api.Api; public class ApiImplementation implements Api { + ZMI root; + Set<ValueContact> contacts; + + public ApiImplementation(ZMI root) { + this.root = root; + this.contacts = new HashSet<ValueContact>(); + } + public Set<String> getZoneSet() throws RemoteException { - return null; + Set<String> zones = new HashSet<String>(); + collectZoneNames(root, zones); + return zones; + } + + private void collectZoneNames(ZMI zone, Set<String> names) { + names.add(zone.getPathName().toString()); + for (ZMI son : zone.getSons()) { + collectZoneNames(son, names); + } } - public AttributesMap getZoneAttributeValue(String zoneName) throws RemoteException { - return null; + public AttributesMap getZoneAttributeValues(String zoneName) throws RemoteException { + try { + ZMI zmi = root.findDescendant(new PathName(zoneName)); + return zmi.getAttributes(); + } catch (ZMI.NoSuchZoneException e) { + throw new RemoteException("Zone not found", e); + } } - public void installQuery(String queryName, String query) throws RemoteException { + public void installQuery(String name, String queryCode) throws RemoteException { + try { + ValueQuery query = new ValueQuery(queryCode); + Attribute attributeName = new Attribute(name); + installQueryInHierarchy(root, attributeName, query); + } catch (Exception e) { + throw new RemoteException("Failed to install query", e); + } + } + + private void installQueryInHierarchy(ZMI zmi, Attribute queryName, ValueQuery query) { + if (!zmi.getSons().isEmpty()) { + zmi.getAttributes().addOrChange(queryName, query); + for (ZMI son : zmi.getSons()) { + installQueryInHierarchy(son, queryName, query); + } + } } public void uninstallQuery(String queryName) throws RemoteException { + uninstallQueryInHierarchy(root, new Attribute(queryName)); + } + + private void uninstallQueryInHierarchy(ZMI zmi, Attribute queryName) { + if (!zmi.getSons().isEmpty()) { + zmi.getAttributes().remove(queryName); + for (ZMI son : zmi.getSons()) { + uninstallQueryInHierarchy(son, queryName); + } + } } - public void setAttributeValue(String attributeName, Value value) throws RemoteException { + public void setAttributeValue(String zoneName, String attributeName, Value value) throws RemoteException { + try { + ZMI zmi = root.findDescendant(new PathName(zoneName)); + zmi.getAttributes().addOrChange(new Attribute(attributeName), value); + } catch (ZMI.NoSuchZoneException e) { + throw new RemoteException("Zone not found", e); + } } - public void setFallbackContacts(Set<ValueContact> serializedContacts) throws RemoteException { + public void setFallbackContacts(Set<ValueContact> contacts) throws RemoteException { + this.contacts = contacts; } } |