Author: dgeraskov
Date: 2008-02-12 07:25:50 -0500 (Tue, 12 Feb 2008)
New Revision: 6255
Modified:
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/HibernateRefactoringUtil.java
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/MoveResourceParticipant.java
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/RenameResourceParticipant.java
Log:
http://jira.jboss.com/jira/browse/JBIDE-1558
classpath changes updates
Modified:
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/HibernateRefactoringUtil.java
===================================================================
---
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/HibernateRefactoringUtil.java 2008-02-12
11:21:46 UTC (rev 6254)
+++
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/HibernateRefactoringUtil.java 2008-02-12
12:25:50 UTC (rev 6255)
@@ -10,21 +10,32 @@
******************************************************************************/
package org.hibernate.eclipse.launch.core.refactoring;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.launching.JavaMigrationDelegate;
-import org.eclipse.jdt.internal.launching.RuntimeClasspathEntry;
+import org.eclipse.jdt.internal.launching.LaunchingPlugin;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.JavaRuntime;
@@ -32,7 +43,15 @@
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.launch.HibernateLaunchConstants;
+import org.hibernate.eclipse.launch.ICodeGenerationLaunchConstants;
import org.hibernate.eclipse.launch.IConsoleConfigurationLaunchConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
/**
* @author Dmitry Geraskov
@@ -42,7 +61,7 @@
private static final String ERROR_MESS = "Error during refactoring";
- private static String[] stringAttribs = new String[]{
+ private static String[] pathKeys = new String[]{
IConsoleConfigurationLaunchConstants.CFG_XML_FILE,
IConsoleConfigurationLaunchConstants.PROPERTY_FILE,
HibernateLaunchConstants.ATTR_TEMPLATE_DIR,
@@ -50,50 +69,62 @@
HibernateLaunchConstants.ATTR_REVERSE_ENGINEER_SETTINGS,
};
- private static String[] strListAttribs = new String[]{
+ private static String[] pathListKeys = new String[]{
IConsoleConfigurationLaunchConstants.FILE_MAPPINGS,
};
- public static boolean isConfigurationChanged(ILaunchConfiguration config, IPath oldPath)
throws CoreException{
+ public static boolean isConfigurationAffected(ILaunchConfiguration config, IPath
oldPath) throws CoreException{
+ return isAttributesAffected(config, oldPath) || isClassPathAffected(config, oldPath);
+ }
+
+ private static boolean isAttributesAffected(ILaunchConfiguration config, IPath oldPath)
throws CoreException{
String attrib = null;
- for (int i = 0; i < stringAttribs.length; i++) {
- attrib = config.getAttribute(stringAttribs[i], (String)null);
+ for (int i = 0; i < pathKeys.length; i++) {
+ attrib = config.getAttribute(pathKeys[i], (String)null);
if (isAttributeChanged(attrib, oldPath))
return true;
}
- for (int i = 0; i < strListAttribs.length; i++) {
- List list = config.getAttribute(strListAttribs[i], Collections.EMPTY_LIST);
- List newMappings = new ArrayList();
- Iterator iter = list.iterator();
+ for (int i = 0; i < pathListKeys.length; i++) {
+ List<String> list = config.getAttribute(pathListKeys[i],
Collections.EMPTY_LIST);
+ List<String> newMappings = new ArrayList<String>();
+ Iterator<String> iter = list.iterator();
while ( iter.hasNext() ) {
- attrib = (String) iter.next();
+ attrib = iter.next();
if (isAttributeChanged(attrib, oldPath)){
return true;
}
newMappings.add(attrib);
}
}
-
- //classpath
+ return false;
+ }
+
+ private static boolean isClassPathAffected(ILaunchConfiguration config, IPath oldPath)
throws CoreException{
IRuntimeClasspathEntry[] entries;
try {
entries = JavaRuntime.computeUnresolvedRuntimeClasspath(config);
- for (int i = 0; i < entries.length; i++) {
- IRuntimeClasspathEntry entry = entries[i];
- if(entry.getClasspathProperty()==IRuntimeClasspathEntry.USER_CLASSES) {
- attrib = entry.getPath() == null ? null
- : entry.getPath().toString();
- if(isAttributeChanged(attrib, oldPath)){
- return true;
- }
- }
- }
+ return isRuntimeClassPathEntriesAffected(entries, oldPath);
}
catch (CoreException e) {
HibernateConsolePlugin.getDefault().log( e );
+ return false;
+ }
+ }
+
+ public static boolean isRuntimeClassPathEntriesAffected(IRuntimeClasspathEntry[]
entries, IPath oldPath){
+ String attrib = null;
+ String projName = null;
+ for (int i = 0; i < entries.length; i++) {
+ IRuntimeClasspathEntry entry = entries[i];
+ attrib = entry.getPath() == null ? null
+ : entry.getPath().toString();
+ projName = entry.getJavaProject() == null ? null
+ : entry.getJavaProject().getElementName();
+ if(isAttributeChanged(attrib, oldPath) || isAttributeChanged(projName, oldPath)){
+ return true;
+ }
}
-
return false;
}
@@ -104,81 +135,181 @@
public static ILaunchConfiguration updateLaunchConfig(ILaunchConfiguration config, IPath
oldPath, IPath newPath) throws CoreException{
final ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
+ updateAttributes(oldPath, newPath, wc);
+ //classpath
+ try {
+ updateClasspathEntries(config, oldPath, newPath, wc);
+ }
+ catch (CoreException e) {
+ HibernateConsolePlugin.getDefault().log( e );
+ }
+
+ //JavaMigrationDelegate.updateResourceMapping(wc);
+ if (wc.isDirty()) {
+ return wc.doSave();
+ } else {
+ return config;
+ }
+ }
+
+ private static void updateClasspathEntries(ILaunchConfiguration config,
+ IPath oldPath, IPath newPath,
+ final ILaunchConfigurationWorkingCopy wc)
+ throws CoreException {
+ boolean isChanged = false;
+ String attrib;
+ String projName;
+ IRuntimeClasspathEntry[] entries =
JavaRuntime.computeUnresolvedRuntimeClasspath(config);
+ List<String> oldMementos =
config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
Collections.EMPTY_LIST);
+ List<String> newMementos = new ArrayList<String>(entries.length);
+ for (int i = 0; i < entries.length; i++) {
+ IRuntimeClasspathEntry entry = entries[i];
+ attrib = entry.getPath() == null ? null
+ : entry.getPath().toString();
+ projName = entry.getJavaProject() == null ? null
+ : entry.getJavaProject().getElementName();
+ if(isAttributeChanged(attrib, oldPath)){
+ isChanged = true;
+ String memento = getUpdatedMemento(oldMementos.get(i), new
Path(getUpdatedPath(attrib, oldPath, newPath)), oldPath);
+ newMementos.add(memento);
+ } else if(isAttributeChanged(projName, oldPath)){
+ isChanged = true;
+ String memento = getUpdatedMemento(oldMementos.get(i), newPath, oldPath);
+ newMementos.add(memento);
+ } else {
+ newMementos.add(entries[i].getMemento());
+ }
+ }
+ if (isChanged) wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
newMementos);
+ }
+
+ public static String getUpdatedMemento(String memento, IPath newPath, IPath oldPath)
throws CoreException{
+ String error_mess = "Error occured while updating classpath.";
+ DocumentBuilder builder;
+ try {
+ builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document doc = builder.parse(new InputSource(new StringReader(memento)));
+ DOMSource domSource = new DOMSource(doc);
+ StringWriter writer = new StringWriter();
+ StreamResult result = new StreamResult(writer);
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer = tf.newTransformer();
+ transformer.transform(domSource, result);
+
+ org.w3c.dom.NodeList nodeList =
doc.getElementsByTagName("runtimeClasspathEntry");
+
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ org.w3c.dom.Node node = nodeList.item(i);
+ NamedNodeMap map = node.getAttributes();
+ Node changedNode = null;
+ //if (entry instanceof RuntimeClasspathEntry){
+ String[] attrNames = new String[]{"projectName",
"externalArchive", "internalArchive",
+ "containerPath", "javaProject"};
+ for (int j = 0; j < attrNames.length; j++) {
+ changedNode = map.getNamedItem(attrNames[j]);
+ if (changedNode != null){
+ Path attrPath = new Path(changedNode.getNodeValue());
+ if (oldPath.isPrefixOf(attrPath)){
+ if (attrNames[j].equals("projectName") ||
attrNames[j].equals("javaProject")){
+ changedNode.setNodeValue(newPath.lastSegment());
+ } else {
+ changedNode.setNodeValue(getUpdatedPath(changedNode.getNodeValue(), oldPath,
newPath).toString());
+ }
+ }
+ }
+ }
+ //} else if (entry instanceof DefaultProjectClasspathEntry){
+ if (node.getNodeType() == Node.ELEMENT_NODE)
+ {
+ Element element = (Element) node;
+ NodeList mementoList = element.getElementsByTagName("memento");
+ for(int j=0; j < mementoList.getLength(); j++)
+ {
+ map = mementoList.item(j).getAttributes();
+ changedNode = map.getNamedItem("project");
+ if (changedNode != null){
+ Path attrPath = new Path(changedNode.getNodeValue());
+ if (oldPath.isPrefixOf(attrPath)){
+ changedNode.setNodeValue(newPath.lastSegment());
+ }
+ }
+ }
+ }
+ }
+ //}
+ domSource = new DOMSource(doc);
+ /*writer = new StringWriter();
+ result = new StreamResult(writer);
+ tf = TransformerFactory.newInstance();
+ transformer = tf.newTransformer();
+ transformer.transform(domSource, result);
+ return writer.toString();*/
+ String newMemento = LaunchingPlugin.serializeDocument(doc);
+ return newMemento;
+ } catch (ParserConfigurationException e) {
+ IStatus status = new Status(IStatus.ERROR, HibernateConsolePlugin.ID, error_mess, e);
+ throw new CoreException(status);
+ } catch (SAXException e) {
+ IStatus status = new Status(IStatus.ERROR, HibernateConsolePlugin.ID, error_mess, e);
+ throw new CoreException(status);
+ } catch (IOException e) {
+ IStatus status = new Status(IStatus.ERROR, HibernateConsolePlugin.ID, error_mess, e);
+ throw new CoreException(status);
+ } catch (TransformerException e) {
+ IStatus status = new Status(IStatus.ERROR, HibernateConsolePlugin.ID, error_mess, e);
+ throw new CoreException(status);
+ }
+ }
+
+ /*public static IRuntimeClasspathEntry getUpdatedEntry(IPath oldPath,
+ IPath newPath, IRuntimeClasspathEntry entry) {
+ String attrib = getUpdatedPath(entry.getPath().toString(), oldPath, newPath);
+ IPath p = new Path(attrib).makeAbsolute();
+
+ switch (entry.getClasspathEntry().getEntryKind()) {
+ case IClasspathEntry.CPE_PROJECT:
+ entry = new RuntimeClasspathEntry( JavaCore.newProjectEntry(p));
+ break;
+ default:
+ entry = JavaRuntime.newArchiveRuntimeClasspathEntry(p);
+ break;
+ }
+ return entry;
+ }*/
+
+ private static void updateAttributes(IPath oldPath, IPath newPath,
+ final ILaunchConfigurationWorkingCopy wc) throws CoreException {
String attrib = null;
- for (int i = 0; i < stringAttribs.length; i++) {
- attrib = wc.getAttribute(stringAttribs[i], (String)null);
+ for (int i = 0; i < pathKeys.length; i++) {
+ attrib = wc.getAttribute(pathKeys[i], (String)null);
if (isAttributeChanged(attrib, oldPath)){
attrib = getUpdatedPath(attrib, oldPath, newPath);
- wc.setAttribute(stringAttribs[i], attrib);
+ wc.setAttribute(pathKeys[i], attrib);
}
}
boolean isChanged = false;
- for (int i = 0; i < strListAttribs.length; i++) {
- List list = wc.getAttribute(strListAttribs[i], Collections.EMPTY_LIST);
+ for (int i = 0; i < pathListKeys.length; i++) {
+ List<String> list = wc.getAttribute(pathListKeys[i], Collections.EMPTY_LIST);
isChanged = false;
- List newMappings = new ArrayList();
- Iterator iter = list.iterator();
+ List<String> newMappings = new ArrayList<String>();
+ Iterator<String> iter = list.iterator();
while ( iter.hasNext() ) {
- attrib = (String) iter.next();
+ attrib = iter.next();
if (isAttributeChanged(attrib, oldPath)){
attrib = getUpdatedPath(attrib, oldPath, newPath);
isChanged = true;
}
newMappings.add(attrib);
}
- if (isChanged) wc.setAttribute(strListAttribs[i], newMappings);
+ if (isChanged) wc.setAttribute(pathListKeys[i], newMappings);
}
-
- //classpath
- isChanged = false;
- IRuntimeClasspathEntry[] entries;
- try {
- entries = JavaRuntime.computeUnresolvedRuntimeClasspath(config);
- List mementos = new ArrayList(entries.length);
- for (int i = 0; i < entries.length; i++) {
- IRuntimeClasspathEntry entry = entries[i];
- if(entry.getClasspathProperty()==IRuntimeClasspathEntry.USER_CLASSES) {
- attrib = entry.getPath() == null ? null
- : entry.getPath().toString();
- if(isAttributeChanged(attrib, oldPath)){
- attrib = getUpdatedPath(attrib, oldPath, newPath);
- IPath p = new Path(attrib).makeAbsolute();
-
- switch (entry.getClasspathEntry().getEntryKind()) {
- case IClasspathEntry.CPE_PROJECT:
- entry = new RuntimeClasspathEntry( JavaCore.newProjectEntry(p));
- break;
- default:
- entry = JavaRuntime.newArchiveRuntimeClasspathEntry(p);
- break;
- }
-
- entries[i] = entry;
- isChanged = true;
- }
- }
- mementos.add(entries[i].getMemento());
- }
- if (isChanged) wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
mementos);
- }
- catch (CoreException e) {
- HibernateConsolePlugin.getDefault().log( e );
- }
-
- //JavaMigrationDelegate.updateResourceMapping(wc);
-
- if (wc.isDirty()) {
- return wc.doSave();
- } else {
- return config;
- }
}
private static String getUpdatedPath(String attrib, IPath oldPath, IPath newPath){
IPath attribPath = new Path(attrib);
- IPath newAttribPath = Path.EMPTY;
+ IPath newAttribPath = new Path("/");
for (int j = 0; j < attribPath.segmentCount(); j++){
if (!oldPath.isPrefixOf(attribPath.removeFirstSegments(j))){
//add prefix
@@ -190,19 +321,19 @@
break;
}
}
- return newAttribPath.toString();
+ return newAttribPath.toOSString();
}
- public static ILaunchConfiguration[] getChangedLaunchConfigurations(IPath path){
+ public static ILaunchConfiguration[] getAffectedLaunchConfigurations(IPath path){
ILaunchConfiguration[] configs = null;
try {
configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
- ArrayList list = new ArrayList();
- for(int i = 0; i < configs.length; i++) {
- //ILaunchConfigurationWorkingCopy wc = configs[i].getWorkingCopy();
- if (HibernateRefactoringUtil.isConfigurationChanged(configs[i], path))
list.add(configs[i]);
+ List<ILaunchConfiguration> list = new ArrayList<ILaunchConfiguration>();
+ for(int i = 0; i < configs.length; i++) {//refactor only hibernate launch
configurations
+ if
(!ICodeGenerationLaunchConstants.CONSOLE_CONFIGURATION_LAUNCH_TYPE_ID.equals(configs[i].getType().getIdentifier()))
continue;
+ if (HibernateRefactoringUtil.isConfigurationAffected(configs[i], path))
list.add(configs[i]);
}
- configs = (ILaunchConfiguration[])list.toArray(new
ILaunchConfiguration[list.size()]);
+ configs = list.toArray(new ILaunchConfiguration[list.size()]);
}
catch(CoreException e) {
configs = new ILaunchConfiguration[0];
@@ -216,7 +347,7 @@
* @param changes - List of Change objects
* @return
*/
- public static Change createChangesFromList(List changes, String name) {
+ public static Change createChangesFromList(List<Change> changes, String name) {
if (changes.size() == 0) {
return null;
} else if (changes.size() == 1) {
Modified:
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/MoveResourceParticipant.java
===================================================================
---
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/MoveResourceParticipant.java 2008-02-12
11:21:46 UTC (rev 6254)
+++
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/MoveResourceParticipant.java 2008-02-12
12:25:50 UTC (rev 6255)
@@ -24,9 +24,9 @@
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
- ILaunchConfiguration[] configs =
HibernateRefactoringUtil.getChangedLaunchConfigurations(fResource.getFullPath());
+ ILaunchConfiguration[] configs =
HibernateRefactoringUtil.getAffectedLaunchConfigurations(fResource.getFullPath());
- List changes = new ArrayList();
+ List<Change> changes = new ArrayList<Change>();
LaunchConfigurationResourceNameChange change = null;
for (int i= 0; i < configs.length; i++) {
change = new LaunchConfigurationResourceNameChange(configs[i],
fResource.getFullPath(),
((IResource)getArguments().getDestination()).getFullPath().append(fResource.getName()));
Modified:
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/RenameResourceParticipant.java
===================================================================
---
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/RenameResourceParticipant.java 2008-02-12
11:21:46 UTC (rev 6254)
+++
trunk/hibernatetools/plugins/org.hibernate.eclipse.console/src/org/hibernate/eclipse/launch/core/refactoring/RenameResourceParticipant.java 2008-02-12
12:25:50 UTC (rev 6255)
@@ -44,9 +44,9 @@
*/
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
- ILaunchConfiguration[] configs =
HibernateRefactoringUtil.getChangedLaunchConfigurations(fResource.getFullPath());
+ ILaunchConfiguration[] configs =
HibernateRefactoringUtil.getAffectedLaunchConfigurations(fResource.getFullPath());
- List changes = new ArrayList();
+ List<Change> changes = new ArrayList<Change>();
LaunchConfigurationResourceNameChange change = null;
for (int i= 0; i < configs.length; i++) {
change = new LaunchConfigurationResourceNameChange(configs[i],
fResource.getFullPath(),