[378503] NPE when exporting an EAR if one of the modules is out of synch
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/ComponentExportOperation.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/ComponentExportOperation.java
index 48fcf6f..6b84dad 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/ComponentExportOperation.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/ComponentExportOperation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
+ * Copyright (c) 2010, 2012 IBM Corporation 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
@@ -49,6 +49,8 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonArchiveResourceHandler;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.IArchiveExportParticipantData;
+import org.eclipse.jst.j2ee.internal.archive.operations.FlatComponentArchiver.UnderlyingFileNotFoundException;
+import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
 import org.eclipse.jst.jee.archive.ArchiveSaveFailureException;
 import org.eclipse.jst.jee.archive.internal.ArchiveUtil;
@@ -133,7 +135,20 @@
     			}
     			export();
     		} catch (Exception e) {
-    			throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + getDestinationPath(), e);
+    			if (e.getCause() != null && e.getCause().getCause() instanceof UnderlyingFileNotFoundException){
+					// Try to refresh the child modules and do the archive operation again
+    				J2EEPlugin.logWarning("Refreshing referenced projects before trying to export again the project " + component.getDeployedName()); //$NON-NLS-1$
+    				try{
+						refreshChildModules(component);
+						export();
+    				}
+    				catch (Exception exceptionWhileRetry){
+    					throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + getDestinationPath(), exceptionWhileRetry);
+    				}
+				}
+    			else{
+    				throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + getDestinationPath(), e);
+    			}
     		}
     		
             final IDataModel dm = getDataModel();
@@ -331,4 +346,19 @@
 		return projs;
 	}
 	
+	private void refreshProject(IVirtualComponent refComp) throws CoreException {
+		if (!component.isBinary()) {
+			IProject project = refComp.getProject();
+			project.refreshLocal(IResource.DEPTH_INFINITE,null);
+		}			
+	}
+	
+	private void refreshChildModules(IVirtualComponent component) throws CoreException {
+		IVirtualReference[] refs = component.getReferences();
+		for (int i = 0; i < refs.length; i++) {
+			IVirtualComponent refComp = refs[i].getReferencedComponent();
+			refreshProject(refComp);
+		}	
+	}
+	
 }
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/FlatComponentArchiver.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/FlatComponentArchiver.java
index cf4fff1..2f46714 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/FlatComponentArchiver.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/operations/FlatComponentArchiver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
+ * Copyright (c) 2010, 2012 IBM Corporation 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
@@ -55,6 +55,15 @@
 		public IFlatVirtualComponent saveComponent(IVirtualComponent component, ZipOutputStream zipOutputStream, List<IPath> zipEntries) throws ArchiveException;
 		public boolean createManifest();
 	}
+	
+	public static class UnderlyingFileNotFoundException extends ArchiveSaveFailureException {
+		private static final long serialVersionUID = 1;
+
+		public UnderlyingFileNotFoundException(String message) {
+			super(message);
+		}
+		
+	}
 
 	public FlatComponentArchiver(IVirtualComponent aComponent, OutputStream out, List<IFlattenParticipant> fParticipants) {
 		participants = fParticipants;
@@ -238,7 +247,17 @@
 			
 			getZipOutputStream().putNextEntry(entry);
 			if (!isFolder) {
-				ArchiveUtil.copy((InputStream) f.getAdapter(InputStream.class), getZipOutputStream());
+				InputStream is = (InputStream) f.getAdapter(InputStream.class);
+				if (is == null){
+					File file = (File) f.getAdapter(File.class);
+					String msg = null;
+					if (file!= null)
+						msg = "Cannot find the file " + file.getAbsolutePath() + " in the file system. Make sure the file exists and try the operation again"; //$NON-NLS-1$ //$NON-NLS-2$
+					else
+						msg = "Cannot find the file " + f.getModuleRelativePath().append(f.getName()) + " in the file system. Make sure the file exists and try the operation again"; //$NON-NLS-1$ //$NON-NLS-2$
+					throw new UnderlyingFileNotFoundException(msg);
+				}
+				ArchiveUtil.copy(is, getZipOutputStream());
 			}
 			getZipOutputStream().closeEntry();
 		} catch (IOException e) {