138930 [refactor + jar export] refactoring info loss when jar-desc-file is created
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageReader.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageReader.java
index a4922c9..a319a8d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageReader.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageReader.java
@@ -11,6 +11,7 @@
 package org.eclipse.jdt.internal.ui.jarpackager;
 
 import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -25,6 +26,8 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
@@ -34,6 +37,12 @@
 
 import org.eclipse.jface.util.Assert;
 
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
+import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
+import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
+import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
+
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -155,9 +164,48 @@
 	}
 
 	private void xmlReadRefactoring(JarPackageData jarPackage, Element element) throws java.io.IOException {
-		if (element.getNodeName().equals("refactoring")) { //$NON-NLS-1$
+		if (element.getNodeName().equals("storedRefactorings")) { //$NON-NLS-1$
 			jarPackage.setExportStructuralOnly(getBooleanAttribute(element, "structuralOnly", jarPackage.isExportStructuralOnly())); //$NON-NLS-1$
 			jarPackage.setDeprecationAware(getBooleanAttribute(element, "deprecationInfo", jarPackage.isDeprecationAware())); //$NON-NLS-1$
+			List elements= new ArrayList();
+			int count= 1;
+			String value= element.getAttribute("project" + count); //$NON-NLS-1$
+			while (value != null && !"".equals(value)) { //$NON-NLS-1$
+				final IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(value);
+				if (project.exists())
+					elements.add(project);
+				count++;
+				value= element.getAttribute("project" + count); //$NON-NLS-1$
+			}
+			jarPackage.setRefactoringProjects((IProject[]) elements.toArray(new IProject[elements.size()]));
+			elements.clear();
+			count= 1;
+			IRefactoringHistoryService service= RefactoringCore.getHistoryService();
+			try {
+				service.connect();
+				value= element.getAttribute("refactoring" + count); //$NON-NLS-1$
+				while (value != null && !"".equals(value)) { //$NON-NLS-1$
+					final ByteArrayInputStream stream= new ByteArrayInputStream(value.getBytes("UTF-8")); //$NON-NLS-1$
+					try {
+						final RefactoringHistory history= service.readRefactoringHistory(stream, RefactoringDescriptor.NONE);
+						if (history != null) {
+							final RefactoringDescriptorProxy[] descriptors= history.getDescriptors();
+							if (descriptors.length > 0) {
+								for (int index= 0; index < descriptors.length; index++) {
+									elements.add(descriptors[index]);
+								}
+							}
+						}
+					} catch (CoreException exception) {
+						JavaPlugin.log(exception);
+					}
+					count++;
+					value= element.getAttribute("refactoring" + count); //$NON-NLS-1$
+				}
+			} finally {
+				service.disconnect();
+			}
+			jarPackage.setRefactoringDescriptors((RefactoringDescriptorProxy[]) elements.toArray(new RefactoringDescriptorProxy[elements.size()]));
 		}
 	}
 
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageWriter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageWriter.java
index 2b851c1..eb88a96 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageWriter.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/jarpackager/JarPackageWriter.java
@@ -11,8 +11,10 @@
 package org.eclipse.jdt.internal.ui.jarpackager;
 
 import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -28,10 +30,16 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 
 import org.eclipse.jface.util.Assert;
 
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
+import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
+import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
+
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IPackageFragment;
 
@@ -136,10 +144,36 @@
 	}
 
 	private void xmlWriteRefactoring(JarPackageData jarPackage, Document document, Element xmlJarDesc) throws DOMException {
-		Element refactoring= document.createElement("refactoring"); //$NON-NLS-1$
+		Element refactoring= document.createElement("storedRefactorings"); //$NON-NLS-1$
 		xmlJarDesc.appendChild(refactoring);
 		refactoring.setAttribute("structuralOnly", "" + jarPackage.isExportStructuralOnly()); //$NON-NLS-1$ //$NON-NLS-2$
 		refactoring.setAttribute("deprecationInfo", "" + jarPackage.isDeprecationAware()); //$NON-NLS-1$ //$NON-NLS-2$
+		final IProject[] projects= jarPackage.getRefactoringProjects();
+		if (projects != null && projects.length > 0) {
+			for (int index= 0; index < projects.length; index++)
+				refactoring.setAttribute("project" + (index + 1), projects[index].getName()); //$NON-NLS-1$
+		}
+		final RefactoringDescriptorProxy[] proxies= jarPackage.getRefactoringDescriptors();
+		if (proxies != null && proxies.length > 0) {
+			int count= 1;
+			IRefactoringHistoryService service= RefactoringCore.getHistoryService();
+			try {
+				service.connect();
+				for (int index= 0; index < proxies.length; index++, count++) {
+					try {
+						final ByteArrayOutputStream stream= new ByteArrayOutputStream();
+						service.writeRefactoringDescriptors(new RefactoringDescriptorProxy[] { proxies[index]}, stream, RefactoringDescriptor.NONE, true, null);
+						refactoring.setAttribute("refactoring" + count, stream.toString("UTF-8")); //$NON-NLS-1$ //$NON-NLS-2$
+					} catch (CoreException exception) {
+						JavaPlugin.log(exception);
+					} catch (UnsupportedEncodingException exception) {
+						Assert.isTrue(false);
+					}
+				}
+			} finally {
+				service.disconnect();
+			}
+		}
 	}
 
 	private void xmlWriteManifest(JarPackageData jarPackage, Document document, Element xmlJarDesc) throws DOMException {