(file) Return to CQLFactory.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / CQL

  1 karl  1.5 //%2005////////////////////////////////////////////////////////////////////////
  2 chuck 1.3 //
  3 karl  1.5 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4           // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5           // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 chuck 1.3 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.5 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8           // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9           // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10           // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 chuck 1.3 //
 12           // Permission is hereby granted, free of charge, to any person obtaining a copy
 13           // of this software and associated documentation files (the "Software"), to
 14           // deal in the Software without restriction, including without limitation the
 15           // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16           // sell copies of the Software, and to permit persons to whom the Software is
 17           // furnished to do so, subject to the following conditions:
 18           // 
 19           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20           // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21           // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22           // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23           // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24           // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25           // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26           // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27           //
 28           //==============================================================================
 29           //
 30           // Authors: David Rosckes (rosckes@us.ibm.com)
 31           //          Bert Rivero (hurivero@us.ibm.com)
 32 chuck 1.3 //          Chuck Carmack (carmack@us.ibm.com)
 33           //          Brian Lucier (lucier@us.ibm.com)
 34           //
 35           // Modified By: 
 36           //
 37           //%/////////////////////////////////////////////////////////////////////////////
 38           
 39 humberto 1.1 #include "CQLFactory.h"
 40 humberto 1.4 #include <Pegasus/Common/Tracer.h>
 41 humberto 1.1 
 42              PEGASUS_NAMESPACE_BEGIN
 43              
 44 chuck    1.3 CQLOBJECTPTR _CQLObjectPtr;
 45              
 46              /*
 47              #define PEGASUS_ARRAY_T CQLObjectPtr
 48              #include <Pegasus/Common/ArrayImpl.h>
 49              #undef PEGASUS_ARRAY_T
 50              */
 51              
 52              /*
 53              CQLFactory::CQLFactory(){
 54              
 55              }
 56              */
 57              CQLFactory::~CQLFactory(){
 58              	cleanup();
 59              }
 60              
 61              void CQLFactory::cleanup(){
 62 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::cleanup");
 63 chuck    1.3 	cleanupArray(_makeObjectIdentifiers, Identifier);
 64              	cleanupArray(_makeObjectChainedIdentifiers, ChainedIdentifier);
 65              	cleanupArray(_makeObjectValues, Value);
 66              	cleanupArray(_makeObjectFunctions, Function);
 67              	cleanupArray(_makeObjectFactors, Factor);
 68              	cleanupArray(_makeObjectTerms, Term);
 69              	cleanupArray(_makeObjectExpressions, Expression);
 70              	cleanupArray(_makeObjectSimplePredicates, SimplePredicate);
 71              	cleanupArray(_makeObjectPredicates, Predicate);
 72              	cleanupArray(_getObjectIdentifiers, Identifier);
 73                      cleanupArray(_getObjectChainedIdentifiers, ChainedIdentifier);
 74                      cleanupArray(_getObjectValues, Value);
 75                      cleanupArray(_getObjectFunctions, Function);
 76                      cleanupArray(_getObjectFactors, Factor);
 77                      cleanupArray(_getObjectTerms, Term);
 78                      cleanupArray(_getObjectExpressions, Expression);
 79                      cleanupArray(_getObjectSimplePredicates, SimplePredicate);
 80                      cleanupArray(_getObjectPredicates, Predicate);
 81 humberto 1.4 PEG_METHOD_EXIT();
 82 chuck    1.3 }
 83              void CQLFactory::cleanupArray(Array<CQLObjectPtr>& arr, FactoryType type){
 84              	for(Uint32 i=0;i < arr.size(); i++){
 85              		if(arr[i]._ptr){
 86              			switch(type){
 87              			   case Predicate:
 88              				delete (CQLPredicate*)(arr[i]._ptr);
 89              				break;
 90              			   case SimplePredicate:
 91                                              delete (CQLSimplePredicate*)(arr[i]._ptr);
 92                                              break;
 93              			   case Expression:
 94                                              delete (CQLExpression*)(arr[i]._ptr);
 95                                              break;
 96              			   case Term:
 97                                              delete (CQLTerm*)(arr[i]._ptr);
 98                                              break;
 99              			   case Factor:
100                                              delete (CQLFactor*)(arr[i]._ptr);
101                                              break;
102              			   case Function:
103 chuck    1.3                                 delete (CQLFunction*)(arr[i]._ptr);
104                                              break;
105              			   case Value:
106                                              delete (CQLValue*)(arr[i]._ptr);
107                                              break;
108              			   case ChainedIdentifier:
109                                              delete (CQLChainedIdentifier*)(arr[i]._ptr);
110                                              break;
111              			   case Identifier:
112                                              delete (CQLIdentifier*)(arr[i]._ptr);
113                                              break;
114              			}
115              		}
116              	}
117              }
118              
119 humberto 1.1 void* CQLFactory::makeObject(CQLIdentifier* obj, FactoryType target){
120 chuck    1.3   //printf("CQLFactory::makeObject(identifier)\n");
121 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLIdentifier");
122 chuck    1.3 	_CQLObjectPtr._ptr = new CQLChainedIdentifier(*obj);
123                      _makeObjectChainedIdentifiers.append(_CQLObjectPtr);
124 humberto 1.1 	switch(target){
125              	  case ChainedIdentifier:
126 chuck    1.3 		return _makeObjectChainedIdentifiers[_makeObjectChainedIdentifiers.size()-1]._ptr;
127 humberto 1.1 		break;
128              	  case Identifier:
129              		return NULL;
130              		break;
131                        default:
132 chuck    1.3 		return makeObject((CQLChainedIdentifier*)(_CQLObjectPtr._ptr), target);
133 humberto 1.1 		break;
134                      }
135 humberto 1.4 PEG_METHOD_EXIT();
136 humberto 1.1 }
137              void* CQLFactory::makeObject(CQLChainedIdentifier* obj, FactoryType target){
138 chuck    1.3 //printf("CQLFactory::makeObject(chainedidentifier)\n");
139 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLChainedIdentifier");
140 chuck    1.3 	_CQLObjectPtr._ptr = new CQLValue(*obj);
141              	CQLValue* _val = (CQLValue*)_CQLObjectPtr._ptr;
142                      _makeObjectValues.append(_CQLObjectPtr);
143 humberto 1.1 	switch(target){
144                        case Value:
145 chuck    1.3                 return _makeObjectValues[_makeObjectValues.size()-1]._ptr;
146 humberto 1.1                 break;
147                        case ChainedIdentifier:
148                              return NULL;
149                              break;
150                        default:
151 chuck    1.3                 return makeObject((CQLValue*)(_CQLObjectPtr._ptr), target);
152 humberto 1.1                 break;
153                      }
154 humberto 1.4 PEG_METHOD_EXIT();
155 humberto 1.1 }
156              void* CQLFactory::makeObject(CQLValue* obj, FactoryType target){
157 chuck    1.3 //printf("CQLFactory::makeObject(value)\n");
158 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLValue");
159 chuck    1.3 	_CQLObjectPtr._ptr = new CQLFactor(*obj);
160                      _makeObjectFactors.append(_CQLObjectPtr);
161 humberto 1.1 	switch(target){
162                        case Factor:
163 chuck    1.3                 return _makeObjectFactors[_makeObjectFactors.size()-1]._ptr;
164 humberto 1.1                 break;
165                        case Value:
166                              return NULL;
167                              break;
168                        default:
169 chuck    1.3                 return makeObject((CQLFactor*)(_CQLObjectPtr._ptr), target);
170 humberto 1.1                 break;
171                      }
172 humberto 1.4 PEG_METHOD_EXIT();
173 humberto 1.1 }
174 chuck    1.3 void* CQLFactory::makeObject(CQLFunction* obj, FactoryType target){
175              //printf("CQLFactory::makeObject(function)\n");
176 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLFunction");
177 chuck    1.3 	_CQLObjectPtr._ptr = new CQLFactor(*obj);
178                      _makeObjectFactors.append(_CQLObjectPtr);
179                      switch(target){
180                        case Factor:
181                              return _makeObjectFactors[_makeObjectFactors.size()-1]._ptr;
182                              break;
183                        default:
184                              return makeObject((CQLFactor*)(_CQLObjectPtr._ptr), target);
185                              break;
186                      }
187 humberto 1.4 PEG_METHOD_EXIT();
188 chuck    1.3 }
189 humberto 1.1 void* CQLFactory::makeObject(CQLFactor* obj, FactoryType target){
190 chuck    1.3 //printf("CQLFactory::makeObject(factor)\n");
191 humberto 1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLFactor");
192 chuck    1.3 	_CQLObjectPtr._ptr = new CQLTerm(*obj);
193                      _makeObjectTerms.append(_CQLObjectPtr);
194 humberto 1.1 	switch(target){
195                        case Term:
196 chuck    1.3                 return _makeObjectTerms[_makeObjectTerms.size()-1]._ptr;
197 humberto 1.1                 break;
198                        case Factor:
199                              return NULL;
200                              break;
201                        default:
202 chuck    1.3                 return makeObject((CQLTerm*)(_CQLObjectPtr._ptr), target);
203 humberto 1.1                 break;
204                      }
205 carson.hovey 1.7 PEG_METHOD_EXIT();
206 humberto     1.1 }
207                  void* CQLFactory::makeObject(CQLTerm* obj, FactoryType target){
208 chuck        1.3 //printf("CQLFactory::makeObject(term)\n");
209 humberto     1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLTerm");
210 chuck        1.3 	_CQLObjectPtr._ptr = new CQLExpression(*obj);
211                          _makeObjectExpressions.append(_CQLObjectPtr);
212 humberto     1.1 	switch(target){
213                            case Expression:
214 chuck        1.3                 return _makeObjectExpressions[_makeObjectExpressions.size()-1]._ptr;
215 humberto     1.1                 break;
216                            case Term:
217                                  return NULL;
218                                  break;
219                            default:
220 chuck        1.3                 return makeObject((CQLExpression*)(_CQLObjectPtr._ptr), target);
221 humberto     1.1                 break;
222                          }
223 humberto     1.4 PEG_METHOD_EXIT();
224 humberto     1.1 }
225                  void* CQLFactory::makeObject(CQLExpression* obj, FactoryType target){
226 chuck        1.3 //printf("CQLFactory::makeObject(expression)\n");
227 humberto     1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLExpression");
228 chuck        1.3 	_CQLObjectPtr._ptr = new CQLSimplePredicate(*obj);
229                  	_makeObjectSimplePredicates.append(_CQLObjectPtr);
230 humberto     1.1 	switch(target){
231                            case SimplePredicate:
232 chuck        1.3                 return _makeObjectSimplePredicates[_makeObjectSimplePredicates.size()-1]._ptr;
233 humberto     1.1                 break;
234                            case Expression:
235                                  return NULL;
236                                  break;
237                            default:
238 chuck        1.3                 return makeObject((CQLSimplePredicate*)(_CQLObjectPtr._ptr), target);
239 humberto     1.1                 break;
240                          }
241 humberto     1.4 PEG_METHOD_EXIT();
242 humberto     1.1 }
243                  void* CQLFactory::makeObject(CQLSimplePredicate* obj, FactoryType target){
244 chuck        1.3 //printf("CQLFactory::makeObject(simplepredicate)\n");
245 humberto     1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::makeObject,CQLSimplePredicate");
246 chuck        1.3 	_CQLObjectPtr._ptr = new CQLPredicate(*obj);
247                  	_makeObjectPredicates.append(_CQLObjectPtr);
248 humberto     1.1 	switch(target){
249                            case Predicate:
250 chuck        1.3                 return _makeObjectPredicates[_makeObjectPredicates.size()-1]._ptr;
251                                  break;
252                            default:
253                                  return NULL;
254                                  break;
255                          }
256 humberto     1.4 PEG_METHOD_EXIT();
257 chuck        1.3 }
258                  
259                  void* CQLFactory::getObject(void* inObject, FactoryType inObjectType, FactoryType targetType){
260 humberto     1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::getObject");
261 chuck        1.3 	switch(inObjectType){
262                  		case Predicate:
263 carson.hovey 1.7 			{
264                  			PEG_METHOD_EXIT();
265 chuck        1.3 			return getObject(((CQLPredicate*)inObject),targetType);
266 carson.hovey 1.7 			}
267 chuck        1.3 		case SimplePredicate:
268 carson.hovey 1.7 			{
269                  			PEG_METHOD_EXIT();
270 chuck        1.3 			return getObject(((CQLSimplePredicate*)inObject),targetType);
271 carson.hovey 1.7 			}
272 chuck        1.3 		case Expression:
273 carson.hovey 1.7 			{
274                  			PEG_METHOD_EXIT();
275 chuck        1.3 			return getObject(((CQLExpression*)inObject),targetType);
276 carson.hovey 1.7 			}
277 chuck        1.3 		case Term:
278 carson.hovey 1.7 			{
279                  			PEG_METHOD_EXIT();
280 chuck        1.3 			return getObject(((CQLTerm*)inObject),targetType);
281 carson.hovey 1.7 			}
282 chuck        1.3 		case Factor:
283 carson.hovey 1.7 			{
284                  			PEG_METHOD_EXIT();
285 chuck        1.3 			return getObject(((CQLFactor*)inObject),targetType);
286 carson.hovey 1.7 			}
287 chuck        1.3 		case Function:
288 carson.hovey 1.7 			{
289                  			PEG_METHOD_EXIT();
290 chuck        1.3 			return NULL;
291 carson.hovey 1.7 			}
292 chuck        1.3 		case Value:
293 carson.hovey 1.7 			{
294                  			PEG_METHOD_EXIT();
295 chuck        1.3 			return getObject(((CQLValue*)inObject),targetType);
296 carson.hovey 1.7 			}
297 chuck        1.3 		case ChainedIdentifier:
298 carson.hovey 1.7 			{
299                  			PEG_METHOD_EXIT();
300 chuck        1.3 			return getObject(((CQLChainedIdentifier*)inObject),targetType);
301 carson.hovey 1.7 			}
302 chuck        1.3 		default:
303 carson.hovey 1.7 			{
304                  			PEG_METHOD_EXIT();
305 chuck        1.3 			return NULL;
306 carson.hovey 1.7 			}
307 chuck        1.3 	}
308                  }
309                  
310                  void* CQLFactory::getObject(CQLChainedIdentifier* obj, FactoryType target){
311                  //	printf("CQLFactory::getObject(CQLChainedIdentifier* obj)\n");
312                     Array<CQLIdentifier> cqlIds;
313                  
314                  	switch(target){
315                            case Identifier:
316                              //if(obj->_rep->_subIdentifiers.size() > 0){
317                           cqlIds = obj->getSubIdentifiers();
318                           if(cqlIds.size() > 0){
319                  
320                             //	_CQLObjectPtr._ptr = new CQLIdentifier(obj->_rep->_subIdentifiers[0]);
321                  			_CQLObjectPtr._ptr = new CQLIdentifier(cqlIds[0]);
322                  			_getObjectIdentifiers.append(_CQLObjectPtr);
323                                  	return _getObjectIdentifiers[_getObjectIdentifiers.size()-1]._ptr;
324                           }
325                  		return NULL;
326                            default:
327                                  return NULL;
328 chuck        1.3         }
329                  }
330                  
331                  void* CQLFactory::getObject(CQLValue* obj, FactoryType target){
332                  //	printf("CQLFactory::getObject(CQLValue* obj)\n");
333                  	switch(target){
334                            case ChainedIdentifier:
335                  		_CQLObjectPtr._ptr = new CQLChainedIdentifier(obj->_rep->_CQLChainId);
336                  		_getObjectChainedIdentifiers.append(_CQLObjectPtr);
337                  		return _getObjectChainedIdentifiers[_getObjectChainedIdentifiers.size()-1]._ptr;
338                  	  case Identifier:
339                  		return getObject(&(obj->_rep->_CQLChainId),target);
340                            default:
341                                  return NULL;
342                                  break;
343                          }
344                  }
345                  
346                  void* CQLFactory::getObject(CQLFactor* obj, FactoryType target){
347                  //	printf("CQLFactory::getObject(CQLFactor* obj)\n");
348                          switch(target){
349 chuck        1.3           case Function:
350                  		_CQLObjectPtr._ptr = new CQLFunction(obj->_rep->_CQLFunct);
351                                  _getObjectFunctions.append(_CQLObjectPtr);
352                  		return _getObjectFunctions[_getObjectFunctions.size()-1]._ptr;
353                  	  case Value:
354                  		_CQLObjectPtr._ptr = new CQLValue(obj->_rep->_CQLVal);
355                                  _getObjectValues.append(_CQLObjectPtr);
356                  		return _getObjectValues[_getObjectValues.size()-1]._ptr;
357                            case ChainedIdentifier:
358                            case Identifier:
359                  		return getObject(&(obj->_rep->_CQLVal),target);
360                            default:
361                                  return NULL;
362 humberto     1.1                 break;
363 chuck        1.3         }                                                                                                                                                    
364                  }
365                  
366                  
367                  void* CQLFactory::getObject(CQLTerm* obj, FactoryType target){
368                  //	printf("CQLFactory::getObject(CQLTerm* obj)\n");
369                          switch(target){
370                  	  case Factor:
371                  		_CQLObjectPtr._ptr = new CQLFactor(obj->getFactors()[0]);
372                                  _getObjectFactors.append(_CQLObjectPtr);
373                  		return _getObjectFactors[_getObjectFactors.size()-1]._ptr;
374                            case Function:
375                  	  case Value:
376                            case ChainedIdentifier:
377                            case Identifier:
378                  		return getObject(&(obj->getFactors()[0]),target);
379 humberto     1.1           default:
380                                  return NULL;
381                                  break;
382                          }
383 chuck        1.3 }
384 humberto     1.1 
385 chuck        1.3 void* CQLFactory::getObject(CQLExpression* obj, FactoryType target){
386                  //	printf("CQLFactory::getObject(CQLExpression* obj)\n");
387                          switch(target){
388                  	  case Term:
389                  		_CQLObjectPtr._ptr = new CQLTerm(obj->getTerms()[0]);
390                                  _getObjectTerms.append(_CQLObjectPtr);
391                                  return _getObjectTerms[_getObjectTerms.size()-1]._ptr;
392                            case Factor:
393                            case Function:
394                  	  case Value:
395                            case ChainedIdentifier:
396                            case Identifier:
397                  		return getObject(&(obj->getTerms()[0]), target);
398                            default:
399                  		return NULL;
400                                  break;
401                          }                                                                                                                                                    
402 humberto     1.1 }
403                  
404 chuck        1.3 void* CQLFactory::getObject(CQLSimplePredicate* obj, FactoryType target){
405                  //	printf("CQLFactory::getObject(CQLSimplePredicate* obj)\n");
406                          switch(target){
407                  	  case Expression:
408                  		_CQLObjectPtr._ptr = new CQLExpression(obj->_rep->_leftSide);
409                                  _getObjectExpressions.append(_CQLObjectPtr);
410                                  return _getObjectExpressions[_getObjectExpressions.size()-1]._ptr;
411                            case Term:
412                            case Factor:
413                            case Function:
414                  	  case Value:
415                            case ChainedIdentifier:
416                            case Identifier:
417                  		return getObject(&(obj->_rep->_leftSide), target);
418                            default:
419                                  return NULL;
420                                  break;
421                          }
422                  }
423 humberto     1.1 
424 chuck        1.3 void* CQLFactory::getObject(CQLPredicate* obj, FactoryType target){
425                  //	printf("CQLFactory::getObject(CQLPredicate* obj)\n");
426                          switch(target){
427                            case SimplePredicate:
428                  		_CQLObjectPtr._ptr = new CQLSimplePredicate(obj->_rep->_simplePredicate);
429                                  _getObjectSimplePredicates.append(_CQLObjectPtr);
430                                  return _getObjectSimplePredicates[_getObjectSimplePredicates.size()-1]._ptr;
431                  	  case Expression:
432                  	  case Term:
433                  	  case Factor:
434                  	  case Function:
435                  	  case Value:
436                  	  case ChainedIdentifier:
437                  	  case Identifier:
438                  		return getObject(&(obj->_rep->_simplePredicate), target);
439                            default:
440                                  return NULL;
441                                  break;
442                          }
443                  }
444                  
445 chuck        1.3 void CQLFactory::setObject(CQLPredicate* predicate, void* obj, FactoryType objType){
446 humberto     1.4 PEG_METHOD_ENTER(TRC_CQL, "CQLFactory::setObject");
447 chuck        1.3 	switch(objType){
448                  	  case SimplePredicate:
449                  		predicate->_rep->_simplePredicate = *((CQLSimplePredicate*)obj);
450                  		break;
451                  	  case Expression:
452                  		predicate->_rep->_simplePredicate._rep->_leftSide = *((CQLExpression*)obj);
453                  		break;
454                            case Term:
455                            	predicate->_rep->_simplePredicate._rep->_leftSide._rep->_CQLTerms[0] =  
456                  			*((CQLTerm*)obj);
457                  		break;
458                            case Factor:
459                  		predicate->_rep->_simplePredicate._rep->_leftSide._rep->_CQLTerms[0]._rep->_Factors[0] = 
460                  			*((CQLFactor*)obj);
461                  		break;
462                            case Function:
463                  		predicate->_rep->_simplePredicate._rep->_leftSide._rep->_CQLTerms[0]._rep->_Factors[0]._rep->_CQLFunct =
464                                          *((CQLFunction*)obj);
465                  		break;
466                  	  case Value:
467                  		predicate->_rep->_simplePredicate._rep->_leftSide._rep->_CQLTerms[0]._rep->_Factors[0]._rep->_CQLVal =
468 chuck        1.3                         *((CQLValue*)obj);
469                  		break;
470                  	  case ChainedIdentifier:
471                  		predicate->_rep->_simplePredicate._rep->_leftSide._rep->_CQLTerms[0]._rep->_Factors[0]._rep->_CQLVal._rep->_CQLChainId = *((CQLChainedIdentifier*)obj);
472                  		break;
473                  	  case Identifier:
474                  		break;
475                  	  default:
476                  		break;
477                  	}
478 humberto     1.4 PEG_METHOD_EXIT();
479 chuck        1.3 } 
480 humberto     1.1 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2