You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2012/01/16 23:07:14 UTC

svn commit: r1232192 - in /lucene/dev/trunk/solr: ./ contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ core/src/java/org/apache/solr/analysis/ core/src/java/org/apache/solr/core/ core/src/java/org/apache/solr/handler/ core/src/java...

Author: erick
Date: Mon Jan 16 22:07:13 2012
New Revision: 1232192

URL: http://svn.apache.org/viewvc?rev=1232192&view=rev
Log:
Fixes for SOLR-3032. Removed all the conditional logging for exceptions, we'll rely on the top levels to log the errors appropriately.

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/Config.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrException.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Jan 16 22:07:13 2012
@@ -390,6 +390,12 @@ Other Changes
   
 * SOLR-2607: Removed deprecated client/ruby directory, which included solr-ruby and flare.
   (ehatcher)
+  
+* Solr-3032: logOnce from SolrException logOnce and all the supporting
+  structure is gone. abortOnConfugrationError is also gone as it is no longer referenced.
+  Errors should be caught and logged at the top-most level or logged and NOT propagated up the 
+  chain. (Erick Erickson)
+
 
 Documentation
 ----------------------
@@ -477,6 +483,10 @@ Other Changes
   AppendedSolrParams into factory methods.
   (David Smiley via hossman)
 
+* Solr-3032: Deprecate logOnce from SolrException logOnce and all the supporting
+  structure will disappear in 4.0. Errors should be caught and logged at the
+  top-most level or logged and NOT propagated up the chain. (Erick Erickson)
+
 Build
 ----------------------
 * SOLR-2487: Add build target to package war without slf4j jars (janhoy)

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java Mon Jan 16 22:07:13 2012
@@ -115,7 +115,6 @@ public class DataImportHandler extends R
         }
       }
     } catch (Throwable e) {
-      SolrConfig.severeErrors.add(e);
       LOG.error( DataImporter.MSG.LOAD_EXP, e);
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
               DataImporter.MSG.INVALID_CONFIG, e);

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java Mon Jan 16 22:07:13 2012
@@ -225,7 +225,6 @@ public class DataImporter {
       config.readFromXml((Element) elems.item(0));
       LOG.info("Data Configuration loaded successfully");
     } catch (Exception e) {
-      SolrConfig.severeErrors.add(e);
       throw new DataImportHandlerException(SEVERE,
               "Exception occurred while initializing context", e);
     }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java Mon Jan 16 22:07:13 2012
@@ -111,7 +111,7 @@ public class PhoneticFilterFactory exten
       }
     } 
     catch (Exception e) {
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error initializing: "+name + "/"+clazz, e , false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error initializing: "+name + "/"+clazz, e);
     }
   }
   

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/Config.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/Config.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/Config.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/Config.java Mon Jan 16 22:07:13 2012
@@ -182,7 +182,7 @@ public class Config {
       return o;
 
     } catch (XPathExpressionException e) {
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + path +" for " + name,e,false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + path +" for " + name,e);
     }
   }
 
@@ -208,12 +208,12 @@ public class Config {
 
     } catch (XPathExpressionException e) {
       SolrException.log(log,"Error in xpath",e);
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + xstr + " for " + name,e,false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + xstr + " for " + name,e);
     } catch (SolrException e) {
       throw(e);
     } catch (Throwable e) {
       SolrException.log(log,"Error in xpath",e);
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + xstr+ " for " + name,e,false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Error in xpath:" + xstr+ " for " + name,e);
     }
   }
 
@@ -306,7 +306,7 @@ public class Config {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
         "Invalid luceneMatchVersion '" + matchVersion +
         "', valid values are: " + Arrays.toString(Version.values()) +
-        " or a string in format 'V.V'", iae, false);    
+        " or a string in format 'V.V'", iae);
     }
     
     if (version == Version.LUCENE_CURRENT && !versionWarningAlreadyLogged.getAndSet(true)) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java Mon Jan 16 22:07:13 2012
