Bug 319728 - Uninjection of primitive values is broken
diff --git a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
index 8db578d..ecfe02b 100644
--- a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
+++ b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
@@ -52,6 +52,15 @@
 
 	final static private String JAVA_OBJECT = "java.lang.Object"; //$NON-NLS-1$
 
+	final private static Boolean DEFAULT_BOOLEAN = new Boolean(false);
+	final private static Integer DEFAULT_INTEGER = new Integer(0);
+	final private static Character DEFAULT_CHAR = new Character((char) 0);
+	final private static Float DEFAULT_FLOAT = new Float(0.0f);
+	final private static Double DEFAULT_DOUBLE = new Double(0.0d);
+	final private static Long DEFAULT_LONG = new Long(0L);
+	final private static Short DEFAULT_SHORT = new Short((short) 0);
+	final private static Byte DEFAULT_BYTE = new Byte((byte) 0);
+
 	private Map<PrimaryObjectSupplier, List<WeakReference<?>>> injectedObjects = new HashMap<PrimaryObjectSupplier, List<WeakReference<?>>>();
 	private Set<WeakReference<Class<?>>> injectedClasses = new HashSet<WeakReference<Class<?>>>();
 	private HashMap<Class<?>, Object> singletonCache = new HashMap<Class<?>, Object>();
@@ -428,13 +437,31 @@
 				if (!descriptorsClass.isAssignableFrom(actualArgs[i].getClass()))
 					actualArgs[i] = IInjector.NOT_A_VALUE;
 			}
-			// replace optional unresolved values with null
-			if (actualArgs[i] == IInjector.NOT_A_VALUE && descriptors[i].hasQualifier(Optional.class))
-				actualArgs[i] = null;
-			else if (fillNulls && actualArgs[i] == IInjector.NOT_A_VALUE)
-				actualArgs[i] = null;
+			if (actualArgs[i] == IInjector.NOT_A_VALUE) { // still unresolved?
+				if (fillNulls || descriptors[i].hasQualifier(Optional.class)) { // uninject or optional - fill defaults
+					Class<?> descriptorsClass = getDesiredClass(descriptors[i].getDesiredType());
+					if (descriptorsClass.isPrimitive()) {
+						if (descriptorsClass.equals(boolean.class))
+							actualArgs[i] = DEFAULT_BOOLEAN;
+						else if (descriptorsClass.equals(int.class))
+							actualArgs[i] = DEFAULT_INTEGER;
+						else if (descriptorsClass.equals(char.class))
+							actualArgs[i] = DEFAULT_CHAR;
+						else if (descriptorsClass.equals(float.class))
+							actualArgs[i] = DEFAULT_FLOAT;
+						else if (descriptorsClass.equals(double.class))
+							actualArgs[i] = DEFAULT_DOUBLE;
+						else if (descriptorsClass.equals(long.class))
+							actualArgs[i] = DEFAULT_LONG;
+						else if (descriptorsClass.equals(short.class))
+							actualArgs[i] = DEFAULT_SHORT;
+						else if (descriptorsClass.equals(byte.class))
+							actualArgs[i] = DEFAULT_BYTE;
+					} else
+						actualArgs[i] = null;
+				}
+			}
 		}
-
 		return actualArgs;
 	}
 
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBaseTypeTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBaseTypeTest.java
index 74935f3..18360d4 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBaseTypeTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectBaseTypeTest.java
@@ -18,6 +18,7 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.annotations.Optional;
 
 /**
  * Checks conversion of primitive types
@@ -28,6 +29,9 @@
 		@Inject @Named("test_int")
 		public int intField;
 		
+		@Inject @Named("test_int_optional") @Optional
+		public int intFieldOptional;
+		
 		@Inject @Named("test_long")
 		public long longField;
 		
@@ -76,6 +80,7 @@
 		TestClass testClass = ContextInjectionFactory.make(TestClass.class, context);
 		
 		assertEquals(12, testClass.intField);
+		assertEquals(0, testClass.intFieldOptional);
 		assertEquals(124564523466L, testClass.longField);
 		assertEquals(12.34f, testClass.floatField);
 		assertEquals(12.34534534563463466546d, testClass.doubleField);
@@ -87,5 +92,23 @@
 		assertEquals(12, testClass.intArg);
 		assertEquals('a', testClass.charArg);
 		assertEquals(true, testClass.booleanArg);
+		
+		// test end-of-life reset of values
+		ContextInjectionFactory.uninject(testClass, context);
+		
+		assertEquals(0, testClass.intField);
+		assertEquals(0, testClass.intFieldOptional);
+		assertEquals(0L, testClass.longField);
+		assertEquals(0f, testClass.floatField);
+		assertEquals(0.0d, testClass.doubleField);
+		assertEquals((short)0, testClass.shortField);
+		assertEquals((byte)0, testClass.byteField);
+		assertEquals(false, testClass.booleanField);
+		assertEquals((char)0, testClass.charField);
+		
+		assertEquals(0, testClass.intArg);
+		assertEquals((char)0, testClass.charArg);
+		assertEquals(false, testClass.booleanArg);
+		
 	}
 }