| /******************************************************************************* |
| * Copyright (c) 2001, 2004 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| /* |
| * Created on Jun 11, 2003 |
| * |
| * To change the template for this generated file go to |
| * Window>Preferences>Java>Code Generation>Code and Comments |
| */ |
| package org.eclipse.jst.j2ee.commonarchivecore.internal.helpers; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.ecore.impl.EObjectImpl; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.xmi.XMLResource; |
| |
| /** |
| * @author cbridgha |
| * |
| * To change the template for this generated type comment go to Window>Preferences>Java>Code |
| * Generation>Code and Comments |
| */ |
| final class ResourceProxyValidator { |
| static HashMap resourceURIMap = new HashMap(); |
| |
| private static void resolveContainedProxies(EObject refObject) { |
| List contained = refObject.eContents(); |
| EObject mofObject; |
| for (int i = 0; i < contained.size(); i++) { |
| mofObject = (EObject) contained.get(i); |
| resolveProxies(mofObject); |
| } |
| } |
| |
| private static void resolveNonContainedProxies(EObject refObject) { |
| List references = refObject.eClass().getEAllReferences(); |
| EReference reference; |
| EObject proxyOrObject; |
| for (int i = 0; i < references.size(); i++) { |
| reference = (EReference) references.get(i); |
| if (!reference.isContainment() && !reference.isTransient()) { |
| if (reference.isMany()) { |
| Iterator value = ((List) refObject.eGet(reference)).iterator(); |
| while (value.hasNext()) { |
| proxyOrObject = (EObject) value.next(); |
| if (proxyOrObject.eIsProxy()) |
| value.remove(); |
| } |
| } else { |
| proxyOrObject = (EObject) refObject.eGet(reference, false); |
| if (proxyOrObject != null && proxyOrObject.eIsProxy()) { |
| URI resourceURI = ((EObjectImpl) proxyOrObject).eProxyURI().trimFragment(); |
| String protocol = resourceURI.scheme(); |
| if (protocol == null || !protocol.equals("java")) { //$NON-NLS-1$ |
| String id = ((EObjectImpl) proxyOrObject).eProxyURI().fragment(); |
| if (resourceURIMap.get(resourceURI) != null) { |
| Resource cachedResource = (Resource) resourceURIMap.get(resourceURI); |
| proxyOrObject = ((XMLResource) cachedResource).getIDToEObjectMap().get(id); |
| } else { |
| proxyOrObject = (EObject) refObject.eGet(reference); |
| resourceURIMap.put(resourceURI, proxyOrObject.eResource()); |
| } |
| if (proxyOrObject == null || proxyOrObject.eIsProxy()) |
| refObject.eSet(reference, null); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| private static void resolveProxies(EObject refObject) { |
| if (refObject != null) { |
| resolveNonContainedProxies(refObject); |
| resolveContainedProxies(refObject); |
| } |
| } |
| |
| /** |
| * Force all of the proxies with <code>resource</code> to be resolved. |
| */ |
| static void checkForUnresolvableProxies(Resource resource) { |
| resourceURIMap = new HashMap(); //Reset hashmap on each call |
| if (resource != null) { |
| List topLevels = resource.getContents(); |
| EObject mofObject; |
| for (int i = 0; i < topLevels.size(); i++) { |
| mofObject = (EObject) topLevels.get(i); |
| resolveProxies(mofObject); |
| } |
| } |
| } |
| |
| } |