From 3c62b863509131e78c18ed13c6b83e4fc508848f Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 23 Nov 2024 13:51:12 -0500 Subject: import replica code from assignment --- .../java/derms/replica/replica1/Resources.java | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/main/java/derms/replica/replica1/Resources.java (limited to 'src/main/java/derms/replica/replica1/Resources.java') diff --git a/src/main/java/derms/replica/replica1/Resources.java b/src/main/java/derms/replica/replica1/Resources.java new file mode 100644 index 0000000..0eb8bf2 --- /dev/null +++ b/src/main/java/derms/replica/replica1/Resources.java @@ -0,0 +1,74 @@ +package derms.replica.replica1; + +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +public class Resources { + private Map> resources; + + public Resources() { + this.resources = new ConcurrentHashMap>(); + } + + public List borrowed(CoordinatorID borrower, ResourceName name) { + List borrowed = new ArrayList(); + Resource[] namedResources = getByName(name); + for (Resource r : namedResources) { + if (r.isBorrowed && r.borrower.equals(borrower)) { + borrowed.add(r); + } + } + return borrowed; + } + + public Resource getByID(ResourceID id) throws NoSuchElementException { + for (Map rids : resources.values()) { + Resource resource = rids.get(id); + if (resource != null) { + return resource; + } + } + throw new NoSuchElementException("No such resource "+id); + } + + public Resource[] getByName(ResourceName name) { + Map rids = resources.get(name); + if (rids == null) { + return new Resource[0]; + } + Resource[] r = new Resource[0]; + return rids.values().toArray(r); + } + + public void add(Resource r) { + Map rids; + synchronized (resources) { + rids = resources.get(r.name); + if (rids == null) { + rids = new ConcurrentHashMap(); + resources.put(r.name, rids); + } + } + synchronized (rids) { + Resource existing = rids.get(r.id); + if (existing != null) { + existing.duration += r.duration; + } else { + rids.put(r.id, r); + } + } + } + + public void removeByID(ResourceID id) throws NoSuchElementException { + for (Map rids : resources.values()) { + if (rids.containsKey(id)) { + rids.remove(id); + return; + } + } + throw new NoSuchElementException("No such resource "+id); + } +} -- cgit v1.2.3