]
Jeff MAURY updated JBIDE-18113:
-------------------------------
Fix Version/s: 4.5.x
(was: 4.5.0.AM1)
Wrong 'dirty regions' values passed to the
'as-you-type' validator
------------------------------------------------------------------
Key: JBIDE-18113
URL:
https://issues.jboss.org/browse/JBIDE-18113
Project: Tools (JBoss Tools)
Issue Type: Bug
Components: common
Affects Versions: 4.2.0.Beta3
Reporter: Xavier Coulon
Assignee: Victor Rubezhny
Fix For: 4.5.x
The as-you-type validator received an array of dirty regions that can be wrong when the
region contains a String.
Steps to reproduce:
- grab the latest changes in jbosstools-webservices repo
- start a runtime workbench
- create a new dynamic web project targeting Wildfly 8.x (the example below uses JAX-RS
2.0 APIs)
- add support for JAX-RS
- create a class with the following content:
{code}
package jaxrs;
import java.io.IOException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
@Path("/")
public class RestService {
@GET
@Path("/{ide}")
public Response get(@PathParam("ide") String id) {
System.out.println("Just passed in method");
return Response.ok().build();
}
@Provider
public static class AuthorizedResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext arg0,
ContainerResponseContext arg1) throws IOException {
System.out.println("Just passed in filter");
}
}
}
{code}
- In your development workspace, open
{{org.jboss.tools.ws.jaxrs.ui.internal.validation.JaxrsMetamodelValidator}} and put a
breakpoint on line 441
- Back in the runtime workspace, remove the @Provider annotation and see the value for
'dirtyRegion'. In my last test, this one alone looked good (offset=559)
- DO NOT SAVE THE FILE
- remove the @Path("/") annotation on the RestService type, this time you
should have *4* dirty regions, with unexpected values (ie, pointing at other locations in
the document).
As [~akazakov] commented in a private mail:
{quote}
JaxrsMetamodelValidator implements IJavaElementValidator and IStringValidator.
When you remove @Provider then you get the region with offset of the removed JavaElement
because you validator implements IJavaElementValidator.
This interface tells our validation manager that the validator is interested in
validating of changes in java elements.
When you remove @Path("/") you also remove a string ("/") and since
your validator implements IStringValidator this validator is notified and you got a list
of the regions of all the strings of the file: 4 regions in your case.
The problem is that you also should have been notified about removed java element because
this annotation is not just a String. It's also a java element. That looks like a bug
for me.
So if you remove any code with a string inside then you will get a list of strings of the
file (but only if you implements IStringValidator).
If you don't implement IStringValidator and remove any java element which contains a
string you won't be notified at all. This is a bug.
{quote}