private synchronized void makeCompositeBuilder() throws InvalidObjectException {
  if (compositeBuilder != null)   return;
  Class targetClass=(Class<?>)getTargetType();
  CompositeBuilder[][] builders={{new CompositeBuilderViaFrom(targetClass,itemNames)},{new CompositeBuilderViaConstructor(targetClass,itemNames)},{new CompositeBuilderCheckGetters(targetClass,itemNames,getterConverters),new CompositeBuilderViaSetters(targetClass,itemNames),new CompositeBuilderViaProxy(targetClass,itemNames)}};
  CompositeBuilder foundBuilder=null;
  StringBuilder whyNots=new StringBuilder();
  Throwable possibleCause=null;
  find:   for (  CompositeBuilder[] relatedBuilders : builders) {
    for (int i=0; i < relatedBuilders.length; i++) {
      CompositeBuilder builder=relatedBuilders[i];
      String whyNot=builder.applicable(getters);
      if (whyNot == null) {
        foundBuilder=builder;
        break find;
      }
      Throwable cause=builder.possibleCause();
      if (cause != null)       possibleCause=cause;
      if (whyNot.length() > 0) {
        if (whyNots.length() > 0)         whyNots.append("; ");
        whyNots.append(whyNot);
        if (i == 0)         break;
      }
    }
  }
  if (foundBuilder == null) {
    String msg="Do not know how to make a " + targetClass.getName() + " from a CompositeData: "+ whyNots;
    if (possibleCause != null)     msg+=". Remaining exceptions show a POSSIBLE cause.";
    throw invalidObjectException(msg,possibleCause);
  }
  compositeBuilder=foundBuilder;
}

private synchronized void makeCompositeBuilder ( ) throws InvalidObjectException { if ( compositeBuilder != null ) return ; Class targetClass = ( Class < ? > ) getTargetType ( ) ; CompositeBuilder [ ] [ ] builders = { { new CompositeBuilderViaFrom ( targetClass , itemNames ) } , { new CompositeBuilderViaConstructor ( targetClass , itemNames ) } , { new CompositeBuilderCheckGetters ( targetClass , itemNames , getterConverters ) , new CompositeBuilderViaSetters ( targetClass , itemNames ) , new CompositeBuilderViaProxy ( targetClass , itemNames ) } } ; CompositeBuilder foundBuilder = null ; StringBuilder whyNots = new StringBuilder ( ) ; Throwable possibleCause = null ; find : for ( CompositeBuilder [ ] relatedBuilders : builders ) { for ( int i = 0 ; i < relatedBuilders . length ; i ++ ) { CompositeBuilder builder = relatedBuilders [ i ] ; String whyNot = builder . applicable ( getters ) ; if ( whyNot == null ) { foundBuilder = builder ; break find ; } Throwable cause = builder . possibleCause ( ) ; if ( cause != null ) possibleCause = cause ; if ( whyNot . length ( ) > 0 ) { if ( whyNots . length ( ) > 0 ) whyNots . append ( "; " ) ; whyNots . append ( whyNot ) ; if ( i == 0 ) break ; } } } if ( foundBuilder == null ) { String msg = "Do not know how to make a " + targetClass . getName ( ) + " from a CompositeData: " + whyNots ; if ( possibleCause != null ) msg += ". Remaining exceptions show a POSSIBLE cause." ; throw invalidObjectException ( msg , possibleCause ) ; } compositeBuilder = foundBuilder ; }
determine how to convert back from the compositedata into the original java type . for a type that is not reconstructible , this method will fail every time , and will throw the right exception .
