Tue, 09 Apr 2013 14:51:13 +0100
8010393: Update JAX-WS RI to 2.2.9-b12941
Reviewed-by: alanb, erikj
Contributed-by: miroslav.kos@oracle.com, martin.grebac@oracle.com
1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
26 package com.sun.tools.internal.xjc.reader.gbind;
28 import java.util.ArrayList;
29 import java.util.HashSet;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.Set;
34 /**
35 * Graph of {@link Element}s.
36 *
37 * @author Kohsuke Kawaguchi
38 */
39 public final class Graph implements Iterable<ConnectedComponent> {
40 private final Element source = new SourceNode();
41 private final Element sink = new SinkNode();
43 /**
44 * Strongly connected components of this graph.
45 */
46 private final List<ConnectedComponent> ccs = new ArrayList<ConnectedComponent>();
48 /**
49 * Builds a {@link Graph} from an {@link Expression} tree.
50 *
51 * {@link Expression} given to the graph will be modified forever,
52 * and it will not be able to create another {@link Graph}.
53 */
54 public Graph(Expression body) {
55 // attach source and sink
56 Expression whole = new Sequence(new Sequence(source,body),sink);
58 // build up a graph
59 whole.buildDAG(ElementSet.EMPTY_SET);
61 // decompose into strongly connected components.
62 // the algorithm is standard DFS-based algorithm,
63 // one illustration of this algorithm is available at
64 // http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/strongComponent.htm
65 source.assignDfsPostOrder(sink);
66 source.buildStronglyConnectedComponents(ccs);
68 // cut-set check
69 Set<Element> visited = new HashSet<Element>();
70 for (ConnectedComponent cc : ccs) {
71 visited.clear();
72 if(source.checkCutSet(cc,visited)) {
73 cc.isRequired = true;
74 }
75 }
76 }
78 /**
79 * List up {@link ConnectedComponent}s of this graph in an order.
80 */
81 public Iterator<ConnectedComponent> iterator() {
82 return ccs.iterator();
83 }
85 public String toString() {
86 return ccs.toString();
87 }
88 }