/** * {@inheritDoc} * * @see * org.eclipse.mylyn.docs.intent.core.modelingunit.util.ModelingUnitSwitch#caseInstanciationInstruction(org.eclipse.mylyn.docs.intent.core.modelingunit.InstanciationInstruction) */ @Override public Object caseInstanciationInstruction(InstanciationInstruction object) { for (ModelingUnitInstruction structuralFeatures : object.getStructuralFeatures()) { return doSwitch(structuralFeatures); } return null; }
/** * Generates the object described in the given instanciationInstruction. * * @param instanciationInstruction the instantiation instruction to inspect * @param importedPackageURIS the URIs corresponding to all the packages imported in this * ModelingUnit * @param linkResolver the entity used in order to resolve links * @param modelingUnitGenerator the dispatcher to use for calling the correct generator on * sub-elements * @return the object described in the given instanciationInstruction */ public static EObject generate( InstanciationInstruction instanciationInstruction, List<String> importedPackageURIS, ModelingUnitLinkResolver linkResolver, ModelingUnitGenerator modelingUnitGenerator) { ModelingUnitGenerator.clearCompilationStatus(instanciationInstruction); EObject createdElement = null; // Step 1 : resolving the link to the metaType (thanks to the linkResolver) String metaTypeHref = instanciationInstruction.getMetaType().getTypeName(); try { EClass metaType = (EClass) linkResolver.resolveEClassifierUsingPackage( instanciationInstruction, importedPackageURIS, metaTypeHref); instanciationInstruction.getMetaType().setResolvedType(metaType); // Step 2 : instantiate correctly this entity // Step 2.1 : Creation using the factory createdElement = metaType.getEPackage().getEFactoryInstance().create(metaType); // Step 2.2 : If a name has been associated to this instance if (instanciationInstruction.getName() != null) { // We determine if this name can be assigned to any attribute for (EAttribute attribute : metaType.getEAllAttributes()) { if (isConcernedByNameAttribute(attribute)) { // if so, we set this attribute createdElement.eSet(attribute, instanciationInstruction.getName()); } } } // Step 2.3 : We set all the structuralFeatureAffectation associated to this instance // leaving the other attributes to default values. for (StructuralFeatureAffectation sfa : instanciationInstruction.getStructuralFeatures()) { StructuralFeatureGenerator.generateFeatureAndAddToClass( sfa, createdElement, linkResolver, modelingUnitGenerator); } } catch (ResolveException e) { // If the metaType of the element to generate cannot be resolved // We generate a compilation status modelingUnitGenerator .getInformationHolder() .registerCompilationExceptionAsCompilationStatus( new CompilationException( e.getInvalidInstruction(), CompilationErrorType.INVALID_REFERENCE_ERROR, e.getMessage())); // And we create a sample object, in order to let the compilation running createdElement = EcoreFactory.eINSTANCE.createEObject(); } catch (IllegalArgumentException e) { modelingUnitGenerator .getInformationHolder() .registerCompilationExceptionAsCompilationStatus( new CompilationException( instanciationInstruction, CompilationErrorType.INVALID_VALUE_ERROR, e.getMessage())); // And we create a sample object, in order to let the compilation running createdElement = EcoreFactory.eINSTANCE.createEObject(); } // Step 3 : Registration of the generated element // Step 3.1 : we add the generated element in the current created Elements list modelingUnitGenerator .getInformationHolder() .addNameToCreatedElementEntry( instanciationInstruction.getName(), createdElement, instanciationInstruction); if (createdElement instanceof EPackage) { linkResolver.unregisterEPackage((EPackage) createdElement); } // Step 3.2 : if any unresolved contribution instructions were contributed to this element // We resolve these contributions for (final UnresolvedContributionHolder contributionHolder : modelingUnitGenerator .getInformationHolder() .getContributionsAssociatedTo(instanciationInstruction.getName())) { ContributionInstructionGenerator.generate( contributionHolder.getReferencedContribution(), modelingUnitGenerator, linkResolver); } return createdElement; }