/*******************************************************************************
* 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.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.reuseware.coconut.compositionprogram.CompositionProgram;
import org.reuseware.coconut.compositionprogram.FragmentInstance;
import org.reuseware.coconut.resource.ReuseResourceDependencyCalculator;
import org.reuseware.coconut.resource.ReuseResources;
import org.reuseware.coconut.resource.util.ReuseResourcesUtil;
import org.reuseware.coconut.reuseextension.CompositionLanguageSpecification;
import org.reuseware.coconut.reuseextension.ReuseExtension;
import org.reuseware.coconut.reuseextension.RootElementContext;
import org.reuseware.coconut.reuseextensionactivator.ReuseExtensionActivator;
import org.reuseware.coconut.reuseextensionactivator.ReuseExtensionActivatorList;
public class ResourceSetReuseResourceDependencyCalculator implements
ReuseResourceDependencyCalculator {
private ReuseResourceSet reuseResourceSet = null;
public ResourceSetReuseResourceDependencyCalculator(ReuseResourceSet reuseResourceSet) {
this.reuseResourceSet = reuseResourceSet;
}
/* TODO #1558: Implement required methods below and remove the ones in this section */
public List<List<String>> getInfluencedFragmentIDs(List<String> rexActivatorID) {
List<List<String>> result = new ArrayList<List<String>>();
ReuseExtensionActivatorList rexActivatorList =
ReuseResourcesUtil.getReuseExtensionActivatorList(
rexActivatorID, reuseResourceSet);
for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) {
boolean isDependentFragment = false;
List<String> UFI = ReuseResources.INSTANCE.getID(resource.getURI());
if (ResourceSetReuseResourceUtil.isInScopeOf(UFI, rexActivatorID)) {
for(ReuseExtensionActivator rexActivator : rexActivatorList.getActivators()) {
isDependentFragment = ResourceSetReuseResourceUtil.extendsTypeOf(rexActivator, resource, UFI);
if (isDependentFragment) {
break;
}
}
}
if (isDependentFragment) {
result.add(UFI);
}
}
return result;
}
public List<List<String>> getInstantantingCompositionProgramIDs(
List<String> instatiatedFragmentID) {
List<List<String>> result = new ArrayList<List<String>>();
for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) {
CompositionProgram compositionProgram =
ReuseResourcesUtil.getCompositionProgram(
ReuseResources.INSTANCE.getID(resource.getURI()),
reuseResourceSet);
if (compositionProgram != null) {
for(FragmentInstance fi : compositionProgram.getFragmentInstances()) {
if (instatiatedFragmentID.equals(fi.getUFI())) {
result.add(compositionProgram.getUCPI());
break;
}
}
}
}
return result;
}
public List<List<String>> getDerivedCompositionProgramIDs(
List<String> derivedFromFragmentID) {
Resource fragmentResource = null;
try {
fragmentResource = reuseResourceSet.getResource(
ReuseResources.INSTANCE.getContentsURI(derivedFromFragmentID), true);
} catch(Exception e) {}
if (fragmentResource == null || fragmentResource.getContents().isEmpty()) {
return Collections.emptyList();
}
Set<List<String>> result = new TreeSet<List<String>>();
for(Resource resource : new ArrayList<Resource>(reuseResourceSet.getResources())) {
ReuseExtensionActivatorList rexActivatorList =
ReuseResourcesUtil.getReuseExtensionActivatorList(
ReuseResources.INSTANCE.getID(resource.getURI()),
reuseResourceSet);
if (rexActivatorList != null) {
if (ResourceSetReuseResourceUtil.isInScopeOf(
derivedFromFragmentID,
ReuseResources.INSTANCE.getID(resource.getURI()))){
for(ReuseExtensionActivator rexActivator : rexActivatorList.getActivators()) {
ReuseExtension rex = rexActivator.getReuseExtension();
if (rex instanceof CompositionLanguageSpecification) {
for(EObject root : fragmentResource.getContents()) {
for(RootElementContext rootElementContext : rex.getRootElementContexts()) {
if (rootElementContext.getEBoundClass().isInstance(root)) {
/*if (Evaluator.eval(
derivedFromFragmentID,
rexActivator.getVariant(),
root,
rootElementContext.getIsExpression())) {
List<String> UCPI = Evaluator.deriveID(
derivedFromFragmentID,
rexActivator.getVariant(),
root,
((CompositionLanguageSpecification)rex).getIdExpression());
result.add(UCPI);
}*/
}
}
}
}
}
}
}
}
return new ArrayList<List<String>>(result);
}
public List<List<String>> getComposedFragmentIDs(
List<String> composingCompositionProgramID) {
List<List<String>> result = new ArrayList<List<String>>();
CompositionProgram compositionProgram =
ReuseResourcesUtil.getCompositionProgram(composingCompositionProgramID, reuseResourceSet);
if (compositionProgram != null) {
for(FragmentInstance fi : compositionProgram.getFragmentInstances()) {
if(fi.isTarget()) {
result.add(fi.getTargetUFI());
}
}
}
return result;
}
/* ========================================= */
public List<List<String>> getInfluencedCompositionInterfaceIDsFracol(
List<String> fracolID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedCompositionInterfaceIDsRexCM(
List<String> rexcmID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedCompositionInterfaceIDsRexActivator(
List<String> rexActivatorID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedComposingCompositionProgramIDsFracol(
List<String> fracolID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedComposingCompositionProgramIDsRexCM(
List<String> rexID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedComposingCompositionProgramIDsRexActivator(
List<String> rexActivatorID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedComposingCompositionProgramIDsFragment(
List<String> fragmentID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedDerivedCompositionProgramIDsFracol(
List<String> fracolID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedDerivedCompositionProgramIDsRexCL(
List<String> rexclID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedDerivedCompositionProgramIDsCompositionProgramSource(
List<String> fragmentID) {
return Collections.emptyList();
}
public List<List<String>> getInfluencedCompositionProgramSourceIDsRexActivator(
List<String> rexActivatorID) {
return Collections.emptyList();
}
}