Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
    * JBoss, Home of Professional Open Source
    * Copyright 2005, JBoss Inc., and individual contributors as indicated
    * by the @authors tag. See the copyright.txt in the distribution for a
    * full listing of individual contributors.
    *
    * This is free software; you can redistribute it and/or modify it
    * under the terms of the GNU Lesser General Public License as
    * published by the Free Software Foundation; either version 2.1 of
   * the License, or (at your option) any later version.
   *
   * This software is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this software; if not, write to the Free
   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   */
 package org.jboss.xb.binding;
 
 
 import java.util.List;

Author(s):
Alexey Loubyansky
Version:
$Revision: 2913 $
 
 public class Immutable
 {
    private static final Logger log = Logger.getLogger(Immutable.class);
 
    public final Class<?> cls;
 
    final List<Stringnames = new java.util.ArrayList<String>();
 
    final List<Objectvalues = new java.util.ArrayList<Object>();
 
    public Immutable(Class<?> cls)
    {
       this. = cls;
       if(.isTraceEnabled())
       {
          .trace("created immutable container for " + cls);
       }
    }
 
    public void addChild(String localNameObject child)
    {
       if(!.isEmpty() && .get(.size() - 1).equals(localName))
       {
          throw new IllegalStateException("Attempt to add duplicate element " +
             localName +
             ": prev value=" +
             .get(.size() - 1) +
             ", new value=" +
             child
          );
       }
       .add(localName);
       .add(child);
 
       if(.isTraceEnabled())
       {
          .trace("added child " + localName + " for " +  + ": " + child);
       }
    }
 
    public Object getChild(String localName)
    {
       return .isEmpty() ?
          null :
          (.get(.size() - 1).equals(localName) ? .get(.size() - 1) : null);
    }
 
    public Object newInstance()
    {
       Constructor<?> ctor = null;
       Constructor[] ctors = .getConstructors();
 
       if(ctors == null || ctors.length == 0)
       {
          throw new JBossXBRuntimeException("The class has no declared constructors: " + );
       }
 
       for(int i = 0; i < ctors.length; ++i)
       {
          Class[] types = ctors[i].getParameterTypes();
 
          if(types == null || types.length == 0)
          {
             throw new IllegalStateException("Found no-arg constructor for immutable " + );
          }
 
          if(types.length == .size())
         {
            ctor = ctors[i];
            int typeInd = 0;
            while(typeInd < types.length)
            {
               if(!types[typeInd].isAssignableFrom(.get(typeInd++).getClass()))
               {
                  ctor = null;
                  break;
               }
            }
            if(ctor != null)
            {
               break;
            }
         }
      }
      if(ctor == null)
      {
         throw new IllegalStateException("No constructor in " +  + " that would take arguments " + );
      }
      try
      {
         return ctor.newInstance(.toArray());
      }
      catch(Exception e)
      {
         throw new IllegalStateException("Failed to create immutable instance of " +
             +
            " using arguments: "
            +  + ": " + e.getMessage()
         );
      }
   }
New to GrepCode? Check out our FAQ X