/**
   * Pozor, skonzumuje vstupny parameter a znehodnoti ho. Pouzit treba dalej navratovy objekt.
   *
   * @param configuration
   */
  public ConfigurationType process(ConfigurationType configuration) {
    // Vezme polozku pre BTEConfiguration
    ConfigurationType BTE = getBTE(configuration);
    // a zmeni zobrazenie typu cieloveho jazykoveho elementu na "key"
    BTE.getMappingOfTargetElement().setTargetElementName("key");
    BTE.getMappingOfTargetElement().setTargetNameType(TargetNameType.USER_DEFINED);

    configuration.getChildren().remove(BTE);

    // Naklonujem si strom (bez BTE)
    ConfigurationType clone = configuration.cloneBranch();
    // Vytvorim si wrapper pre annotatcne typy
    ConfigurationType annType = generateWrapperForType();
    // a vlozim ho pod BTE
    BTE.getChildren().add(annType);
    annType.setParent(BTE);
    // K nemu pripojim polozky, ktore mozu byt aplikovane na anotacny typ
    addAnnTypes(annType, configuration, BTE);

    // Obdobne pre vlastnost
    ConfigurationType property = generateWrapperForProperty();
    annType.getChildren().add(property);
    property.setParent(annType);
    // Tu mozu ist aj niektore polozky, ktore uz boli pridane pod annType,
    // preto sa spracuvaju a pridavaju klony - kopie
    addMethodTypes(property, clone, BTE);

    configuration.getChildren().add(BTE);

    // A nakoniec este spracuje mapovanie na nazvy
    processMapsTo(configuration);

    return configuration;
  }
 /**
  * Metoda prida z modelu pod propType ako potomkov polozky aplikovatelne na vlasnost.
  *
  * @param annType
  * @param model
  * @param BTE
  */
 private void addMethodTypes(
     ConfigurationType propType, ConfigurationType model, ConfigurationType BTE) {
   for (ConfigurationType child : model.getChildren()) {
     // Vyber poloziek, ktore maju medzi cielovymi jazykovymi elementami
     // metodu
     if (child.getMappingOfTargetElement().getTargetElements() != null
         && Arrays.asList(child.getMappingOfTargetElement().getTargetElements())
             .contains(ElementType.METHOD)) {
       propType.getChildren().add(child);
       child.setParent(propType);
       changeTravelerMeth(child, BTE);
     }
   }
   // Invalidacia modelu, pre istotu
   model.setChildren(new ArrayList<ConfigurationType>());
 }
 /**
  * Metoda prida z modelu pod annType ako potomkov polozky aplikovatelne na anotacny typ.
  *
  * @param annType
  * @param model
  * @param BTE
  */
 private void addAnnTypes(
     ConfigurationType annType, ConfigurationType model, ConfigurationType BTE) {
   for (ConfigurationType child : model.getChildren()) {
     // Vyber poloziek, ktore maju medzi cielovymi jazykovymi elementami
     // anotacny typ, pritom sa nesmiem spoliehat, ze getTargetElements
     // mi nevrati null
     if (child.getMappingOfTargetElement().getTargetElements() != null
         && (Arrays.asList(child.getMappingOfTargetElement().getTargetElements())
                 .contains(ElementType.ANNOTATION_TYPE)
             || Arrays.asList(child.getMappingOfTargetElement().getTargetElements())
                 .contains(ElementType.TYPE))) {
       annType.getChildren().add(child);
       child.setParent(annType);
       changeTravelerAnn(child, BTE);
     }
     // Ostatne sa nepridaju
   }
   // Invalidacia modelu, pre istotu
   model.setChildren(new ArrayList<ConfigurationType>());
 }
 /**
  * Metoda pre zmenu niektorych poloziek pri presuvanej polozke pre anotacny typ.
  *
  * @param child
  * @param BTE
  */
 private void changeTravelerMeth(ConfigurationType child, ConfigurationType BTE) {
   // Vypis cieloveho jazykoveho elementu nepotrebujem
   child.getMappingOfTargetElement().setQNameOfTargetProcView(XMLProcessing.SKIP_PROCESS);
   // A pod property chcem zobrazit iba metainformacie nad vlastnostami
   child
       .getMappingOfConfigurationToSources()
       .setSupportedSources(new ElementKind[] {ElementKind.METHOD});
   // A kotva na BTE
   child.getMappingOfConfigurationToSources().setPositionAnchor(BTE);
   child
       .getMappingOfConfigurationToSources()
       .setRelPositionToAnchor(RelativePositionToAnchor.SAME_LOWER_LVL);
 }
 /**
  * Metoda pre zmenu niektorych poloziek pri presuvanej polozke pre anotacny typ.
  *
  * @param child
  * @param BTE
  */
 private void changeTravelerAnn(ConfigurationType child, ConfigurationType BTE) {
   // Vypis cieloveho jazykoveho elementu nepotrebujem
   child.getMappingOfTargetElement().setQNameOfTargetProcView(XMLProcessing.SKIP_PROCESS);
   // A pod annType chcem zobrazit iba metainformacie nad anotacnymi typmi
   child
       .getMappingOfConfigurationToSources()
       .setSupportedSources(new ElementKind[] {ElementKind.ANNOTATION_TYPE});
   // A napokon nastavim ako kotvu element pre BTE, tak bude jedna vetva
   // s unikatnym klucom BTE (nazov baliku) obsahovat iba metainformacie
   // o mapovani anotacnych typov z daneho balika
   child.getMappingOfConfigurationToSources().setPositionAnchor(BTE);
   child
       .getMappingOfConfigurationToSources()
       .setRelPositionToAnchor(RelativePositionToAnchor.SAME_LOWER_LVL);
 }