One domain model, multiple json views

classic Classic list List threaded Threaded
14 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

One domain model, multiple json views

rick
Hi, I asked this question on stackoverflow, but thought I would send it
here as well..

We have a set of domain classes which are serialized to json via
jackson using jersey services. We are currently annotating the classes
with JAXB (although we're not tied to that). This works fine. But we
want to offer different serializations of the classes for different use
cases.

Web site
Mobile apps
Admin tool
Public API

In each of these use cases there are different fields which we may or
may not want included in the json view. For example, the admin tool
might need some parameters for setting permissions on data. The mobile
client needs a different URL to a media stream than the website. The
website has particular naming conventions it needs for fields.

What is the best practice for managing different mappings of json for
different service endpoints in Jersey?

Thanks!
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

Arul Dhesiaseelan-3
Google Drive API does something similar by passing in an optional parameter in the request that hints what response data is expected by the target client.

https://developers.google.com/drive/v1/reference/files/get

Does this work for you?

-Arul

On Sat, May 26, 2012 at 8:26 AM, <[hidden email]> wrote:
Hi, I asked this question on stackoverflow, but thought I would send it
here as well..

We have a set of domain classes which are serialized to json via
jackson using jersey services. We are currently annotating the classes
with JAXB (although we're not tied to that). This works fine. But we
want to offer different serializations of the classes for different use
cases.

Web site
Mobile apps
Admin tool
Public API

In each of these use cases there are different fields which we may or
may not want included in the json view. For example, the admin tool
might need some parameters for setting permissions on data. The mobile
client needs a different URL to a media stream than the website. The
website has particular naming conventions it needs for fields.

What is the best practice for managing different mappings of json for
different service endpoints in Jersey?

Thanks!



--
http://aruld.info
http://twitter.com/aruld


Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

rick
I'd rather not pass extra parameters in. Ideally each service endpoint would be able to have a different serialization of the domain models. 

Sent from my iPad

On May 27, 2012, at 1:28 AM, Arul Dhesiaseelan <[hidden email]> wrote:

Google Drive API does something similar by passing in an optional parameter in the request that hints what response data is expected by the target client.

https://developers.google.com/drive/v1/reference/files/get

Does this work for you?

-Arul

On Sat, May 26, 2012 at 8:26 AM, <[hidden email]> wrote:
Hi, I asked this question on stackoverflow, but thought I would send it
here as well..

We have a set of domain classes which are serialized to json via
jackson using jersey services. We are currently annotating the classes
with JAXB (although we're not tied to that). This works fine. But we
want to offer different serializations of the classes for different use
cases.

Web site
Mobile apps
Admin tool
Public API

In each of these use cases there are different fields which we may or
may not want included in the json view. For example, the admin tool
might need some parameters for setting permissions on data. The mobile
client needs a different URL to a media stream than the website. The
website has particular naming conventions it needs for fields.

What is the best practice for managing different mappings of json for
different service endpoints in Jersey?

Thanks!



--
http://aruld.info
http://twitter.com/aruld


Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

rick
I guess my question is more, what facilities (if any) does jersey provide for allowing for multiple json serialization formats for a single pojo?



On Sun, May 27, 2012 at 8:54 AM, Rick Mangi <[hidden email]> wrote:
I'd rather not pass extra parameters in. Ideally each service endpoint would be able to have a different serialization of the domain models. 

Sent from my iPad

On May 27, 2012, at 1:28 AM, Arul Dhesiaseelan <[hidden email]> wrote:

Google Drive API does something similar by passing in an optional parameter in the request that hints what response data is expected by the target client.

https://developers.google.com/drive/v1/reference/files/get

Does this work for you?

-Arul

On Sat, May 26, 2012 at 8:26 AM, <[hidden email]> wrote:
Hi, I asked this question on stackoverflow, but thought I would send it
here as well..

We have a set of domain classes which are serialized to json via
jackson using jersey services. We are currently annotating the classes
with JAXB (although we're not tied to that). This works fine. But we
want to offer different serializations of the classes for different use
cases.

Web site
Mobile apps
Admin tool
Public API

In each of these use cases there are different fields which we may or
may not want included in the json view. For example, the admin tool
might need some parameters for setting permissions on data. The mobile
client needs a different URL to a media stream than the website. The
website has particular naming conventions it needs for fields.

What is the best practice for managing different mappings of json for
different service endpoints in Jersey?

Thanks!



--
http://aruld.info
http://twitter.com/aruld



Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

Casper Bang-2
None, as fair as I am aware of. I've struggled with this problem in
the past as well, and came to the conclusion that JAXB ties the view
(resource) too rigidly with the model (POJO), making it impossible to
reuse POJO's elsewhere - basically it's a cute idea, but it just
doesn't scale in practice.

So we ended up using raw Jackson, which also has the added benefit
that you can start streaming results back immediately. The downside is
that it's still laborious to construct these slightly different
variations, so we've taken the next step into developing an OData
endpoint on top of Jersey, which allows the URL to specify the desired
projection, translate this into SQL (via a model) and feed back via
JSON. I'm no longer directly associated with this latter part, but I
believe the plan is to release this as open source for others to use.

/Casper

On Sun, May 27, 2012 at 5:24 PM, Rick Mangi <[hidden email]> wrote:

> I guess my question is more, what facilities (if any) does jersey provide
> for allowing for multiple json serialization formats for a single pojo?
>
>
>
> On Sun, May 27, 2012 at 8:54 AM, Rick Mangi <[hidden email]> wrote:
>>
>> I'd rather not pass extra parameters in. Ideally each service endpoint
>> would be able to have a different serialization of the domain models.
>>
>> Sent from my iPad
>>
>> On May 27, 2012, at 1:28 AM, Arul Dhesiaseelan <[hidden email]> wrote:
>>
>> Google Drive API does something similar by passing in an optional
>> parameter in the request that hints what response data is expected by the
>> target client.
>>
>> https://developers.google.com/drive/v1/reference/files/get
>>
>> Does this work for you?
>>
>> -Arul
>>
>> On Sat, May 26, 2012 at 8:26 AM, <[hidden email]> wrote:
>>>
>>> Hi, I asked this question on stackoverflow, but thought I would send it
>>> here as well..
>>>
>>> We have a set of domain classes which are serialized to json via
>>> jackson using jersey services. We are currently annotating the classes
>>> with JAXB (although we're not tied to that). This works fine. But we
>>> want to offer different serializations of the classes for different use
>>> cases.
>>>
>>> Web site
>>> Mobile apps
>>> Admin tool
>>> Public API
>>>
>>> In each of these use cases there are different fields which we may or
>>> may not want included in the json view. For example, the admin tool
>>> might need some parameters for setting permissions on data. The mobile
>>> client needs a different URL to a media stream than the website. The
>>> website has particular naming conventions it needs for fields.
>>>
>>> What is the best practice for managing different mappings of json for
>>> different service endpoints in Jersey?
>>>
>>> Thanks!
>>
>>
>>
>>
>> --
>> http://aruld.info
>> http://twitter.com/aruld
>>
>>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

rick
Hmm... do you use jackson directly for unmarshalling posts/puts as well?

Thanks,

Rick


On Sun, May 27, 2012 at 11:46 AM, Casper Bang <[hidden email]> wrote:
None, as fair as I am aware of. I've struggled with this problem in
the past as well, and came to the conclusion that JAXB ties the view
(resource) too rigidly with the model (POJO), making it impossible to
reuse POJO's elsewhere - basically it's a cute idea, but it just
doesn't scale in practice.

So we ended up using raw Jackson, which also has the added benefit
that you can start streaming results back immediately. The downside is
that it's still laborious to construct these slightly different
variations, so we've taken the next step into developing an OData
endpoint on top of Jersey, which allows the URL to specify the desired
projection, translate this into SQL (via a model) and feed back via
JSON. I'm no longer directly associated with this latter part, but I
believe the plan is to release this as open source for others to use.

/Casper

On Sun, May 27, 2012 at 5:24 PM, Rick Mangi <[hidden email]> wrote:
> I guess my question is more, what facilities (if any) does jersey provide
> for allowing for multiple json serialization formats for a single pojo?
>
>
>
> On Sun, May 27, 2012 at 8:54 AM, Rick Mangi <[hidden email]> wrote:
>>
>> I'd rather not pass extra parameters in. Ideally each service endpoint
>> would be able to have a different serialization of the domain models.
>>
>> Sent from my iPad
>>
>> On May 27, 2012, at 1:28 AM, Arul Dhesiaseelan <[hidden email]> wrote:
>>
>> Google Drive API does something similar by passing in an optional
>> parameter in the request that hints what response data is expected by the
>> target client.
>>
>> https://developers.google.com/drive/v1/reference/files/get
>>
>> Does this work for you?
>>
>> -Arul
>>
>> On Sat, May 26, 2012 at 8:26 AM, <[hidden email]> wrote:
>>>
>>> Hi, I asked this question on stackoverflow, but thought I would send it
>>> here as well..
>>>
>>> We have a set of domain classes which are serialized to json via
>>> jackson using jersey services. We are currently annotating the classes
>>> with JAXB (although we're not tied to that). This works fine. But we
>>> want to offer different serializations of the classes for different use
>>> cases.
>>>
>>> Web site
>>> Mobile apps
>>> Admin tool
>>> Public API
>>>
>>> In each of these use cases there are different fields which we may or
>>> may not want included in the json view. For example, the admin tool
>>> might need some parameters for setting permissions on data. The mobile
>>> client needs a different URL to a media stream than the website. The
>>> website has particular naming conventions it needs for fields.
>>>
>>> What is the best practice for managing different mappings of json for
>>> different service endpoints in Jersey?
>>>
>>> Thanks!
>>
>>
>>
>>
>> --
>> http://aruld.info
>> http://twitter.com/aruld
>>
>>
>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

Cowtowncoder
In reply to this post by Casper Bang-2
On Sun, May 27, 2012 at 8:46 AM, Casper Bang <[hidden email]> wrote:
> None, as fair as I am aware of. I've struggled with this problem in
> the past as well, and came to the conclusion that JAXB ties the view
> (resource) too rigidly with the model (POJO), making it impossible to
> reuse POJO's elsewhere - basically it's a cute idea, but it just
> doesn't scale in practice.
>
> So we ended up using raw Jackson, which also has the added benefit
> that you can start streaming results back immediately. The downside is
...

One possible extension point is to have a look at the provider that is
used to integrate Jackson with JAX-RS. This is where one can add
things like annotation- or header/query-param-based routing and
dispatching. Or even use content/media-type for deciding how to handle
a request, and by whom.

The default implementation (JacksonJaxrsJsonProvider) is relatively
simple, which is mostly because it is not easy to figure out a generic
system that would allow useful toggles for things like asked here.
But it is not all that difficult to figure out how to handle specific
use case, in "locally generic" way. That is: logic for determining is
based on specific domain and use case, and custom annotations are
added to support just those cases.

I think all the flexibility & power of JAX-RS -- which handles LOTS of
use cases with very simple config and annotations -- sort of hides the
possibility of using custom extensions, which can solve further set of
use cases.

-+ Tatu +-
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

rick
Thanks Tatu,


?

Thanks,

Rick


On Mon, May 28, 2012 at 1:45 PM, Tatu Saloranta <[hidden email]> wrote:
On Sun, May 27, 2012 at 8:46 AM, Casper Bang <[hidden email]> wrote:
> None, as fair as I am aware of. I've struggled with this problem in
> the past as well, and came to the conclusion that JAXB ties the view
> (resource) too rigidly with the model (POJO), making it impossible to
> reuse POJO's elsewhere - basically it's a cute idea, but it just
> doesn't scale in practice.
>
> So we ended up using raw Jackson, which also has the added benefit
> that you can start streaming results back immediately. The downside is
...

One possible extension point is to have a look at the provider that is
used to integrate Jackson with JAX-RS. This is where one can add
things like annotation- or header/query-param-based routing and
dispatching. Or even use content/media-type for deciding how to handle
a request, and by whom.

The default implementation (JacksonJaxrsJsonProvider) is relatively
simple, which is mostly because it is not easy to figure out a generic
system that would allow useful toggles for things like asked here.
But it is not all that difficult to figure out how to handle specific
use case, in "locally generic" way. That is: logic for determining is
based on specific domain and use case, and custom annotations are
added to support just those cases.

I think all the flexibility & power of JAX-RS -- which handles LOTS of
use cases with very simple config and annotations -- sort of hides the
possibility of using custom extensions, which can solve further set of
use cases.

-+ Tatu +-

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

Cowtowncoder
On Mon, May 28, 2012 at 5:54 PM, Rick Mangi <[hidden email]> wrote:
> Thanks Tatu,
>
> Do you mean: https://github.com/FasterXML/jackson-jaxrs-json-provider

For Jackson 2.0, yes; for 1.9 and earlier it is part of core jars and
can be found at [http://wiki.fasterxml.com/JacksonDownload] (code from
Codehaus svn).
So it depends on which Jackson version you will be using; Jersey is
using 1.x for now.

-+ Tatu +-
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

BOTTLE11
This post has NOT been accepted by the mailing list yet.
In reply to this post by rick
A gorgeous mermaid wedding gown cheap ball gowns pink quinceanera dresses will  just make you a stunning bride in the fantastic wedding ceremony. The smooth and shimmering pokemon cosplay costumes bodice fancily carves the bust line silver prom shoes with slight sensual touch. Clingy long mermaid dress fluently flows, finishing with classic underskirt. Feminine floral design on the shoulder just makes a graceful effect.This inuyasha costumes mermaid wedding dress red cocktail dress stuns the black cocktail dresses audience with prom dresses under 100 its unique design with pleats motifs all over the body-sculpting bodice, coming along with one piece cosplay the a elegant sweetheart neckline accentuated with sparkling beadings and sequins. The cross-over military ball gowns 2013 ruches go party dresses for women down to the dropped waistline, leading into the draping plus size corset skirt with a cathedral train at the back, finished with lace-up back closure.Chic and charming mermaid wedding gown features fashionable one shoulder neckline with pleated semi formal dresses bodice. Ruched waist invites the flare skirt running down to the floor mermaid wedding dresses with a court sweet lolita dresses train. Self-covered inuyasha cosplay costumes button closure at back finishes the prom dresses 2013 style.Graceful wedding gown features the classic design and offers incomparable elegance. Mermaid taffeta is slightly shirred yellow quinceanera dresses and perfectly hugs over the body making the amazing shape. Tempting V-necks on both front and back are Wedding Accessories accentuated with fancy beading and vocaloid cosplay costumes sequin details concentrating on the front bodice. Fully lined.A beautiful and sensual bridal corset silhouette of sexy evening dresses the mermaid weeding gown makes short prom dresses you an excellent bride for any occasion. Delicate pleats detailed bodice with cute straps creates cheap wedding dresses online a wonderful drape and frames the Swimwear bust line. Chic silver silk dress gathers at punk lolita dresses the empire waist and smoothly cosplay costumes for sale runs over the body into a long, charming dress with buttons back.This new designed Wedding Jewelry fancy wedding dress features dipped neckline. Delicate appliques decorate throughout the whole cheap plus size wedding dresses bodice. A zipper closure corsets the bodice, showing your perfect figure. Flared skirt is shimmering and pleated, flowing down to bridal shoes a glamour chapel train.<br><br>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

BOTTLE11
This post has NOT been accepted by the mailing list yet.
VGlorious and strapless bridal dress enjoys the mermaid silhouette with corset closure, and stretching out the bowtie cheap cocktail dresses Gloves detail cosplay bleach in the back. The full bust line reveals array of crafted dresses for wedding guest lovable floral patterns and beading details on with the rippling pleats below, while the skirt is cascading down to the chapel train to complete with this charming design. What a fresh design of military ball gowns the wedding gown in the mermaid plus size evening dresses style just gives a pure and clean look and makes you an amazing bride. Strapless bodice with lace homecoming dresses cheap motif makes a charming fit while cheap prom dresses the clingy mermaid long dress delightfully flows and perfectly flaunts the fantastic figure. Fully toddler christmas dresses lined and chapel punk lolita dress train.Extremely flattering mermaid style for bridal gown features smart one-shoulder spaghetti strap with pleated bodice decorated with Wedding Gloves handmade mother of the bride dresses braided patterns artistically. Horizontal pleated Sashes drop waist reveals the rich draped flare skirt running down to plus size bridesmaid dresses the open back wedding dresses floor with a  sweetheart neckline wedding dresses court Lingerie train. This clear and clean design creates a chaste effect. Fanciful, fantastic mermaid homecoming dresses under 50 bridal gown features illusion lace capped short sleeves and sweetheart ivory wedding dresses neckline with fitted curve bodice. Sparkling beaded motifs define the raised waistline junior bridesmaid dresses and reveals the opulent skirt running down to the sexy plus size dresses floor with ethereal organza court train. plus size party dresses Corset closure.Charming mermaid silhouette features spaghetti straps and scalloped bodice which has refine lace underbust corset detailing corsets costumes on it. Both of the straps and lace are embellished with shinning sequins and beadings. Shirred satin perfectly black bridesmaid dresses hugs over the body and a cosplay costumes for sale fancy organza skirt flowing down with a beautiful bunch of applique on the right thigh inexpensive wedding dresses emits fancy fairy-tale feeling. Fully lined.Why not show off your seductive figure in your own way? This traditional strapless taffeta formal gown features catching sheath silhouette gently hugging your curvy body. informal wedding dresses Sparkling sequined christmas costume decoration creates a splendid effect. school uniforms costumes End up with sweep-length train and hidden zipper.<br><br>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

BOTTLE11
This post has NOT been accepted by the mailing list yet.
VEnticing, enchanting. Dramatic mermaid silhouette for wedding dress is completed with an engaging sweetheart neckline with pleated bodice. bleach costumes Satin bodice gives 2013 prom dresses this style an opulent look. Sleek skirt flows down to the floor with a beach wedding dresses court train, while a sheen tulle disney princess wedding dresses jacket is available lolita blouses with this style.Classic design empire waist dress marries cheap cocktail dresses sweet jacquard to form this semi-formal wedding dress. This sleeveless gown enjoys V-neckline, delicate plus size corsets jacquard throughout prom dresses under 100 bodice and skirt, adding romantic appeal. The skirt flares to the floor with fancy court train adding a glamorous yet sexy pokemon halloween costumes feeling. Wear it with confidence for an unforgettable look.Enticing, enchanting. Charming taffeta bridal wedding gown for petite brides enjoy strapless neckline with shimmering beaded motifs bodice. ivory wedding shoes Empire waist invites the fitted wedding guest outfits skirt flowing down to the floor with a court train. Self-covered button closure. Flattering mermaid style for bridal wear appreciates sparkling halter neckline with plus size corset pleated blue quinceanera dresses bodice. casual wedding dresses Ruched  drop waist invites the flare skirt running bridesmaid dresses under 100 down to the plus size special occasion dresses floor gently. A big artistic rosette at side skirt accents the style to a nicety.What a romantic and Wedding Garment Bags fantastic wedding dress! The exquisite embroidery throughout the dress accents the romantic short prom dresses 2013 touch quietly. Together with the corset waist and corset costumes the romantic flare skirt the dress showcases homecoming dresses under 100 a breath-taking silhouette. Try cosplay uniform it on, it can bring you a fantastic feeling.It is truly perfect for hugging figure, glamorous Discount Wedding Accessories lady on you. homecoming dresses Beginning with beadings along evening shoes sweetheart neckline adding sensual and luxury wedding corsets impression, dense shirr bust with fan ruche applique tied military ball gowns side plus size special occasion dresses reveals its charming dress for wedding guest area. Ruche special occasion dresses tiers cover the dress to ending hem present your slim and slender curve.<br><br>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

W-yuxin
This post has NOT been accepted by the mailing list yet.
In reply to this post by rick
 If you learn more about replica watches, please visit www.solfwatches.com


Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: One domain model, multiple json views

yolobaba
This post has NOT been accepted by the mailing list yet.
In reply to this post by rick
Juliana Ribeiro and André Lima have known each other since their youth. The vice president of fashion and lifestyle at Black Frame PR and the neurologist first met through their families who just happened to be friends. “He and I were never really close,” the Brazilian-born Ribeiro explains. “But years later, we reconnected at my parents’ home during their New Year’s Eve party,” she adds. “That was when our relationship started, and we dated for two years before he proposed.” As fate would have it, the pair’s engagement, on Ribeiro’s 30th birthday, happened in the exact spot where they met. As she remembers, “my grandmother and mother knew what was about to happen because they helped design the ring, and our other family members and friends had a feeling it would happen on my birthday, especially after he showed up with a small box in his pocket. Turns out, the box was actually a pair of earrings for me, so I was a bit disappointed when I opened them. However, much later, around 2:00 a.m., we were dancing, and he whispered ‘Will you marry me?’ in my ear.” long evening dresses That was in November. In December, Ribeiro became pregnant and they began planning their wedding for May. “I never dreamed of a big wedding, nor did I have any specifics in mind,” Ribeiro notes. “But I did know that I wanted to get married in this church in Lisbon, where my parents have an apartment, at a monastery called Mosteiro dos Jerónimos. I first saw it when I was 15 and thought it was so beautiful.” As fate had it once again, Lima’s family is Portuguese, and their setting could not have been more perfect. long prom dresses The ceremony at the church was traditional, with a soloist singing classic wedding hymns alongside a children’s chorus. “It was such a special moment for me to see all my friends and family together in one place,” Ribeiro says. “The ceremony felt very intimate, even though the church was very grand and the outside was filled with tourists.” The bride wore a classic white satin gown with a long cape that was embroidered by her great aunt to include her mother’s old veil. Her hair was in a low bun, embellished with a vintage beaded headpiece, and she wore only her mother’s small pearl and diamond earrings and her wedding band. wedding dresses online Once the ceremony was over, the newlyweds and their guests headed to the reception at the nearby Palácio do Conde d’Óbidos. “I really love the Portuguese culture and aesthetic,” Ribeiro says. “This old palace on the river has the traditional blue-and-white tiles, and since the decor is already so amazing, I didn’t have to do much else to the space.” She did, however, have the napkins and tablecloths printed with the same motif as the tiles, and matched her orchids and hydrangeas to the white and blue hues. The reception actually began at 3:00 p.m. and went until 3:00 a.m., and when dinner was served sometime in between, guests were treated to classic Portuguese fare like veal, codfish baked with potatoes and eggs, and a native sweet called pastel de crema. During dinner, the bridesmaids presented a film they’d made that showcased the newlyweds as children and then their story as a happy couple. Later came what Ribeiro called, “the biggest surprise of the evening.” “André, my uncle, my cousin, and two friends did a fully choreographed dance that no one had a clue about,” she says. “My husband actually hired a professional to teach him a dance to a special remix of all the cheesiest Bruno Mars love songs, and for the guys who weren’t in Brazil with him at the time, he taped himself doing the dance to send to them so they could practice,” she adds. “He’s a neurologist and pretty serious most of the time, so this was incredibly funny.” Though Lima’s performance certainly took the cake, the DJ had everyone from Ribeiro’s grandfather to her little cousins on the dance floor too. And at dusk, all of the guests gathered outside to release lit balloons into the sky for good luck. After, while the music raged on, something seemed to slip Ribeiro and Lima’s minds. “We were so excited to dance with all of our friends and family that we actually forgot to do the first dance,” Ribeiro remembers. “Our first dance was actually the last song of the evening, and it was a Caetano Veloso song that played on the radio during our first date—the perfect ending to a happy day.”
Loading...