org.metaabm.commands.TargetTranslator.java Source code

Java tutorial

Introduction

Here is the source code for org.metaabm.commands.TargetTranslator.java

Source

/**
 * <copyright>
 *
 * Copyright (c) 2007-2009 Metascape, LLC
 * Copyright (c) 2006-2007 Argonne National Labs
 * 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:
 *   Argonne National Laboratory - Initial development (pre-contribution)
 *   Metascape - Subsequent development and maintenance
 *
 * </copyright> $Id: TargetTranslator.java,v 1.3 2010/08/04 01:52:52 mparker Exp $
 */
package org.metaabm.commands;

import java.util.Arrays;
import java.util.List;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;

import org.apache.commons.lang.StringUtils;
import org.metaabm.IID;
import org.metaabm.MetaABMPackage;
import org.metaabm.SAgent;
import org.metaabm.SContext;
import org.metaabm.SImplemented;
import org.metaabm.SProjection;
import org.metaabm.act.ABuildProjection;
import org.metaabm.act.ACreateAgents;
import org.metaabm.act.ALoadAgents;
import org.metaabm.act.ALoadShapedAgents;
import org.metaabm.provider.MetaABMEditPlugin;

/**
 * Standard translators for typical identifier transformations.
 * 
 * @author milesparker
 * 
 */
public abstract class TargetTranslator implements StringTranslator {

    EStructuralFeature sourceFeature;

    EStructuralFeature targetFeature;