@@ -206,25 +206,6 @@ public class CoreContainer 
     protected String solrConfigFilename = null;
     protected String dataDir = null; // override datadir for single core mode
 
-    /**
-     * @deprecated all cores now abort on configuration error regardless of configuration
-     */
-    @Deprecated
-    public boolean isAbortOnConfigurationError() {
-      return true;
-    }
-    
-    /**
-     * @deprecated all cores now abort on configuration error regardless of configuration
-     */
-    @Deprecated
-    public void setAbortOnConfigurationError(boolean abortOnConfigurationError) {
-      if (false == abortOnConfigurationError)
-        throw new SolrException
-          (SolrException.ErrorCode.SERVER_ERROR,
-           "Setting abortOnConfigurationError==false is no longer supported");
-    }
-
     // core container instantiation
     public CoreContainer initialize() throws IOException,
         ParserConfigurationException, SAXException {
@@ -353,8 +334,7 @@ public class CoreContainer 
     try {
       containerProperties = readProperties(cfg, ((NodeList) cfg.evaluate("solr", XPathConstants.NODESET)).item(0));
     } catch (Throwable e) {
-      SolrConfig.severeErrors.add(e);
-      SolrException.logOnce(log,null,e);
+      SolrException.log(log,null,e);
     }
 
     NodeList nodes = (NodeList)cfg.evaluate("solr/cores/core", XPathConstants.NODESET);
@@ -410,8 +390,7 @@ public class CoreContainer 
         register(name, core, false);
       }
       catch (Throwable ex) {
-        SolrConfig.severeErrors.add( ex );
-        SolrException.logOnce(log,null,ex);
+        SolrException.log(log,null,ex);
       }
     }
     

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Mon Jan 16 22:07:13 2012
@@ -169,11 +169,8 @@ final class RequestHandlers {
         }
         log.info("created "+info.name+": " + info.className);
       } catch (Exception ex) {
-          SolrConfig.severeErrors.add( ex );
-          SolrException e = new SolrException
+          throw new SolrException
             (ErrorCode.SERVER_ERROR, "RequestHandler init failure", ex);
-          SolrException.logOnce(log,null,e);
-          throw e;
       }
     }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrConfig.java Mon Jan 16 22:07:13 2012
@@ -69,14 +69,6 @@ public class SolrConfig extends Config {
   public static final String DEFAULT_CONF_FILE = "solrconfig.xml";
 
 
-  /**
-   * Singleton keeping track of configuration errors
-   *
-   * @deprecated All exceptions encountered during config parsing are now thrown by the respective constructors, preventing initialization.
-   */
-  @Deprecated
-  public static final Collection<Throwable> severeErrors = new HashSet<Throwable>();
-
   /** Creates a default instance from the solrconfig.xml. */
   public SolrConfig()
   throws ParserConfigurationException, IOException, SAXException {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Mon Jan 16 22:07:13 2012
@@ -414,7 +414,7 @@ public final class SolrCore implements S
     } catch (SolrException e) {
       throw e;
     } catch (Exception e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +cast.getName(), e, false);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +cast.getName(), e);
     }
   }
   
@@ -436,11 +436,11 @@ public final class SolrCore implements S
             return (T)con.newInstance(this, updateHandler);
           } 
         }
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " could not find proper constructor for " +class1.getName(), false);
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " could not find proper constructor for " +class1.getName());
     } catch (SolrException e) {
       throw e;
     } catch (Exception e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +class1.getName(), e, false);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Error Instantiating "+msg+", "+className+ " failed to instantiate " +class1.getName(), e);
     }
   }
 
@@ -616,7 +616,7 @@ public final class SolrCore implements S
       latch.countDown();//release the latch, otherwise we block trying to do the close.  This should be fine, since counting down on a latch of 0 is still fine
       //close down the searcher and any other resources, if it exists, as this is not recoverable
       close();
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, null, e, false);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, null, e);
     } finally {
       // allow firstSearcher events to fire and make sure it is released
       latch.countDown();
@@ -1099,7 +1099,7 @@ public final class SolrCore implements S
         String msg="Error opening new searcher. exceeded limit of maxWarmingSearchers="+maxWarmingSearchers + ", try again later.";
         log.warn(logid+""+ msg);
         // HTTP 503==service unavailable, or 409==Conflict
-        throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE,msg,true);
+        throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE,msg);
       } else if (onDeckSearchers > 1) {
         log.info(logid+"PERFORMANCE WARNING: Overlapping onDeckSearchers=" + onDeckSearchers);
       }
