KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > classycle > renderer > AbstractStrongComponentRenderer


1 /*
2  * Copyright (c) 2003-2006, Franz-Josef Elmer, All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * - Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  * - Redistributions in binary form must reproduce the above copyright notice,
10  * this list of conditions and the following disclaimer in the documentation
11  * and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
14  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
15  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
21  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
22  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
23  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */

25 package classycle.renderer;
26
27 import classycle.graph.AtomicVertex;
28 import classycle.graph.GraphAttributes;
29 import classycle.graph.NameAttributes;
30 import classycle.graph.StrongComponent;
31 import classycle.graph.Vertex;
32
33 /**
34  * Abstract superclass of all {@link StrongComponentRenderer}.
35  *
36  * @author Franz-Josef Elmer
37  */

38 public abstract class AbstractStrongComponentRenderer
39                                     implements StrongComponentRenderer {
40   /**
41    * Creates an appropriated name for the specified {@link StrongComponent}.
42    * Usually, the name is the fully-qualified class name of the first vertex in
43    * <tt>component</tt> extended by "et al." if <tt>component</tt> contains
44    * more than one vertex. If <tt>component</tt> contains
45    * only a class and its inner classes the name is the fully-qualified
46    * class name of the outer class extended by "and inner classes".
47    */

48   public static String JavaDoc createName(StrongComponent component) {
49     GraphAttributes ga = (GraphAttributes) component.getAttributes();
50     Vertex fragmenter = ga.getBestFragmenters()[0];
51     String JavaDoc result = ((NameAttributes) fragmenter.getAttributes()).getName();
52     //String result = component.getVertex(0).getAttributes().toString();
53
if (component.getNumberOfVertices() > 1) {
54       AtomicVertex vertex = component.getVertex(0);
55       NameAttributes attributes = (NameAttributes) vertex.getAttributes();
56       String JavaDoc outerClass = attributes.getName();
57       int index = outerClass.indexOf('$');
58       if (index > 0) {
59         outerClass = outerClass.substring(0, index);
60       }
61       boolean isInnerClass = true;
62       for (int i = 0, n = component.getNumberOfVertices(); i < n; i++) {
63         attributes = (NameAttributes) component.getVertex(i).getAttributes();
64         if (attributes.getName().equals(outerClass)) {
65           vertex = component.getVertex(i);
66         } else if (!attributes.getName().startsWith(outerClass)
67             || attributes.getName().charAt(outerClass.length()) != '$') {
68           isInnerClass = false;
69           break;
70         }
71       }
72       attributes = (NameAttributes) vertex.getAttributes();
73       if (isInnerClass) {
74         result = attributes.getName() + " and inner classes";
75       } else {
76         result += " et al.";
77       }
78     }
79     return result;
80   }
81 } //class
Popular Tags