/** * Copyright (c) 2013 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.generator.genmodel.ui.wizard; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.util.EList; 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.yakindu.sct.generator.core.extensions.IGeneratorDescriptor; import org.yakindu.sct.generator.core.extensions.ILibraryDescriptor; import org.yakindu.sct.generator.core.extensions.LibraryExtensions; import org.yakindu.sct.generator.core.library.IDefaultFeatureValueProvider; import org.yakindu.sct.generator.genmodel.ui.internal.SGenActivator; import org.yakindu.sct.model.sgen.FeatureConfiguration; import org.yakindu.sct.model.sgen.FeatureType; import org.yakindu.sct.model.sgen.FeatureTypeLibrary; import org.yakindu.sct.model.sgen.GeneratorEntry; import org.yakindu.sct.model.sgen.GeneratorModel; import org.yakindu.sct.model.sgen.SGenFactory; import com.google.common.collect.Lists; /** * * @author muelder * @author oliver bohl */ public class ModelCreator { private final SGenFactory factory = SGenFactory.eINSTANCE; private final IGeneratorDescriptor descriptor; private final List<EObject> eobjects; public ModelCreator(IGeneratorDescriptor selectedGenerator, List<EObject> objects) { this.descriptor = selectedGenerator; this.eobjects = objects; } public GeneratorModel create() { GeneratorModel model = factory.createGeneratorModel(); model.setGeneratorId(descriptor.getId()); for (EObject object : eobjects) { model.getEntries().add(createGeneratorEntry(object)); } return model; } private GeneratorEntry createGeneratorEntry(EObject eobject) { GeneratorEntry entry = factory.createGeneratorEntry(); entry.setContentType(descriptor.getContentType()); entry.setElementRef(eobject); List<FeatureType> featureTypes = getFeatureTypes(descriptor); for (FeatureType featureType : featureTypes) { FeatureConfiguration config = createFeatureConfiguration(eobject, featureType); if (config != null && !config.getParameterValues().isEmpty()) { entry.getFeatures().add(config); } } return entry; } private FeatureConfiguration createFeatureConfiguration(EObject object, FeatureType featureType) { Iterable<ILibraryDescriptor> libraryDescriptor = LibraryExtensions .getLibraryDescriptors(descriptor.getLibraryIDs()); for (ILibraryDescriptor desc : libraryDescriptor) { IDefaultFeatureValueProvider defaultProvider = desc.createFeatureValueProvider( SGenActivator.getInstance().getInjector(SGenActivator.ORG_YAKINDU_SCT_GENERATOR_GENMODEL_SGEN)); if (defaultProvider != null && defaultProvider.isProviderFor(featureType.getLibrary())) { return defaultProvider.createDefaultFeatureConfiguration(featureType, object); } } return null; } public static List<FeatureType> getFeatureTypes(IGeneratorDescriptor descriptor) { ArrayList<FeatureType> features = Lists.newArrayList(); Iterable<ILibraryDescriptor> libraryDescriptor = LibraryExtensions .getLibraryDescriptors(descriptor.getLibraryIDs()); for (ILibraryDescriptor desc : libraryDescriptor) { ResourceSet set = new ResourceSetImpl(); Resource resource = set.getResource(desc.getURI(), true); FeatureTypeLibrary lib = (FeatureTypeLibrary) resource.getContents().get(0); EList<FeatureType> types = lib.getTypes(); // Only add the required features to the default model for (FeatureType featureType : types) { if (!featureType.isOptional()) features.add(featureType); } } return features; } }