View Javadoc

1    /*
2    *  soapUI, copyright (C) 2004-2007 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.impl.wsdl.loadtest.log;
14  
15  import java.util.ArrayList;
16  import java.util.Collections;
17  import java.util.HashMap;
18  import java.util.List;
19  import java.util.Map;
20  import java.util.Stack;
21  
22  import javax.swing.AbstractListModel;
23  
24  import com.eviware.soapui.SoapUI;
25  import com.eviware.soapui.impl.wsdl.loadtest.WsdlLoadTest;
26  import com.eviware.soapui.model.support.TestSuiteListenerAdapter;
27  import com.eviware.soapui.model.testsuite.TestStep;
28  
29  /***
30   * Log for LoadTest events
31   * 
32   * @author Ole.Matzura
33   */
34  
35  public class LoadTestLog extends AbstractListModel implements Runnable
36  {
37  	private List<LoadTestLogEntry> entries = Collections.synchronizedList( new ArrayList<LoadTestLogEntry>());
38  	private final WsdlLoadTest loadTest;
39  	private int totalErrorCount;
40  	private Map<String,Integer> errorCounts = new HashMap<String,Integer>();
41  	private Stack<LoadTestLogEntry> entriesStack = new Stack<LoadTestLogEntry>();
42  	private Thread modelThread;
43  	private InternalTestSuiteListener testSuiteListener = new InternalTestSuiteListener();
44  	
45  	public LoadTestLog(WsdlLoadTest loadTest)
46  	{
47  		this.loadTest = loadTest;
48  		loadTest.getTestCase().getTestSuite().addTestSuiteListener( testSuiteListener );
49  	}
50  	
51  	public void release()
52  	{
53  		loadTest.getTestCase().getTestSuite().removeTestSuiteListener( testSuiteListener );
54  	}
55  
56  	public int getSize()
57  	{
58  		return entries.size();
59  	}
60  
61  	public Object getElementAt(int index)
62  	{
63  		return entries.get( index );
64  	}
65  	
66  	public synchronized void addEntry( LoadTestLogEntry entry )
67  	{
68  		entriesStack.push( entry );
69  		
70  		if( modelThread == null )
71  		{
72  			modelThread = new Thread( this, loadTest.getName() + " LoadTestLog Updater" );
73  			modelThread.start();
74  		}
75  	}
76  	
77  	public void run()
78  	{
79  		// always run at least once
80  		while( true )
81  		{
82  			try
83  			{
84  				while( !entriesStack.isEmpty() )
85  				{
86  					int cnt = 0;
87  					while (cnt < 10 && !entriesStack.isEmpty())
88  					{
89  						LoadTestLogEntry entry = entriesStack.pop();
90  						if (entry != null)
91  						{
92  							entries.add(entry);
93  							if (entry.isError())
94  							{
95  								totalErrorCount++;
96  								TestStep targetStep = entry.getTargetStep();
97  								String stepName = targetStep == null ? "- Total -" : targetStep.getName();
98  								
99  								Integer errorCount = errorCounts.get(stepName);
100 								if (errorCount == null)
101 									errorCount = 1;
102 								else
103 									errorCount = errorCount + 1;
104 
105 								errorCounts.put(stepName, errorCount);
106 							}
107 
108 							cnt++;
109 						}
110 					}
111 					
112 					if (cnt > 0)
113 						fireIntervalAdded(this, entries.size() - cnt, entries.size() - 1);
114 				}			
115 				
116 				// break if load test is not running
117 				if( !loadTest.isRunning() )
118 					break;
119 				
120 				Thread.sleep( 200 );
121 			}
122 			catch (Exception e)
123 			{
124 				SoapUI.logError( e );
125 			}			
126 		}
127 		
128 		modelThread = null;
129 	}
130 		
131 	public void clear()
132 	{
133 		entriesStack.clear();
134 		
135 		if( !entries.isEmpty() )
136 		{
137 			int size = entries.size();
138 			entries.clear();
139 			fireIntervalRemoved( this, 0, size-1 );
140 			totalErrorCount = 0;
141 			errorCounts.clear();
142 		}
143 	}
144 
145 	public void clearErrors()
146 	{
147 		int sz = entries.size();
148 		
149 		for( int c = 0; c < entries.size(); c++ )
150 		{
151 			if( entries.get( c ).isError() )
152 			{
153 				entries.remove( c );
154 				c--;
155 			}
156 		}
157 
158 		totalErrorCount = 0;
159 		errorCounts.clear();
160 		
161 		if( sz > entries.size() )
162 		{
163 			fireIntervalRemoved( this, entries.size(), sz );
164 			fireContentsChanged( this, 0, entries.size() );
165 		}
166 	}
167 	
168 	public void clearEntries( TestStep testStep )
169 	{
170 		int sz = entries.size();
171 		
172 		String testStepName = testStep.getName();
173 		for( int c = 0; c < entries.size(); c++ )
174 		{
175 			if( entries.get( c ).getTargetStep() != null && testStepName.equals( entries.get( c ).getTargetStep().getName() ) )
176 			{
177 				entries.remove( c );
178 				c--;
179 			}
180 		}
181 
182 		if( errorCounts.containsKey( testStepName ))
183 		{
184 			totalErrorCount -= errorCounts.get( testStepName ).intValue();
185 			errorCounts.remove( testStepName );
186 		}
187 		
188 		if( sz > entries.size() )
189 		{
190 			fireIntervalRemoved( this, entries.size(), sz );
191 			fireContentsChanged( this, 0, entries.size() );
192 		}
193 	}
194 
195 	public WsdlLoadTest getLoadTest()
196 	{
197 		return loadTest;
198 	}
199 
200 	public int getErrorCount( String stepName )
201 	{
202 		if( stepName == null )
203 			return totalErrorCount;
204 
205 		Integer counts = errorCounts.get( stepName );
206 		return counts == null ? 0 : counts; 
207 	}
208 	
209 	private final class InternalTestSuiteListener extends TestSuiteListenerAdapter
210 	{
211 		public void testStepRemoved(TestStep testStep, int index)
212 		{
213 			if( testStep.getTestCase() == loadTest.getTestCase() )
214 			{
215 				clearEntries( testStep );
216 			}
217 		}
218 	}
219 }