Bug 485659 - [CDT Integration and Class Diagram] Function Parameter lose their type after saving.

- Fix name of Ansi C library in CppUriConstants
- Load Ansi C library to make sure that primitive types are found
- Restore original types, if new type cannot be found

Signed-off-by: Ansgar Radermacher <ansgar.radermacher@cea.fr>
diff --git a/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor/src/org/eclipse/papyrus/designer/languages/cpp/cdt/texteditor/sync/SyncCDTtoModel.java b/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor/src/org/eclipse/papyrus/designer/languages/cpp/cdt/texteditor/sync/SyncCDTtoModel.java
index c1418e9..f58c2fb 100644
--- a/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor/src/org/eclipse/papyrus/designer/languages/cpp/cdt/texteditor/sync/SyncCDTtoModel.java
+++ b/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor/src/org/eclipse/papyrus/designer/languages/cpp/cdt/texteditor/sync/SyncCDTtoModel.java
@@ -41,7 +41,9 @@
 import org.eclipse.cdt.ui.CDTUITools;
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.papyrus.designer.languages.common.base.ElementUtils;
 import org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen;
 import org.eclipse.papyrus.designer.languages.common.extensionpoints.ILangCodegen2;
 import org.eclipse.papyrus.designer.languages.common.extensionpoints.LanguageCodegen;
@@ -50,6 +52,7 @@
 import org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor.Utils;
 import org.eclipse.papyrus.designer.languages.cpp.cdt.texteditor.listener.ModelListener;
 import org.eclipse.papyrus.designer.languages.cpp.codegen.Constants;
+import org.eclipse.papyrus.designer.languages.cpp.library.CppUriConstants;
 import org.eclipse.papyrus.designer.languages.cpp.profile.C_Cpp.Array;
 import org.eclipse.papyrus.designer.languages.cpp.profile.C_Cpp.Const;
 import org.eclipse.papyrus.designer.languages.cpp.profile.C_Cpp.EStorageClass;
@@ -59,6 +62,7 @@
 import org.eclipse.papyrus.designer.languages.cpp.profile.C_Cpp.StorageClass;
 import org.eclipse.papyrus.designer.languages.cpp.profile.C_Cpp.Volatile;
 import org.eclipse.papyrus.designer.transformation.base.utils.CommandSupport;
+import org.eclipse.papyrus.designer.transformation.base.utils.StdModelLibs;
 import org.eclipse.papyrus.infra.core.Activator;
 import org.eclipse.papyrus.uml.tools.utils.StereotypeUtil;
 import org.eclipse.papyrus.uml.tools.utils.UMLUtil;
@@ -74,6 +78,7 @@
 import org.eclipse.uml2.uml.Operation;
 import org.eclipse.uml2.uml.Parameter;
 import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.UMLFactory;
 import org.eclipse.uml2.uml.UMLPackage;
 
 public class SyncCDTtoModel implements Runnable {
@@ -138,9 +143,9 @@
 				}
 
 			} catch (CModelException e) {
-				Activator.getDefault().getLog().log(e.getStatus());
+				Activator.log.error(e);
 			} catch (Exception e) {
-				System.err.println(e);
+				Activator.log.error(e);
 			} finally {
 				if (index != null) {
 					index.releaseReadLock();
@@ -318,7 +323,14 @@
 		// Remove all parameters from operation / behavior (they will be added later).
 		// Calling parameters.clear() is not sufficient. Otherwise stereotype
 		// applications to unresolved elements remain in the model
+		EList<Parameter> existingParameters = new BasicEList<Parameter>();
 		if (operation != null) {
+			for (Parameter existingParameter : operation.getOwnedParameters()) {
+				Parameter existingParamCopy = UMLFactory.eINSTANCE.createParameter();
+				existingParamCopy.setName(existingParameter.getName());
+				existingParamCopy.setType(existingParameter.getType());
+				existingParameters.add(existingParamCopy);
+			}
 			UMLUtil.destroyElements(operation.getOwnedParameters());
 		}
 		UMLUtil.destroyElements(behavior.getOwnedParameters());
@@ -378,8 +390,22 @@
 				NamedElement namedElemParamType = Utils.getQualifiedElement(Utils.getTop(m_classifier),
 						parameterTypeName);
 				if (namedElemParamType == null) {
-					namedElemParamType = Utils.getQualifiedElement(Utils.getTop(m_classifier),
-							ansiCLib + Utils.nsSep + parameterTypeName);
+					String qParName = ansiCLib + Utils.nsSep + parameterTypeName;
+					namedElemParamType = ElementUtils.getQualifiedElementFromRS(m_classifier, qParName);
+					if (namedElemParamType == null) {
+						// Make sure that Ansi-C library is loaded
+						StdModelLibs.addResource(CppUriConstants.ANSIC_LIB, m_classifier);
+						namedElemParamType = ElementUtils.getQualifiedElementFromRS(m_classifier, qParName);
+					}
+					// still null? recover type from existing definition (provided that name has not changed)
+					if (namedElemParamType == null) {
+						for (Parameter existingParameter : existingParameters) {
+							if (existingParameter.getName().equals(parameterName.toString())) {
+								namedElemParamType = existingParameter.getType();
+								break;
+							}
+						}
+					}
 				}
 				if (parameterType.isRestrict()) {
 				}
diff --git a/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.library/src/org/eclipse/papyrus/designer/languages/cpp/library/CppUriConstants.java b/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.library/src/org/eclipse/papyrus/designer/languages/cpp/library/CppUriConstants.java
index 352351d..128acd7 100644
--- a/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.library/src/org/eclipse/papyrus/designer/languages/cpp/library/CppUriConstants.java
+++ b/languages/cpp/org.eclipse.papyrus.designer.languages.cpp.library/src/org/eclipse/papyrus/designer/languages/cpp/library/CppUriConstants.java
@@ -24,7 +24,7 @@
 	
 	public static final URI PTHREAD_LIB = URI.createURI(PATHMAP + "pthread.uml"); //$NON-NLS-1$
 
-	public static final URI ANSIC_LIB = URI.createURI(PATHMAP + "ansiCLibrary.uml"); //$NON-NLS-1$
+	public static final URI ANSIC_LIB = URI.createURI(PATHMAP + "AnsiCLibrary.uml"); //$NON-NLS-1$
 
 	public static final URI OSAL_LIB = URI.createURI(PATHMAP + "osal.uml"); //$NON-NLS-1$