Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public List<Item> resolve(Collection<Item> items, ItemRegistry registry) {
- final List<Item> resolved = new ArrayList<Item>(items.size());
- final Map<String, List<Item>> unResolved = new HashMap<String, List<Item>>();
- final Deque<Item> resolveQueue = new ArrayDeque<Item>(1000);
- for(Item item : items) {
- for(String dependency : item.getDependencies()) {
- if(registry.contains(dependency)) {
- item.fulfilDependency(dependency);
- } else {
- List<Item> waiting = unResolved.get(dependency);
- if(waiting == null) {
- waiting = new ArrayList<Item>(10);
- unResolved.put(dependency, waiting);
- }
- waiting.add(item);
- }
- }
- if(item.dependenciesMet()) {
- resolveQueue.clear();
- resolveQueue.addFirst(item);
- while(!resolveQueue.isEmpty()) {
- final Item itemToResolve = resolveQueue.removeFirst();
- resolved.add(itemToResolve);
- registry.add(itemToResolve);
- if(unResolved.containsKey(itemToResolve.getName())) {
- final List<Item> waitingItems = unResolved.remove(itemToResolve.getName());
- for(Item waiting : waitingItems) {
- waiting.fulfilDependency(itemToResolve.getName());
- if(waiting.dependenciesMet()) {
- resolveQueue.addFirst(waiting);
- }
- }
- }
- }
- }
- }
- if(!unResolved.isEmpty())
- throw new RuntimeException("Unresolved dependencies: " + unResolved);
- return resolved;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement