baffled with web api

Hi Morten

I am struggling to grasp something (well actually to do something)
which I thought would be fairly simple, and probably even is if only I
knew how ...

It has to do with where you have been clever with the
AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets
formatted in html. And using either the extension (.xml or .json) or
accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure
of the datasets (lets call it as data structure definition or DSD).
Is there any way to map a request which uses either an extension (eg
dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT
get routed through the getObjectList method of AbstractCrudController?

Bob

Hi Bob

This should be as easy as adding another method… we already have getObjectList (I think thats the name… ) in our ABC. What you will need to do, is to add another method in DataSetController, maybe call it getDataSetsDSD (or something similar). And have a request-mapping that points to both dataSets and dataSets.dsd, this together with the consumed = mimetype option, should give you a unique combination (spring mvc will complain if two requestmappings point to the same method)

Try it… if its not working, I will try and add it for you

···


Morten

On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe bobjolliffe@gmail.com wrote:

Hi Morten

I am struggling to grasp something (well actually to do something)

which I thought would be fairly simple, and probably even is if only I

knew how …

It has to do with where you have been clever with the

AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets

formatted in html. And using either the extension (.xml or .json) or

accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure

of the datasets (lets call it as data structure definition or DSD).

Is there any way to map a request which uses either an extension (eg

dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT

get routed through the getObjectList method of AbstractCrudController?

Bob

Sorry, that’s consumes not consumed.

···


Morten

On Sun, Oct 28, 2012 at 2:18 PM, Morten Olav Hansen mortenoh@gmail.com wrote:

consumed

Hi Morten

Hi Bob

This should be as easy as adding another method.. we already have
getObjectList (I think thats the name.. ) in our ABC. What you will need to
do, is to add another method in DataSetController, maybe call it
getDataSetsDSD (or something similar). And have a request-mapping that
points to both dataSets and dataSets.dsd, this together with the consumed =
mimetype option, should give you a unique combination (spring mvc will
complain if two requestmappings point to the same method)

This is all what I figured. Estimated 2 hours work and 2 days later
:slight_smile: So I have a method in DataSetController with a signature like:

@RequestMapping( value = DataSetController.RESOURCE_PATH + ".dsd",
produces = "application/dsd+xml" )
    public void getStructure( @RequestParam Map<String, String>
parameters, HttpServletResponse response )

Which is I think like you say (other than produces rather than
consumes). But all I get is the "Aw snap" page with nothing in the
logs whatsoever which makes this really difficult to debug. (I don't
know if you have any tips for efficient debugging, but currently my
edit-compile-test cycle is also very unfriendly, going into many
minutes).

I *think* (and I feel I am no expert on this), that the getObjectList
in abstract controller is catching ALL get requests to dataSets. I
had originally thought that providing a more precise match to the
request in the dataSets class would trump the more general match in
the abstract controller (you will recognize xslt as having dominated
my thinking on this matching business). Anyway it looks like it
doesn't work like this. If two controller methods are an ambiguous
match, spring seems to just go pop.

Thats ok, but if it is the case, then either we would have to make
specific exclusions to the abstract controller match (which could get
ugly as it is used for much more than datasets), or move back away
from /api/dataSets to something like /api/dsd.

Can you confirm that I am reading this correctly.

Bob

···

On 28 October 2012 13:18, Morten Olav Hansen <mortenoh@gmail.com> wrote:

Try it... if its not working, I will try and add it for you

--
Morten

On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe <bobjolliffe@gmail.com> wrote:

Hi Morten

I am struggling to grasp something (well actually to do something)
which I thought would be fairly simple, and probably even is if only I
knew how ...

It has to do with where you have been clever with the
AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets
formatted in html. And using either the extension (.xml or .json) or
accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure
of the datasets (lets call it as data structure definition or DSD).
Is there any way to map a request which uses either an extension (eg
dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT
get routed through the getObjectList method of AbstractCrudController?

Bob

Hi Bob, it should be possible to define a more specific mapping in the
concrete controller class. To see the stack trace in the log you can
start any single web-module with mvn clean jetty:run . Your build
cycle is then to run mvn install on the dhis-web-api module, then mvn
clean jetty:run on e.g. dhis-web-reporting module.

Lars

···

On Sun, Oct 28, 2012 at 10:43 PM, Bob Jolliffe <bobjolliffe@gmail.com> wrote:

Hi Morten

On 28 October 2012 13:18, Morten Olav Hansen <mortenoh@gmail.com> wrote:

Hi Bob

This should be as easy as adding another method.. we already have
getObjectList (I think thats the name.. ) in our ABC. What you will need to
do, is to add another method in DataSetController, maybe call it
getDataSetsDSD (or something similar). And have a request-mapping that
points to both dataSets and dataSets.dsd, this together with the consumed =
mimetype option, should give you a unique combination (spring mvc will
complain if two requestmappings point to the same method)

This is all what I figured. Estimated 2 hours work and 2 days later
:slight_smile: So I have a method in DataSetController with a signature like:

@RequestMapping( value = DataSetController.RESOURCE_PATH + ".dsd",
produces = "application/dsd+xml" )
    public void getStructure( @RequestParam Map<String, String>
parameters, HttpServletResponse response )

Which is I think like you say (other than produces rather than
consumes). But all I get is the "Aw snap" page with nothing in the
logs whatsoever which makes this really difficult to debug. (I don't
know if you have any tips for efficient debugging, but currently my
edit-compile-test cycle is also very unfriendly, going into many
minutes).

I *think* (and I feel I am no expert on this), that the getObjectList
in abstract controller is catching ALL get requests to dataSets. I
had originally thought that providing a more precise match to the
request in the dataSets class would trump the more general match in
the abstract controller (you will recognize xslt as having dominated
my thinking on this matching business). Anyway it looks like it
doesn't work like this. If two controller methods are an ambiguous
match, spring seems to just go pop.

Thats ok, but if it is the case, then either we would have to make
specific exclusions to the abstract controller match (which could get
ugly as it is used for much more than datasets), or move back away
from /api/dataSets to something like /api/dsd.

Can you confirm that I am reading this correctly.

Bob

Try it... if its not working, I will try and add it for you

--
Morten

On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe <bobjolliffe@gmail.com> wrote:

Hi Morten

I am struggling to grasp something (well actually to do something)
which I thought would be fairly simple, and probably even is if only I
knew how ...

It has to do with where you have been clever with the
AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets
formatted in html. And using either the extension (.xml or .json) or
accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure
of the datasets (lets call it as data structure definition or DSD).
Is there any way to map a request which uses either an extension (eg
dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT
get routed through the getObjectList method of AbstractCrudController?

Bob

_______________________________________________
Mailing list: DHIS 2 developers in Launchpad
Post to : dhis2-devs@lists.launchpad.net
Unsubscribe : DHIS 2 developers in Launchpad
More help : ListHelp - Launchpad Help

I have sent him a fix for this…

···


Morten

On Mon, Oct 29, 2012 at 11:43 AM, Lars Helge Øverland larshelge@gmail.com wrote:

Hi Bob, it should be possible to define a more specific mapping in the

concrete controller class. To see the stack trace in the log you can

start any single web-module with mvn clean jetty:run . Your build

cycle is then to run mvn install on the dhis-web-api module, then mvn

clean jetty:run on e.g. dhis-web-reporting module.

Lars

On Sun, Oct 28, 2012 at 10:43 PM, Bob Jolliffe bobjolliffe@gmail.com wrote:

Hi Morten

On 28 October 2012 13:18, Morten Olav Hansen mortenoh@gmail.com wrote:

Hi Bob

This should be as easy as adding another method… we already have

getObjectList (I think thats the name… ) in our ABC. What you will need to

do, is to add another method in DataSetController, maybe call it

getDataSetsDSD (or something similar). And have a request-mapping that

points to both dataSets and dataSets.dsd, this together with the consumed =

mimetype option, should give you a unique combination (spring mvc will

complain if two requestmappings point to the same method)

This is all what I figured. Estimated 2 hours work and 2 days later

:slight_smile: So I have a method in DataSetController with a signature like:

@RequestMapping( value = DataSetController.RESOURCE_PATH + “.dsd”,

produces = “application/dsd+xml” )

public void getStructure( @RequestParam Map<String, String>

parameters, HttpServletResponse response )

Which is I think like you say (other than produces rather than

consumes). But all I get is the “Aw snap” page with nothing in the

logs whatsoever which makes this really difficult to debug. (I don’t

know if you have any tips for efficient debugging, but currently my

edit-compile-test cycle is also very unfriendly, going into many

minutes).

I think (and I feel I am no expert on this), that the getObjectList

in abstract controller is catching ALL get requests to dataSets. I

had originally thought that providing a more precise match to the

request in the dataSets class would trump the more general match in

the abstract controller (you will recognize xslt as having dominated

my thinking on this matching business). Anyway it looks like it

doesn’t work like this. If two controller methods are an ambiguous

match, spring seems to just go pop.

Thats ok, but if it is the case, then either we would have to make

specific exclusions to the abstract controller match (which could get

ugly as it is used for much more than datasets), or move back away

from /api/dataSets to something like /api/dsd.

Can you confirm that I am reading this correctly.

Bob

Try it… if its not working, I will try and add it for you

Morten

On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe bobjolliffe@gmail.com wrote:

Hi Morten

I am struggling to grasp something (well actually to do something)

which I thought would be fairly simple, and probably even is if only I

knew how …

It has to do with where you have been clever with the

AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets

formatted in html. And using either the extension (.xml or .json) or

accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure

of the datasets (lets call it as data structure definition or DSD).

Is there any way to map a request which uses either an extension (eg

dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT

get routed through the getObjectList method of AbstractCrudController?

Bob


Mailing list: https://launchpad.net/~dhis2-devs

Post to : dhis2-devs@lists.launchpad.net

Unsubscribe : https://launchpad.net/~dhis2-devs

More help : https://help.launchpad.net/ListHelp

OK that seems fine now, thanks.

The problem goes away when I remove the 'value' parameter from the
RequestMapping.

···

#
On 29 October 2012 10:44, Morten Olav Hansen <mortenoh@gmail.com> wrote:

I have sent him a fix for this..

--
Morten

On Mon, Oct 29, 2012 at 11:43 AM, Lars Helge Øverland <larshelge@gmail.com> > wrote:

Hi Bob, it should be possible to define a more specific mapping in the
concrete controller class. To see the stack trace in the log you can
start any single web-module with mvn clean jetty:run . Your build
cycle is then to run mvn install on the dhis-web-api module, then mvn
clean jetty:run on e.g. dhis-web-reporting module.

Lars

On Sun, Oct 28, 2012 at 10:43 PM, Bob Jolliffe <bobjolliffe@gmail.com> >> wrote:
> Hi Morten
>
> On 28 October 2012 13:18, Morten Olav Hansen <mortenoh@gmail.com> wrote:
>> Hi Bob
>>
>> This should be as easy as adding another method.. we already have
>> getObjectList (I think thats the name.. ) in our ABC. What you will
>> need to
>> do, is to add another method in DataSetController, maybe call it
>> getDataSetsDSD (or something similar). And have a request-mapping that
>> points to both dataSets and dataSets.dsd, this together with the
>> consumed =
>> mimetype option, should give you a unique combination (spring mvc will
>> complain if two requestmappings point to the same method)
>
> This is all what I figured. Estimated 2 hours work and 2 days later
> :slight_smile: So I have a method in DataSetController with a signature like:
>
> @RequestMapping( value = DataSetController.RESOURCE_PATH + ".dsd",
> produces = "application/dsd+xml" )
> public void getStructure( @RequestParam Map<String, String>
> parameters, HttpServletResponse response )
>
> Which is I think like you say (other than produces rather than
> consumes). But all I get is the "Aw snap" page with nothing in the
> logs whatsoever which makes this really difficult to debug. (I don't
> know if you have any tips for efficient debugging, but currently my
> edit-compile-test cycle is also very unfriendly, going into many
> minutes).
>
> I *think* (and I feel I am no expert on this), that the getObjectList
> in abstract controller is catching ALL get requests to dataSets. I
> had originally thought that providing a more precise match to the
> request in the dataSets class would trump the more general match in
> the abstract controller (you will recognize xslt as having dominated
> my thinking on this matching business). Anyway it looks like it
> doesn't work like this. If two controller methods are an ambiguous
> match, spring seems to just go pop.
>
> Thats ok, but if it is the case, then either we would have to make
> specific exclusions to the abstract controller match (which could get
> ugly as it is used for much more than datasets), or move back away
> from /api/dataSets to something like /api/dsd.
>
> Can you confirm that I am reading this correctly.
>
> Bob
>
>
>
>>
>> Try it... if its not working, I will try and add it for you
>>
>> --
>> Morten
>>
>>
>>
>> On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe <bobjolliffe@gmail.com> >> >> wrote:
>>>
>>> Hi Morten
>>>
>>> I am struggling to grasp something (well actually to do something)
>>> which I thought would be fairly simple, and probably even is if only I
>>> knew how ...
>>>
>>> It has to do with where you have been clever with the
>>> AbstractCrudController in the web api.
>>>
>>> Something like DataSetController extends this.
>>>
>>> Currently /api/dataSets returns you the full list of datasets
>>> formatted in html. And using either the extension (.xml or .json) or
>>> accept headers we can get xml or json renditions of the same.
>>>
>>> But I want to return an alternative xml description of the structure
>>> of the datasets (lets call it as data structure definition or DSD).
>>> Is there any way to map a request which uses either an extension (eg
>>> dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT
>>> get routed through the getObjectList method of AbstractCrudController?
>>>
>>> Bob
>>
>>
>
> _______________________________________________
> Mailing list: DHIS 2 developers in Launchpad
> Post to : dhis2-devs@lists.launchpad.net
> Unsubscribe : DHIS 2 developers in Launchpad
> More help : ListHelp - Launchpad Help

Yes, its because every controller is mapped to a path… so if its DataSetController, then its mapped to /dataSets, so if you add another value = “/dataSets”, the end result would be /dataSets/dataSets

(If I understood you correctly)

···


Morten

On Mon, Oct 29, 2012 at 12:07 PM, Bob Jolliffe bobjolliffe@gmail.com wrote:

OK that seems fine now, thanks.

The problem goes away when I remove the ‘value’ parameter from the

RequestMapping.

On 29 October 2012 10:44, Morten Olav Hansen mortenoh@gmail.com wrote:

I have sent him a fix for this…

Morten

On Mon, Oct 29, 2012 at 11:43 AM, Lars Helge Øverland larshelge@gmail.com > > > wrote:

Hi Bob, it should be possible to define a more specific mapping in the

concrete controller class. To see the stack trace in the log you can

start any single web-module with mvn clean jetty:run . Your build

cycle is then to run mvn install on the dhis-web-api module, then mvn

clean jetty:run on e.g. dhis-web-reporting module.

Lars

On Sun, Oct 28, 2012 at 10:43 PM, Bob Jolliffe bobjolliffe@gmail.com > > >> wrote:

Hi Morten

On 28 October 2012 13:18, Morten Olav Hansen mortenoh@gmail.com wrote:

Hi Bob

This should be as easy as adding another method… we already have

getObjectList (I think thats the name… ) in our ABC. What you will

need to

do, is to add another method in DataSetController, maybe call it

getDataSetsDSD (or something similar). And have a request-mapping that

points to both dataSets and dataSets.dsd, this together with the

consumed =

mimetype option, should give you a unique combination (spring mvc will

complain if two requestmappings point to the same method)

This is all what I figured. Estimated 2 hours work and 2 days later

:slight_smile: So I have a method in DataSetController with a signature like:

@RequestMapping( value = DataSetController.RESOURCE_PATH + “.dsd”,

produces = “application/dsd+xml” )

public void getStructure( @RequestParam Map<String, String>

parameters, HttpServletResponse response )

Which is I think like you say (other than produces rather than

consumes). But all I get is the “Aw snap” page with nothing in the

logs whatsoever which makes this really difficult to debug. (I don’t

know if you have any tips for efficient debugging, but currently my

edit-compile-test cycle is also very unfriendly, going into many

minutes).

I think (and I feel I am no expert on this), that the getObjectList

in abstract controller is catching ALL get requests to dataSets. I

had originally thought that providing a more precise match to the

request in the dataSets class would trump the more general match in

the abstract controller (you will recognize xslt as having dominated

my thinking on this matching business). Anyway it looks like it

doesn’t work like this. If two controller methods are an ambiguous

match, spring seems to just go pop.

Thats ok, but if it is the case, then either we would have to make

specific exclusions to the abstract controller match (which could get

ugly as it is used for much more than datasets), or move back away

from /api/dataSets to something like /api/dsd.

Can you confirm that I am reading this correctly.

Bob

Try it… if its not working, I will try and add it for you

Morten

On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe bobjolliffe@gmail.com > > >> >> wrote:

Hi Morten

I am struggling to grasp something (well actually to do something)

which I thought would be fairly simple, and probably even is if only I

knew how …

It has to do with where you have been clever with the

AbstractCrudController in the web api.

Something like DataSetController extends this.

Currently /api/dataSets returns you the full list of datasets

formatted in html. And using either the extension (.xml or .json) or

accept headers we can get xml or json renditions of the same.

But I want to return an alternative xml description of the structure

of the datasets (lets call it as data structure definition or DSD).

Is there any way to map a request which uses either an extension (eg

dataSets.dsd) or accept header (eg application/dsd+xml) which DOES NOT

get routed through the getObjectList method of AbstractCrudController?

Bob


Mailing list: https://launchpad.net/~dhis2-devs

Post to : dhis2-devs@lists.launchpad.net

Unsubscribe : https://launchpad.net/~dhis2-devs

More help : https://help.launchpad.net/ListHelp

yes I think this is exactly what was happening :frowning:

···

On 29 October 2012 11:09, Morten Olav Hansen <mortenoh@gmail.com> wrote:

Yes, its because every controller is mapped to a path.. so if its
DataSetController, then its mapped to /dataSets, so if you add another value
= "/dataSets", the end result would be /dataSets/dataSets

(If I understood you correctly)

--
Morten

On Mon, Oct 29, 2012 at 12:07 PM, Bob Jolliffe <bobjolliffe@gmail.com> > wrote:

OK that seems fine now, thanks.

The problem goes away when I remove the 'value' parameter from the
RequestMapping.

#
On 29 October 2012 10:44, Morten Olav Hansen <mortenoh@gmail.com> wrote:
> I have sent him a fix for this..
>
> --
> Morten
>
>
>
> On Mon, Oct 29, 2012 at 11:43 AM, Lars Helge Øverland >> > <larshelge@gmail.com> >> > wrote:
>>
>> Hi Bob, it should be possible to define a more specific mapping in the
>> concrete controller class. To see the stack trace in the log you can
>> start any single web-module with mvn clean jetty:run . Your build
>> cycle is then to run mvn install on the dhis-web-api module, then mvn
>> clean jetty:run on e.g. dhis-web-reporting module.
>>
>> Lars
>>
>> On Sun, Oct 28, 2012 at 10:43 PM, Bob Jolliffe <bobjolliffe@gmail.com> >> >> wrote:
>> > Hi Morten
>> >
>> > On 28 October 2012 13:18, Morten Olav Hansen <mortenoh@gmail.com> >> >> > wrote:
>> >> Hi Bob
>> >>
>> >> This should be as easy as adding another method.. we already have
>> >> getObjectList (I think thats the name.. ) in our ABC. What you will
>> >> need to
>> >> do, is to add another method in DataSetController, maybe call it
>> >> getDataSetsDSD (or something similar). And have a request-mapping
>> >> that
>> >> points to both dataSets and dataSets.dsd, this together with the
>> >> consumed =
>> >> mimetype option, should give you a unique combination (spring mvc
>> >> will
>> >> complain if two requestmappings point to the same method)
>> >
>> > This is all what I figured. Estimated 2 hours work and 2 days later
>> > :slight_smile: So I have a method in DataSetController with a signature like:
>> >
>> > @RequestMapping( value = DataSetController.RESOURCE_PATH + ".dsd",
>> > produces = "application/dsd+xml" )
>> > public void getStructure( @RequestParam Map<String, String>
>> > parameters, HttpServletResponse response )
>> >
>> > Which is I think like you say (other than produces rather than
>> > consumes). But all I get is the "Aw snap" page with nothing in the
>> > logs whatsoever which makes this really difficult to debug. (I don't
>> > know if you have any tips for efficient debugging, but currently my
>> > edit-compile-test cycle is also very unfriendly, going into many
>> > minutes).
>> >
>> > I *think* (and I feel I am no expert on this), that the getObjectList
>> > in abstract controller is catching ALL get requests to dataSets. I
>> > had originally thought that providing a more precise match to the
>> > request in the dataSets class would trump the more general match in
>> > the abstract controller (you will recognize xslt as having dominated
>> > my thinking on this matching business). Anyway it looks like it
>> > doesn't work like this. If two controller methods are an ambiguous
>> > match, spring seems to just go pop.
>> >
>> > Thats ok, but if it is the case, then either we would have to make
>> > specific exclusions to the abstract controller match (which could get
>> > ugly as it is used for much more than datasets), or move back away
>> > from /api/dataSets to something like /api/dsd.
>> >
>> > Can you confirm that I am reading this correctly.
>> >
>> > Bob
>> >
>> >
>> >
>> >>
>> >> Try it... if its not working, I will try and add it for you
>> >>
>> >> --
>> >> Morten
>> >>
>> >>
>> >>
>> >> On Sat, Oct 27, 2012 at 6:54 PM, Bob Jolliffe >> >> >> <bobjolliffe@gmail.com> >> >> >> wrote:
>> >>>
>> >>> Hi Morten
>> >>>
>> >>> I am struggling to grasp something (well actually to do something)
>> >>> which I thought would be fairly simple, and probably even is if
>> >>> only I
>> >>> knew how ...
>> >>>
>> >>> It has to do with where you have been clever with the
>> >>> AbstractCrudController in the web api.
>> >>>
>> >>> Something like DataSetController extends this.
>> >>>
>> >>> Currently /api/dataSets returns you the full list of datasets
>> >>> formatted in html. And using either the extension (.xml or .json)
>> >>> or
>> >>> accept headers we can get xml or json renditions of the same.
>> >>>
>> >>> But I want to return an alternative xml description of the
>> >>> structure
>> >>> of the datasets (lets call it as data structure definition or DSD).
>> >>> Is there any way to map a request which uses either an extension
>> >>> (eg
>> >>> dataSets.dsd) or accept header (eg application/dsd+xml) which DOES
>> >>> NOT
>> >>> get routed through the getObjectList method of
>> >>> AbstractCrudController?
>> >>>
>> >>> Bob
>> >>
>> >>
>> >
>> > _______________________________________________
>> > Mailing list: DHIS 2 developers in Launchpad
>> > Post to : dhis2-devs@lists.launchpad.net
>> > Unsubscribe : DHIS 2 developers in Launchpad
>> > More help : ListHelp - Launchpad Help
>
>