RemoveInputsFilter.java revision 1472:c18cbe5936b8
1214518Srpaulo/*
2190214Srpaulo * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
3190214Srpaulo * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4190214Srpaulo *
5190214Srpaulo * This code is free software; you can redistribute it and/or modify it
6190214Srpaulo * under the terms of the GNU General Public License version 2 only, as
7190214Srpaulo * published by the Free Software Foundation.
8190214Srpaulo *
9190214Srpaulo * This code is distributed in the hope that it will be useful, but WITHOUT
10190214Srpaulo * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11190214Srpaulo * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12190214Srpaulo * version 2 for more details (a copy is included in the LICENSE file that
13190214Srpaulo * accompanied this code).
14190214Srpaulo *
15190214Srpaulo * You should have received a copy of the GNU General Public License version
16190214Srpaulo * 2 along with this work; if not, write to the Free Software Foundation,
17190214Srpaulo * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18190214Srpaulo *
19190214Srpaulo * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20190214Srpaulo * or visit www.oracle.com if you need additional information or have any
21190214Srpaulo * questions.
22190214Srpaulo *
23190214Srpaulo */
24190214Srpaulopackage com.sun.hotspot.igv.filter;
25190214Srpaulo
26190214Srpauloimport com.sun.hotspot.igv.graph.Connection;
27190214Srpauloimport com.sun.hotspot.igv.graph.Diagram;
28190214Srpauloimport com.sun.hotspot.igv.graph.Figure;
29190214Srpauloimport com.sun.hotspot.igv.graph.InputSlot;
30190214Srpauloimport com.sun.hotspot.igv.graph.OutputSlot;
31190214Srpauloimport com.sun.hotspot.igv.graph.Selector;
32190214Srpauloimport java.util.ArrayList;
33190214Srpauloimport java.util.List;
34190214Srpaulo
35190214Srpaulo/**
36190214Srpaulo *
37190214Srpaulo * @author Thomas Wuerthinger
38190214Srpaulo */
39190214Srpaulopublic class RemoveInputsFilter extends AbstractFilter {
40190214Srpaulo
41190214Srpaulo    private List<RemoveInputsRule> rules;
42190214Srpaulo    private String name;
43190214Srpaulo
44190214Srpaulo    public RemoveInputsFilter(String name) {
45190214Srpaulo        this.name = name;
46190214Srpaulo        rules = new ArrayList<RemoveInputsRule>();
47190214Srpaulo    }
48190214Srpaulo
49190214Srpaulo    public String getName() {
50190214Srpaulo        return name;
51190214Srpaulo    }
52190214Srpaulo
53190214Srpaulo    public void apply(Diagram diagram) {
54190214Srpaulo
55190214Srpaulo        for (RemoveInputsRule r : rules) {
56190214Srpaulo
57214518Srpaulo            List<Figure> list = r.getSelector().selected(diagram);
58235426Sdelphij            for (Figure f : list) {
59214518Srpaulo                int z = 0;
60190214Srpaulo                List<InputSlot> last = new ArrayList<InputSlot>();
61190214Srpaulo                for (InputSlot is : f.getInputSlots()) {
62190214Srpaulo                    if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) {
63190214Srpaulo                        StringBuilder sb = new StringBuilder();
64190214Srpaulo                        List<Connection> conns = is.getConnections();
65190214Srpaulo                        for (int i = 0; i < conns.size(); i++) {
66190214Srpaulo                            Connection c = conns.get(i);
67190214Srpaulo                            OutputSlot os = c.getOutputSlot();
68190214Srpaulo                            Figure pred = os.getFigure();
69190214Srpaulo                            if (i != 0) {
70190214Srpaulo                                sb.append("<BR>");
71190214Srpaulo                            }
72190214Srpaulo                            sb.append(pred.getLines()[0]);
73                        }
74                        is.removeAllConnections();
75                        is.setShortName("X");
76                        is.setName(sb.toString());
77                        last.add(is);
78                    } else {
79                        last.clear();
80                    }
81                    z++;
82                }
83
84                if (last.size() > 3) {
85                    InputSlot first = last.get(0);
86                    first.setShortName("XX");
87
88                    StringBuilder sb = new StringBuilder();
89                    for (int i = 0; i < last.size(); i++) {
90                        InputSlot is2 = last.get(i);
91                        if (i != 0) {
92                            sb.append("<BR>");
93                        }
94                        sb.append(is2.getName());
95                    }
96
97                    first.setName(sb.toString());
98
99                    for (int i = 1; i < last.size(); i++) {
100                        f.removeSlot(last.get(i));
101                    }
102                }
103            }
104        }
105    }
106
107    public void addRule(RemoveInputsRule rule) {
108        rules.add(rule);
109    }
110
111    public static class RemoveInputsRule {
112
113        private Selector selector;
114        private int startingIndex;
115        private int endIndex;
116
117        public RemoveInputsRule(Selector selector) {
118            this(selector, 0);
119        }
120
121        public RemoveInputsRule(Selector selector, int startIndex) {
122            this(selector, startIndex, Integer.MAX_VALUE);
123        }
124
125        public RemoveInputsRule(Selector selector, int startIndex, int endIndex) {
126            this.startingIndex = startIndex;
127            this.endIndex = endIndex;
128            this.selector = selector;
129        }
130
131        public int getStartingIndex() {
132            return startingIndex;
133        }
134
135        public int getEndIndex() {
136            return endIndex;
137        }
138
139        public Selector getSelector() {
140            return selector;
141        }
142    }
143}
144