@@ -1220,7 +1220,7 @@ public final class SolrCore implements S
                       try {
                         newSearcher.warm(currSearcher);
                       } catch (Throwable e) {
-                        SolrException.logOnce(log,null,e);
+                        SolrException.log(log, null, e);
                       }
                       return null;
                     }
@@ -1248,7 +1248,7 @@ public final class SolrCore implements S
                           listener.newSearcher(newSearcher,null);
                         }
                       } catch (Throwable e) {
-                        SolrException.logOnce(log,null,e);
+                        SolrException.log(log, null, e);
                       }
                       return null;
                     }
@@ -1276,7 +1276,7 @@ public final class SolrCore implements S
                           listener.newSearcher(newSearcher, currSearcher);
                         }
                       } catch (Throwable e) {
-                        SolrException.logOnce(log,null,e);
+                        SolrException.log(log, null, e);
                       }
                       return null;
                     }
@@ -1309,7 +1309,7 @@ public final class SolrCore implements S
                         decrementOnDeckCount[0]=false;
                         registerSearcher(newSearchHolder);
                       } catch (Throwable e) {
-                        SolrException.logOnce(log,null,e);
+                        SolrException.log(log, null, e);
                       } finally {
                         // we are all done with the old searcher we used
                         // for warming...
@@ -1340,7 +1340,7 @@ public final class SolrCore implements S
       return returnSearcher ? newSearchHolder : null;
 
     } catch (Exception e) {
-      SolrException.logOnce(log,null,e);
+      SolrException.log(log, null, e);
       if (currSearcherHolder != null) currSearcherHolder.decref();
 
       synchronized (searcherLock) {
@@ -1454,7 +1454,7 @@ public final class SolrCore implements S
       
       if (log.isWarnEnabled()) log.warn(logid + msg + ":" + req);
       
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, msg, true);
+      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, msg);
     }
     // setup response header and handle request
     final NamedList<Object> responseHeader = new SimpleOrderedMap<Object>();
@@ -1525,7 +1525,7 @@ public final class SolrCore implements S
 
 
   final public static void log(Throwable e) {
-    SolrException.logOnce(log,null,e);
+    SolrException.log(log, null, e);
   }
 
   
@@ -1579,11 +1579,8 @@ public final class SolrCore implements S
         }
         log.info("created "+info.name+": " + info.className);
       } catch (Exception ex) {
-          SolrConfig.severeErrors.add( ex );
-          SolrException e = new SolrException
+          throw new SolrException
             (SolrException.ErrorCode.SERVER_ERROR, "QueryResponseWriter init failure", ex);
-          SolrException.logOnce(log,null,e);
-          throw e;
       }
     }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Mon Jan 16 22:07:13 2012
@@ -406,7 +406,7 @@ public class SolrResourceLoader implemen
         }
       }
   
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error loading class '" + cname + "'", e, false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error loading class '" + cname + "'", e);
     }finally{
       //cache the shortname vs FQN if it is loaded by the webapp classloader  and it is loaded
       // using a shortname
@@ -424,7 +424,7 @@ public class SolrResourceLoader implemen
     Class clazz = findClass(cname,subpackages);
     if( clazz == null ) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Can not find class: "+cname + " in " + classLoader, false);
+          "Can not find class: "+cname + " in " + classLoader);
     }
     
     Object obj = null;
@@ -433,7 +433,7 @@ public class SolrResourceLoader implemen
     } 
     catch (Exception e) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Error instantiating class: '" + clazz.getName()+"'", e, false );
