308510 - with patch, npe patch 2, icon, and test case
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
index 6893a1a..9b79bd5 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/ear/operations/EARProjectCreationOperationTest.java
@@ -30,27 +30,37 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.core.JavaModelManager;
+import org.eclipse.jst.common.internal.modulecore.ClasspathContainerVirtualComponent;
 import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider;
+import org.eclipse.jst.j2ee.application.internal.operations.AddReferenceToEnterpriseApplicationDataModelProvider;
 import org.eclipse.jst.j2ee.classpath.tests.util.ClasspathDependencyTestUtil;
 import org.eclipse.jst.j2ee.earcreation.IEarFacetInstallDataModelProperties;
 import org.eclipse.jst.j2ee.internal.project.facet.EARFacetProjectCreationDataModelProvider;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetInstallDataModelProperties;
 import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetInstallDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
@@ -462,6 +472,62 @@
 		assertEquals("test1.jar", children[0].getName());
     }
 
+    public void testEARWithClasspathContainerReference() throws Exception {
+    	// Find the junit jar
+		ClasspathContainerInitializer initializer= JavaCore.getClasspathContainerInitializer(JavaCore.USER_LIBRARY_CONTAINER_ID);
+		IPath path = new Path("JUNIT_HOME/junit.jar"); //$NON-NLS-1$
+		IPath resolvedPath = JavaCore.getResolvedVariablePath(path);
+		
+		// Make a new user library a999 referencing this jar
+		IClasspathEntry junitEntry = JavaCore.newLibraryEntry(resolvedPath, null, null);
+		JavaModelManager.getUserLibraryManager().setUserLibrary("a999", new IClasspathEntry[]{junitEntry}, false);
+		String containerPath = JavaCore.USER_LIBRARY_CONTAINER_ID + "/a999";
+		
+		// Make an EAR project
+    	IDataModel dm = getEARDataModel("rEAR", "ourContent", null, null, JavaEEFacetConstants.EAR_5, false);
+    	OperationTestCase.runAndVerify(dm);
+    	IProject rootProj = ResourcesPlugin.getWorkspace().getRoot().getProject("rEAR");
+    	final IVirtualComponent rootComp = ComponentCore.createComponent(rootProj);
+    	
+    	// Add a classpath container reference
+    	IVirtualComponent classpathContainerComp = new ClasspathContainerVirtualComponent(rootProj, rootComp, containerPath);
+		final VirtualReference ref = new VirtualReference(rootComp, classpathContainerComp, new Path("/testFolder").makeAbsolute());
+		ref.setDependencyType(IVirtualReference.DEPENDENCY_TYPE_CONSUMES);
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
+			public void run(IProgressMonitor monitor) throws CoreException{
+				IDataModelProvider provider = new AddReferenceToEnterpriseApplicationDataModelProvider();
+				IDataModel dm = DataModelFactory.createDataModel(provider);
+				dm.setProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT, rootComp);
+				dm.setProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST, Arrays.asList(ref));
+				
+				IStatus stat = dm.validateProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST);
+				if (!stat.isOK())
+					throw new CoreException(stat);
+				try {
+					dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+				} catch (ExecutionException e) {
+					throw new CoreException(new Status(IStatus.ERROR, "blah", "error", e));
+				}	
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+		} catch( CoreException e ) {
+			e.printStackTrace();
+			fail();
+		}
+		
+		// Verify module stuff!
+		IModule module = ServerUtil.getModule(rootProj);
+		ModuleDelegate delegate = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+		IModuleResource[] resources = delegate.members();
+		assertTrue(resources.length == 1);
+		assertTrue(resources[0] instanceof IModuleFolder);
+		assertTrue(resources[0].getName().equals("testFolder"));
+		assertTrue(((IModuleFolder)resources[0]).members().length == 1);
+		assertTrue(((IModuleFolder)resources[0]).members()[0] instanceof IModuleFile);
+		assertTrue(((IModuleFolder)resources[0]).members()[0].getName().equals("junit.jar"));
+    }
 
     public void addArchiveComponent(IVirtualComponent component) throws CoreException {