1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */ 
17   
18  package org.apache.commons.betwixt;
19  
20  /** <p> This is a bean specifically designed to test cyclic references. 
21    * The idea is that there's a count that counts every time <code>getFriend</code>
22    * gets called and throws a <code>RuntimeException</code> if the count gets too high.</p>
23    *
24    * @author Robert Burrell Donkin
25    * @version $Revision: 438373 $
26    */
27  public class LoopBean
28  {
29      private static int count = 0;
30      
31      private static final int max_count = 100;
32  
33      private LoopBean friend;
34      
35      private String name;
36      
37      public static final LoopBean createNoLoopExampleBean()
38      {
39          LoopBean root = new LoopBean("Root");
40          LoopBean levelOne = new LoopBean("level1");
41          LoopBean levelTwo = new LoopBean("level2");
42          LoopBean levelThree = new LoopBean("level3");
43          LoopBean levelFour = new LoopBean("level4");
44          LoopBean levelFive = new LoopBean("level5");
45          
46          root.setFriend(levelOne);
47          levelOne.setFriend(levelTwo);
48          levelTwo.setFriend(levelThree);
49          levelThree.setFriend(levelFour);
50          levelFour.setFriend(levelFive);
51          
52          return root;
53      }    
54          
55      public static final LoopBean createLoopExampleBean()
56      {
57          LoopBean root = new LoopBean("Root");
58          LoopBean levelOne = new LoopBean("level1");
59          LoopBean levelTwo = new LoopBean("level2");
60          LoopBean levelThree = new LoopBean("level3");
61          LoopBean levelFour = new LoopBean("level4");
62          LoopBean levelFive = new LoopBean("level5");
63          
64          root.setFriend(levelOne);
65          levelOne.setFriend(levelTwo);
66          levelTwo.setFriend(levelThree);
67          levelThree.setFriend(levelFour);
68          levelFour.setFriend(levelFive);
69          levelFive.setFriend(root);
70          
71          return root;
72      }
73      
74      
75      public static final LoopBean createNotEmptyNoLoopExampleBean()
76      {
77          LoopBean root = new LoopBean("");
78          LoopBean levelOne = new LoopBean("");
79          LoopBean levelTwo = new LoopBean("");
80          LoopBean levelThree = new LoopBean("");
81          LoopBean levelFour = new LoopBean("");
82          LoopBean levelFive = new LoopBean("Not Empty");
83          
84          root.setFriend(levelOne);
85          levelOne.setFriend(levelTwo);
86          levelTwo.setFriend(levelThree);
87          levelThree.setFriend(levelFour);
88          levelFour.setFriend(levelFive);
89          
90          return root;
91      }
92      
93      public static final LoopBean createEmptyLoopExampleBean()
94      {
95          LoopBean root = new LoopBean("");
96          LoopBean levelOne = new LoopBean("");
97          LoopBean levelTwo = new LoopBean("");
98          LoopBean levelThree = new LoopBean("");
99          LoopBean levelFour = new LoopBean("");
100         LoopBean levelFive = new LoopBean("");
101         
102         root.setFriend(levelOne);
103         levelOne.setFriend(levelTwo);
104         levelTwo.setFriend(levelThree);
105         levelThree.setFriend(levelFour);
106         levelFour.setFriend(levelFive);
107         levelFive.setFriend(root);
108         
109         return root;
110     }
111     
112     public static final LoopBean createIdOnlyLoopExampleBean()
113     {
114         LoopBean root = new LoopBean("Root");
115         LoopBean levelOne = new LoopBean("level1");
116         LoopBean levelTwo = new LoopBean("level2");
117         LoopBean levelThree = new LoopBean("level3");
118         LoopBean levelFour = new LoopBean("level4");
119         LoopBean levelFive = new LoopBean("level5");
120         LoopBean notRoot = new LoopBean("Root");
121         
122         root.setFriend(levelOne);
123         levelOne.setFriend(levelTwo);
124         levelTwo.setFriend(levelThree);
125         levelThree.setFriend(levelFour);
126         levelFour.setFriend(levelFive);
127         levelFive.setFriend(notRoot);
128         
129         return root;
130     }
131     
132     public LoopBean(String name) 
133     {
134         this.name = name;
135     }
136     
137     public LoopBean getFriend()
138     {
139         if (++count > max_count)
140         {
141             throw new RuntimeException("Looping!");
142         }
143         return friend;
144     }
145     
146     public void setFriend(LoopBean friend)
147     {
148         this.friend = friend;
149     }
150     
151     public String getName()
152     {
153         return name;
154     }
155     
156     public String toString()
157     {
158         return "[LoopBean] name=" + name;
159     }
160 }