[496148] Fix AS2CS of non-default multiplicities
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtbase/META-INF/MANIFEST.MF b/plugins/org.eclipse.qvtd.xtext.qvtbase/META-INF/MANIFEST.MF
index c21eb0c..20eb7a2 100644
--- a/plugins/org.eclipse.qvtd.xtext.qvtbase/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.qvtd.xtext.qvtbase/META-INF/MANIFEST.MF
@@ -13,6 +13,7 @@
  org.eclipse.qvtd.pivot.qvtbase;bundle-version="[0.14.0,1.0.0)";visibility:=reexport,
  org.eclipse.ocl.xtext.essentialocl;bundle-version="[1.2.0,1.4.0)";visibility:=reexport
 Export-Package: org.eclipse.qvtd.xtext.qvtbase,
+ org.eclipse.qvtd.xtext.qvtbase.as2cs,
  org.eclipse.qvtd.xtext.qvtbase.cs2as,
  org.eclipse.qvtd.xtext.qvtbase.formatting,
  org.eclipse.qvtd.xtext.qvtbase.parser.antlr,
@@ -20,6 +21,7 @@
  org.eclipse.qvtd.xtext.qvtbase.scoping,
  org.eclipse.qvtd.xtext.qvtbase.serializer,
  org.eclipse.qvtd.xtext.qvtbase.services,
