Package de.FeatureModellingTool.Pattern

Source Code of de.FeatureModellingTool.Pattern.FeatureModelHelper

package de.FeatureModellingTool.Pattern;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;

import research.ConnectionFigure;
import research.DrawingView;
import research.Figure;
import research.FigureEnumeration;
import research.figure.ArrowTip;
import de.FeatureModellingTool.FeatureModel.CFRelation;
import de.FeatureModellingTool.FeatureModel.CompositeConstraint;
import de.FeatureModellingTool.FeatureModel.CompositeConstraintEditor;
import de.FeatureModellingTool.FeatureModel.Constraint;
import de.FeatureModellingTool.FeatureModel.ConstraintModel;
import de.FeatureModellingTool.FeatureModel.ConstraintModelEditor;
import de.FeatureModellingTool.FeatureModel.Feature;
import de.FeatureModellingTool.FeatureModel.FeatureEditor;
import de.FeatureModellingTool.FeatureModel.FeatureModel;
import de.FeatureModellingTool.FeatureModel.FeatureModelEditor;
import de.FeatureModellingTool.FeatureModel.FeatureProperties;
import de.FeatureModellingTool.FeatureModel.FeatureRelation;
import de.FeatureModellingTool.FeatureModel.GroupConstraint;
import de.FeatureModellingTool.FeatureModel.GroupConstraintEditor;
import de.FeatureModellingTool.FeatureModel.VPConstraint;
import de.FeatureModellingTool.FeatureModel.VPConstraintEditor;
import de.FeatureModellingTool.GraphicalEditor.ConstraintConnection;
import de.FeatureModellingTool.GraphicalEditor.CrossDecoration;
import de.FeatureModellingTool.GraphicalEditor.AttributeConnection;
import de.FeatureModellingTool.GraphicalEditor.FeatureFigure;
import de.FeatureModellingTool.GraphicalEditor.DecomposeConnection;
import java.util.Collection;
import java.util.Map;

public class FeatureModelHelper {

    public static Figure createFeatureFigure() {
        return null;
    }

    private static void collectSubFeatureIDs(Feature feature, HashSet<String> hsSubFeatureIDs) {
        hsSubFeatureIDs.add(feature.getID());
        for (Iterator<FeatureRelation> itRelation = (Iterator<FeatureRelation>) feature.getAllRelatedRelation().iterator(); itRelation.hasNext();) {
            FeatureRelation relation = itRelation.next();
            if (ConstantDefinition.isStructRelation(relation) && relation.getStartFeature().getID().equals(feature.getID()) && !hsSubFeatureIDs.contains(relation.getEndFeature().getID())) {
                collectSubFeatureIDs(relation.getEndFeature(), hsSubFeatureIDs);
            }
        }
    }

