package ch.zhaw.ads; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; public class Storage { public static boolean generationalGCActive = false; // in Aufgabe 2 verwendet public static StringBuffer log = new StringBuffer(); private static List root; private static List youngHeap; private static List oldHeap; public static boolean youngGenerationOnly = true; static { clear(); } public static void clear() { root = new LinkedList<>(); youngHeap = new LinkedList<>(); // oldHeap erst in Aufgabe 2 verwenden! oldHeap = new LinkedList<>(); } /* add root object */ public static void addRoot(Collectable obj) { root.add(obj); } // create a collectable object of class cls public static Collectable _new(String cls, Object arg) { Collectable obj = null; try { // create an object and call constructor Constructor cst = Class.forName(getPackage() + cls).getConstructor(arg.getClass()); obj = (Collectable) cst.newInstance(new Object[] {arg}); // add object to heap youngHeap.add(obj); log.append("New: ").append(obj).append("\n"); } catch (Exception ex) { log.append("error creating object ").append(cls).append("\n"); } return obj; } private static String getPackage() { Package pack = Storage.class.getPackage(); if (pack != null && !pack.getName().equals("")) { return pack.getName() + "."; } else { return ""; } } /* remove object from heap */ public static void delete(Collectable obj) { if (youngHeap.remove(obj)) { if (generationalGCActive) { log.append("Delete young heap: ").append(obj).append("\n"); } else { log.append("Delete heap: ").append(obj).append("\n"); } } else if (oldHeap.remove(obj)) { log.append("Delete old heap: ").append(obj).append("\n"); } else { log.append("error trying to delete not existing object ").append(obj).append("\n"); } } /* get all root objects */ public static Iterable getRoot() { return new LinkedList<>(root); } /* get young heap */ public static Iterable getYoungHeap() { return new LinkedList<>(youngHeap); } /* get old heap */ public static Iterable getOldHeap() { return new LinkedList<>(oldHeap); } /* get heap */ public static Iterable getHeap() { return new LinkedList<>(youngHeap); } /* get references to collectables of an object */ public static Iterable getRefs(Collectable obj) { // get all fields of an object List fieldList = new LinkedList<>(); for (Field field : obj.getClass().getFields()) { try { Object o = field.get(obj); if (o instanceof Collectable) { fieldList.add((Collectable) o); } } catch (Exception ex) { ex.printStackTrace(); } } return fieldList; } /* dump an iterator */ public static void dump(String s, Iterable itr) { log.append(s); for (Collectable o: itr) { log.append(" ").append(o); } log.append("\n"); } public static String getLog() { return log.toString(); } private static void mark(Collectable cObject) { // TODO Aufgabe 13.1 } private static void sweep() { // TODO Aufgabe 13.1 und Aufgabe 13.2 } public static void gc() { if (generationalGCActive) { if (youngGenerationOnly) { log.append("\nCollector start young generation only\n"); } else { log.append("\nCollector start young and old generation\n"); } } else { log.append("\nCollector start\n"); } // TODO Aufgabe 13.1 und Aufgabe 13.2 log.append("Collector end\n"); } }