+          "Error instantiating class: '" + clazz.getName()+"'", e);
     }
 
     if (!live) {
@@ -457,7 +457,7 @@ public class SolrResourceLoader implemen
     Class clazz = findClass(cname,subpackages);
     if( clazz == null ) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Can not find class: "+cname + " in " + classLoader, false);
+          "Can not find class: "+cname + " in " + classLoader);
     }
     
     Object obj = null;
@@ -467,7 +467,7 @@ public class SolrResourceLoader implemen
     } 
     catch (Exception e) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Error instantiating class: '" + clazz.getName()+"'", e, false );
+          "Error instantiating class: '" + clazz.getName()+"'", e);
     }
 
     if (!live) {
@@ -488,7 +488,7 @@ public class SolrResourceLoader implemen
     Class clazz = findClass(cName,subPackages);
     if( clazz == null ) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Can not find class: "+cName + " in " + classLoader, false);
+          "Can not find class: "+cName + " in " + classLoader);
     }
 
     Object obj = null;
@@ -499,7 +499,7 @@ public class SolrResourceLoader implemen
     }
     catch (Exception e) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Error instantiating class: '" + clazz.getName()+"'", e, false );
+          "Error instantiating class: '" + clazz.getName()+"'", e);
     }
 
     if (!live) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java Mon Jan 16 22:07:13 2012
@@ -246,7 +246,7 @@ public class MoreLikeThisHandler extends
           rsp.add("debug", dbgInfo);
         }
       } catch (Exception e) {
-        SolrException.logOnce(SolrCore.log, "Exception during debug", e);
+        SolrException.log(SolrCore.log, "Exception during debug", e);
         rsp.add("exception_during_debug", SolrException.toStr(e));
       }
     }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java Mon Jan 16 22:07:13 2012
@@ -45,7 +45,7 @@ public class PingRequestHandler extends 
     // Check if the service is available
     String healthcheck = core.getSolrConfig().get("admin/healthcheck/text()", null );
     if( healthcheck != null && !new File(healthcheck).exists() ) {
-      throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Service disabled", true);
+      throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Service disabled");
     }
     
     // Get the RequestHandler

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Mon Jan 16 22:07:13 2012
@@ -216,7 +216,7 @@ public class QueryElevationComponent ext
       }
     } catch (Exception ex) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-          "Error initializing QueryElevationComponent.", ex, false);
+          "Error initializing QueryElevationComponent.", ex);
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SimpleFacets.java Mon Jan 16 22:07:13 2012
@@ -208,10 +208,8 @@ public class SimpleFacets {
       facetResponse.add("facet_ranges", getFacetRangeCounts());
 
     } catch (IOException e) {
-      SolrException.logOnce(SolrCore.log, "Exception during facet counts", e);
       throw new SolrException(ErrorCode.SERVER_ERROR, e);
     } catch (ParseException e) {
-      SolrException.logOnce(SolrCore.log, "Exception during facet counts", e);
       throw new SolrException(ErrorCode.BAD_REQUEST, e);
     }
     return facetResponse;

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/response/transform/ValueSourceAugmenter.java Mon Jan 16 22:07:13 2012
@@ -100,7 +100,7 @@ public class ValueSourceAugmenter extend
         doc.setField( name, val );
       }
     } catch (IOException e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "exception at docid " + docid + " for valuesource " + valueSource, e, false);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "exception at docid " + docid + " for valuesource " + valueSource, e);
     }
   }
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java Mon Jan 16 22:07:13 2012
@@ -246,7 +246,7 @@ public abstract class FieldType extends 
     try {
       val = toInternal(value.toString());
     } catch (RuntimeException e) {
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error while creating field '" + field + "' from value '" + value + "'", e, false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Error while creating field '" + field + "' from value '" + value + "'", e);
     }
     if (val==null) return null;
 
@@ -465,12 +465,10 @@ public abstract class FieldType extends 
    * @see #getAnalyzer
    */
   public void setAnalyzer(Analyzer analyzer) {
-    SolrException e = new SolrException
+    throw new SolrException
       (ErrorCode.SERVER_ERROR,
        "FieldType: " + this.getClass().getSimpleName() + 
        " (" + typeName + ") does not support specifying an analyzer");
-    SolrException.logOnce(log,null,e);
-    throw e;
   }
 
   /**
@@ -487,12 +485,10 @@ public abstract class FieldType extends 
    * @see #getQueryAnalyzer
    */
   public void setQueryAnalyzer(Analyzer analyzer) {
-    SolrException e = new SolrException
+    throw new SolrException
       (ErrorCode.SERVER_ERROR,
        "FieldType: " + this.getClass().getSimpleName() +
        " (" + typeName + ") does not support specifying an analyzer");
-    SolrException.logOnce(log,null,e);
-    throw e;
   }
 
   /** @lucene.internal */

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Mon Jan 16 22:07:13 2012
@@ -386,7 +386,7 @@ public final class IndexSchema {
 
         FieldType ft = fieldTypes.get(type);
         if (ft==null) {
-          throw new SolrException( SolrException.ErrorCode.BAD_REQUEST,"Unknown fieldtype '" + type + "' specified on field " + name,false);
+          throw new SolrException( SolrException.ErrorCode.BAD_REQUEST,"Unknown fieldtype '" + type + "' specified on field " + name);
         }
 
         Map<String,String> args = DOMUtil.toMapExcept(attrs, "name", "type");
@@ -401,10 +401,7 @@ public final class IndexSchema {
           if( old != null ) {
             String msg = "[schema.xml] Duplicate field definition for '"
               + f.getName() + "' [[["+old.toString()+"]]] and [[["+f.toString()+"]]]";
-            SolrException t = new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg );
-            SolrException.logOnce(log,null,t);
-            SolrConfig.severeErrors.add( t );
-            throw t;
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg );
           }
           log.debug("field defined: " + f);
           if( f.getDefaultValue() != null ) {
@@ -553,12 +550,10 @@ public final class IndexSchema {
         aware.inform(this);
       }
     } catch (SolrException e) {
-      SolrConfig.severeErrors.add( e );
       throw e;
     } catch(Exception e) {
       // unexpected exception...
-      SolrConfig.severeErrors.add( e );
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Schema Parsing Failed: " + e.getMessage(), e,false);
+      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Schema Parsing Failed: " + e.getMessage(), e);
     }
 
     // create the field analyzers