    public static void cloneFeatureTree(Feature feature, FeatureEditor featureEditor, FeatureModel featureModel, FeatureModelEditor featureModelEditor, ConstraintModel constraintModel, ConstraintModelEditor constraintModelEditor, GroupConstraintEditor groupConstraintEditor, CompositeConstraintEditor compositeConstraintEditor, VPConstraintEditor vpConstraintEditor) {
        HashSet<String> hsSubFeatureIDs = new HashSet<String>();
        FeatureModelHelper.collectSubFeatureIDs(feature, hsSubFeatureIDs);

        Hashtable<String, String> htNameMap = new Hashtable<String, String>();
        FeatureModelHelper.cloneFeatureTree(feature, featureEditor, featureModel, featureModelEditor, htNameMap, hsSubFeatureIDs);

        Set constraints = new HashSet();

        constraints.clear();
        constraints.addAll(featureModel.getAllFeatureRelation().values());
        for (Iterator<FeatureRelation> itRelation = constraints.iterator(); itRelation.hasNext();) {
            FeatureRelation relation = itRelation.next();
            if (!htNameMap.containsKey(relation.getID())) {
                Feature start = featureModel.getFeature(htNameMap.get(relation.getStartFeature().getID()));
                Feature end = featureModel.getFeature(htNameMap.get(relation.getEndFeature().getID()));
                if (start != null || end != null) {
                    if (start == null) {
                        start = relation.getStartFeature();
                    }
                    if (end == null) {
                        end = relation.getEndFeature();
                    }
                    FeatureRelation newRelation = featureModelEditor.addRelation(relation.getName(), start, end);
                    htNameMap.put(relation.getID(), newRelation.getID());
                }
            }
        }

        constraints.clear();
        constraints.addAll(constraintModel.getAllGroupConstraint().values());
        for (Iterator<GroupConstraint> itConstraint = constraints.iterator(); itConstraint.hasNext();) {
            GroupConstraint gc = itConstraint.next();

            boolean newFeature = false;
            boolean allNewFeature = true;
            for (Iterator<Feature> itFeature = gc.getFeatureSet().iterator(); itFeature.hasNext();) {
                Feature constraintFeature = itFeature.next();
                if (htNameMap.containsKey(constraintFeature.getID())) {
                    newFeature = true;
                } else {
                    allNewFeature = false;
                }
            }

            GroupConstraint newConstraint = null;
            if (newFeature) {
                if (allNewFeature) {
                    newConstraint = constraintModelEditor.addGroupConstraint();
                    groupConstraintEditor.setType(newConstraint, gc.getType());
                    htNameMap.put(gc.getID(), newConstraint.getID());
                } else {
                    newConstraint = gc;
                }

                for (Iterator<Feature> itFeature = gc.getFeatureSet().iterator(); itFeature.hasNext();) {
                    Feature constraintFeature = itFeature.next();
                    if (allNewFeature || htNameMap.containsKey(constraintFeature.getID())) {
                        constraintFeature = featureModel.getFeature(htNameMap.get(constraintFeature.getID()));
                        groupConstraintEditor.addFeature(newConstraint, constraintFeature);
                    }
                }
            }
        }

        constraints.clear();
        constraints.addAll(constraintModel.getAllCompositeConstraint().values());
        for (Iterator<CompositeConstraint> itConstraint = constraints.iterator(); itConstraint.hasNext();) {
            CompositeConstraint gc = itConstraint.next();

            boolean newFeature = false;
            boolean allNewFeature = true;
            for (Iterator<Feature> itFeature = gc.getSinkFeatureSet().iterator(); itFeature.hasNext();) {
                Feature constraintFeature = itFeature.next();
                if (htNameMap.containsKey(constraintFeature.getID())) {
                    newFeature = true;
                } else {
                    allNewFeature = false;
                }
            }
            for (Iterator<Feature> itFeature = gc.getSourceFeatureSet().iterator(); itFeature.hasNext();) {
                Feature constraintFeature = itFeature.next();
                if (htNameMap.containsKey(constraintFeature.getID())) {
                    newFeature = true;
                } else {
                    allNewFeature = false;
                }
            }

            if (newFeature) {
                CompositeConstraint newConstraint = null;
                if (allNewFeature) {
                    newConstraint = constraintModelEditor.addCompositeConstraint();
                    compositeConstraintEditor.setPLType(newConstraint, gc.getPLType());
                    compositeConstraintEditor.setSinkType(newConstraint, gc.getSinkType());
                    compositeConstraintEditor.setSourceType(newConstraint, gc.getSourceType());
                    htNameMap.put(gc.getID(), newConstraint.getID());
                } else {
                    newConstraint = gc;
                }

                for (Iterator<Feature> itFeature = gc.getSourceFeatureSet().iterator(); itFeature.hasNext();) {
                    Feature constraintFeature = itFeature.next();
                    if (allNewFeature || htNameMap.containsKey(constraintFeature.getID())) {
                        constraintFeature = featureModel.getFeature(htNameMap.get(constraintFeature.getID()));
                        compositeConstraintEditor.addSourceFeature(newConstraint, constraintFeature);
                    }
                }

                for (Iterator<Feature> itFeature = gc.getSinkFeatureSet().iterator(); itFeature.hasNext();) {
                    Feature constraintFeature = itFeature.next();
                    if (allNewFeature || htNameMap.containsKey(constraintFeature.getID())) {
                        constraintFeature = featureModel.getFeature(htNameMap.get(constraintFeature.getID()));
                        compositeConstraintEditor.addSinkFeature(newConstraint, constraintFeature);
                    }
                }
            }
        }

        constraints.clear();
        constraints.addAll(constraintModel.getAllVPConstraint().values());
        for (Iterator<VPConstraint> itConstraint = constraints.iterator(); itConstraint.hasNext();) {
            VPConstraint gc = itConstraint.next();

            boolean newFeature = false;
            boolean allNewFeature = true;
            for (Iterator<Feature> itFeature = gc.getSinkFeatureSet().iterator(); itFeature.hasNext();) {
                Feature constraintFeature = itFeature.next();
                if (htNameMap.containsKey(constraintFeature.getID())) {
                    newFeature = true;
                } else {
                    allNewFeature = false;
                }
            }
            for (Iterator<Feature> itFeature = gc.getSourceFeatureSet().iterator(); itFeature.hasNext();) {
                Feature constraintFeature = itFeature.next();
                if (htNameMap.containsKey(constraintFeature.getID())) {
                    newFeature = true;
                } else {
                    allNewFeature = false;
                }
            }

            if (newFeature) {
                VPConstraint newConstraint = null;
                if (allNewFeature) {
                    newConstraint = constraintModelEditor.addVPConstraint();
                    vpConstraintEditor.setType(newConstraint, gc.getType());
                    htNameMap.put(gc.getID(), newConstraint.getID());
                } else {
                    newConstraint = gc;
                }

                for (Iterator<Feature> itFeature = gc.getSourceFeatureSet().iterator(); itFeature.hasNext();) {
                    Feature constraintFeature = itFeature.next();
                    if (allNewFeature || htNameMap.containsKey(constraintFeature.getID())) {
                        constraintFeature = featureModel.getFeature(htNameMap.get(constraintFeature.getID()));
                        vpConstraintEditor.addSourceFeature(newConstraint, constraintFeature);
                    }
                }

                for (Iterator<Feature> itFeature = gc.getSinkFeatureSet().iterator(); itFeature.hasNext();) {
                    Feature constraintFeature = itFeature.next();
                    if (allNewFeature || htNameMap.containsKey(constraintFeature.getID())) {
                        constraintFeature = featureModel.getFeature(htNameMap.get(constraintFeature.getID()));
                        vpConstraintEditor.addSinkFeature(newConstraint, constraintFeature);
                    }
                }
            }
        }

        constraints.clear();
        constraints.addAll(constraintModel.getAllCFRelation().values());
        for (Iterator<CFRelation> itConstraint = constraints.iterator(); itConstraint.hasNext();) {
            CFRelation gc = itConstraint.next();

            boolean newFeature = false;
            Feature cfFeature = gc.getFeature();
            if (htNameMap.containsKey(gc.getFeature().getID())) {
                cfFeature = featureModel.getFeature(htNameMap.get(gc.getFeature().getID()));
                newFeature = true;
            }
            Constraint cfConstraint = gc.getConstraint();
            if (htNameMap.containsKey(gc.getConstraint().getID())) {
                cfConstraint = constraintModel.getConstraint(htNameMap.get(gc.getConstraint().getID()));
                newFeature = true;
            }
            if (newFeature) {
                CFRelation newConstraint = constraintModelEditor.addCFRelation(cfFeature, cfConstraint, gc.isSource(), gc.getModifier());
                htNameMap.put(gc.getID(), newConstraint.getID());
            }
        }
    }

