Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 330708

Summary: Special characters in project names preclude adding facets.
Product: [WebTools] WTP Common Tools Reporter: bungeman
Component: wst.commonAssignee: wst.common <wst.common-inbox>
Status: NEW --- QA Contact: Carl Anderson <ccc>
Severity: normal    
Priority: P3 CC: thatnitind
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:

Description bungeman CLA 2010-11-19 15:23:55 EST
Build Identifier: I20100608-0911

org.eclipse.wst.common.project.facet.core.FacetedProjectFrameworkException: Failed while installing EAR 5.0.
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.callDelegate(FacetedProject.java:1508)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.modifyInternal(FacetedProject.java:442)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.mergeChangesInternal(FacetedProject.java:1182)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.access$2(FacetedProject.java:1118)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject$1.run(FacetedProject.java:325)
	at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1975)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.modify(FacetedProject.java:340)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.installProjectFacet(FacetedProject.java:256)
	at com.ibm.wbimonitor.deploy.base.EarProjectGenerator.createEAR(EarProjectGenerator.java:736)
	at com.ibm.wbimonitor.deploy.base.EarProjectGenerator.run(EarProjectGenerator.java:306)
	at com.ibm.wbimonitor.deploy.mmdeploy.MonitoringModelDeployOperation.generateCode(MonitoringModelDeployOperation.java:153)
	at com.ibm.wbimonitor.deploy.mmdeploy.MonitoringModelDeployOperation.run(MonitoringModelDeployOperation.java:75)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Caused by: java.lang.IllegalArgumentException: Path must include project and resource name: /StockTradeV3!@
	at org.eclipse.core.runtime.Assert.isLegal(Assert.java:63)
	at org.eclipse.core.internal.resources.Workspace.newResource(Workspace.java:1801)
	at org.eclipse.core.internal.resources.Container.getFile(Container.java:207)
	at org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper.getPlatformFile(WorkbenchResourceHelper.java:442)
	at org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper$FileAdapter.getFile(WorkbenchResourceHelper.java:177)
	at org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper.computeModificationStamp(WorkbenchResourceHelper.java:336)
	at org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper.cacheSynchronizationStamp(WorkbenchResourceHelper.java:326)
	at org.eclipse.wst.common.internal.emfworkbench.integration.ProjectResourceSetEditImpl.createResource(ProjectResourceSetEditImpl.java:51)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandCreateResource(ResourceSetImpl.java:239)
	at org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl.getResource(ProjectResourceSetImpl.java:742)
	at org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper.getOrCreateResource(WorkbenchResourceHelper.java:380)
	at org.eclipse.wst.common.internal.emfworkbench.integration.EditModel.getResource(EditModel.java:685)
	at org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel.getPrimaryResource(ModuleStructuralModel.java:332)
	at org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel.prepareProjectModulesIfNecessary(ModuleStructuralModel.java:240)
	at org.eclipse.wst.common.componentcore.internal.ModuleStructuralModel.getPrimaryRootObject(ModuleStructuralModel.java:119)
	at org.eclipse.wst.common.componentcore.internal.StructureEdit.getComponentModelRoot(StructureEdit.java:436)
	at org.eclipse.wst.common.componentcore.internal.StructureEdit.getWorkbenchModules(StructureEdit.java:471)
	at org.eclipse.wst.common.componentcore.internal.StructureEdit.getComponent(StructureEdit.java:914)
	at org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent.createResource(VirtualComponent.java:122)
	at org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent.initializeResource(VirtualComponent.java:111)
	at org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent.<init>(VirtualComponent.java:146)
	at org.eclipse.wst.common.componentcore.internal.util.ComponentImplManager.createComponent(ComponentImplManager.java:235)
	at org.eclipse.wst.common.componentcore.ComponentCore.createComponent(ComponentCore.java:84)
	at org.eclipse.jst.j2ee.project.facet.EarFacetInstallDelegate.execute(EarFacetInstallDelegate.java:59)
	at org.eclipse.wst.common.project.facet.core.internal.FacetedProject.callDelegate(FacetedProject.java:1478)
	... 12 more

The problem is at ModuleStructuralModel line 331.

URI uri = URI.createURI(compFile.getProjectRelativePath().toPortableString());

This line actually has two bugs. The first is the one which causes the issue seen here, that createURI assumes that the string being passed to it has already been escaped. Since no escaping is done here, the '#' in the project name is seen in the URI as the fragment indicator. The second bug is the use of toPortableString which states in its documentation that the format is not specified, but is only suitable for passing back to Path#fromProtableString(String). The usage here (to attempt some kind of URIifying) is incorrect. Its usage suggests that at some point issues were seen since the #getProjectRelativePath() call didn't return a URI, but the solution was incorrect. The call to #toPortableString() must be dropped and replaced with something that creates a valid URI.


This can be reproduced every time by an RCP application which reads in a customer supplied project archive which contains some specifications from which an EAR ad EJB project are generated and exported. Should the EAR project contain a '#' then the above is observed. It appears to simply be the mishandling of converting file names to URIs.

Reproducible: Always

Steps to Reproduce:
1. Create a project with '#' or other special characters (':' will probably work sometimes too).
2. Try to add facets.
3. Observe stack traces.
Comment 1 bungeman CLA 2010-11-19 15:28:19 EST
org.eclipse.wst.common.modulecore 1.2.2.v201007310300