@@ -574,10 +569,7 @@ public final class IndexSchema {
       String msg = "[schema.xml] Duplicate DynamicField definition for '"
               + f.getName() + "'";
 
-      SolrException t = new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
-      SolrException.logOnce(log, null, t);
-      SolrConfig.severeErrors.add(t);
-      throw t;
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java Mon Jan 16 22:07:13 2012
@@ -84,44 +84,20 @@ public class SolrDispatchFilter implemen
   {
     log.info("SolrDispatchFilter.init()");
 
-    boolean abortOnConfigurationError = true;
     CoreContainer.Initializer init = createInitializer();
     try {
       // web.xml configuration
       this.pathPrefix = config.getInitParameter( "path-prefix" );
 
       this.cores = init.initialize();
-      abortOnConfigurationError = init.isAbortOnConfigurationError();
       log.info("user.dir=" + System.getProperty("user.dir"));
     }
     catch( Throwable t ) {
       // catch this so our filter still works
-      log.error( "Could not start Solr. Check solr/home property and the logs", t);
-      SolrConfig.severeErrors.add( t );
+      log.error( "Could not start Solr. Check solr/home property and the logs");
       SolrCore.log( t );
     }
 
-    // Optionally abort if we found a sever error
-    if( abortOnConfigurationError && SolrConfig.severeErrors.size() > 0 ) {
-      StringWriter sw = new StringWriter();
-      PrintWriter out = new PrintWriter( sw );
-      out.println( "Severe errors in solr configuration.\n" );
-      out.println( "Check your log files for more detailed information on what may be wrong.\n" );
-      for( Throwable t : SolrConfig.severeErrors ) {
-        out.println( "-------------------------------------------------------------" );
-        t.printStackTrace( out );
-      }
-      out.flush();
-
-      // Servlet containers behave slightly differently if you throw an exception during 
-      // initialization.  Resin will display that error for every page, jetty prints it in
-      // the logs, but continues normally.  (We will see a 404 rather then the real error)
-      // rather then leave the behavior undefined, lets cache the error and spit it out 
-      // for every request.
-      abortErrorMessage = sw.toString();
-      //throw new ServletException( abortErrorMessage );
-    }
-
     log.info("SolrDispatchFilter.init() done");
   }
 
@@ -366,7 +342,7 @@ public class SolrDispatchFilter implemen
       ex.printStackTrace(new PrintWriter(sw));
       trace = "\n\n"+sw.toString();
 
-      SolrException.logOnce(log,null,ex );
+      SolrException.log(log, null, ex);
 
       // non standard codes have undefined results with various servers
       if( code < 100 ) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java Mon Jan 16 22:07:13 2012
@@ -573,7 +573,7 @@ public class DirectUpdateHandler2 extend
     try {
       solrCoreState.decref();
     } catch (IOException e) {
-      throw new SolrException(ErrorCode.SERVER_ERROR, "", e, false);
+      throw new SolrException(ErrorCode.SERVER_ERROR, "", e);
     }
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java Mon Jan 16 22:07:13 2012
@@ -167,8 +167,6 @@ public abstract class AbstractPluginLoad
           SolrException e = new SolrException
             (ErrorCode.SERVER_ERROR,
              "Plugin init failure for " + type + ":" + ex.getMessage(), ex);
-          SolrConfig.severeErrors.add( e );
-          SolrException.logOnce(log,null,e);
           throw e;
         }
       }
@@ -182,8 +180,6 @@ public abstract class AbstractPluginLoad
       catch( Exception ex ) {
         SolrException e = new SolrException
           (ErrorCode.SERVER_ERROR, "Plugin Initializing failure for " + type, ex);
-        SolrConfig.severeErrors.add( e );
-        SolrException.logOnce(log,null,e);
         throw e;
       }
     }
@@ -232,8 +228,6 @@ public abstract class AbstractPluginLoad
     } catch (Exception ex) {
       SolrException e = new SolrException
         (ErrorCode.SERVER_ERROR, "Plugin init failure for " + type, ex);
-      SolrConfig.severeErrors.add( e );
-      SolrException.logOnce(log,null,e);
       throw e;
     }
 
@@ -244,8 +238,6 @@ public abstract class AbstractPluginLoad
       } catch (Exception ex) {
         SolrException e = new SolrException
           (ErrorCode.SERVER_ERROR, "Plugin init failure for " + type, ex);
-        SolrConfig.severeErrors.add( e );
-        SolrException.logOnce(log,null,e);
         throw e;
       }
     }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java Mon Jan 16 22:07:13 2012
@@ -82,7 +82,6 @@ public abstract class AbstractDistribute
     System.clearProperty("solr.test.sys.prop2");
     super.tearDown();
     resetExceptionIgnores();
-    SolrConfig.severeErrors.clear();
   }
   
   protected void printLayout() throws Exception {

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java Mon Jan 16 22:07:13 2012
@@ -105,7 +105,6 @@ public abstract class AbstractZkTestCase
       printLayout(zkServer.getZkHost());
     }
 
-    SolrConfig.severeErrors.clear();
     super.tearDown();
   }
   

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java Mon Jan 16 22:07:13 2012
@@ -312,7 +312,6 @@ public class CloudStateUpdateTest extend
     System.clearProperty("zkHost");
     System.clearProperty("hostPort");
     System.clearProperty("CLOUD_UPDATE_DELAY");
