blob: d3194b88631105140966cc09e019f5545f3b634e [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.persistence.util;
import java.util.ArrayList;
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.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.epf.common.CommonPlugin;
import org.eclipse.epf.persistence.UnnormalizedURIException;
/**
* A extended resource set whose objects can references objects of other resource set
*
* @author Phong Nguyen Le - Aug 9, 2006
* @since 1.0
*/
public class ExtendedResourceSet extends ResourceSetImpl {
public static final int URI_TYPE_UNKNOWN = 0;
public static final int URI_TYPE_LOCAL = 1;
public static final int URI_TYPE_EXTERNAL = 2;
protected List<ResourceSet> referencedResourceSets = new ArrayList<ResourceSet>();
/**
* Gets the type of the given URI.
*
* @param uri
* @return one of URI type constants: {@link #URI_TYPE_EXTERNAL}, {@link #URI_TYPE_LOCAL}, {@link #URI_TYPE_UNKNOWN}
*/
protected int getURIType(URI uri) {
return URI_TYPE_UNKNOWN;
}
public boolean add(ResourceSet referencedResourceSet) {
if(!referencedResourceSets.contains(referencedResourceSet)) {
return referencedResourceSets.add(referencedResourceSet);
}
return false;
}
@Override
public EObject getEObject(URI uri, boolean loadOnDemand) {
EObject object = null;
UnnormalizedURIException ex = null;
int uriType = getURIType(uri);
if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_LOCAL) {
try {
object = super.getEObject(uri, loadOnDemand);
} catch (UnnormalizedURIException e) {
ex = e;
}
if(object != null) {
return object;
}
}
if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_EXTERNAL) {
for (Iterator iter = referencedResourceSets.iterator(); iter.hasNext();) {
ResourceSet resourceSet = (ResourceSet) iter.next();
try {
object = resourceSet.getEObject(uri, loadOnDemand);
if(object != null) {
return object;
}
} catch (UnnormalizedURIException e) {
ex = e;
}
}
}
if(ex != null) {
throw ex;
}
return object;
}
public void dispose() {
for (Iterator iter = getResources().iterator(); iter.hasNext();) {
Resource resource = (Resource) iter.next();
try{
resource.unload();
}
catch(Exception e) {
CommonPlugin.getDefault().getLogger().logError(e);
}
}
referencedResourceSets.clear();
}
}