OK: isSubtypeOf is an action on a type, not on instances of a type. I
should have thought twice. I like this solution a lot. Thank you!

Johan.

On Mon, Nov 7, 2011 at 9:44 AM, Dan Haywood
<[email protected]> wrote:
>
>
> On 04/11/2011 08:55, Johan Andries wrote:
>>
>> It is my goal to put a first version (just a zip file) of the
>> javascript application online by the end of next week. After that I'll
>> create a Google code project to host it more officially.
>
> Good stuff.
>
>
>>
>> Two remarks about the polymorphism question:
>>
>> 1.
>> http://~/domainTypes/org.apache.isis.example.claims.dom.employee.Employee
>> would have to list all super classes (and interfaces it implements),
>> not all sub classes as you mention. In this example that would be the
>> two interfaces Claimant and Approver. I am not sure that would not
>> scale.
>
> You are right that this is a bounded set and so ought to scale reasonably
> well.  But some of the lists could be quite large (especially if we included
> transitive dependencies so that the client didn't have to walk all the way
> up the hierarchy).  So this implementation is going to be ugly.
>
> I'm not going to rule out this approach for good, but I think the need can
> be addressed by (2) below - let me expand on it there.
>
>
>>
>> 2. isAssignableFrom is a technical action without real business
>> meaning, so it must not be offered to end-users in the UI. Isn't that
>> a bit inconsistent?
>
> I guess I didn't explain this properly.  I wasn't suggesting that this
> action would be available on the DomainObject resource; rather it is
> available as a brand-new resource linked from the DomainType resource.
>
> I've just gone ahead and implemented (and committed) this, though I haven't
> yet updated the docs.  Still, if you do a GET on the DomainType, you'll see
> a new "typeActions" list, which lists the different type actions you can
> invoke; eg:
>
> http://localhost:8080/domainTypes/org.apache.isis.tck.objstore.dflt.scalars.ApplibValuedEntityRepositoryDefault
>
> will return:
>
>  "typeActions" : [ {
>    "id" : "isSubtypeOf",
>    "rel" : "typeaction",
>    "href" :
> "http://localhost:8080/domainTypes/org.apache.isis.tck.objstore.dflt.scalars.ApplibValuedEntityRepositoryDefault/typeactions/isSubtypeOf/invoke";,
>    "method" : "GET",
>    "type" :
> "application/json;profile=\"urn:org.restfulobjects/domaintypeissubtypeof\"",
>    "arguments" : {
>      "supertype" : {
>        "href" : null
>      }
>    }
>  } ],
>
> This can then be invoked in the usual way, ie passing the arguments map as a
> URL-encoded map for a query string called args.
>
> Eg to check that the above type IS a subtype of itself, you can use:
>
> http://localhost:8080/domainTypes/org.apache.isis.tck.objstore.dflt.scalars.ApplibValuedEntityRepositoryDefault/typeactions/isSubtypeOf/invoke?args=%7B%20%22supertype%22%20%3A%20%7B%20%20%22href%22%20%3A%20%22http%3A%2F%2Flocalhost%3A8080%2FdomainTypes%2Forg.apache.isis.tck.objstore.dflt.scalars.ApplibValuedEntityRepositoryDefault%22%20%20%7D%20%7D
>
> ie, args is the URL encoded version of
>
> { "supertype" : { "href" :
> "http://localhost:8080/domainTypes/org.apache.isis.tck.objstore.dflt.scalars.ApplibValuedEntityRepositoryDefault";
> } }
>
> (I'm using a little online utility
> http://www.albionresearch.com/misc/urlencode.php) to encode/decode maps.
>
>
>
>>
>> 3. The js application would have to call this isAssignableFrom action
>> right at the moment that the user tries to drop an Employee object on
>> a Claiment or Approver form field.
>
> That's true, it would.  I don't see this as an issue.
>
> Of course I could cache previous
>>
>> calls to isAssignableFrom.
>
> Yes, though the representation also has a cache-control of 1 day set, so the
> web browsers caching (or cache proxies) should take care of this rather than
> being write something yourself.
>
>
>
>>
>> Conclusion: I would like to ask you to reconsider my original
>> suggestion (item1 in the list above)...
>
> Can you see how you get on with (2); if it's unworkable, then we can revisit
> (1).
>
> Thx
> Dan
>
>
>
>>
>> Johan.
>>
>> On Fri, Nov 4, 2011 at 9:24 AM, Dan Haywood
>> <[email protected]>  wrote:
>>>
>>> Interesting question.
>>>
>>> Rather than listing all subtypes - which I think would not scale
>>> particularly well - I think it would be better to have an action,
>>> equivalent to java.lang.Class#isAssignableFrom(java.lang.Class).  This
>>> would allow a client to ask whether the Employee is compatible with the
>>> Claimant interface.
>>>
>>> In other words:
>>>
>>> {
>>>  "href": "http://
>>>
>>> ~/types/com.mycompany.myapp.claims.Claimant/actions/isAssignableFrom/invoke",
>>>  "arguments": {
>>>    "href": "http://~/types/com.mycompany.myapp.employee.Employee";
>>>  }
>>> }
>>>
>>> Thoughts?
>>>
>>> ~~~
>>> Question back to you: do you intend to open source your Javascript app?
>>> I'd be very interested in seeing it, at any rate.
>>>
>>> Cheers
>>> Dan
>>>
>>>
>>>
>>>
>>> On 4 November 2011 07:13, Johan Andries<[email protected]>  wrote:
>>>
>>>> Hi,
>>>>
>>>> in the claims example application the class
>>>>
>>>> org.apache.isis.example.claims.dom.claim.Claim
>>>>
>>>> is using the interfaces
>>>>
>>>> org.apache.isis.example.claims.dom.claim.Claimant
>>>> org.apache.isis.example.claims.dom.claim.Approver
>>>>
>>>> both implemented by
>>>>
>>>> org.apache.isis.example.claims.dom.employee.Employee
>>>>
>>>> The problem is now that my javascript application does not know about
>>>> the polymorphic relationship between the Employee class and the two
>>>> interfaces, so in this case I have no way of enforcing type safety in
>>>> the UI when invoking actions or updating properties.
>>>>
>>>> One way of solving this would be to specify all implemented interfaces
>>>> and superclasses for a given domain type in chapter 20 (Domain Type
>>>> Resource) of the restful objects spec (v0.50). For example,
>>>>
>>>>
>>>> http://~/domainTypes/org.apache.isis.example.claims.dom.employee.Employee
>>>>
>>>> should list all other domain types it can act as.
>>>>
>>>> Or is there an other solution I am not aware of?
>>>>
>>>> Johan.
>>>>
>>>
>>
>
>

Reply via email to