Community Tip - Have a PTC product question you need answered fast? Chances are someone has asked it before. Learn about the community search. X
Hello,
I started to develop some Java-Extensions to solve some issues, that we where not able to solve with pure javascript. For some of these functional modules it would be interesting to have them as ThingShape to enable reuse on different Things.
The Eclipse-Plugin allows me to add a ConfigurationTable to the ThingShape and everything compiles properly.
But when I use this ThingShape, I can not see my ConfigurationTable entries anywhere?
Ok my first use example, we would like to have a TimerShape that behaves similar like TimerTemplate:
@ThingworxConfigurationTableDefinitions(tables = { @ThingworxConfigurationTableDefinition(name = "Settings", description = "General Settings", isMultiRow = false, ordinal = 0, dataShape = @ThingworxDataShapeDefinition( fields = { @com.thingworx.metadata.annotations.ThingworxFieldDefinition(name="updateRate", description="Update rate", baseType="NUMBER", aspects={"defaultValue:60000"}), @com.thingworx.metadata.annotations.ThingworxFieldDefinition(name="enabled", description="Automatically enable timer on startup", baseType="BOOLEAN", aspects={"defaultValue:true"}), @com.thingworx.metadata.annotations.ThingworxFieldDefinition(name="runAsUser", description="User context in which to run event handlers", baseType="USERNAME") })) }) public class TimerTS { // private static Logger _logger = LogUtilities.getInstance().getApplicationLogger(TimerTS.class); public TimerTS() { // TODO Auto-generated constructor stub } @ThingworxServiceDefinition(name = "OnTimerTick", description = "Called by timer each time the it is triggered ...", category = "Timer", isAllowOverride = true ) @ThingworxServiceResult(name = "Result", description = "", baseType = "NOTHING", aspects = {}) public void OnTimerTick( @ThingworxServiceParameter(name = "Timestamp", description = "\t", baseType = "DATETIME") DateTime Timestamp) { } }
Solved! Go to Solution.
On the second thought it looks like I found a workable solution -- you can define configuration via in the metadata / entity XML where you reference your class name. The easiest way to do this would be to add it on some dummy thing shape in the Composer, then export it for source control, pick ConfigurationTableDefinitions / ConfigurationTables blocks from this XML file and paste it into your XML where you define ThingShapes (metadata.xml in my case, even though it's not recommended).
I've just tried it in 8.4.3 -- and it worked, my Java thing shape got a configuration.
/ Constantine
Hi @atondorf.
Which version of ThingWorx are you running? It appears this issue was corrected in ThingWorx 8.4.4.
Regards.
--Sharon
Hi Sharon,
we have 8.4.4 and after your comment I tested it with a ThingShape created in the Composer .. it's working.
But still not with my shape created as a JavaExtension in Eclipse. So there must be something wrong with the source code. But it is just blank code created by the eclipse thingworx assistant.
Hi @atondorf.
These guides may help in determining the cause of your issue:
Create a Mashup Widget Extension
Regards.
--Sharon
Hi Sharon,
thanks a lot, but I already know these tutorials and I followed them. That's how I get this far, but like most documentation on thingworx, these are on a very basic level. If you go deeper into some details you will mostly hit the wall.
In my special case I want to add the ConfigurationTable to a ThingShape and I already did it in Eclipse, but it does not show up in Thingworx. So there must be something missing in code or the Eclipse Plugin does not do the job correclty.
Greetings
Andreas
Hello,
Just a thought -- what if you try to inherit from Thing or ThingShape class?
/ Constantine
Dear Constantine,
is there a Java ThingShape Class??
The eclipse plugin implements ThingShapes as Baseclass without any base class.
Greetings
Andreas
Hello Andreas,
There are com.thingworx.thingshape.ThingShape and com.thingworx.things.Thing classes. Without a better solution I just suggested doing a quick check to see if inheriting one of those might help in your situation.
/ Constantine
Dear Constantine,
sorry was quite busy with other stuff, but right now back to my issue...
I tried your suggestion and I created an Test Project in Eclipse that has two classes:
1) a shape:
package test.extension;
import com.thingworx.metadata.annotations.ThingworxConfigurationTableDefinition;
import com.thingworx.metadata.annotations.ThingworxConfigurationTableDefinitions;
import com.thingworx.metadata.annotations.ThingworxDataShapeDefinition;
import com.thingworx.metadata.annotations.ThingworxFieldDefinition;
import com.thingworx.thingshape.ThingShape;
@ThingworxConfigurationTableDefinitions(tables = {
@ThingworxConfigurationTableDefinition(name = "Settings", description = "General Settings", isMultiRow = false, ordinal = 0, dataShape = @ThingworxDataShapeDefinition(fields = {
@ThingworxFieldDefinition(name = "name", description = "", baseType = "STRING", ordinal = 0),
@ThingworxFieldDefinition(name = "enabled", description = "", baseType = "BOOLEAN", ordinal = 1, aspects = {"defaultValue:false" })})) })
public class TestJavaConfigThingTS extends ThingShape {
public TestJavaConfigThingTS() {
// TODO Auto-generated constructor stub
}
}
2) a template:
package test.extension;
import com.thingworx.metadata.annotations.ThingworxBaseTemplateDefinition;
import com.thingworx.metadata.annotations.ThingworxConfigurationTableDefinition;
import com.thingworx.metadata.annotations.ThingworxConfigurationTableDefinitions;
import com.thingworx.metadata.annotations.ThingworxDataShapeDefinition;
import com.thingworx.metadata.annotations.ThingworxFieldDefinition;
import com.thingworx.things.Thing;
@ThingworxBaseTemplateDefinition(name = "GenericThing")
@ThingworxConfigurationTableDefinitions(tables = {
@ThingworxConfigurationTableDefinition(name = "Settings", description = "General Settings", isMultiRow = false, ordinal = 0, dataShape = @ThingworxDataShapeDefinition(fields = {
@ThingworxFieldDefinition(name = "name", description = "\t\t", baseType = "STRING", ordinal = 0),
@ThingworxFieldDefinition(name = "enabled", description = "", baseType = "BOOLEAN", ordinal = 1, aspects = {"defaultValue:false" }) })) })
public class TestJavaConfigThingTT extends Thing {
public TestJavaConfigThingTT() {
// TODO Auto-generated constructor stub
}
}
Both should have the same Configuration settings and I created them using the Eclipse-Plugin. This plugin does not add the base class ThingShape for ThingShapes and so I added this manually.
Everything compiles well and also the import was without any issu, but ...
The Configuration of the Template shows up in Thingworx as expected. The config of the ThingShape does not!
So there must be something wrong or missing in the code created by the eclipse wizards.
Greetings
Andreas
Hello Andreas,
I'm sorry it didn't help. To me it looks like it's time to contact tech support.
Regards,
Constantine
Hi @atondorf.
Were you able to find a solution to your problem? If so, we encourage you to post it here for the benefit of others on the community.
Regards.
--Sharon
No solution, yet ... do you have any idea?
On the second thought it looks like I found a workable solution -- you can define configuration via in the metadata / entity XML where you reference your class name. The easiest way to do this would be to add it on some dummy thing shape in the Composer, then export it for source control, pick ConfigurationTableDefinitions / ConfigurationTables blocks from this XML file and paste it into your XML where you define ThingShapes (metadata.xml in my case, even though it's not recommended).
I've just tried it in 8.4.3 -- and it worked, my Java thing shape got a configuration.
/ Constantine
Dear Constantine,
thanks for the idea. I also tried it and it's working for me, too.
PTC please add some more details on this (and much other stuff) to the documentation.
Greetings
Andreas
Hi @atondorf.
Did you review this documentation available in the Help Center?
If you can provide a list of elements/concepts for which documentation is needed, I will be happy to open an internal case.
Regards.
--Sharon
Hi @atondorf.
If Constantine's last response resolved your issue, please mark it as the Accepted Solution for the benefit of others on the community.
Regards.
--Sharon