-    SolrConfig.severeErrors.clear();
   }
 
   private void addShardToZk(SolrZkClient zkClient, String shardsPath,

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java Mon Jan 16 22:07:13 2012
@@ -219,7 +219,6 @@ public class ZkControllerTest extends So
   
   @Override
   public void tearDown() throws Exception {
-    SolrConfig.severeErrors.clear();
     super.tearDown();
   }
 }

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkSolrClientTest.java Mon Jan 16 22:07:13 2012
@@ -234,7 +234,6 @@ public class ZkSolrClientTest extends Ab
   
   @Override
   public void tearDown() throws Exception {
-    SolrConfig.severeErrors.clear();
     super.tearDown();
   }
   

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java Mon Jan 16 22:07:13 2012
@@ -45,7 +45,6 @@ public class BadIndexSchemaTest extends 
         (ErrorCode.SERVER_ERROR, 
          "Unexpected error, expected error matching: " + errString, e);
     } finally {
-      SolrConfig.severeErrors.clear();
       deleteCore();
     }
     fail("Did not encounter any exception from: " + schema);

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java Mon Jan 16 22:07:13 2012
@@ -427,7 +427,7 @@ public class CommonsHttpSolrServer exten
         msg.append( method.getStatusText() );
         msg.append( "\n\n" );
         msg.append( "request: "+method.getURI() );
-        throw new SolrException(statusCode, java.net.URLDecoder.decode(msg.toString(), "UTF-8") );
+        throw new SolrException(SolrException.ErrorCode.getErrorCode(statusCode), java.net.URLDecoder.decode(msg.toString(), "UTF-8") );
       }
 
       // Read the contents

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrException.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrException.java?rev=1232192&r1=1232191&r2=1232192&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrException.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/SolrException.java Mon Jan 16 22:07:13 2012
@@ -54,52 +54,25 @@ public class SolrException extends Runti
       return UNKNOWN;
     }
   };
-  
-  public boolean logged=false;
 
   public SolrException(ErrorCode code, String msg) {
-    this(code, msg, null, false);
-  }
-  
-  public SolrException(ErrorCode code, String msg, boolean alreadyLogged) {
-    this(code, msg, null, alreadyLogged);
-  }
-
-  public SolrException(ErrorCode code, String msg, Throwable th, boolean alreadyLogged) {
-    super(msg,th);
-    this.code=code.code;
-    logged=alreadyLogged;
+    this(code, msg, null);
   }
-
   public SolrException(ErrorCode code, String msg, Throwable th) {
-    this(code, msg, th, (th instanceof SolrException) ? ((SolrException)th).logged : false);
+    super(msg, th);
+    this.code = code.code;
   }
 
   public SolrException(ErrorCode code, Throwable th) {
-    this(code, null, th, (th instanceof SolrException) ? ((SolrException)th).logged : false);
-  }
-  
-  /**
-   * @deprecated Use {@link #SolrException(ErrorCode,String)}.
-   */
-  @Deprecated
-  public SolrException(int code, String msg) {
-    super(msg);
-    this.code=code;
+    this(code, null, th);
   }
   
-
   int code=0;
   public int code() { return code; }
 
 
-
-
   public void log(Logger log) { log(log,this); }
   public static void log(Logger log, Throwable e) {
-    if (e instanceof SolrException) {
-      ((SolrException)e).logged = true;
-    }
     String stackTrace = toStr(e);
     String ignore = doIgnore(stackTrace);
     if (ignore != null) {
@@ -111,9 +84,6 @@ public class SolrException extends Runti
   }
 
   public static void log(Logger log, String msg, Throwable e) {
-    if (e instanceof SolrException) {
-      ((SolrException)e).logged = true;
-    }
     String stackTrace = msg + ':' + toStr(e);
     String ignore = doIgnore(stackTrace);
     if (ignore != null) {
@@ -123,14 +93,6 @@ public class SolrException extends Runti
     log.error(stackTrace);
   }
 
-  public static void logOnce(Logger log, String msg, Throwable e) {
-    if (e instanceof SolrException) {
-      if(((SolrException)e).logged) return;
-    }
-    if (msg!=null) log(log,msg,e);
-    else log(log,e);
-  }
-
 
   // public String toString() { return toStr(this); }  // oops, inf loop
   @Override