    private static void cloneFeatureTree(Feature feature, FeatureEditor featureEditor, FeatureModel featureModel, FeatureModelEditor featureModelEditor, Hashtable<String, String> htNameMap, HashSet<String> hsSubFeatureIDs) {
        Feature newFeature = featureModelEditor.addFeature(feature.getName());
        htNameMap.put(feature.getID(), newFeature.getID());

        featureEditor.setBindingTime(newFeature, feature.getBindingTime());
        featureEditor.setCategory(newFeature, feature.getCategory());
        featureEditor.setDescription(newFeature, feature.getDescription());
        featureEditor.setVariability(newFeature, feature.getVariability());

        for (Iterator<FeatureRelation> itRelation = feature.getAllRelatedRelation().iterator(); itRelation.hasNext();) {
            FeatureRelation relation = itRelation.next();
            if (ConstantDefinition.isStructRelation(relation) && relation.getStartFeature().getID().equals(feature.getID())) {
                cloneFeatureTree(relation.getEndFeature(), featureEditor, featureModel, featureModelEditor, htNameMap, hsSubFeatureIDs);
            }
        }
    }

    public static void removeFeatureTree(Feature feature, FeatureModel featureModel, FeatureModelEditor featureModelEditor, ConstraintModel constraintModel, ConstraintModelEditor constraintModelEditor, GroupConstraintEditor groupConstraintEditor, CompositeConstraintEditor compositeConstraintEditor, VPConstraintEditor vpConstraintEditor) {
        HashSet<String> hsSubFeatureIDs = new HashSet<String>();
        FeatureModelHelper.collectSubFeatureIDs(feature, hsSubFeatureIDs);

        Set constraints = new HashSet();

        constraints.clear();
        constraints.addAll(featureModel.getAllFeatureRelation().values());
        for (Iterator<FeatureRelation> itRelation = constraints.iterator(); itRelation.hasNext();) {
            FeatureRelation relation = itRelation.next();
            if (hsSubFeatureIDs.contains(relation.getStartFeature().getID()) || hsSubFeatureIDs.contains(relation.getEndFeature().getID())) {
                featureModelEditor.removeRelation(relation.getID());
            }
        }

        constraints.clear();
        constraints.addAll(constraintModel.getAllCFRelation().values());
        for (Iterator<CFRelation> itRelation = constraints.iterator(); itRelation.hasNext();) {
            CFRelation relation = itRelation.next();
            if (hsSubFeatureIDs.contains(relation.getFeature())) {
                constraintModelEditor.removeCFRelation(relation.getID());
            }
        }



    }

