/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.metamodels.xml; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.eclipse.emf.ecore.EObject; import org.teiid.core.designer.id.UUID; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.metamodel.IPasteContributor; /** * @since 8.0 */ public class PasteContributor implements IPasteContributor { // =========================================================================================================================== // Controller Methods /** * @see org.teiid.designer.core.metamodel.IPasteContributor#contribute(java.util.Map, java.lang.String) * @since 4.3.2 */ @Override public void contribute(final Map map, final String uri) { // Contribute if pasting into an XML Document model if (XmlDocumentPackage.eNS_URI.equals(uri)) { // Create UUID map for copied objects final Map uuidMap = new HashMap(map.size()); for (final Iterator iter = map.entrySet().iterator(); iter.hasNext();) { final Entry entry = (Entry)iter.next(); final Object obj = entry.getKey(); if (obj instanceof EObject) { uuidMap.put(ModelerCore.getObjectIdString((EObject)obj), ModelerCore.getObjectIdString((EObject)entry.getValue())); } } // Replace UUID's of clipboard objects in pasted object choice criteria with UUID's of corresponding pasted objects for (final Iterator iter = map.entrySet().iterator(); iter.hasNext();) { final Entry entry = (Entry)iter.next(); final Object obj = entry.getValue(); if (obj instanceof XmlElement) { final XmlElement pastedElem = (XmlElement)obj; final String criteria = pastedElem.getChoiceCriteria(); if (criteria != null) { final StringBuffer newCriteria = new StringBuffer(); int startNdx = 0; int uuidNdx = criteria.indexOf(UUID.PROTOCOL); while (uuidNdx >= 0) { newCriteria.append(criteria.substring(startNdx, uuidNdx)); final int endNdx = uuidNdx + UUID.FQ_LENGTH; final String uuid = criteria.substring(uuidNdx, endNdx); final String pastedUuid = (String)uuidMap.get(uuid); if (pastedUuid == null) { // Must be either not one of the pasted objects or an invalid UUID to begin with newCriteria.append(uuid); } else { newCriteria.append(pastedUuid); } startNdx = endNdx; uuidNdx = criteria.indexOf(UUID.PROTOCOL, startNdx); } newCriteria.append(criteria.substring(startNdx)); pastedElem.setChoiceCriteria(newCriteria.toString()); } } } } } }