//Generated with EGF 1.6.1.201902111324
package org.eclipse.egf.emf.pattern.edit;

import org.eclipse.egf.emf.pattern.base.*;
import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil;
import org.eclipse.emf.codegen.ecore.genmodel.*;
import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
import org.eclipse.emf.codegen.util.*;
import org.eclipse.emf.ecore.util.*;
import org.eclipse.emf.common.util.*;
import org.eclipse.egf.common.helper.*;
import java.util.*;
import org.eclipse.emf.ecore.*;
import org.eclipse.egf.model.pattern.*;
import org.eclipse.egf.pattern.execution.*;
import org.eclipse.egf.pattern.query.*;

public class ItemProviderAdapterFactory extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
	protected static String nl;

	public static synchronized ItemProviderAdapterFactory create(String lineSeparator) {
		nl = lineSeparator;
		ItemProviderAdapterFactory result = new ItemProviderAdapterFactory();
		nl = null;
		return result;
	}

	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
	protected final String TEXT_1 = "";
	protected final String TEXT_2 = NL + "package ";
	protected final String TEXT_3 = ";" + NL;
	protected final String TEXT_4 = NL + NL + "/**" + NL
			+ " * This is the factory that is used to provide the interfaces needed to support Viewers." + NL
			+ " * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}."
			+ NL + " * The adapters also support Eclipse property sheets." + NL
			+ " * Note that most of the adapters are shared among multiple instances." + NL
			+ " * <!-- begin-user-doc -->" + NL + " * <!-- end-user-doc -->";
	protected final String TEXT_5 = NL + " * ";
	protected final String TEXT_6 = NL + " * @generated" + NL + " */";
	protected final String TEXT_7 = NL + "@Deprecated";
	protected final String TEXT_8 = NL + "@SuppressWarnings(\"deprecation\")";
	protected final String TEXT_9 = NL + "public class ";
	protected final String TEXT_10 = " extends ";
	protected final String TEXT_11 = " implements ComposeableAdapterFactory, IChangeNotifier";
	protected final String TEXT_12 = ", ";
	protected final String TEXT_13 = NL + "{";
	protected final String TEXT_14 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static final ";
	protected final String TEXT_15 = " copyright = ";
	protected final String TEXT_16 = ";";
	protected final String TEXT_17 = NL;
	protected final String TEXT_18 = NL + "\t/**" + NL
			+ "\t * This keeps track of the root adapter factory that delegates to this adapter factory." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected ComposedAdapterFactory parentAdapterFactory;" + NL + "" + NL + "\t/**" + NL
			+ "\t * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected IChangeNotifier changeNotifier = new ChangeNotifier();" + NL;
	protected final String TEXT_19 = NL + "\t/**" + NL
			+ "\t * This keeps track of all the item providers created, so that they can be {@link #dispose disposed}."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */" + NL + "\tprotected ";
	protected final String TEXT_20 = " disposable = new Disposable();" + NL;
	protected final String TEXT_21 = NL + "\t/**" + NL + "\t * This helps manage the child creation extenders." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tprotected ";
	protected final String TEXT_22 = " childCreationExtenderManager = new ";
	protected final String TEXT_23 = "(";
	protected final String TEXT_24 = ".INSTANCE, ";
	protected final String TEXT_25 = ".eNS_URI);" + NL;
	protected final String TEXT_26 = NL + "\t/**" + NL
			+ "\t * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */" + NL + "\tprotected ";
	protected final String TEXT_27 = " supportedTypes = new ";
	protected final String TEXT_28 = "();" + NL + "" + NL + "\t/**" + NL + "\t * This constructs an instance." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic ";
	protected final String TEXT_29 = "()" + NL + "\t{";
	protected final String TEXT_30 = NL + "\t\tsupportedTypes.add(";
	protected final String TEXT_31 = ".class);";
	protected final String TEXT_32 = NL + "\t}" + NL;
	protected final String TEXT_33 = NL + "\t/**" + NL
			+ "\t * This keeps track of the factory to which to delegate adapter creation for objects from that package."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */" + NL + "\tprotected ";
	protected final String TEXT_34 = " ";
	protected final String TEXT_35 = " = null;" + NL + "" + NL + "\t/**" + NL
			+ "\t * This determines the delegate factory for the package." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_36 = " get";
	protected final String TEXT_37 = "()" + NL + "\t{" + NL + "\t\tif (";
	protected final String TEXT_38 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
	protected final String TEXT_39 = " rootAdapterFactory = getRootAdapterFactory();" + NL
			+ "\t\t\tif (rootAdapterFactory instanceof ComposedAdapterFactory)" + NL + "\t\t\t{" + NL + "\t\t\t\t";
	protected final String TEXT_40 = " delegateAdapterFactory =" + NL
			+ "\t\t\t\t\t((ComposedAdapterFactory)rootAdapterFactory).getFactoryForType(";
	protected final String TEXT_41 = ".getPackage());" + NL + "\t\t\t\tif (delegateAdapterFactory instanceof ";
	protected final String TEXT_42 = ")" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\t";
	protected final String TEXT_43 = " = (";
	protected final String TEXT_44 = ")delegateAdapterFactory;" + NL + "\t\t\t\t}" + NL + "\t\t\t}" + NL + "\t\t}" + NL
			+ "\t\treturn ";
	protected final String TEXT_45 = ";" + NL + "\t}" + NL;
	protected final String TEXT_46 = NL + "\t/**" + NL
			+ "\t * This keeps track of the one adapter used for all {@link ";
	protected final String TEXT_47 = "} instances." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->";
	protected final String TEXT_48 = NL + "\t * ";
	protected final String TEXT_49 = NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_50 = NL + "\t@Deprecated";
	protected final String TEXT_51 = NL + "\tprotected ";
	protected final String TEXT_52 = "ItemProvider;" + NL + "" + NL + "\t/**" + NL
			+ "\t * This creates an adapter for a {@link ";
	protected final String TEXT_53 = "}." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
	protected final String TEXT_54 = NL + "\t@Override";
	protected final String TEXT_55 = NL + "\tpublic Adapter create";
	protected final String TEXT_56 = "Adapter()" + NL + "\t{" + NL + "\t\tif (";
	protected final String TEXT_57 = "ItemProvider == null)" + NL + "\t\t{" + NL + "\t\t\t";
	protected final String TEXT_58 = "ItemProvider = new ";
	protected final String TEXT_59 = "(this);" + NL + "\t\t}" + NL + "" + NL + "\t\treturn ";
	protected final String TEXT_60 = "ItemProvider;" + NL + "\t}" + NL;
	protected final String TEXT_61 = NL + "\t/**" + NL + "\t * This creates an adapter for a {@link ";
	protected final String TEXT_62 = "Adapter()" + NL + "\t{" + NL + "\t\treturn new ";
	protected final String TEXT_63 = "(this);" + NL + "\t}" + NL;
	protected final String TEXT_64 = NL + "\t/**" + NL + "\t * ";
	protected final String TEXT_65 = " of ";
	protected final String TEXT_66 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->";
	protected final String TEXT_67 = "Adapter()" + NL + "\t{" + NL + "\t\treturn" + NL + "\t\t\tget";
	protected final String TEXT_68 = "() == null ?" + NL + "\t\t\t\tnull :" + NL + "\t\t\t\tget";
	protected final String TEXT_69 = "().create";
	protected final String TEXT_70 = "Adapter();" + NL + "\t}" + NL;
	protected final String TEXT_71 = NL + "\t/**" + NL
			+ "\t * This returns the root adapter factory that contains this factory." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_72 = NL + "\tpublic ComposeableAdapterFactory getRootAdapterFactory()" + NL + "\t{" + NL
			+ "\t\treturn parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();" + NL
			+ "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * This sets the composed adapter factory that contains this factory." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_73 = NL
			+ "\tpublic void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)" + NL + "\t{" + NL
			+ "\t\tthis.parentAdapterFactory = parentAdapterFactory;" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_74 = NL + "\tpublic boolean isFactoryForType(Object type)" + NL + "\t{" + NL
			+ "\t\treturn supportedTypes.contains(type) || super.isFactoryForType(type);" + NL + "\t}" + NL + "" + NL
			+ "\t/**" + NL + "\t * This implementation substitutes the factory itself as the key for the adapter." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_75 = NL + "\tpublic Adapter adapt(Notifier notifier, Object type)" + NL + "\t{" + NL
			+ "\t\treturn super.adapt(notifier, this);" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_76 = NL + "\tpublic Object adapt(Object object, Object type)" + NL + "\t{" + NL
			+ "\t\tif (isFactoryForType(type))" + NL + "\t\t{" + NL
			+ "\t\t\tObject adapter = super.adapt(object, type);" + NL + "\t\t\tif (!(type instanceof Class";
	protected final String TEXT_77 = "<?>";
	protected final String TEXT_78 = ") || ";
	protected final String TEXT_79 = ".isInstance((Class";
	protected final String TEXT_80 = ")type, adapter)";
	protected final String TEXT_81 = "(((Class";
	protected final String TEXT_82 = ")type).isInstance(adapter))";
	protected final String TEXT_83 = ")" + NL + "\t\t\t{" + NL + "\t\t\t\treturn adapter;" + NL + "\t\t\t}" + NL
			+ "\t\t}" + NL + "" + NL + "\t\treturn null;" + NL + "\t}" + NL;
	protected final String TEXT_84 = NL + "\t/**" + NL
			+ "\t * Associates an adapter with a notifier via the base implementation, then records it to ensure it will be disposed."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_85 = NL + "\tprotected void associate(Adapter adapter, Notifier target)" + NL + "\t{"
			+ NL + "\t\tsuper.associate(adapter, target);" + NL + "\t\tif (adapter != null)" + NL + "\t\t{" + NL
			+ "\t\t\tdisposable.add(adapter);" + NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_86 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
	protected final String TEXT_87 = " getChildCreationExtenders()" + NL + "\t{" + NL
			+ "\t\treturn childCreationExtenderManager.getChildCreationExtenders();" + NL + "\t}" + NL + "" + NL
			+ "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated"
			+ NL + "\t */" + NL + "\tpublic ";
	protected final String TEXT_88 = " getNewChildDescriptors(Object object, ";
	protected final String TEXT_89 = " editingDomain)" + NL + "\t{" + NL
			+ "\t\treturn childCreationExtenderManager.getNewChildDescriptors(object, editingDomain);" + NL + "\t}" + NL
			+ "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @generated" + NL + "\t */" + NL + "\tpublic ";
	protected final String TEXT_90 = " getResourceLocator()" + NL + "\t{" + NL
			+ "\t\treturn childCreationExtenderManager;" + NL + "\t}" + NL;
	protected final String TEXT_91 = NL + "\t/**" + NL + "\t * This adds a listener." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_92 = NL + "\tpublic void addListener(INotifyChangedListener notifyChangedListener)" + NL
			+ "\t{" + NL + "\t\tchangeNotifier.addListener(notifyChangedListener);" + NL + "\t}" + NL + "" + NL
			+ "\t/**" + NL + "\t * This removes a listener." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_93 = NL + "\tpublic void removeListener(INotifyChangedListener notifyChangedListener)"
			+ NL + "\t{" + NL + "\t\tchangeNotifier.removeListener(notifyChangedListener);" + NL + "\t}" + NL + "" + NL
			+ "\t/**" + NL + "\t * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_94 = NL + "\tpublic void fireNotifyChanged(Notification notification)" + NL + "\t{" + NL
			+ "\t\tchangeNotifier.fireNotifyChanged(notification);" + NL + "" + NL
			+ "\t\tif (parentAdapterFactory != null)" + NL + "\t\t{" + NL
			+ "\t\t\tparentAdapterFactory.fireNotifyChanged(notification);" + NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_95 = NL + "\t/**" + NL
			+ "\t * This disposes all of the item providers created by this factory. " + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_96 = NL + "\tpublic void dispose()" + NL + "\t{";
	protected final String TEXT_97 = NL + "\t\tdisposable.dispose();";
	protected final String TEXT_98 = NL + "\t\tif (";
	protected final String TEXT_99 = "ItemProvider != null) ";
	protected final String TEXT_100 = "ItemProvider.dispose();";
	protected final String TEXT_101 = NL + "\t/**" + NL + "\t * A child creation extender for the {@link ";
	protected final String TEXT_102 = "}." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static class ";
	protected final String TEXT_103 = " implements ";
	protected final String TEXT_104 = NL + "\t{" + NL + "\t\t/**" + NL
			+ "\t\t * The switch for creating child descriptors specific to each extended class." + NL
			+ "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL
			+ "\t\t */" + NL + "\t\tprotected static class CreationSwitch extends ";
	protected final String TEXT_105 = NL + "\t\t{" + NL + "\t\t\t/**" + NL
			+ "\t\t\t * The child descriptors being populated." + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
			+ "\t\t\tprotected ";
	protected final String TEXT_106 = " newChildDescriptors;" + NL + "" + NL + "\t\t\t/**" + NL
			+ "\t\t\t * The domain in which to create the children." + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
			+ "\t\t\tprotected ";
	protected final String TEXT_107 = " editingDomain;" + NL + "" + NL + "\t\t\t/**" + NL
			+ "\t\t\t * Creates the a switch for populating child descriptors in the given domain." + NL
			+ "\t\t\t * <!-- begin-user-doc -->" + NL + "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated"
			+ NL + "\t\t\t */" + NL + "\t\t\tCreationSwitch(";
	protected final String TEXT_108 = " newChildDescriptors, ";
	protected final String TEXT_109 = " editingDomain) " + NL + "\t\t\t{" + NL
			+ "\t\t\t\tthis.newChildDescriptors = newChildDescriptors;" + NL
			+ "\t\t\t\tthis.editingDomain = editingDomain;" + NL + "\t\t\t}";
	protected final String TEXT_110 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */";
	protected final String TEXT_111 = NL + "\t\t\t@Override";
	protected final String TEXT_112 = NL + "\t\t\tpublic ";
	protected final String TEXT_113 = "Object case";
	protected final String TEXT_114 = " object)" + NL + "\t\t\t{";
	protected final String TEXT_115 = NL + "\t\t\t\treturn null;" + NL + "\t\t\t}" + NL + " ";
	protected final String TEXT_116 = NL + "\t\t\t/**" + NL + "\t\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t\t * <!-- end-user-doc -->" + NL + "\t\t\t * @generated" + NL + "\t\t\t */" + NL
			+ "\t\t\tprotected ";
	protected final String TEXT_117 = " createChildParameter(Object feature, Object child)" + NL + "\t\t\t{" + NL
			+ "\t\t\t\treturn new ";
	protected final String TEXT_118 = "(null, feature, child);" + NL + "\t\t\t}" + NL + "" + NL + "\t\t}" + NL + "" + NL
			+ "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
	protected final String TEXT_119 = " editingDomain)" + NL + "\t\t{" + NL + "\t\t\t";
	protected final String TEXT_120 = " result = new ";
	protected final String TEXT_121 = "();" + NL + "\t\t\tnew CreationSwitch(result, editingDomain).doSwitch((";
	protected final String TEXT_122 = ")object);" + NL + "\t\t\treturn result;" + NL + "\t\t}" + NL + "" + NL
			+ "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL + "\t\t * <!-- end-user-doc -->" + NL
			+ "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tpublic ";
	protected final String TEXT_123 = " getResourceLocator()" + NL + "\t\t{" + NL + "\t\t\treturn ";
	protected final String TEXT_124 = ".INSTANCE;" + NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_125 = NL + "}";
	protected final String TEXT_126 = NL;

	public ItemProviderAdapterFactory() {
		//Here is the constructor
		StringBuffer stringBuffer = new StringBuffer();

		// add initialisation of the pattern variables (declaration has been already done).

	}

	public String generate(Object argument) throws Exception {
		final StringBuffer stringBuffer = new StringBuffer();

		InternalPatternContext ctx = (InternalPatternContext) argument;
		Map<String, String> queryCtx = null;
		IQuery.ParameterDescription paramDesc = null;
		Node.Container currentNode = ctx.getNode();

		List<Object> parameterList = null;
		//this pattern can only be called by another (i.e. it's not an entry point in execution)

		for (Object parameterParameter : parameterList) {

			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;

			if (preCondition(ctx)) {
				ctx.setNode(new Node.Container(currentNode, getClass()));
				orchestration(ctx);
			}

		}
		ctx.setNode(currentNode);
		if (ctx.useReporter()) {
			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
		}

		stringBuffer.append(TEXT_126);
		stringBuffer.append(TEXT_126);
		return stringBuffer.toString();
	}

	public String orchestration(PatternContext ctx) throws Exception {
		InternalPatternContext ictx = (InternalPatternContext) ctx;

		super.orchestration(new SuperOrchestrationContext(ictx));

		method_preGenerate(new StringBuffer(), ictx);

		method_doGenerate(new StringBuffer(), ictx);
		{
			final Map<String, Object> parameters = getParameters();
			CallbackContext ctx_callback = new CallbackContext(ictx);
			CallHelper.callBack(ctx_callback, parameters);
		}

		method_postGenerate(new StringBuffer(), ictx);

		if (ictx.useReporter()) {
			Map<String, Object> parameterValues = new HashMap<String, Object>();
			parameterValues.put("parameter", this.parameter);
			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
		}
		return null;
	}

	public Map<String, Object> getParameters() {
		final Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("parameter", this.parameter);
		return parameters;
	}

	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		GenPackage genPackage = parameter;
		targetPath = genPackage.getGenModel().getEditDirectory();
		packageName = genPackage.getProviderPackageName();
		className = genPackage.getItemProviderAdapterFactoryClassName();

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
	}

	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		GenPackage genPackage = parameter;
		argument = parameter;

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
	}

	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getEditDirectory(), genModel,
				GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
	}

	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		/**
		 * Copyright (c) 2002-2010 IBM Corporation and others.
		 * All rights reserved.   This program and the accompanying materials
		 * are made available under the terms of the Eclipse Public License v2.0
		 * which accompanies this distribution, and is available at
		 * http://www.eclipse.org/legal/epl-v20.html
		 *
		 * Contributors:
		 *   IBM - Initial API and implementation
		 */

		GenPackage genPackage = (GenPackage) argument;
		GenModel genModel = genPackage.getGenModel();
		/* Trick to import java.util.* without warnings */Iterator.class.getName();
		final boolean isJDK50 = genModel.getComplianceLevel().getValue() >= GenJDKLevel.JDK50;
		stringBuffer.append(TEXT_1);
		{
			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>

			InternalPatternContext ictx = (InternalPatternContext) ctx;
			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
			stringBuffer.setLength(0);

			final Map<String, Object> callParameters = new HashMap<String, Object>();
			callParameters.put("argument", parameter);
			CallHelper.executeWithParameterInjection(
					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
					new ExecutionContext((InternalPatternContext) ctx), callParameters);
			stringBuffer.setLength(0);
		}

		stringBuffer.append(TEXT_2);
		stringBuffer.append(genPackage.getProviderPackageName());
		stringBuffer.append(TEXT_3);
		genModel.addImport("org.eclipse.emf.common.notify.Adapter");
		genModel.addImport("org.eclipse.emf.common.notify.Notification");
		genModel.addImport("org.eclipse.emf.common.notify.Notifier");
		genModel.addImport("org.eclipse.emf.edit.provider.ChangeNotifier");
		genModel.addImport("org.eclipse.emf.edit.provider.ComposeableAdapterFactory");
		genModel.addImport("org.eclipse.emf.edit.provider.ComposedAdapterFactory");
		genModel.addImport("org.eclipse.emf.edit.provider.IChangeNotifier");
		genModel.addImport("org.eclipse.emf.edit.provider.IEditingDomainItemProvider");
		genModel.addImport("org.eclipse.emf.edit.provider.IItemLabelProvider");
		genModel.addImport("org.eclipse.emf.edit.provider.IItemPropertySource");
		genModel.addImport("org.eclipse.emf.edit.provider.INotifyChangedListener");
		genModel.addImport("org.eclipse.emf.edit.provider.IStructuredItemContentProvider");
		genModel.addImport("org.eclipse.emf.edit.provider.ITreeItemContentProvider");
		boolean useGenerics = genModel.useGenerics();
		String _ArrayList = genModel
				.getImportedName(useGenerics ? "java.util.ArrayList<java.lang.Object>" : "java.util.ArrayList");
		String _Collection = genModel
				.getImportedName(useGenerics ? "java.util.Collection<java.lang.Object>" : "java.util.Collection");
		genModel.markImportLocation(stringBuffer);
		stringBuffer.append(TEXT_4);
		if (genPackage.hasAPITags()) {
			stringBuffer.append(TEXT_5);
			stringBuffer.append(genPackage.getAPITags(genModel.getIndentation(stringBuffer)));
		}
		stringBuffer.append(TEXT_6);
		if (isJDK50 && genPackage.hasAPIDeprecatedTag()) {
			stringBuffer.append(TEXT_7);
		} else if (isJDK50 && GenModelUtil.hasAPIDeprecatedTag(genPackage.getGenClasses())) {
			stringBuffer.append(TEXT_8);
		}
		stringBuffer.append(TEXT_9);
		stringBuffer.append(genPackage.getItemProviderAdapterFactoryClassName());
		stringBuffer.append(TEXT_10);
		stringBuffer.append(genPackage.getImportedAdapterFactoryClassName());
		stringBuffer.append(TEXT_11);
		if (genPackage.isDisposableProviderFactory()) {
			stringBuffer.append(TEXT_12);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IDisposable"));
		}
		if (genPackage.isExtensibleProviderFactory()) {
			stringBuffer.append(TEXT_12);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
		}
		stringBuffer.append(TEXT_13);
		if (genModel.hasCopyrightField()) {
			stringBuffer.append(TEXT_14);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_15);
			stringBuffer.append(genModel.getCopyrightFieldLiteral());
			stringBuffer.append(TEXT_16);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_17);
		}
		stringBuffer.append(TEXT_18);
		if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {
			stringBuffer.append(TEXT_19);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.Disposable"));
			stringBuffer.append(TEXT_20);
		}
		if (genPackage.isExtensibleProviderFactory()) {
			stringBuffer.append(TEXT_21);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager"));
			stringBuffer.append(TEXT_22);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.ChildCreationExtenderManager"));
			stringBuffer.append(TEXT_23);
			stringBuffer.append(genPackage.getImportedEditPluginClassName());
			stringBuffer.append(TEXT_24);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_25);
		}
		stringBuffer.append(TEXT_26);
		stringBuffer.append(_Collection);
		stringBuffer.append(TEXT_27);
		stringBuffer.append(_ArrayList);
		stringBuffer.append(TEXT_28);
		stringBuffer.append(genPackage.getItemProviderAdapterFactoryClassName());
		stringBuffer.append(TEXT_29);
		for (String name : genPackage.getProviderSupportedTypes()) {
			stringBuffer.append(TEXT_30);
			stringBuffer.append(genModel.getImportedName(name));
			stringBuffer.append(TEXT_31);
		}
		stringBuffer.append(TEXT_32);
		for (GenPackage genDelegate : genPackage.getAdapterDelegatePackages()) {
			stringBuffer.append(TEXT_33);
			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
			stringBuffer.append(TEXT_34);
			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
			stringBuffer.append(TEXT_35);
			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
			stringBuffer.append(TEXT_36);
			stringBuffer.append(genPackage.getAdapterFactoryDelegateName(genDelegate));
			stringBuffer.append(TEXT_37);
			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
			stringBuffer.append(TEXT_38);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory"));
			stringBuffer.append(TEXT_39);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.notify.AdapterFactory"));
			stringBuffer.append(TEXT_40);
			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
			stringBuffer.append(TEXT_41);
			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
			stringBuffer.append(TEXT_42);
			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
			stringBuffer.append(TEXT_43);
			stringBuffer.append(genDelegate.getImportedAdapterFactoryClassName());
			stringBuffer.append(TEXT_44);
			stringBuffer.append(genPackage.getUncapAdapterFactoryDelegateName(genDelegate));
			stringBuffer.append(TEXT_45);
		}
		for (GenClass genClass : genPackage.getGenClasses()) {
			if (!genClass.isAbstract() && genClass.getProvider() != GenProviderKind.NONE_LITERAL) {
				if (genClass.isProviderSingleton()) {
					stringBuffer.append(TEXT_46);
					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
					stringBuffer.append(TEXT_47);
					if (genClass.hasAPITags()) {
						stringBuffer.append(TEXT_48);
						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
					}
					stringBuffer.append(TEXT_49);
					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
						stringBuffer.append(TEXT_50);
					}
					stringBuffer.append(TEXT_51);
					stringBuffer.append(genClass.getProviderClassName());
					stringBuffer.append(TEXT_34);
					stringBuffer.append(genClass.getUncapName());
					stringBuffer.append(TEXT_52);
					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
					stringBuffer.append(TEXT_53);
					if (genClass.hasAPITags()) {
						stringBuffer.append(TEXT_48);
						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
					}
					stringBuffer.append(TEXT_49);
					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
						stringBuffer.append(TEXT_50);
					}
					if (genModel.useClassOverrideAnnotation()) {
						stringBuffer.append(TEXT_54);
					}
					stringBuffer.append(TEXT_55);
					stringBuffer.append(genClass.getName());
					stringBuffer.append(TEXT_56);
					stringBuffer.append(genClass.getUncapName());
					stringBuffer.append(TEXT_57);
					stringBuffer.append(genClass.getUncapName());
					stringBuffer.append(TEXT_58);
					stringBuffer.append(genClass.getProviderClassName());
					stringBuffer.append(TEXT_59);
					stringBuffer.append(genClass.getUncapName());
					stringBuffer.append(TEXT_60);
				} else {
					stringBuffer.append(TEXT_61);
					stringBuffer.append(genClass.getRawQualifiedInterfaceName());
					stringBuffer.append(TEXT_53);
					if (genClass.hasAPITags()) {
						stringBuffer.append(TEXT_48);
						stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
					}
					stringBuffer.append(TEXT_49);
					if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
						stringBuffer.append(TEXT_50);
					}
					if (genModel.useClassOverrideAnnotation()) {
						stringBuffer.append(TEXT_54);
					}
					stringBuffer.append(TEXT_55);
					stringBuffer.append(genClass.getName());
					stringBuffer.append(TEXT_62);
					stringBuffer.append(genClass.getProviderClassName());
					stringBuffer.append(TEXT_63);
				}
			}
		}
		for (GenClass genClass : genPackage.getAdapterDelegateSuperClasses()) {
			stringBuffer.append(TEXT_64);
			stringBuffer.append(genClass.getName());
			stringBuffer.append(TEXT_65);
			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
			stringBuffer.append(TEXT_66);
			if (genClass.hasAPITags()) {
				stringBuffer.append(TEXT_48);
				stringBuffer.append(genClass.getAPITags(genModel.getIndentation(stringBuffer)));
			}
			stringBuffer.append(TEXT_49);
			if (isJDK50 && genClass.hasAPIDeprecatedTag()) {
				stringBuffer.append(TEXT_50);
			}
			stringBuffer.append(TEXT_55);
			stringBuffer.append(genClass.getName());
			stringBuffer.append(TEXT_67);
			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
			stringBuffer.append(TEXT_68);
			stringBuffer.append(genClass.getItemProviderAdapterFactoryClassName());
			stringBuffer.append(TEXT_69);
			stringBuffer.append(genClass.getName());
			stringBuffer.append(TEXT_70);
		}
		stringBuffer.append(TEXT_71);
		if (genModel.useInterfaceOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_72);
		if (genModel.useInterfaceOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_73);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_74);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_75);
		if (genModel.useClassOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_76);
		if (genModel.useGenerics()) {
			stringBuffer.append(TEXT_77);
		}
		stringBuffer.append(TEXT_78);
		if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
			stringBuffer.append(TEXT_79);
			if (genModel.useGenerics()) {
				stringBuffer.append(TEXT_77);
			}
			stringBuffer.append(TEXT_80);
		} else {
			stringBuffer.append(TEXT_81);
			if (genModel.useGenerics()) {
				stringBuffer.append(TEXT_77);
			}
			stringBuffer.append(TEXT_82);
		}
		stringBuffer.append(TEXT_83);
		if (genPackage.isDisposableProviderFactory() && genPackage.hasStatefulProvider()) {
			stringBuffer.append(TEXT_84);
			if (genModel.useClassOverrideAnnotation()) {
				stringBuffer.append(TEXT_54);
			}
			stringBuffer.append(TEXT_85);
		}
		if (genPackage.isExtensibleProviderFactory()) {
			stringBuffer.append(TEXT_86);
			stringBuffer.append(genModel.getImportedName(
					useGenerics ? "java.util.List<org.eclipse.emf.edit.provider.IChildCreationExtender>"
							: "java.util.List"));
			stringBuffer.append(TEXT_87);
			stringBuffer
					.append(genModel.getImportedName(useGenerics ? "java.util.Collection<?>" : "java.util.Collection"));
			stringBuffer.append(TEXT_88);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
			stringBuffer.append(TEXT_89);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
			stringBuffer.append(TEXT_90);
		}
		stringBuffer.append(TEXT_91);
		if (genModel.useInterfaceOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_92);
		if (genModel.useInterfaceOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_93);
		if (genModel.useInterfaceOverrideAnnotation()) {
			stringBuffer.append(TEXT_54);
		}
		stringBuffer.append(TEXT_94);
		if (genPackage.isDisposableProviderFactory()) {
			stringBuffer.append(TEXT_95);
			if (genModel.useInterfaceOverrideAnnotation()) {
				stringBuffer.append(TEXT_54);
			}
			stringBuffer.append(TEXT_96);
			if (genPackage.hasStatefulProvider()) {
				stringBuffer.append(TEXT_97);
			} else {
				for (GenClass genClass : genPackage.getGenClasses()) {
					if (!genClass.isAbstract() && genClass.isProviderSingleton()) {
						stringBuffer.append(TEXT_98);
						stringBuffer.append(genClass.getUncapName());
						stringBuffer.append(TEXT_99);
						stringBuffer.append(genClass.getUncapName());
						stringBuffer.append(TEXT_100);
					}
				}
			}
			stringBuffer.append(TEXT_32);
		}
		if (genPackage.isChildCreationExtenders()) {
			for (Map.Entry<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> packageEntry : genPackage
					.getExtendedChildCreationData().entrySet()) {
				stringBuffer.append(TEXT_101);
				stringBuffer.append(packageEntry.getKey().getImportedPackageInterfaceName());
				stringBuffer.append(TEXT_102);
				stringBuffer.append(genPackage.getChildCreationExtenderName(packageEntry.getKey()));
				stringBuffer.append(TEXT_103);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.provider.IChildCreationExtender"));
				stringBuffer.append(TEXT_104);
				stringBuffer.append(genModel.getImportedName(packageEntry.getKey().getQualifiedSwitchClassName()));
				stringBuffer.append(useGenerics ? "<Object>" : "");
				stringBuffer.append(TEXT_105);
				stringBuffer
						.append(genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List"));
				stringBuffer.append(TEXT_106);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
				stringBuffer.append(TEXT_107);
				stringBuffer
						.append(genModel.getImportedName(useGenerics ? "java.util.List<Object>" : "java.util.List"));
				stringBuffer.append(TEXT_108);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
				stringBuffer.append(TEXT_109);
				for (Map.Entry<GenClass, List<GenClass.ChildCreationData>> classEntry : packageEntry.getValue()
						.entrySet()) {
					GenClass genClass = classEntry.getKey();
					stringBuffer.append(TEXT_110);
					if (genModel.useClassOverrideAnnotation()) {
						stringBuffer.append(TEXT_111);
					}
					stringBuffer.append(TEXT_112);
					stringBuffer.append(genClass.getTypeParameters());
					stringBuffer.append(TEXT_113);
					stringBuffer.append(genPackage.getClassUniqueName(genClass));
					stringBuffer.append(TEXT_23);
					stringBuffer.append(genClass.getImportedInterfaceName());
					stringBuffer.append(genClass.getInterfaceTypeArguments());
					stringBuffer.append(TEXT_114);
					for (GenClass.ChildCreationData childCreationData : classEntry.getValue()) {
						GenFeature createFeature = childCreationData.createFeature;
						GenFeature delegatedFeature = childCreationData.delegatedFeature;
						GenClassifier createClassifier = childCreationData.createClassifier;
						if (createFeature.isFeatureMapType()) {
							if (delegatedFeature.isReferenceType()) {
								GenClass createClass = (GenClass) createClassifier;
								stringBuffer.append(TEXT_17);
								{
									//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceDelegatedFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>

									InternalPatternContext ictx = (InternalPatternContext) ctx;
									new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
									stringBuffer.setLength(0);

									final Map<String, Object> callParameters = new HashMap<String, Object>();
									callParameters.put("createClass", createClass);
									callParameters.put("createFeature", createFeature);
									callParameters.put("delegatedFeature", delegatedFeature);
									callParameters.put("createClassifier", createClassifier);
									callParameters.put("childCreationData", childCreationData);
									callParameters.put("genClass", genClass);
									callParameters.put("genPackage", genPackage);
									callParameters.put("genModel", genModel);
									callParameters.put("isJDK50", isJDK50);
									CallHelper.executeWithParameterInjection(
											"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_036GEGJ-Ed-FqczH3ESmRw",
											new ExecutionContext((InternalPatternContext) ctx), callParameters);
									stringBuffer.setLength(0);
								}

								//ItemProvider/newChildDescriptorsReferenceDelegatedFeature.override.javajetinc
							} else {
								GenDataType createDataType = (GenDataType) createClassifier;
								stringBuffer.append(TEXT_17);
								{
									//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeDelegatedFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>

									InternalPatternContext ictx = (InternalPatternContext) ctx;
									new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
									stringBuffer.setLength(0);

									final Map<String, Object> callParameters = new HashMap<String, Object>();
									callParameters.put("createDataType", createDataType);
									callParameters.put("createFeature", createFeature);
									callParameters.put("delegatedFeature", delegatedFeature);
									callParameters.put("createClassifier", createClassifier);
									callParameters.put("childCreationData", childCreationData);
									callParameters.put("genClass", genClass);
									callParameters.put("genPackage", genPackage);
									callParameters.put("genModel", genModel);
									callParameters.put("isJDK50", isJDK50);
									CallHelper.executeWithParameterInjection(
											"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04WyAGJ-Ed-FqczH3ESmRw",
											new ExecutionContext((InternalPatternContext) ctx), callParameters);
									stringBuffer.setLength(0);
								}

								//ItemProvider/newChildDescriptorsAttributeDelegatedFeature.override.javajetinc
							}
						} else if (createFeature.isReferenceType()) {
							GenClass createClass = (GenClass) createClassifier;
							stringBuffer.append(TEXT_17);
							{
								//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsReferenceFeature.override" args="createClass:createClass,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>

								InternalPatternContext ictx = (InternalPatternContext) ctx;
								new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
								stringBuffer.setLength(0);

								final Map<String, Object> callParameters = new HashMap<String, Object>();
								callParameters.put("createClass", createClass);
								callParameters.put("createFeature", createFeature);
								callParameters.put("delegatedFeature", delegatedFeature);
								callParameters.put("createClassifier", createClassifier);
								callParameters.put("childCreationData", childCreationData);
								callParameters.put("genClass", genClass);
								callParameters.put("genPackage", genPackage);
								callParameters.put("genModel", genModel);
								callParameters.put("isJDK50", isJDK50);
								CallHelper.executeWithParameterInjection(
										"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_04ps8GJ-Ed-FqczH3ESmRw",
										new ExecutionContext((InternalPatternContext) ctx), callParameters);
								stringBuffer.setLength(0);
							}

							//ItemProvider/newChildDescriptorsReferenceFeature.override.javajetinc 
						} else {
							GenDataType createDataType = (GenDataType) createClassifier;
							stringBuffer.append(TEXT_17);
							{
								//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#LogicalName=org.eclipse.egf.emf.pattern.edit.call.ItemProvider.ItemProvider.newChildDescriptorsAttributeFeature.override" args="createDataType:createDataType,createFeature:createFeature,delegatedFeature:delegatedFeature,createClassifier:createClassifier,childCreationData:childCreationData,genClass:genClass,genPackage:genPackage,genModel:genModel,isJDK50:isJDK50"%>

								InternalPatternContext ictx = (InternalPatternContext) ctx;
								new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
								stringBuffer.setLength(0);

								final Map<String, Object> callParameters = new HashMap<String, Object>();
								callParameters.put("createDataType", createDataType);
								callParameters.put("createFeature", createFeature);
								callParameters.put("delegatedFeature", delegatedFeature);
								callParameters.put("createClassifier", createClassifier);
								callParameters.put("childCreationData", childCreationData);
								callParameters.put("genClass", genClass);
								callParameters.put("genPackage", genPackage);
								callParameters.put("genModel", genModel);
								callParameters.put("isJDK50", isJDK50);
								CallHelper.executeWithParameterInjection(
										"platform:/plugin/org.eclipse.egf.emf.pattern/egf/EMF_Pattern.fcore#_048n4GJ-Ed-FqczH3ESmRw",
										new ExecutionContext((InternalPatternContext) ctx), callParameters);
								stringBuffer.setLength(0);
							}

							//ItemProvider/newChildDescriptorsAttributeFeature.override.javajetinc
						}
						stringBuffer.append(TEXT_17);
					}
					stringBuffer.append(TEXT_115);
				}
				stringBuffer.append(TEXT_116);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter"));
				stringBuffer.append(TEXT_117);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.command.CommandParameter"));
				stringBuffer.append(TEXT_118);
				stringBuffer.append(_Collection);
				stringBuffer.append(TEXT_88);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.edit.domain.EditingDomain"));
				stringBuffer.append(TEXT_119);
				stringBuffer.append(_ArrayList);
				stringBuffer.append(TEXT_120);
				stringBuffer.append(_ArrayList);
				stringBuffer.append(TEXT_121);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EObject"));
				stringBuffer.append(TEXT_122);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.ResourceLocator"));
				stringBuffer.append(TEXT_123);
				stringBuffer.append(genPackage.getImportedEditPluginClassName());
				stringBuffer.append(TEXT_124);
			}
		}
		stringBuffer.append(TEXT_125);
		genModel.emitSortedImports();
		stringBuffer.append(TEXT_17);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
	}

	public boolean preCondition(PatternContext ctx) throws Exception {
		GenPackage genPackage = parameter;
		genModel = parameter.getGenModel();
		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.EditProject");
		canGenerate = canGenerate && (!genPackage.getGenClasses().isEmpty());
		return canGenerate;
	}
}