    public static void pasteFeatureTree(Feature fSrc, FeatureModel fmSrc, ConstraintModel cmSrc, DrawingView dvSrc, Feature fDist, FeatureModel fmDist, ConstraintModel cmDist, DrawingView dvDist, FeatureModelEditor fmEditor, FeatureEditor fEditor) {
        Set<Feature> features = new HashSet<Feature>(fmSrc.getAllFeature().values());
        features.remove(fSrc);

        Hashtable<String, Figure> srcFigureMap = new Hashtable<String, Figure>();
        for (FigureEnumeration fe = dvSrc.getDrawing().getFigures(); fe.hasMoreElements();) {
            Figure figure = fe.nextFigure();
            srcFigureMap.put((String) figure.getAttribute("id"), figure);
        }

        Hashtable<String, String> nameMap = new Hashtable<String, String>();
        nameMap.put(fSrc.getID(), fDist.getID());
        Hashtable<String, Figure> figureMap = new Hashtable<String, Figure>();
        for (FigureEnumeration fe = dvDist.getDrawing().getFigures(); fe.hasMoreElements();) {
            Figure figure = fe.nextFigure();
            if (fDist.getID().equals(figure.getAttribute("id"))) {
                figureMap.put(fDist.getID(), figure);
                break;
            }
        }

        Figure rSrc = srcFigureMap.get(fSrc.getID());
        Figure rDist = figureMap.get(fDist.getID());
        for (Iterator<Feature> itFeature = features.iterator(); itFeature.hasNext();) {
            Feature feature = itFeature.next();
            Feature newFeature = fmEditor.addFeature(feature.getName());
            fEditor.setBindingTime(newFeature, feature.getBindingTime());
            fEditor.setCategory(newFeature, feature.getCategory());
            fEditor.setVariability(newFeature, feature.getVariability());

            nameMap.put(feature.getID(), newFeature.getID());

            FeatureFigure figDist = new FeatureFigure();
            figDist.setText(feature.getName());
            figDist.setAttribute("id", feature.getID());
            figDist.setAttribute(FeatureProperties.VARIABILITY, feature.getVariability().getName());
            dvDist.add(figDist);

            Figure fOld = srcFigureMap.get(feature.getID());
            figDist.moveBy(rDist.getDisplayBox().x - rSrc.getDisplayBox().x + fOld.getDisplayBox().x, rDist.getDisplayBox().y - rSrc.getDisplayBox().y + fOld.getDisplayBox().y);
            figureMap.put(newFeature.getID(), figDist);
        }

        for (Iterator<FeatureRelation> itRelation = fmSrc.getAllFeatureRelation().values().iterator(); itRelation.hasNext();) {
            FeatureRelation relation = itRelation.next();
            FeatureRelation newRelation = fmEditor.addRelation(relation.getName(), fmDist.getFeature(nameMap.get(relation.getStartFeature().getID())), fmDist.getFeature(nameMap.get(relation.getEndFeature().getID())));

            nameMap.put(relation.getID(), newRelation.getID());

            ConnectionFigure cf = null;
            if (FeatureRelation.ATTRIBUTE.equals(newRelation.getName())) {
                AttributeConnection dvc = new AttributeConnection();
                cf = dvc;
            } else if (FeatureRelation.DECOMPOSE.equals(newRelation.getName())) {
                DecomposeConnection ic = new DecomposeConnection();
                cf = ic;
            } else if (FeatureRelation.REQUIRE.equals(newRelation.getName())) {
                ConstraintConnection cc = new ConstraintConnection(FeatureRelation.REQUIRE);
                cc.setEndDecoration(new ArrowTip());
                cf = cc;
            } else if (FeatureRelation.EXCLUDE.equals(newRelation.getName())) {
                ConstraintConnection cc = new ConstraintConnection(FeatureRelation.EXCLUDE);
                cc.setMidDecoration(new CrossDecoration(5));
                cf = cc;
            }

            if (cf != null) {
                cf.setAttribute("id", newRelation.getID());
                cf.startPoint(figureMap.get(newRelation.getStartFeature().getID()).center().x, figureMap.get(newRelation.getStartFeature().getID()).center().y);
                cf.endPoint(figureMap.get(newRelation.getEndFeature().getID()).center().x, figureMap.get(newRelation.getEndFeature().getID()).center().y);
                if (de.FeatureModellingTool.Pattern.ConstantDefinition.isStructRelation(relation)) {
                    cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[2]);
                    cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[1]);
                } else {
                    cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[0]);
                    cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[0]);
                }
                dvDist.add(cf);
                cf.updateConnection();
            }
        }
    }

    public static void pasteFeatureTree(Feature fSrc, FeatureModel fmSrc, ConstraintModel cmSrc, Feature fDist, FeatureModel fmDist, ConstraintModel cmDist, DrawingView dvDist, FeatureModelEditor fmEditor, FeatureEditor fEditor, Hashtable<String, String> nameMap, Hashtable<String, Figure> figureMap) {
        Set<Feature> features = new HashSet<Feature>();
        features.add(fSrc);
        boolean changed = false;
        do {
            for (Iterator<Feature> itFeature = fmSrc.getAllFeature().values().iterator(); itFeature.hasNext();) {
                Feature feature = itFeature.next();
                if (!features.contains(feature) && features.contains(fmSrc.getParentFeature(feature.getID()))) {
                    features.add(feature);
                    changed = true;
                }
            }
            changed = false;
        } while (changed);
        features.remove(fSrc);

//    Hashtable<String , Figure> srcFigureMap = new Hashtable<String , Figure>();
//    for (FigureEnumeration fe=dvSrc.getDrawing().getFigures()
//        ; fe.hasMoreElements() ; ) {
//      Figure figure = fe.nextFigure();
//      srcFigureMap.put((String)figure.getAttribute("id") , figure);
//    }
//
//    Hashtable<String , String> nameMap = new Hashtable<String , String>();
        nameMap.put(fSrc.getID(), fDist.getID());
//    Hashtable<String , Figure> figureMap = new Hashtable<String , Figure>();
        for (FigureEnumeration fe = dvDist.getDrawing().getFigures(); fe.hasMoreElements();) {
            Figure figure = fe.nextFigure();
            if (fDist.getID().equals(figure.getAttribute("id"))) {
                figureMap.put(fDist.getID(), figure);
                break;
            }
        }

//    Figure rSrc = srcFigureMap.get(fSrc.getID());
        Figure rDist = figureMap.get(fDist.getID());
        for (Iterator<Feature> itFeature = features.iterator(); itFeature.hasNext();) {
            Feature feature = itFeature.next();
            Feature newFeature = fmEditor.addFeature(feature.getName());
            fEditor.setBindingTime(newFeature, feature.getBindingTime());
            fEditor.setCategory(newFeature, feature.getCategory());
            fEditor.setVariability(newFeature, feature.getVariability());

            nameMap.put(feature.getID(), newFeature.getID());

            FeatureFigure figDist = new FeatureFigure();
            figDist.setText(feature.getName());
            figDist.setAttribute("id", feature.getID());
            figDist.setAttribute(FeatureProperties.VARIABILITY, feature.getVariability().getName());
            dvDist.add(figDist);

//      Figure fOld = srcFigureMap.get(feature.getID());
//      figDist.moveBy(rDist.getDisplayBox().x - rSrc.getDisplayBox().x + fOld.getDisplayBox().x
//          , rDist.getDisplayBox().y - rSrc.getDisplayBox().y + fOld.getDisplayBox().y);
            figureMap.put(newFeature.getID(), figDist);
        }

            for (Iterator<FeatureRelation> itRelation = fmSrc.getAllFeatureRelation().values().iterator(); itRelation != null && itRelation.hasNext();) {
                FeatureRelation relation = itRelation.next();
                if (!nameMap.containsKey(relation.getStartFeature().getID()) || !nameMap.containsKey(relation.getEndFeature().getID())) {
                    continue;
                }

                FeatureRelation newRelation = fmEditor.addRelation(relation.getName(), fmDist.getFeature(nameMap.get(relation.getStartFeature().getID())), fmDist.getFeature(nameMap.get(relation.getEndFeature().getID())));

                nameMap.put(relation.getID(), newRelation.getID());

                ConnectionFigure cf = null;
                if (FeatureRelation.ATTRIBUTE.equals(newRelation.getName())) {
                    AttributeConnection dvc = new AttributeConnection();
                    cf = dvc;
                } else if (FeatureRelation.DECOMPOSE.equals(newRelation.getName())) {
                    DecomposeConnection ic = new DecomposeConnection();
                    cf = ic;
                } else if (FeatureRelation.REQUIRE.equals(newRelation.getName())) {
                    ConstraintConnection cc = new ConstraintConnection(FeatureRelation.REQUIRE);
                    cc.setEndDecoration(new ArrowTip());
                    cf = cc;
                } else if (FeatureRelation.EXCLUDE.equals(newRelation.getName())) {
                    ConstraintConnection cc = new ConstraintConnection(FeatureRelation.EXCLUDE);
                    cc.setMidDecoration(new CrossDecoration(5));
                    cf = cc;
                }

                if (cf != null) {
                    cf.setAttribute("id", newRelation.getID());
                    cf.startPoint(figureMap.get(newRelation.getStartFeature().getID()).center().x, figureMap.get(newRelation.getStartFeature().getID()).center().y);
                    cf.endPoint(figureMap.get(newRelation.getEndFeature().getID()).center().x, figureMap.get(newRelation.getEndFeature().getID()).center().y);
                    if (de.FeatureModellingTool.Pattern.ConstantDefinition.isStructRelation(relation)) {
                        cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[2]);
                        cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[1]);
                    } else {
                        cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[0]);
                        cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[0]);
                    }
                    dvDist.add(cf);
                    cf.updateConnection();
                    dvDist.repairDamage();
                }
            }

    }

    public static void pasteFeatureTree(Feature fSrc, FeatureModel fmSrc, ConstraintModel cmSrc, Feature fDist, FeatureModel fmDist, ConstraintModel cmDist, DrawingView dvDist, FeatureModelEditor fmEditor, FeatureEditor fEditor, Hashtable<String, Integer> cloneCount, Hashtable<String, String> nameMap, Hashtable<String, Figure> figureMap) {
//    Hashtable<String , String> nameMap = new Hashtable<String , String>();
//    Hashtable<String , Figure> figureMap = new Hashtable<String , Figure>();

        pasteFeatureTree(fSrc, fmSrc, cmSrc, fDist, fmDist, cmDist, dvDist, fmEditor, fEditor, nameMap, figureMap);

        Hashtable<String, String> waittingMap = new Hashtable<String, String>();
        for (Iterator<Entry<String, String>> itNameMap = nameMap.entrySet().iterator(); itNameMap.hasNext();) {
            Entry<String, String> entry = itNameMap.next();
            waittingMap.put(entry.getValue(), entry.getKey());
        }

        HashSet<String> counts = new HashSet<String>(cloneCount.keySet());
        ArrayList<String> alCount = new ArrayList<String>();
        while (counts.size() > 0) {
            for (Iterator<Entry<String, Integer>> itCount = cloneCount.entrySet().iterator(); itCount.hasNext();) {
                Entry<String, Integer> entry = itCount.next();
                if (!alCount.contains(entry.getKey())) {
                    Feature feature = fmSrc.getFeature(entry.getKey());

                    feature = fmSrc.getParentFeature(feature.getID());
                    while (feature != null) {
                        counts.remove(feature.getID());
                        feature = fmSrc.getParentFeature(feature.getID());
                    }
                }
            }

            alCount.addAll(counts);
            counts.clear();
            counts.addAll(cloneCount.keySet());
            counts.removeAll(alCount);
        }

//    for (Iterator<Entry<String,Integer>> itCount=cloneCount.entrySet().iterator() ; itCount.hasNext() ; ) {
        for (int i = 0; i < alCount.size(); i++) {
            String srcKey = alCount.get(i);
            Integer srcCount = cloneCount.get(srcKey);
            for (int j = 1; j < srcCount; j++) {
                for (Iterator<Entry<String, String>> itWaitting = waittingMap.entrySet().iterator(); itWaitting.hasNext();) {
                    Entry<String, String> waitting = itWaitting.next();
                    if (waitting.getValue().equals(srcKey)) {
                        Hashtable<String, String> tmpNameMap = new Hashtable<String, String>();

                        cloneThroughPaste(fmDist.getFeature(waitting.getKey()), fmDist, cmDist, fmDist.getParentFeature(waitting.getKey()), fmDist, cmDist, dvDist, fmEditor, fEditor, tmpNameMap, figureMap);
//            cloneThroughPaste(fmSrc.getFeature(entry.getKey()) , fmSrc , cmSrc , fmDist.getParentFeature(waitting.getKey())
//                , fmDist , cmDist , dvDist , fmEditor , fEditor , tmpWaittingMap , figureMap);
                        nameMap.putAll(tmpNameMap);
                    }
                }
            }
        }
    }

    public static void cloneThroughPaste(Feature fSrc, FeatureModel fmSrc, ConstraintModel cmSrc, Feature fDist, FeatureModel fmDist, ConstraintModel cmDist, DrawingView dvDist, FeatureModelEditor fmEditor, FeatureEditor fEditor, Hashtable<String, String> nameMap, Hashtable<String, Figure> figureMap) {
        Feature fTarget = fmEditor.addFeature(fSrc.getName());

        FeatureFigure figDist = new FeatureFigure();
        figDist.setText(fTarget.getName());
        figDist.setAttribute("id", fTarget.getID());
        figDist.setAttribute(FeatureProperties.VARIABILITY, fTarget.getVariability().getName());
        dvDist.add(figDist);

        nameMap.put(fSrc.getID(), fTarget.getID());
        figureMap.put(fTarget.getID(), figDist);

        Feature fParent = fmSrc.getParentFeature(fSrc.getID());
        if (fParent != null) {
            for (Iterator<FeatureRelation> itRelation = fSrc.getAllRelatedRelation().iterator(); itRelation.hasNext();) {
                FeatureRelation relation = itRelation.next();
                if (relation.getStartFeature().getID().equals(fParent.getID())) {
                    FeatureRelation newRelation = fmEditor.addRelation(relation.getName(), fDist, fTarget);

                    ConnectionFigure cf = null;
                    if (FeatureRelation.ATTRIBUTE.equals(newRelation.getName())) {
                        AttributeConnection dvc = new AttributeConnection();
                        cf = dvc;
                    } else if (FeatureRelation.DECOMPOSE.equals(newRelation.getName())) {
                        DecomposeConnection ic = new DecomposeConnection();
                        cf = ic;
                    } else if (FeatureRelation.REQUIRE.equals(newRelation.getName())) {
                        ConstraintConnection cc = new ConstraintConnection(FeatureRelation.REQUIRE);
                        cc.setEndDecoration(new ArrowTip());
                        cf = cc;
                    } else if (FeatureRelation.EXCLUDE.equals(newRelation.getName())) {
                        ConstraintConnection cc = new ConstraintConnection(FeatureRelation.EXCLUDE);
                        cc.setMidDecoration(new CrossDecoration(5));
                        cf = cc;
                    }

                    if (cf != null) {
                        cf.setAttribute("id", newRelation.getID());
                        cf.startPoint(figureMap.get(newRelation.getStartFeature().getID()).center().x, figureMap.get(newRelation.getStartFeature().getID()).center().y);
                        cf.endPoint(figureMap.get(newRelation.getEndFeature().getID()).center().x, figureMap.get(newRelation.getEndFeature().getID()).center().y);
                        if (de.FeatureModellingTool.Pattern.ConstantDefinition.isStructRelation(relation)) {
                            cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[2]);
                            cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[1]);
                        } else {
                            cf.connectStart(figureMap.get(newRelation.getStartFeature().getID()).getConnectors()[0]);
                            cf.connectEnd(figureMap.get(newRelation.getEndFeature().getID()).getConnectors()[0]);
                        }
                        dvDist.add(cf);
                        cf.updateConnection();
                    }

                    break;
                }
            }
        }


        pasteFeatureTree(fSrc, fmSrc, cmSrc, fTarget, fmDist, cmDist, dvDist, fmEditor, fEditor, nameMap, figureMap);
    }
}

 
TOP

Related Classes of de.FeatureModellingTool.Pattern.FeatureModelHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.