/*******************************************************************************
* 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.sokan.generators;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.reuseware.coconut.compositionprogram.CompositionProgram;
import org.reuseware.coconut.compositionprogram.FragmentInstance;
import org.reuseware.coconut.fragment.ComposedFragment;
import org.reuseware.coconut.resource.sokan.util.SokanReuseResourceUtil;
import org.reuseware.coconut.resource.util.ReuseResourcesUtil;
import org.reuseware.sokan.ID;
import org.reuseware.sokan.IndexMetaData;
import org.reuseware.sokan.index.DependencyMap;
import org.reuseware.sokan.index.indexer.CalledIndexer;
import org.reuseware.sokan.index.util.ResourceUtil;
/**
* This called indexer (generator) executes a composition program
* and generates the composed fragments resulting from this execution.
* <p>
* This indexer does not modify the index.
*/
public class ComposedFragmentsGenerator implements CalledIndexer {
/**
* @param artifactURI the URI
* @param metaData the meta data to fill
* @param resourceSet the resource set to use
*/
public void createIndex(URI artifactURI, IndexMetaData metaData,
ResourceSet resourceSet) {
CompositionProgram compositionProgram = getCompositionProgram(
ResourceUtil.idFrom(artifactURI), resourceSet);
if (compositionProgram == null) {
return;
}
executeComposition(compositionProgram, resourceSet);
}
private CompositionProgram getCompositionProgram(ID artifactID, ResourceSet resourceSet) {
return ReuseResourcesUtil.getCompositionProgram(
artifactID.getSegments(), resourceSet);
}
private void executeComposition(CompositionProgram compositionProgram,
ResourceSet resourceSet) {
if (compositionProgram == null) {
return;
}
//execute the composition
compositionProgram.compose();
for (ComposedFragment composedFragment : compositionProgram.getComposedFragments()) {
URI composedFragmentURI = SokanReuseResourceUtil.getComposedFragmentURI(
composedFragment.getUFI(),
compositionProgram);
Resource composedFragmentResource = resetResource(composedFragmentURI, resourceSet);
composedFragmentResource.getContents().addAll(composedFragment.getContents());
Resource composedDiagramResource = createDiagramResource(compositionProgram, composedFragment.getUFI(), composedFragmentURI, resourceSet);
if (composedDiagramResource != null) {
composedDiagramResource.getContents().addAll(composedFragment.getDiagrams());
}
}
compositionProgram.getComposedFragments().clear();
}
private Resource createDiagramResource(CompositionProgram compositionProgram, List<String> composedFragmentUFI, URI composedFragmentURI,
ResourceSet resourceSet) {
for (FragmentInstance fragmentInstance : compositionProgram.getFragmentInstances()) {
if (fragmentInstance.isTarget() && composedFragmentUFI.equals(fragmentInstance.getTargetUFI())) {
if (!fragmentInstance.getFragment().getDiagrams().isEmpty()) {
Resource originalDiagramResource = fragmentInstance.getFragment().getDiagrams().get(0).eResource();
if (originalDiagramResource != null) {
URI composedDiagramURI = composedFragmentURI.trimFileExtension().appendFileExtension(
originalDiagramResource.getURI().fileExtension());
return resetResource(composedDiagramURI, resourceSet);
}
}
}
}
return null;
}
private Resource resetResource(URI uri, ResourceSet resourceSet) {
Resource resource = resourceSet.getResource(uri, false);
if (resource == null) {
resource = resourceSet.createResource(uri);
} else {
resource.getContents().clear();
}
resource.setModified(true);
return resource;
}
/**
* This implementation does nothing.
*
* @param artifactID the artifact's ID
* @param depMap the dependency map to fill
*/
public void getDependent(ID artifactID, DependencyMap depMap) { }
}