/**
  * Public constructor.
  *
  * @param domain ServiceDomain instance.
  */
 public TransformerRegistryLoader(ServiceDomain domain) {
   if (domain == null) {
     throw TransformMessages.MESSAGES.nullServiceDomainArgument();
   }
   this._serviceDomain = domain;
   if (_serviceDomain.getTransformerRegistry() == null) {
     throw TransformMessages.MESSAGES.nullTransformerRegistryArgument();
   }
   this._transformerRegistry = _serviceDomain.getTransformerRegistry();
 }
  /**
   * Create a Collection of {@link Transformer} instances from the supplied {@link TransformModel}
   * instance.
   *
   * @param transformModel The TransformModel instance.
   * @return The Transformer instance.
   */
  public Collection<Transformer<?, ?>> newTransformers(TransformModel transformModel) {

    Collection<Transformer<?, ?>> transformers = null;

    if (transformModel instanceof JavaTransformModel) {
      JavaTransformModel javaTransformModel = JavaTransformModel.class.cast(transformModel);
      String bean = javaTransformModel.getBean();
      if (bean != null) {
        BeanManager beanManager = CDIUtil.lookupBeanManager();
        if (beanManager == null) {
          throw TransformMessages.MESSAGES.cdiBeanManagerNotFound();
        }
        Object transformer = null;
        Set<Bean<?>> beans = beanManager.getBeans(bean);
        if (beans != null && !beans.isEmpty()) {
          Bean<?> target = beans.iterator().next();
          CreationalContext<?> context = beanManager.createCreationalContext(target);
          transformer = beanManager.getReference(target, Object.class, context);
          _cdiCreationalContexts.add(context);
        }
        if (transformer == null) {
          throw TransformMessages.MESSAGES.beanNotFoundInCDIRegistry(bean);
        }
        transformers =
            TransformerUtil.newTransformers(
                transformer, transformModel.getFrom(), transformModel.getTo());
      } else {
        String className = ((JavaTransformModel) transformModel).getClazz();
        if (className == null) {
          throw TransformMessages.MESSAGES.beanOrClassMustBeSpecified();
        }
        Class<?> transformClass = getClass(className);
        if (transformClass == null) {
          throw TransformMessages.MESSAGES.unableToLoadTransformerClass(className);
        }
        transformers =
            TransformerUtil.newTransformers(
                transformClass, transformModel.getFrom(), transformModel.getTo());
      }
    } else {
      TransformerFactory factory = getTransformerFactory(transformModel);

      transformers = new ArrayList<Transformer<?, ?>>();
      transformers.add(factory.newTransformer(_serviceDomain, transformModel));
    }

    if (transformers == null || transformers.isEmpty()) {
      throw TransformMessages.MESSAGES.unknownTransformModel(transformModel.getClass().getName());
    }

    return transformers;
  }
 /**
  * Public constructor.
  *
  * @param transformerRegistry The registry instance.
  */
 public TransformerRegistryLoader(TransformerRegistry transformerRegistry) {
   if (transformerRegistry == null) {
     throw TransformMessages.MESSAGES.nullTransformerRegistryArgument();
   }
   this._transformerRegistry = transformerRegistry;
   this._serviceDomain = null;
 }
  /**
   * Load the out of the box transformers.
   *
   * <p>Scans the classpath for {@link #TRANSFORMS_XML} runtime configuration resources.
   */
  public void loadOOTBTransforms() {
    try {
      List<URL> resources = getResources(TRANSFORMS_XML);

      for (URL resource : resources) {
        InputStream configStream = resource.openStream();

        try {
          TransformsModel transformsModel = new ModelPuller<TransformsModel>().pull(configStream);
          registerTransformers(transformsModel, false);
        } catch (final DuplicateTransformerException e) {
          _log.debug(e.getMessage());
        } finally {
          configStream.close();
        }
      }
    } catch (IOException e) {
      throw TransformMessages.MESSAGES.errorReadingTransformerConfig(TRANSFORMS_XML, e);
    }
  }
  private TransformerFactory<?> getTransformerFactory(TransformModel transformModel) {
    TransformerFactoryClass transformerFactoryClass =
        transformModel.getClass().getAnnotation(TransformerFactoryClass.class);

    if (transformerFactoryClass == null) {
      TransformMessages.MESSAGES.transformModelNotAnnotated(transformModel.getClass().getName());
    }

    Class<?> factoryClass = transformerFactoryClass.value();
    if (!TransformerFactory.class.isAssignableFrom(factoryClass)) {
      TransformMessages.MESSAGES.invalidTransformerFactory(
          org.switchyard.transform.internal.TransformerFactory.class.getName());
    }

    try {
      if (!_transformerFactories.containsKey(factoryClass)) {
        TransformerFactory<?> factory = (TransformerFactory<?>) factoryClass.newInstance();
        _transformerFactories.put(factoryClass, factory);
      }

      return _transformerFactories.get(factoryClass);
    } catch (ClassCastException e) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (IllegalArgumentException iae) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (NullPointerException npe) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (InstantiationException ie) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (IllegalAccessException iae) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    }
  }