/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * 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: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ package org.reuseware.coconut.resource.resourceset; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.reuseware.coconut.compositionprogram.CompositionProgram; import org.reuseware.coconut.compositionprogram.DerivedCompositionProgram; import org.reuseware.coconut.fracol.FragmentCollaboration; import org.reuseware.coconut.resource.ReuseResourceAccess; import org.reuseware.coconut.resource.util.ReuseResourcesUtil; import org.reuseware.coconut.reuseextension.ReuseExtension; import org.reuseware.coconut.reuseextensionactivator.ReuseExtensionActivatorList; /** * A reuse resource manager that manages resources in memory * by using a single resource set. */ public class ResourceSetReuseResourceAccess implements ReuseResourceAccess { protected ReuseResourceSet reuseResourceSet = null; protected List<URI> storeURIs = new ArrayList<URI>(); protected URI defaultStoreURI = null; protected Map<List<String>, URI> idToStoreURIMap = new LinkedHashMap<List<String>, URI>(); public void addStore(URI storeURI) { storeURIs.add(storeURI); } public ResourceSetReuseResourceAccess(ReuseResourceSet reuseResourceSet, URI defaultStoreURI) { super(); this.reuseResourceSet = reuseResourceSet; this.defaultStoreURI = defaultStoreURI; } private URI idToURI(List<String> ID) { URI storeURI = idToStoreURIMap.get(ID); if (storeURI == null) { return defaultStoreURI.appendSegments( ID.toArray(new String[ID.size()])); } return storeURI.appendSegments( ID.toArray(new String[ID.size()])); } private List<String> uriToID(URI uri) { for(URI storeURI : storeURIs) { if (uri.toString().startsWith(storeURI.appendSegment("").toString())) { List<String> ID = uri.segmentsList().subList(storeURI.segmentCount(), uri.segmentCount()); idToStoreURIMap.put(ID, storeURI); return ID; } } if (uri.toString().startsWith(defaultStoreURI.appendSegment("").toString())) { List<String> ID = uri.segmentsList().subList(defaultStoreURI.segmentCount(), uri.segmentCount()); idToStoreURIMap.put(ID, defaultStoreURI); return ID; } return null; } public List<String> getID(URI contentsURI) { return uriToID(contentsURI); } public URI getContentsURI(List<String> ID) { return idToURI(ID); } public List<URI> getDiagramURIs(List<String> ID) { Resource contentsResource = null; try { contentsResource = reuseResourceSet.getResource(idToURI(ID), true); } catch(Exception e) {} if (contentsResource == null) { return Collections.emptyList(); } Set<URI> diagramURIs = new TreeSet<URI>(); for(Resource diagramResource : new ArrayList<Resource>(reuseResourceSet.getResources())) { if (!diagramResource.getContents().isEmpty() && diagramResource.getContents().get(0).eClass().getName().equals("Diagram")) { for(Iterator<EObject> i = diagramResource.getAllContents(); i.hasNext(); ) { EObject next = i.next(); for(EObject referencedElement : next.eCrossReferences()) { URI referencedURI = referencedElement.eResource().getURI(); if(referencedURI.equals(idToURI(ID))) { diagramURIs.add(diagramResource.getURI()); } } } } } return new ArrayList<URI>(diagramURIs); } public List<List<String>> getAllFragmentCollaborationIDs() { List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { List<String> ID = uriToID(resource.getURI()); FragmentCollaboration fracol = ReuseResourcesUtil.getFragmentCollaboration(ID, reuseResourceSet); if (fracol != null) { result.add(ID); } } return result; } public List<List<String>> getAllReuseExtensionIDs(){ List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { List<String> ID = uriToID(resource.getURI()); ReuseExtension reuseExtension = ReuseResourcesUtil.getReuseExtension(ID, reuseResourceSet); if (reuseExtension != null) { result.add(ID); } } return result; } public List<List<String>> getAllReuseExtensionActivatorListIDs(){ List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { List<String> ID = uriToID(resource.getURI()); ReuseExtensionActivatorList reuseExtensionActivatorList = ReuseResourcesUtil.getReuseExtensionActivatorList(ID, reuseResourceSet); if (reuseExtensionActivatorList != null) { result.add(ID); } } return result; } public List<List<String>> getAllCompositionProgramIDs(){ List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { List<String> ID = uriToID(resource.getURI()); CompositionProgram compositionProgram = ReuseResourcesUtil.getCompositionProgram(ID, reuseResourceSet); if (compositionProgram != null) { result.add(ID); } } return result; } public List<List<String>> getAllFragmentIDs(){ List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { URI uri = resource.getURI(); //every resource can be treated as fragment result.add(uriToID(uri)); } return result; } public List<List<String>> getAllComposedFragmentIDs() { List<List<String>> result = new ArrayList<List<String>>(); for(URI uri : reuseResourceSet.getComposedFragmentURIs()) { result.add(uriToID(uri)); } return result; } public List<List<String>> getAllDerivedCompositionProgramIDs(){ List<List<String>> result = new ArrayList<List<String>>(); for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) { List<String> ID = uriToID(resource.getURI()); DerivedCompositionProgram derivedCompositionProgram = ReuseResourcesUtil.getDerivedCompositionProgram(ID, reuseResourceSet); if (derivedCompositionProgram != null) { result.add(ID); } } return result; } }