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

org.nuiton.eugene.models.friend.OperationDef Maven / Gradle / Ivy

package org.nuiton.eugene.models.friend;

/*-
 * #%L
 * EUGene :: EUGene
 * %%
 * Copyright (C) 2004 - 2017 Code Lutin
 * %%
 * 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%
 */

import com.google.common.base.Joiner;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.eugene.models.object.ObjectModelOperation;
import org.nuiton.eugene.models.object.ObjectModelParameter;
import org.nuiton.eugene.models.object.xml.ObjectModelOperationImpl;
import org.nuiton.eugene.models.object.xml.ObjectModelParameterImpl;

/**
 * Created by tchemit on 22/06/17.
 *
 * @author Tony Chemit - [email protected]
 */
public class OperationDef extends ElementDef {
    /** Logger. */
    private static final Log log = LogFactory.getLog(OperationDef.class);

    private final String returnType;
    private String fullyQualifiedReturnType;
    private final List parameters = new LinkedList<>();

    public static OperationDef of(ObjectModelOperation anOperation, String defaultPackage) {
        OperationDef result = new OperationDef(anOperation.getName(), getRelativeType(anOperation.getReturnType(), defaultPackage));
        result.loadStereotypesAndTagValues(anOperation);
        for (ObjectModelParameter objectModelParameter : anOperation.getParameters()) {
            result.add(ParameterDef.of(objectModelParameter, defaultPackage));
        }
        return result;
    }

    public static OperationDef of(String lineDef) {
        Pair pair = splitTagValues(lineDef, lineDef.indexOf(')'));
        lineDef = pair.getLeft();
        String tagValues = pair.getRight();

        int parameterFirstIndex = lineDef.indexOf('(');
        int parameterLastIndex = lineDef.indexOf(')');
        String type = lineDef.substring(parameterLastIndex + 1).trim();
        String parameters = lineDef.substring(parameterFirstIndex, parameterLastIndex + 1).replace("(", "").replace(")", "");
        lineDef = lineDef.substring(0, parameterFirstIndex);

        OperationDef result = new OperationDef(lineDef.trim(), type);

        if (tagValues != null) {
            result.loadStereotypesAndTagValues(tagValues);
        }

        if (!parameters.isEmpty()) {
            for (String parameter : parameters.split(",")) {
                ParameterDef parameterDef = ParameterDef.of(parameter.trim());
                result.add(parameterDef);
            }
        }
        return result;
    }

    private OperationDef(String name, String returnType) {
        super(name);
        this.returnType = returnType;
    }

    public String getReturnType() {
        return returnType;
    }

    public String getFullyQualifiedReturnType() {
        return fullyQualifiedReturnType;
    }

    public List getParameters() {
        return parameters;
    }

    public void add(ParameterDef parameterDef) {
        log.debug(String.format("Add parameter: %s on %s", parameterDef, getName()));
        parameters.add(parameterDef);
    }

    @Override
    public String toString() {
        return getName()
                + (parameters.isEmpty() ? "()" : "(" + Joiner.on(",").join(parameters) + ")")
                + ":" + returnType;
    }

    @Override
    public void write(BufferedWriter writer) throws IOException {
        writer.newLine();
        writer.append(getName());
        if (parameters.isEmpty()) {
            writer.append("()");
        } else {
            writer.append("(");
            write(writer, parameters, ", ");
            writer.append(")");
        }
        if (!returnType.isEmpty()) {
            writer.append(" ").append(returnType);
        }
        writeStereotypesAndTagValues(writer);
    }

    void resolveTypes(Map classesMapping) {
        fullyQualifiedReturnType = resolveType(getReturnType(), classesMapping);
        for (ParameterDef parameterDef : getParameters()) {
            parameterDef.resolveType(classesMapping);
        }
    }

    ObjectModelOperationImpl toObjectModel() {
        ObjectModelOperationImpl result = new ObjectModelOperationImpl();
        result.setName(getName());
        flushStereotypesAndTagValues(result);
        ObjectModelParameterImpl returnParameter = new ObjectModelParameterImpl();
        returnParameter.setType(getFullyQualifiedReturnType());
        result.setReturnParameter(returnParameter);
        for (ParameterDef parameter : parameters) {
            result.addParameter(parameter.toObjectModel());
        }
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy