public static boolean edgeIsTransient(DAGEdge<?, Dependency> input) { Desire desire = input.getLabel().getInitialDesire(); return desireIsTransient(desire); }
private static List<String> extractOrderKey(DAGEdge<Component,Dependency> node) { Desire desire = node.getLabel().getInitialDesire(); InjectionPoint ip = desire.getInjectionPoint(); List<String> key = new ArrayList<>(4); Member member = ip.getMember(); if (member instanceof Constructor) { key.add("0: constructor"); key.add(Integer.toString(ip.getParameterIndex())); } else if (member instanceof Method) { key.add("1: setter"); key.add(member.getName()); key.add(Integer.toString(ip.getParameterIndex())); } else if (member instanceof Field) { key.add("2: field"); key.add(member.getName()); } else if (ip instanceof SimpleInjectionPoint) { key.add("5: simple"); } else { key.add("9: unknown"); key.add(ip.getClass().getName()); } return key; }
/** * Find a node with a satisfaction for a specified type. Does a breadth-first * search to find the closest matching one. * * @param type The type to look for. * @return A node whose satisfaction is compatible with {@code type}. */ @Nullable public static DAGNode<Component,Dependency> findSatisfyingNode(DAGNode<Component,Dependency> graph, final QualifierMatcher qmatch, final Class<?> type) { Optional<DAGEdge<Component, Dependency>> edge = graph.breadthFirstEdges() .filter(e -> type.isAssignableFrom(e.getTail() .getLabel() .getSatisfaction() .getErasedType())) .filter(e -> qmatch.apply(e.getLabel() .getInitialDesire() .getInjectionPoint() .getQualifier())) .findFirst(); return edge.map(DAGEdge::getTail) .orElse(null); } }
Collections.sort(edges, GraphtUtils.DEP_EDGE_ORDER); for (DAGEdge<Component, Dependency> e: edges) { Desire dep = e.getLabel().getInitialDesire(); Annotation q = dep.getInjectionPoint().getQualifier(); DAGNode<Component, Dependency> targetNode = e.getTail(); EdgeBuilder eb = EdgeBuilder.create(port, tid) .set("arrowhead", "vee"); if (e.getLabel().isFixed()) { eb.set("arrowtail", "crow");
public DAGNode<Component, Dependency> processNode(@Nonnull DAGNode<Component, Dependency> node, @Nonnull DAGNode<Component, Dependency> original) { Component label = node.getLabel(); if (!label.getSatisfaction().hasInstance()) { Satisfaction instanceSat = Satisfactions.nullOfType(label.getSatisfaction().getErasedType()); Component newLbl = Component.create(instanceSat, label.getCachePolicy()); // build new node with replacement label DAGNodeBuilder<Component,Dependency> bld = DAGNode.newBuilder(newLbl); // retain all non-transient edges for (DAGEdge<Component,Dependency> edge: node.getOutgoingEdges()) { if (!GraphtUtils.edgeIsTransient(edge)) { bld.addEdge(edge.getTail(), edge.getLabel()); } } DAGNode<Component,Dependency> repl = bld.build(); logger.debug("simulating instantiation of {}", node); return repl; } else { return node; } } }
bld.addEdge(edge.getTail(), edge.getLabel());
public DAGNode<Component, Dependency> processNode(@Nonnull DAGNode<Component, Dependency> node, @Nonnull DAGNode<Component, Dependency> original) { Component label = node.getLabel(); Satisfaction satisfaction = label.getSatisfaction(); if (satisfaction.hasInstance()) { return node; } Object obj = instantiator.apply(node); Satisfaction instanceSat; if (obj == null) { instanceSat = Satisfactions.nullOfType(satisfaction.getErasedType()); } else { instanceSat = Satisfactions.instance(obj); } Component newLabel = Component.create(instanceSat, label.getCachePolicy()); // build new node with replacement label DAGNodeBuilder<Component,Dependency> bld = DAGNode.newBuilder(newLabel); // retain all non-transient edges for (DAGEdge<Component, Dependency> edge: node.getOutgoingEdges()) { if (!GraphtUtils.edgeIsTransient(edge)) { bld.addEdge(edge.getTail(), edge.getLabel()); } } return bld.build(); } }
@Override public boolean apply(@Nullable DAGEdge<?, E> input) { E label = input == null ? null : input.getLabel(); return pred.apply(label); } };
/** * Get the outgoing edge with the specified target and label, if it exists. * @param target The target node. * @param label The label. * @return The edge from this node to {@code target} with label {@code label}, if it exists, or * {@code null} if no such edge exists. */ public DAGEdge<V,E> getOutgoingEdge(DAGNode<V,E> target, E label) { for (DAGEdge<V,E> edge: outgoingEdges) { if (edge.getTail().equals(target) && edge.getLabel().equals(label)) { return edge; } } return null; }
@Override public boolean equals(Object o) { if (o == this) { return true; } else if (o instanceof DAGEdge) { DAGEdge<?,?> oe = (DAGEdge<?,?>) o; return head.equals(oe.getHead()) && tail.equals(oe.getTail()) && label.equals(oe.getLabel()); } else { return false; } }
@Nullable @Override public Instantiator apply(@Nullable Desire input) { for (DAGEdge<Component,Dependency> edge: edges) { if (edge.getLabel().getInitialDesire().equals(input)) { return makeInstantiator(edge.getTail(), backEdges); } } return null; } }
private Map<Desire, Instantiator> makeDependencyMap(DAGNode<Component, Dependency> node, SetMultimap<DAGNode<Component, Dependency>, DAGEdge<Component, Dependency>> backEdges) { Set<DAGEdge<Component,Dependency>> edges = node.getOutgoingEdges(); if (backEdges.containsKey(node)) { ImmutableSet.Builder<DAGEdge<Component,Dependency>> bld = ImmutableSet.builder(); edges = bld.addAll(edges) .addAll(backEdges.get(node)) .build(); } ImmutableSet.Builder<Desire> desires = ImmutableSet.builder(); for (DAGEdge<Component,Dependency> edge: edges) { desires.add(edge.getLabel().getInitialDesire()); } return Maps.asMap(desires.build(), new DepLookup(edges, backEdges)); }
public static boolean edgeIsTransient(DAGEdge<?, Dependency> input) { Desire desire = input.getLabel().getInitialDesire(); return desireIsTransient(desire); }
private static List<String> extractOrderKey(DAGEdge<Component,Dependency> node) { Desire desire = node.getLabel().getInitialDesire(); InjectionPoint ip = desire.getInjectionPoint(); List<String> key = new ArrayList<>(4); Member member = ip.getMember(); if (member instanceof Constructor) { key.add("0: constructor"); key.add(Integer.toString(ip.getParameterIndex())); } else if (member instanceof Method) { key.add("1: setter"); key.add(member.getName()); key.add(Integer.toString(ip.getParameterIndex())); } else if (member instanceof Field) { key.add("2: field"); key.add(member.getName()); } else if (ip instanceof SimpleInjectionPoint) { key.add("5: simple"); } else { key.add("9: unknown"); key.add(ip.getClass().getName()); } return key; }
@Nullable @Override public DAGEdge<V, E> apply(@Nullable DAGEdge<V, E> input) { if (input == null) { return null; } DAGNode<V,E> nt, nh; nt = func.apply(input.getTail()); nh = func.apply(input.getHead()); if (nt == null) { nt = input.getTail(); } if (nh == null) { nh = input.getHead(); } if (!nt.equals(input.getTail()) || !nh.equals(input.getHead())) { return create(nh, nt, input.getLabel()); } else { return input; } } };
private void replaceNode(DAGNode<Component,Dependency> old, DAGNode<Component,Dependency> repl) { Map<DAGNode<Component,Dependency>, DAGNode<Component,Dependency>> memory = Maps.newHashMap(); graph = graph.replaceNode(old, repl, memory); // loop over a snapshot of the list, replacing nodes Collection<DAGEdge<Component, Dependency>> oldBackEdges = backEdges.values(); backEdges = HashMultimap.create(); for (DAGEdge<Component,Dependency> edge: oldBackEdges) { DAGNode<Component,Dependency> newHead, newTail; newHead = memory.get(edge.getHead()); if (newHead == null) { newHead = edge.getHead(); } newTail = memory.get(edge.getTail()); if (newTail == null) { newTail = edge.getTail(); } DAGEdge<Component,Dependency> newEdge; if (newHead.equals(edge.getHead()) && newTail.equals(edge.getTail())) { newEdge = edge; } else { newEdge = DAGEdge.create(newHead, newTail, edge.getLabel()); } backEdges.put(newHead, newEdge); } }
/** * Find a node with a satisfaction for a specified type. Does a breadth-first * search to find the closest matching one. * * @param type The type to look for. * @return A node whose satisfaction is compatible with {@code type}. */ @Nullable public static DAGNode<Component,Dependency> findSatisfyingNode(DAGNode<Component,Dependency> graph, final QualifierMatcher qmatch, final Class<?> type) { Optional<DAGEdge<Component, Dependency>> edge = graph.breadthFirstEdges() .filter(e -> type.isAssignableFrom(e.getTail() .getLabel() .getSatisfaction() .getErasedType())) .filter(e -> qmatch.apply(e.getLabel() .getInitialDesire() .getInjectionPoint() .getQualifier())) .findFirst(); return edge.map(DAGEdge::getTail) .orElse(null); } }
/** * Create a new builder initialized to build a copy of the specified node. * @param node The node to copy. * @param <V> The type of node labels. * @param <E> The type of edge labels. * @return A new builder initialized with the labels and edges of {@code node}. */ public static <V,E> DAGNodeBuilder<V,E> copyBuilder(DAGNode<V,E> node) { DAGNodeBuilder<V,E> bld = newBuilder(node.getLabel()); for (DAGEdge<V,E> edge: node.getOutgoingEdges()) { bld.addEdge(edge.getTail(), edge.getLabel()); } return bld; }
public DAGNode<Component, Dependency> processNode(@Nonnull DAGNode<Component, Dependency> node, @Nonnull DAGNode<Component, Dependency> original) { Component label = node.getLabel(); if (!label.getSatisfaction().hasInstance()) { Satisfaction instanceSat = Satisfactions.nullOfType(label.getSatisfaction().getErasedType()); Component newLbl = Component.create(instanceSat, label.getCachePolicy()); // build new node with replacement label DAGNodeBuilder<Component,Dependency> bld = DAGNode.newBuilder(newLbl); // retain all non-transient edges for (DAGEdge<Component,Dependency> edge: node.getOutgoingEdges()) { if (!GraphtUtils.edgeIsTransient(edge)) { bld.addEdge(edge.getTail(), edge.getLabel()); } } DAGNode<Component,Dependency> repl = bld.build(); logger.debug("simulating instantiation of {}", node); return repl; } else { return node; } } }
public DAGNode<Component, Dependency> processNode(@Nonnull DAGNode<Component, Dependency> node, @Nonnull DAGNode<Component, Dependency> original) { Component label = node.getLabel(); Satisfaction satisfaction = label.getSatisfaction(); if (satisfaction.hasInstance()) { return node; } Object obj = instantiator.apply(node); Satisfaction instanceSat; if (obj == null) { instanceSat = Satisfactions.nullOfType(satisfaction.getErasedType()); } else { instanceSat = Satisfactions.instance(obj); } Component newLabel = Component.create(instanceSat, label.getCachePolicy()); // build new node with replacement label DAGNodeBuilder<Component,Dependency> bld = DAGNode.newBuilder(newLabel); // retain all non-transient edges for (DAGEdge<Component, Dependency> edge: node.getOutgoingEdges()) { if (!GraphtUtils.edgeIsTransient(edge)) { bld.addEdge(edge.getTail(), edge.getLabel()); } } return bld.build(); } }