cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

Community Tip - Did you get an answer that solved your problem? Please mark it as an Accepted Solution so others with the same problem can find the answer easily. X

Casting Things as their implemented ThingShape

jasong
12-Amethyst

Casting Things as their implemented ThingShape

I have developed a ThingShape in Java as a POJO.

I place this shape on several templates, hence why it's a shape.

Once I have an instantiated Thing, is there any way I can cast that Thing as this ThingShape it uses to get access to the public services, without having to use the reflective 'processServiceRequest(serviceName, params) method?

It's not a huge deal, but seems like due to the reflective nature of how Things are loaded, this would be doable, by either extending the ThingShape in Java from Thing or by some other mechanism.

2 REPLIES 2
PaiChung
22-Sapphire I
(To:jasong)

On the Thing level you will only be able to use the services that apply to an instance, so from a ThingShape perspective only the custom (My) services, properties and events you've added. If you wanted to do something that is executed against the ThingShape itself, you will need to specifically do that as ThingShapes[NameOfShape].Service/Property/Event I don't know any way around that.

But if it is something you added as a MY item, then in the context of the Thing you can use me.Service/Property/Event

jasong
12-Amethyst
(To:PaiChung)

Yeah I was hoping there was something I could do like this:

Thing t = EntityUtilities.findEntity("MyThingName", ThingworxRelationshipTypes.Thing);

MyThingShape mts = (MyThingShape) t;

mts.myServiceName();

Bummer

The alternative is not bad but just inconsistent with my other things. For the services internal to the shape I do this:

private Thing getMe() throws Exception {

    Object meObj = ThreadLocalContext.getMeContext();

    if (meObj instanceof Thing) {

        return (Thing)meObj;       

    } else {

        throw new Exception("Cannot cast me to Thing");

    }

}

private void someServce() {

   Thing t = getMe();

   t.whateverThingmethodIneed();

   someOtherService();

}

private void someOtherServce() {

//code-n-stuff

}

But then in any other code that needs to access this services defined on the thing shape, it goes something like this

Thing t = EntityUtilities.findEntity("MyThingName", ThingworxRelationshipTypes.Thing);

DeviceTools.runSomeService(t); //DeviceTools is just a wrapper that uses the reflective Thing.processServiceRequest(...)

Excuse any typos!

Announcements


Top Tags