org.yakindu.sct.model.sgraph.naming.SGraphNameProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.yakindu.sct.model.sgraph.naming.SGraphNameProvider.java

Source

/**
 * Copyright (c) 2011 committers of YAKINDU and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     committers of YAKINDU - initial API and implementation
 */
package org.yakindu.sct.model.sgraph.naming;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.util.SimpleAttributeResolver;
import org.eclipse.xtext.util.Strings;
import org.yakindu.base.types.Declaration;
import org.yakindu.sct.model.sgraph.Choice;
import org.yakindu.sct.model.sgraph.CompositeElement;
import org.yakindu.sct.model.sgraph.Entry;
import org.yakindu.sct.model.sgraph.Exit;
import org.yakindu.sct.model.sgraph.FinalState;
import org.yakindu.sct.model.sgraph.Region;
import org.yakindu.sct.model.sgraph.Scope;
import org.yakindu.sct.model.sgraph.ScopedElement;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.model.sgraph.Statechart;
import org.yakindu.sct.model.sgraph.Synchronization;
import org.yakindu.sct.model.sgraph.Vertex;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;

/**
 * NameProvider for SGraph elements like statecharts, scopes and declarations.
 * 
 * @author benjamin schwertfeger
 * @author andreas muelder
 * 
 */
public class SGraphNameProvider extends DefaultDeclarativeQualifiedNameProvider {

    /** "Default" */
    private static final QualifiedName DEFAULT_ENTRY_NAME = QualifiedName.create("_entry_Default");
    private static final QualifiedName DEFAULT_EXIT_NAME = QualifiedName.create("_exit_Default");
    private static final String _FINAL_STATE_NAME = "_final_";
    private static final String _CHOICE_NAME = "_choice_";
    private static final String _SYNC_NAME = "_sync";

    @Inject
    private IQualifiedNameConverter nameConverter;
    @Inject
    private IdentifierConverter identifierConverter;

    @Override
    protected Function<EObject, String> getResolver() {
        return SimpleAttributeResolver.NAME_RESOLVER;
    }

    public QualifiedName qualifiedName(Statechart ele) {
        String scName = ele.getName();
        if (Strings.isEmpty(scName)) {
            return null;
        }
        QualifiedName name = QualifiedName.create(identifierConverter.toIdentifier(ele.getName()));
        if (!Strings.isEmpty(ele.getNamespace())) {
            name = nameConverter.toQualifiedName(ele.getNamespace()).append(name);
        }
        return name;
    }

    public QualifiedName qualifiedName(Synchronization ele) {

        QualifiedName qualifiedNameFromConverter = null;

        if (!Strings.isEmpty(ele.getName())) {
            qualifiedNameFromConverter = QualifiedName.create(ele.getName());
        } else {
            LinkedList<Synchronization> list = new LinkedList<Synchronization>();
            Iterables.addAll(list,
                    Iterables.filter(((Region) ele.eContainer()).getVertices(), Synchronization.class));
            qualifiedNameFromConverter = QualifiedName.create(_SYNC_NAME + list.indexOf(ele));
        }

        return getParentQualifiedName(ele, qualifiedNameFromConverter);
    }

    public QualifiedName qualifiedName(Choice ele) {

        // first get order number of choice node
        List<Vertex> choiceList = new ArrayList<Vertex>();
        choiceList.addAll(Collections2.filter(((Region) ele.eContainer()).getVertices(), new Predicate<Vertex>() {
            public boolean apply(Vertex input) {
                return input instanceof Choice;
            }
        }));
        int index = choiceList.indexOf(ele);

        QualifiedName qualifiedNameFromConverter = QualifiedName.create(_CHOICE_NAME + index);

        return getParentQualifiedName(ele, qualifiedNameFromConverter);
    }

    public QualifiedName qualifiedName(Entry ele) {

        QualifiedName name = DEFAULT_ENTRY_NAME;
        if (ele.getName() != null && !ele.getName().isEmpty()) {
            name = QualifiedName.create(ele.getName());
        }

        return getParentQualifiedName(ele, name);
    }

    public QualifiedName qualifiedName(Exit ele) {

        QualifiedName name = DEFAULT_EXIT_NAME;
        if (ele.getName() != null && !ele.getName().isEmpty()) {
            name = QualifiedName.create(ele.getName());
        }

        return getParentQualifiedName(ele, name);
    }

    protected QualifiedName getParentQualifiedName(final EObject ele, final QualifiedName childName) {
        EObject temp = ele;
        while (temp.eContainer() != null) {
            temp = temp.eContainer();
            QualifiedName parentsQualifiedName = getFullyQualifiedName(temp);
            if (parentsQualifiedName != null)
                return parentsQualifiedName.append(childName);
        }
        return childName;
    }

    public QualifiedName qualifiedName(Scope ele) {
        QualifiedName name = null;
        String nameString = SimpleAttributeResolver.NAME_RESOLVER.apply(ele);
        if (!Strings.isEmpty(nameString)) {
            name = nameConverter.toQualifiedName(nameString);
        }

        QualifiedName namespace = getNamespace(ele);
        if (namespace != null && name != null) {
            name = namespace.append(name);
        }
        return name;
    }

    public QualifiedName qualifiedName(FinalState ele) {
        QualifiedName qfn = null;
        if (Strings.isEmpty(ele.getName())) {
            qfn = QualifiedName.create(_FINAL_STATE_NAME);
        } else {
            qfn = QualifiedName.create(identifierConverter.toIdentifier(ele.getName()));
        }

        return getParentQualifiedName(ele, qfn);
    }

    public QualifiedName qualifiedName(State ele) {
        if (ele.getName() == null) {
            return null;
        }
        QualifiedName qualifiedNameFromConverter = QualifiedName
                .create(identifierConverter.toIdentifier(ele.getName()));

        return getParentQualifiedName(ele, qualifiedNameFromConverter);
    }

    public QualifiedName qualifiedName(Region ele) {
        QualifiedName qualifiedNameFromConverter = null;
        if (ele.getName() == null || ele.getName().isEmpty()) {
            if (ele.eContainer() instanceof CompositeElement) {
                CompositeElement parent = (CompositeElement) ele.eContainer();
                int index = parent.getRegions().indexOf(ele);
                if (index != -1) {
                    qualifiedNameFromConverter = QualifiedName.create("_region" + index);
                }
            }
            if (qualifiedNameFromConverter == null) {
                return null;
            }
        } else {
            qualifiedNameFromConverter = QualifiedName.create(identifierConverter.toIdentifier(ele.getName()));
        }

        return getParentQualifiedName(ele, qualifiedNameFromConverter);
    }

    public QualifiedName qualifiedName(Declaration ele) {
        QualifiedName name = null;
        if (!Strings.isEmpty(ele.getName())) {
            name = nameConverter.toQualifiedName(ele.getName());
        }
        QualifiedName namespace = getNamespace(ele);
        if (namespace != null && name != null) {
            name = namespace.append(name);
        }
        return name;
    }

    protected QualifiedName getNamespace(EObject child) {
        QualifiedName name = null;
        if (!(child instanceof ScopedElement)) {
            ScopedElement interfaceScope = EcoreUtil2.getContainerOfType(child, ScopedElement.class);
            if (interfaceScope != null && !Strings.isEmpty(interfaceScope.getNamespace())) {
                name = nameConverter.toQualifiedName(interfaceScope.getNamespace());
            }
        }
        return name;
    }
}