+ org.eclipse.qvtd.xtext.qvtbase.utilities,
  org.eclipse.qvtd.xtext.qvtbase.validation,
  org.eclipse.qvtd.xtext.qvtbasecs,
  org.eclipse.qvtd.xtext.qvtbasecs.impl,
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtbase/src/org/eclipse/qvtd/xtext/qvtbase/as2cs/QVTbaseDeclarationVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtbase/src/org/eclipse/qvtd/xtext/qvtbase/as2cs/QVTbaseDeclarationVisitor.java
new file mode 100644
index 0000000..297e1ee
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.xtext.qvtbase/src/org/eclipse/qvtd/xtext/qvtbase/as2cs/QVTbaseDeclarationVisitor.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.qvtd.xtext.qvtbase.as2cs;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.CollectionType;
+import org.eclipse.ocl.pivot.LanguageExpression;
+import org.eclipse.ocl.pivot.Operation;
+import org.eclipse.ocl.pivot.Parameter;
+import org.eclipse.ocl.pivot.TemplateSignature;
+import org.eclipse.ocl.pivot.TypedElement;
+import org.eclipse.ocl.xtext.base.as2cs.AS2CSConversion;
+import org.eclipse.ocl.xtext.basecs.BaseCSFactory;
+import org.eclipse.ocl.xtext.basecs.BaseCSPackage;
+import org.eclipse.ocl.xtext.basecs.ConstraintCS;
+import org.eclipse.ocl.xtext.basecs.ElementCS;
+import org.eclipse.ocl.xtext.basecs.MultiplicityBoundsCS;
+import org.eclipse.ocl.xtext.basecs.OperationCS;
+import org.eclipse.ocl.xtext.basecs.ParameterCS;
+import org.eclipse.ocl.xtext.basecs.SpecificationCS;
+import org.eclipse.ocl.xtext.basecs.TemplateSignatureCS;
+import org.eclipse.ocl.xtext.basecs.TypedElementCS;
+import org.eclipse.ocl.xtext.basecs.TypedRefCS;
+import org.eclipse.ocl.xtext.essentialocl.as2cs.EssentialOCLDeclarationVisitor;
+import org.eclipse.qvtd.pivot.qvtbase.util.QVTbaseVisitor;
+
+public abstract class QVTbaseDeclarationVisitor extends EssentialOCLDeclarationVisitor implements QVTbaseVisitor<ElementCS>
+{
+	public QVTbaseDeclarationVisitor(@NonNull AS2CSConversion context) {
+		super(context);
+	}
+	
+	// FIXME Re-implemented to workaround Bug 496148
+	public <@NonNull T extends TypedElementCS> T refreshTypedElement(@NonNull Class<T> csClass, /*@NonNull */EClass csEClass, @NonNull TypedElement asTypedElement) {
+		T csTypedElement = context.refreshNamedElement(csClass, csEClass, asTypedElement);
+		csTypedElement.setPivot(asTypedElement);
+		TypedRefCS csTypeRef = createTypeRefCS(asTypedElement.getType());
+		csTypedElement.setOwnedType(csTypeRef);
+		if ((csTypeRef != null) && !(asTypedElement.getType() instanceof CollectionType)) {
+			if (asTypedElement.isIsRequired()) {
+				MultiplicityBoundsCS csMultiplicity = BaseCSFactory.eINSTANCE.createMultiplicityBoundsCS();
+				csMultiplicity.setLowerBound(1);
+				csTypeRef.setOwnedMultiplicity(csMultiplicity);
+			}
+//			else {
+//				MultiplicityStringCS csMultiplicity = BaseCSFactory.eINSTANCE.createMultiplicityStringCS();
+//				csMultiplicity.setStringBounds("1");
+//				csTypeRef.setOwnedMultiplicity(csMultiplicity);
+//			}
+		}
+		return csTypedElement;
+	}
+
+	@Override // FIXME Re-implemented to workaround Bug 496148
+	public ElementCS visitOperation(@NonNull Operation object) {
+		OperationCS csElement = refreshTypedElement(OperationCS.class, BaseCSPackage.Literals.OPERATION_CS, object);
+		TemplateSignature ownedTemplateSignature = object.getOwnedSignature();
+		csElement.setOwnedSignature(context.visitDeclaration(TemplateSignatureCS.class, ownedTemplateSignature));
+		context.refreshList(csElement.getOwnedParameters(), context.visitDeclarations(ParameterCS.class, object.getOwnedParameters(), null));
+		context.refreshList(csElement.getOwnedExceptions(), context.visitReferences(TypedRefCS.class, object.getRaisedExceptions(), null));
+		//
+		context.refreshList(csElement.getOwnedPreconditions(), context.visitDeclarations(ConstraintCS.class, object.getOwnedPreconditions(), null));
+		List<LanguageExpression> bodyExpressions = object.getBodyExpression() != null ? Collections.singletonList(object.getBodyExpression()) : Collections.<LanguageExpression>emptyList();
+		context.refreshList(csElement.getOwnedBodyExpressions(), context.visitDeclarations(SpecificationCS.class, bodyExpressions, null));
+		context.refreshList(csElement.getOwnedPostconditions(), context.visitDeclarations(ConstraintCS.class, object.getOwnedPostconditions(), null));
+		return csElement;
+	}
+
+	@Override
+	public ElementCS visitParameter(@NonNull Parameter object) { // FIXME Re-implemented to workaround Bug 496148
+		ParameterCS csElement = refreshTypedElement(ParameterCS.class, BaseCSPackage.Literals.PARAMETER_CS, object);
+		return csElement;
+	}
+}
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtcorebase/src/org/eclipse/qvtd/xtext/qvtcorebase/as2cs/QVTcoreBaseDeclarationVisitor.java b/plugins/org.eclipse.qvtd.xtext.qvtcorebase/src/org/eclipse/qvtd/xtext/qvtcorebase/as2cs/QVTcoreBaseDeclarationVisitor.java
index 911e9b9..dd7ecc0 100644
--- a/plugins/org.eclipse.qvtd.xtext.qvtcorebase/src/org/eclipse/qvtd/xtext/qvtcorebase/as2cs/QVTcoreBaseDeclarationVisitor.java
+++ b/plugins/org.eclipse.qvtd.xtext.qvtcorebase/src/org/eclipse/qvtd/xtext/qvtcorebase/as2cs/QVTcoreBaseDeclarationVisitor.java
@@ -49,7 +49,6 @@
 import org.eclipse.ocl.xtext.basecs.PathElementWithURICS;
 import org.eclipse.ocl.xtext.basecs.PathNameCS;
 import org.eclipse.ocl.xtext.basecs.RootPackageCS;
-import org.eclipse.ocl.xtext.essentialocl.as2cs.EssentialOCLDeclarationVisitor;
 import org.eclipse.ocl.xtext.essentialoclcs.ExpCS;
 import org.eclipse.ocl.xtext.essentialoclcs.NameExpCS;
 import org.eclipse.qvtd.pivot.qvtbase.BaseModel;
@@ -74,6 +73,7 @@
 import org.eclipse.qvtd.pivot.qvtcorebase.VariableAssignment;
 import org.eclipse.qvtd.pivot.qvtcorebase.util.QVTcoreBaseVisitor;
 import org.eclipse.qvtd.pivot.qvtcorebase.utilities.QVTcoreBaseUtil;
+import org.eclipse.qvtd.xtext.qvtbase.as2cs.QVTbaseDeclarationVisitor;
 import org.eclipse.qvtd.xtext.qvtbasecs.AbstractTransformationCS;
 import org.eclipse.qvtd.xtext.qvtbasecs.QVTbaseCSPackage;
 import org.eclipse.qvtd.xtext.qvtbasecs.QualifiedPackageCS;
@@ -92,7 +92,7 @@
 import org.eclipse.qvtd.xtext.qvtcorebasecs.TransformationCS;
 import org.eclipse.qvtd.xtext.qvtcorebasecs.UnrealizedVariableCS;
 
-public abstract class QVTcoreBaseDeclarationVisitor extends EssentialOCLDeclarationVisitor implements QVTcoreBaseVisitor<ElementCS>
+public abstract class QVTcoreBaseDeclarationVisitor extends QVTbaseDeclarationVisitor implements QVTcoreBaseVisitor<ElementCS>
 {
 	public static @Nullable PathNameCS createPathNameCS(@Nullable List<? extends @NonNull NamedElement> csPath) {
 		PathNameCS csPathName = null;
@@ -346,10 +346,8 @@
 
 	@Override
 	public ElementCS visitFunction(@NonNull Function asFunction) {
-		QueryCS csQuery = context.refreshNamedElement(QueryCS.class, QVTcoreBaseCSPackage.Literals.QUERY_CS, asFunction);
-		csQuery.setPivot(asFunction);
+		QueryCS csQuery = refreshTypedElement(QueryCS.class, QVTcoreBaseCSPackage.Literals.QUERY_CS, asFunction);
 		csQuery.setOwnedPathName(createPathNameCS(asFunction.getOwningClass()));
-		csQuery.setOwnedType(createTypeRefCS(asFunction.getType()));
 		context.refreshList(csQuery.getOwnedParameters(), context.visitDeclarations(ParamDeclarationCS.class, asFunction.getOwnedParameters(), null));
 		csQuery.setOwnedExpression(createExpCS(asFunction.getQueryExpression()));
 		return csQuery;
@@ -357,16 +355,13 @@
 
 	@Override
 	public ElementCS visitFunctionParameter(@NonNull FunctionParameter asFunctionParameter) {
-		ParamDeclarationCS csParamDeclaration = context.refreshNamedElement(ParamDeclarationCS.class, QVTcoreBaseCSPackage.Literals.PARAM_DECLARATION_CS, asFunctionParameter);
-		csParamDeclaration.setPivot(asFunctionParameter);
-		csParamDeclaration.setOwnedType(createTypeRefCS(asFunctionParameter.getType()));
+		ParamDeclarationCS csParamDeclaration = refreshTypedElement(ParamDeclarationCS.class, QVTcoreBaseCSPackage.Literals.PARAM_DECLARATION_CS, asFunctionParameter);
 		return csParamDeclaration;
 	}
 
 	@Override
 	public ElementCS visitNavigationAssignment(@NonNull NavigationAssignment asNavigationAssignment) {
 		PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTcoreBaseCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asNavigationAssignment);
-		csAssignment.setPivot(asNavigationAssignment);
 		ExpCS csSlotExp = createExpCS(asNavigationAssignment.getSlotExpression());
 		NameExpCS csPropName = createNameExpCS(QVTcoreBaseUtil.getTargetProperty(asNavigationAssignment));
 		csAssignment.setOwnedTarget(createInfixExpCS(csSlotExp, ".", csPropName));
@@ -431,9 +426,7 @@
 
 	@Override
 	public ElementCS visitRealizedVariable(@NonNull RealizedVariable asRealizedVariable) {
-		RealizedVariableCS csRealizedVariable = context.refreshNamedElement(RealizedVariableCS.class, QVTcoreBaseCSPackage.Literals.REALIZED_VARIABLE_CS, asRealizedVariable);
-		csRealizedVariable.setPivot(asRealizedVariable);
-		csRealizedVariable.setOwnedType(createTypeRefCS(asRealizedVariable.getType(), getScope(asRealizedVariable)));
+		RealizedVariableCS csRealizedVariable = refreshTypedElement(RealizedVariableCS.class, QVTcoreBaseCSPackage.Literals.REALIZED_VARIABLE_CS, asRealizedVariable);
 		return csRealizedVariable;
 	}
 
@@ -445,7 +438,7 @@
 	@Override
 	public ElementCS visitTransformation(@NonNull Transformation asTransformation) {
 		TransformationCS csTransformation = context.refreshNamedElement(TransformationCS.class, QVTcoreBaseCSPackage.Literals.TRANSFORMATION_CS, asTransformation);
-		csTransformation.setPivot(asTransformation);
+//		csTransformation.setPivot(asTransformation);
 //		org.eclipse.ocl.pivot.Package owningPackage = asTransformation.getOwningPackage();
 //		if ((owningPackage == null) || "".equals(owningPackage.getName()) || (owningPackage.getName() == null)) {
 //			csTransformation.setOwnedPathName(null);
@@ -465,7 +458,6 @@
 		if ("".equals(asTypedModel.getName())) {
 			csDirection.setName(null);
 		}	
-		csDirection.setPivot(asTypedModel);
 		PivotUtilInternal.refreshList(csDirection.getImports(), asTypedModel.getUsedPackage());
 //		PivotUtil.refreshList(csDirection.getUses(), asTypedModel.getDependsOn());
 		return csDirection;
@@ -506,9 +498,7 @@
 	@Override
 	public ElementCS visitVariable(@NonNull Variable asVariable) {
 		if (asVariable.eContainer() instanceof CorePattern) {
-			UnrealizedVariableCS csUnrealizedVariable = context.refreshNamedElement(UnrealizedVariableCS.class, QVTcoreBaseCSPackage.Literals.UNREALIZED_VARIABLE_CS, asVariable);
-			csUnrealizedVariable.setPivot(asVariable);
-			csUnrealizedVariable.setOwnedType(createTypeRefCS(asVariable.getType(), getScope(asVariable)));
+			UnrealizedVariableCS csUnrealizedVariable = refreshTypedElement(UnrealizedVariableCS.class, QVTcoreBaseCSPackage.Literals.UNREALIZED_VARIABLE_CS, asVariable);
 			csUnrealizedVariable.setOwnedInitExpression(context.visitDeclaration(ExpCS.class, asVariable.getOwnedInit()));
 			return csUnrealizedVariable;
 		}
@@ -520,7 +510,6 @@
 	@Override
 	public ElementCS visitVariableAssignment(@NonNull VariableAssignment asVariableAssignment) {
 		PredicateOrAssignmentCS csAssignment = context.refreshElement(PredicateOrAssignmentCS.class, QVTcoreBaseCSPackage.Literals.PREDICATE_OR_ASSIGNMENT_CS, asVariableAssignment);
-		csAssignment.setPivot(asVariableAssignment);
 		Variable asVariable = asVariableAssignment.getTargetVariable();
 		if (asVariable != null) {
 			csAssignment.setOwnedTarget(createNameExpCS(asVariable));
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/ManualUML2RDBMS/ManualUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/ManualUML2RDBMS/ManualUML2RDBMS.qvti
index 6724e88..3328231 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/ManualUML2RDBMS/ManualUML2RDBMS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/ManualUML2RDBMS/ManualUML2RDBMS.qvti
@@ -194,15 +194,15 @@
     ) {}
 }
 
-query ManualUML2RDBMS::getAllSupers(cls : UML::Class) : Set(UML::Class) {
+query ManualUML2RDBMS::getAllSupers(cls : UML::Class[1]) : Set(UML::Class) {
     cls.general->collect(gen | getAllSupers(gen))->including(cls)->asSet()
 }
 
-query ManualUML2RDBMS::getAllAttributes(cls :  UML::Class) : Set(UML::Attribute) {
+query ManualUML2RDBMS::getAllAttributes(cls :  UML::Class[1]) : Set(UML::Attribute) {
     getAllSupers(cls).attributes->asSet() -- ->collect(c | c._'attribute')
 }
     
-query ManualUML2RDBMS::getAllForwards(cls : UML::Class) : Set(UML::Association) {
+query ManualUML2RDBMS::getAllForwards(cls : UML::Class[1]) : Set(UML::Association) {
     getAllSupers(cls).forward->asSet()
 }