# HG changeset patch # User Eugene Ostroukhov # Date 1275933023 25200 # Node ID 4cd68ab4c1f220f72334c7a716f03f8e551edb24 # Parent 6c48d84d3490c63d8cc5939092ddfbc7c532895f Bug 2534 - Project rename isn't complete diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/http/WorkspaceResourcesServlet.java --- a/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/http/WorkspaceResourcesServlet.java Fri Jun 04 16:25:50 2010 -0700 +++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/http/WorkspaceResourcesServlet.java Mon Jun 07 10:50:23 2010 -0700 @@ -242,10 +242,8 @@ if (stream != null) { copyData(stream, resp.getOutputStream()); } else { - PreviewerPlugin.log(String.format("Resource %s was not found", req.getPathInfo()), null); resp.setStatus(HttpServletResponse.SC_NOT_FOUND); } - } catch (PreviewerException e) { PreviewerPlugin.log(e); throw new ServletException(e); diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/AbstractPreviewPage.java --- a/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/AbstractPreviewPage.java Fri Jun 04 16:25:50 2010 -0700 +++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/AbstractPreviewPage.java Mon Jun 07 10:50:23 2010 -0700 @@ -217,12 +217,14 @@ } public synchronized void projectRenamed(IPath newPath) { - project = ResourcesPlugin.getWorkspace().getRoot().getProject(newPath.lastSegment()); - asyncExec(new Runnable() { - public void run() { - browser.dispose(); - addBrowser(); - } - }); + if (!isDisposed()) { + project = ResourcesPlugin.getWorkspace().getRoot().getProject(newPath.lastSegment()); + asyncExec(new Runnable() { + public void run() { + browser.dispose(); + addBrowser(); + } + }); + } } } diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/PreviewView.java --- a/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/PreviewView.java Fri Jun 04 16:25:50 2010 -0700 +++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/PreviewView.java Mon Jun 07 10:50:23 2010 -0700 @@ -10,8 +10,8 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; -import java.util.Map.Entry; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -261,10 +261,12 @@ public synchronized void projectRenamed(IProject project, IPath newPath) { IPreviewPage page = projectToPage.remove(project); - Boolean refresh = autorefresh.remove(project); - page.projectRenamed(newPath); - projectToPage.put(page.getProject(), page); - autorefresh.put(page.getProject(), refresh); + if (page != null) { + Boolean refresh = autorefresh.remove(project); + page.projectRenamed(newPath); + projectToPage.put(page.getProject(), page); + autorefresh.put(page.getProject(), refresh); + } } } diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools/META-INF/MANIFEST.MF --- a/org.symbian.tools.wrttools/META-INF/MANIFEST.MF Fri Jun 04 16:25:50 2010 -0700 +++ b/org.symbian.tools.wrttools/META-INF/MANIFEST.MF Mon Jun 07 10:50:23 2010 -0700 @@ -24,7 +24,8 @@ org.eclipse.ui.navigator.resources;bundle-version="3.4.0", org.w3c.css;bundle-version="1.0.0", org.eclipse.core.expressions;bundle-version="3.4.101", - org.eclipse.wst.xml.ui;bundle-version="1.1.2" + org.eclipse.wst.xml.ui;bundle-version="1.1.2", + org.eclipse.ltk.core.refactoring Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6 Bundle-ActivationPolicy: lazy diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools/plugin.xml --- a/org.symbian.tools.wrttools/plugin.xml Fri Jun 04 16:25:50 2010 -0700 +++ b/org.symbian.tools.wrttools/plugin.xml Mon Jun 07 10:50:23 2010 -0700 @@ -883,5 +883,27 @@ + + + + + + + + + + + + + + + + + diff -r 6c48d84d3490 -r 4cd68ab4c1f2 org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/project/ProjectRenameParticipant.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/project/ProjectRenameParticipant.java Mon Jun 07 10:50:23 2010 -0700 @@ -0,0 +1,174 @@ +/** + * Copyright (c) 2010 Symbian Foundation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Symbian Foundation - initial contribution. + * Contributors: + * Description: + * Overview: + * Details: + * Platforms/Drives/Compatibility: + * Assumptions/Requirement/Pre-requisites: + * Failures and causes: + */ +package org.symbian.tools.wrttools.core.project; + +import java.io.IOException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.ltk.core.refactoring.Change; +import org.eclipse.ltk.core.refactoring.RefactoringStatus; +import org.eclipse.ltk.core.refactoring.TextFileChange; +import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; +import org.eclipse.ltk.core.refactoring.participants.RenameParticipant; +import org.eclipse.text.edits.MultiTextEdit; +import org.eclipse.text.edits.ReplaceEdit; +import org.eclipse.text.edits.TextEdit; +import org.eclipse.wst.sse.core.StructuredModelManager; +import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; +import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; +import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; +import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText; +import org.symbian.tools.wrttools.Activator; +import org.symbian.tools.wrttools.util.CoreUtil; +import org.symbian.tools.wrttools.util.ProjectUtils; +import org.symbian.tools.wrttools.util.Util; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +@SuppressWarnings("restriction") +public class ProjectRenameParticipant extends RenameParticipant { + private IProject project; + + @Override + protected boolean initialize(Object element) { + if (element instanceof IProject && (ProjectUtils.hasWrtNature((IProject) element))) { + project = (IProject) element; + return true; + } + return false; + } + + @Override + public String getName() { + return "Mobile Web Project Rename Participant"; + } + + @Override + public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) + throws OperationCanceledException { + return null; + } + + @Override + public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { + final IFile file = project.getFile(CoreUtil.METADATA_FILE); + if (file.isAccessible()) { + IStructuredModel model = null; + try { + model = StructuredModelManager.getModelManager().getModelForRead(file); + if (model != null) { + final TextEdit change = getAttributesChange(model); + if (change != null) { + IFile newFile = ResourcesPlugin.getWorkspace().getRoot() + .getFile(new Path(getArguments().getNewName()).append(file.getProjectRelativePath())); + TextFileChange fileChange = new TextFileChange("Rename application", newFile); + fileChange.setEdit(change); + return fileChange; + } else { + return null; + } + } + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Cannot rename project", e)); + } finally { + if (model != null) { + model.releaseFromRead(); + } + } + } + return null; + } + + private TextEdit getAttributesChange(IStructuredModel model) { + MultiTextEdit edit = new MultiTextEdit(); + IDOMDocument document = ((IDOMModel) model).getDocument(); + Element element = document.getDocumentElement(); + if (element != null) { + NodeList dict = element.getElementsByTagName("dict"); + if (dict.getLength() == 1) { + NodeList children = dict.item(0).getChildNodes(); + for (int i = 0; i < children.getLength() - 2; i++) { // Note - we only care about name-value pairs, so we do not to iterate to last element. Also remember there's text node between elements + final String key = getKey(children.item(i)); + if ("DisplayName".equals(key)) { + final IDOMText text = getTextNode(children.item(i + 2)); + if (text != null) { + final String val = text.getNodeValue(); + if (val.trim().equals(project.getName())) { + edit.addChild(new ReplaceEdit(text.getStartOffset() + val.indexOf(project.getName()), + project.getName().length(), getArguments().getNewName())); + } + } + } else if ("Identifier".equals(key)) { + final IDOMText text = getTextNode(children.item(i + 2)); + if (text != null) { + final String val = text.getNodeValue(); + final String idPart = Util.removeSpaces(project.getName()); + int offset = val.indexOf(idPart); + if (offset >= 0) { + edit.addChild(new ReplaceEdit(text.getStartOffset() + offset, idPart.length(), Util + .removeSpaces(getArguments().getNewName()))); + } + } + } + } + } + } + return edit.getChildrenSize() > 0 ? edit : null; + } + + private IDOMText getTextNode(final Node value) { + if (value.getNodeType() == Node.ELEMENT_NODE && "string".equals(value.getNodeName())) { + NodeList childNodes = value.getChildNodes(); + if (childNodes.getLength() == 1 && childNodes.item(0).getNodeType() == Node.TEXT_NODE) { + return (IDOMText) childNodes.item(0); + } + } + return null; + } + + private String getKey(final Node node) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + if ("key".equals(node.getNodeName())) { + return getNodeValue(node); + } + } + return null; + } + + private String getNodeValue(final Node node) { + final NodeList childNodes = node.getChildNodes(); + if (childNodes.getLength() == 1) { + final Node contents = childNodes.item(0); + if (contents.getNodeType() == Node.TEXT_NODE) { + return contents.getNodeValue().trim(); + } + } + return null; + } + +}