| /* |
| * Copyright (c) 2007, 2008 Borland Software Corporation |
| * |
| * 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: |
| * Dmitry Stadnik (Borland) - initial API and implementation |
| * Artem Tikhomirov (Borland) - match referenced elements |
| */ |
| package org.eclipse.gmf.internal.codegen.util; |
| |
| import java.util.HashSet; |
| import java.util.List; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; |
| import org.eclipse.gmf.codegen.gmfgen.GenCommonBase; |
| import org.eclipse.gmf.internal.common.reconcile.Matcher; |
| |
| /** |
| * @author dstadnik |
| */ |
| public class VisualIDMatcher implements Matcher { |
| private final EReference myCommonBaseReference; |
| |
| public VisualIDMatcher() { |
| myCommonBaseReference = null; |
| } |
| |
| /** |
| * Matches not the elements passed by reconciler, but values they reference with the supplied feature. |
| * Feature's type should be subclass of GenCommonBase. If feature is multiple, element ordering is ignored. |
| */ |
| public VisualIDMatcher(EReference commonBaseReference) { |
| assert commonBaseReference != null; // use another cons instead |
| assert GMFGenPackage.eINSTANCE.getGenCommonBase().isSuperTypeOf(commonBaseReference.getEReferenceType()); |
| myCommonBaseReference = commonBaseReference; |
| } |
| |
| public boolean match(EObject current, EObject old) { |
| if (myCommonBaseReference == null) { |
| if (current instanceof GenCommonBase && old instanceof GenCommonBase) { |
| int oldID = ((GenCommonBase) old).getVisualID(); |
| int newID = ((GenCommonBase) current).getVisualID(); |
| return oldID == newID; |
| } |
| return false; |
| } |
| assert myCommonBaseReference.getEContainingClass().isInstance(current); |
| if (myCommonBaseReference.isMany()) { |
| @SuppressWarnings("unchecked") |
| List<GenCommonBase> lcb_old = (List<GenCommonBase>) old.eGet(myCommonBaseReference); |
| @SuppressWarnings("unchecked") |
| List<GenCommonBase> lcb_new = (List<GenCommonBase>) current.eGet(myCommonBaseReference); |
| if (lcb_new.size() != lcb_old.size()) { |
| return false; |
| } |
| HashSet<Integer> oldVisualIDs = new HashSet<Integer>(); |
| for (GenCommonBase cb : lcb_old) { |
| oldVisualIDs.add(cb.getVisualID()); |
| } |
| for (GenCommonBase cb : lcb_new) { |
| if (!oldVisualIDs.remove(cb.getVisualID())) { |
| return false; |
| } |
| } |
| assert oldVisualIDs.isEmpty(); // sanity |
| return true; |
| } else { |
| GenCommonBase oldCB = (GenCommonBase) old.eGet(myCommonBaseReference); |
| GenCommonBase newCB = (GenCommonBase) current.eGet(myCommonBaseReference); |
| return oldCB.getVisualID() == newCB.getVisualID(); |
| } |
| } |
| } |