    public final static TargetTranslator LABEL_TO_CLASSNAME_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.SIMPLEMENTATION__CLASS_NAME) {
        public String translateName(String otherName, IID source) {
            String className = removeSpecialChars(otherName);
            return className;
        }

        public EObject targetFor(EObject source) {
            return ((SImplemented) source).getImplementation();
        }
    };

    public final static TargetTranslator LABEL_TO_AGENT_COUNT_DESC_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.SNAMED__PLURAL_LABEL, MetaABMPackage.Literals.SNAMED__DESCRIPTION) {
        public String translateName(String otherName, IID source) {
            // todo would like to have real support for plural
            // names
            // here
            return "The number of " + (otherName != null ? otherName.toLowerCase() : "?") + " to create.";
        }

        public EObject targetFor(EObject source) {
            ACreateAgents creator = AddAgentsActsCommand.findCreatorFor((SAgent) source);
            return creator != null ? creator.getAgentCount() : null;
        }
    };

    public final static TargetTranslator LABEL_TO_AGENT_COUNT_LABEL_TRANSLATOR = new TargetTranslator() {
        public String translateName(String otherName, IID source) {
            return otherName + " Count";
        }

        public EObject targetFor(EObject source) {
            ACreateAgents creator = AddAgentsActsCommand.findCreatorFor((SAgent) source);
            return creator != null ? creator.getAgentCount() : null;
        }
    };

    public final static TargetTranslator LABEL_TO_AGENT_CREATOR_LABEL_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.SNAMED__PLURAL_LABEL, MetaABMPackage.Literals.IID__LABEL) {
        public String translateName(String otherName, IID source) {
            String label = !StringUtils.isEmpty(otherName) ? otherName : "Unspecified";
            if (source instanceof ALoadAgents || source instanceof ALoadShapedAgents) {
                label = "Load " + label;
            } else {
                label = "Create " + label;
            }
            return label;
        }

        public EObject targetFor(EObject source) {
            ACreateAgents creator = AddAgentsActsCommand.findCreatorFor((SAgent) source);
            return creator;
        }
    };

    public final static TargetTranslator LABEL_TO_SPACE_BUILDER_LABEL_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.SNAMED__PLURAL_LABEL, MetaABMPackage.Literals.IID__LABEL) {
        public String translateName(String otherName, IID source) {
            String label = !StringUtils.isEmpty(otherName) ? otherName : "Undefined";
            if (source instanceof ABuildProjection) {
                label = "Build " + label;
            }
            return label;
        }

        public EObject targetFor(EObject source) {
            ABuildProjection creator = AddSpacesActsCommand
                    .findBuilderOf((SContext) ((SProjection) source).eContainer(), (SProjection) source);
            return creator;
        }
    };

    public final static TargetTranslator LABEL_TO_PLURAL_NAME_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.SNAMED__PLURAL_LABEL) {
        public String translateName(String otherName, IID source) {
            return !StringUtils.isEmpty(otherName) ? otherName.concat("s") : "";
        }
    };

    public final static TargetTranslator LABEL_TO_ID_TRANSLATOR = new TargetTranslator(
            MetaABMPackage.Literals.IID__ID) {
        public String translateName(String otherName, IID source) {
            String legalID = removeSpecialChars(otherName);
            legalID = StringUtils.uncapitalize(legalID);
            return legalID;
        }
    };

    // todo clean-up
    public final static List<TargetTranslator> ID_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR);

    public final static List<TargetTranslator> PLURAL_TRANSLATORS = Arrays
            .asList(LABEL_TO_AGENT_CREATOR_LABEL_TRANSLATOR, LABEL_TO_AGENT_COUNT_DESC_TRANSLATOR);

    public final static List<TargetTranslator> AGENT_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR,
            LABEL_TO_PLURAL_NAME_TRANSLATOR, LABEL_TO_CLASSNAME_TRANSLATOR, LABEL_TO_AGENT_COUNT_DESC_TRANSLATOR,
            LABEL_TO_AGENT_CREATOR_LABEL_TRANSLATOR, LABEL_TO_AGENT_COUNT_LABEL_TRANSLATOR);

    public final static List<TargetTranslator> SAPCE_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR,
            LABEL_TO_PLURAL_NAME_TRANSLATOR, LABEL_TO_SPACE_BUILDER_LABEL_TRANSLATOR);

    public final static List<TargetTranslator> NAMED_IMPLEMENTED_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR,
            LABEL_TO_PLURAL_NAME_TRANSLATOR, LABEL_TO_CLASSNAME_TRANSLATOR);

    public final static List<TargetTranslator> NAMED_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR,
            LABEL_TO_PLURAL_NAME_TRANSLATOR);

    public final static List<TargetTranslator> IMPLEMENTED_TRANSLATORS = Arrays.asList(LABEL_TO_ID_TRANSLATOR,
            LABEL_TO_CLASSNAME_TRANSLATOR);

    public TargetTranslator() {
        this(MetaABMPackage.Literals.IID__LABEL);
    }

    public TargetTranslator(EStructuralFeature targetFeature) {
        this(MetaABMPackage.Literals.IID__LABEL, targetFeature);
    }

    public TargetTranslator(EStructuralFeature sourceFeature, EStructuralFeature targetFeature) {
        this.sourceFeature = sourceFeature;
        this.targetFeature = targetFeature;
    }

    public EObject targetFor(EObject source) {
        return source;
    }

    public boolean includeFor(EditingDomain domain, EObject source) {
        String sourceName = (String) source.eGet(sourceFeature);
        String oldTranslatedName = translateName(sourceName, (IID) source);
        EObject target = targetFor(source);

        if (target != null) {
            String oldName = (String) target.eGet(targetFeature);
            oldName = StringUtils.remove(oldName, " Copy");
            oldName = StringUtils.remove(oldName, "Copy");
            oldTranslatedName = StringUtils.remove(oldTranslatedName, " Copy");
            oldTranslatedName = StringUtils.remove(oldTranslatedName, "Copy");
            String defaultString = MetaABMEditPlugin.INSTANCE
                    .getString("_UI_" + source.eClass().getName() + "_type");
            // System.out.println();
            // System.out.println((new StringBuffer(" : "+oldName).insert(0,
            // "[TargetTranslator.includeFor] oldName")));
            // System.out.println((new StringBuffer(" :
            // "+oldTranslatedName).insert(0, "[TargetTranslator.includeFor]
            // oldTranslatedName")));
            //
            // System.out.println((new StringBuffer(" :
            // "+defaultString).insert(0, "[TargetTranslator.includeFor]
            // defaultString")));

            if (!StringUtils.isEmpty(StringUtils.deleteWhitespace(oldName)) && !oldName.equals(oldTranslatedName)) {
                if (target instanceof IID) {
                    SuggestLabelCommand testCmd = new SuggestLabelCommand(domain, (IID) target);
                    if (targetFeature == MetaABMPackage.Literals.IID__LABEL
                            && (testCmd.suggestLabel((IID) target).equals(oldName) || defaultString.equals(oldName))
                            || targetFeature == MetaABMPackage.Literals.IID__ID
                                    && testCmd.suggestID((IID) target).equals(oldName)) {
                        // || ((targetFeature ==
                        // MetaABMPackage.Literals.SNAMED__PLURAL_LABEL) &&
                        // SetLabelCommand.LABEL_TO_PLURAL_NAME_TRANSLATOR.
                        // translateName(
                        // testCmd.suggestLabel((IID) target)).equals(oldName)))
                        // {
                        return true;
                    }
                }
                return false;
            }
        }
        return true;
    }

    public Command createCommand(EditingDomain domain, IID source) {
        if (source != null) {
            String sourceName = (String) source.eGet(sourceFeature);

            if (!StringUtils.isEmpty(sourceName)) {
                EObject targetFor = targetFor(source);
                String targetValue = translateName(sourceName, targetFor instanceof IID ? (IID) targetFor : source);

                return SetCommand.create(domain, targetFor, targetFeature, targetValue);
            }
        }
        return null;
    }

    public static Command create(EditingDomain domain, List<TargetTranslator> translators, IID source) {
        CompoundCommand cmd = new CompoundCommand();
        for (TargetTranslator targetTranslator : translators) {
            cmd.append(targetTranslator.createCommand(domain, source));
        }
        return cmd;
    }

    protected String removeSpecialChars(String otherName) {
        String legalID = StringUtils.deleteWhitespace(StringUtils.capitalize(otherName));
        // todo..make this more generic
        legalID = StringUtils.replace(legalID, "()", "");
        legalID = StringUtils.replace(legalID, "(", "_");
        legalID = StringUtils.replace(legalID, ")", "_");
        legalID = StringUtils.replace(legalID, "[?]", "");
        legalID = StringUtils.replace(legalID, "[", "_");
        legalID = StringUtils.replace(legalID, "]", "_");
        legalID = StringUtils.replace(legalID, "?", "");
        legalID = StringUtils.replace(legalID, "&&", "AND");
        legalID = StringUtils.replace(legalID, "&", "And");
        legalID = StringUtils.replace(legalID, "!", "Not");
        legalID = StringUtils.replace(legalID, "||", "OR");
        legalID = StringUtils.replace(legalID, "|", "Or");
        legalID = StringUtils.replace(legalID, ",", "");
        legalID = StringUtils.replace(legalID, ".", "pt");
        legalID = StringUtils.replace(legalID, ":", "");
        return legalID;
    }
}