All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nuiton.eugene.models.object.ObjectModelTransformer Maven / Gradle / Ivy

There is a newer version: 3.0
Show newest version
/*
 * #%L
 * EUGene :: EUGene
 * 
 * $Id: ObjectModelTransformer.java 1079 2011-06-28 09:15:23Z tchemit $
 * $HeadURL: http://svn.nuiton.org/svn/eugene/tags/eugene-2.6.1/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelTransformer.java $
 * %%
 * Copyright (C) 2004 - 2010 CodeLutin
 * %%
 * This program 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 3 of the 
 * License, or (at your option) any later version.
 * 
 * This program 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 General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public 
 * License along with this program.  If not, see
 * .
 * #L%
 */

package org.nuiton.eugene.models.object;

import org.nuiton.eugene.Transformer;
import org.nuiton.eugene.models.Model;

import java.util.Collection;

/**
 * L'initialisation du modèle de sortie et du générateur de sortie associée,
 * se fait dans la superclass grâce à la méthode init.
 *
 * @param 
 *
 * Created: 28 oct. 2009
 *
 * @author fdesbois 
 */
public abstract class ObjectModelTransformer extends Transformer {
    
    /**
     * Le model associé au transformer est le model d'entree. Le modele de sortie
     * peut etre initialiser via la methode {@link Transformer#initOutputModel()}.
     *
     * Il est également possible de surcharger la methode {@link #debugOutputModel()}
     * pour verifier le resultat de la transformation.
     * Par defaut la methode appelle la methode
     * {@link #transformFromModel(ObjectModel)} puis boucle sur chaque
     * class en appelant la methode
     * {@link #transformFromClass(ObjectModelClass)} puis boucle sur chaque
     * interface en appelant a methode
     * {@link #transformFromInterface(ObjectModelInterface)} et enfin sur chaque
     * enumeration en appelant la methode
     * {@link #transformFromEnumeration(ObjectModelEnumeration)}
     */
    @Override
    public void transform() {

        ObjectModel model = getModel();

        // transformFromModel
        transformFromElement(model, ObjectModelType.OBJECT_MODEL);

        // transformFromClassifier
        transformFromElements(model.getClassifiers(), ObjectModelType.OBJECT_MODEL_CLASSIFIER);

        // transformFromInterface
        transformFromElements(model.getInterfaces(), ObjectModelType.OBJECT_MODEL_INTERFACE);

        // transformFromClass
        transformFromElements(model.getClasses(), ObjectModelType.OBJECT_MODEL_CLASS);

        // transformFromEnumeration
        transformFromElements(model.getEnumerations(), ObjectModelType.OBJECT_MODEL_ENUMERATION);

        debugOutputModel();
    }

    protected abstract void debugOutputModel();

    /**
     * Parcours une collection d'éléments pour la transformation suivant un type d'éléments.
     * Types possibles : ObjectModelClassifier, ObjectModelClass, ObjectModelInterface et
     * ObjectModelEnumeration.
     * Une méthode dépend du type et peut être surchargée :
     * transformFromXXX (XXX étant un type prédéfini pour une méthode existante).
     *
     * @param elements Collection d'éléments d'un des types ci-dessus
     * @param type     type explicite d'ObjectModel
     * @see ObjectModelType
     */
    private void transformFromElements(Collection elements,
                                       ObjectModelType type) {

        for (ObjectModelElement element : elements) {
            transformFromElement(element, type);
        }
    }

    /**
     * Génération pour un élément du modèle (ou le modèle lui-même).
     * Types possibles : ObjectModel, ObjectModelClassifier, ObjectModelClass,
     * ObjectModelInterface et ObjectModelEnumeration.
     * La méthode transformFromXXX dépend du type d'élément et peut être surchargée.
     *
     * @param element  element à généré
     * @param type     type d'ObjectModel
     * @see ObjectModelType
     */
    protected void transformFromElement(Object element, ObjectModelType type) {

        switch (type) {
            case OBJECT_MODEL:
                transformFromModel((ObjectModel) element);
                break;
            case OBJECT_MODEL_CLASSIFIER:
                transformFromClassifier((ObjectModelClassifier) element);
                break;
            case OBJECT_MODEL_INTERFACE:
                transformFromInterface((ObjectModelInterface) element);
                break;
            case OBJECT_MODEL_CLASS:
                transformFromClass((ObjectModelClass) element);
                break;
            case OBJECT_MODEL_ENUMERATION:
                transformFromEnumeration((ObjectModelEnumeration) element);
                break;
        }
    }

    public void transformFromModel(ObjectModel model) {
    }

    public void transformFromInterface(ObjectModelInterface interfacez) {
    }

    public void transformFromClass(ObjectModelClass clazz) {
    }

    public void transformFromClassifier(ObjectModelClassifier clazz) {
    }

    public void transformFromEnumeration(ObjectModelEnumeration enumeration) {
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy