Author: objectiser
Date: 2008-07-17 10:54:11 -0400 (Thu, 17 Jul 2008)
New Revision: 183
Modified:
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SetStateAction.java
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/test/org/jboss/tools/overlord/jbossesb/model/actions/SetStateActionTest.java
Log:
Enhanced validation of 'variable' property on the SetStateAction to accommodate
navigation of bean properties expressed as a dot notation. Also validates that the
properties are read or writable as appropriate.
Modified:
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties
===================================================================
---
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties 2008-07-17
13:25:20 UTC (rev 182)
+++
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/Messages.properties 2008-07-17
14:54:11 UTC (rev 183)
@@ -25,12 +25,15 @@
_MUST_DEFINE_SINGLE_WHILE_PATH=While action must have a single 'while' path
_MUST_DEFINE_SINGLE_WHILE_EXIT=While action must have a single 'exit' path
_MUST_INITIATE_ROOT=Must 'initiate' root service descriptor for category
'{0}' and name '{1}'
-_NOT_FOUND_VARIABLE=Variable '{0}' could not be found on session type
'{1}'
+_NOT_FOUND_VARIABLE=Variable '{0}' could not be found on class '{1}'
+_NOT_FOUND_VARIABLE_PROPERTY=Variable '{0}' contains property '{1}' that
could not be found on class '{2}'
_NOT_FOUND_PERFORM_CREATE_SESSION=Perform action can only invoke a service descriptor
that starts with a CreateSessionAction
+_NOT_READABLE_PROPERTY=Property '{0}' on class '{1}' is not readable
_NOT_SPECIFIED_CONVERSATION_TYPE=Conversation type must be specified on root service
descriptor
_NOT_SPECIFIED_CONVERSATION_TYPE_ROLE=Conversation type '{0}' must specify a role
name following the '@' symbol
_NOT_SPECIFIED_PROPERTY=Property '{0}' must be specified
_NOT_SPECIFIED_REQ_RESP_EPR=Send does not contain request service category/name or
response client EPR
+_NOT_WRITABLE_PROPERTY=Property '{0}' on class '{1}' is not writable
_MUST_BE_FIRST_ACTION='{0}' action must be first in the service descriptor
_MUST_SPECIFY_STATE_OR_MESSAGE_EXPRESSION=Must specify either a State OR Message based
expression
_PARALLEL_MORE_THAN_TWO_PATHS=Parallel action must specify two or more paths
Modified:
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SetStateAction.java
===================================================================
---
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SetStateAction.java 2008-07-17
13:25:20 UTC (rev 182)
+++
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/java/org/jboss/tools/overlord/jbossesb/model/actions/SetStateAction.java 2008-07-17
14:54:11 UTC (rev 183)
@@ -87,33 +87,69 @@
// Check that variable defined on session class
Class<?> cls=getService().getSessionClass();
- if (cls != null) {
- try {
- java.beans.BeanInfo bi=java.beans.Introspector.getBeanInfo(cls);
-
- boolean f_found=false;
-
- java.beans.PropertyDescriptor[] pds=bi.getPropertyDescriptors();
-
- for (int i=0; f_found==false && pds != null &&
- i < pds.length; i++) {
- if (pds[i].getName().equals(variable)) {
- f_found = true;
+ java.util.StringTokenizer st=new java.util.StringTokenizer(variable, ".");
+
+ while (st.hasMoreTokens()) {
+ String token=st.nextToken();
+
+ if (cls != null) {
+ try {
+ java.beans.BeanInfo bi=java.beans.Introspector.getBeanInfo(cls);
+
+ java.beans.PropertyDescriptor[] pds=bi.getPropertyDescriptors();
+ java.beans.PropertyDescriptor pd=null;
+
+ for (int i=0; pd == null && pds != null &&
+ i < pds.length; i++) {
+ if (pds[i].getName().equals(token)) {
+ pd = pds[i];
+ }
}
+
+ if (pd == null) {
+
+ if (variable.equals(token)) {
+ l.error(this, org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_FOUND_VARIABLE",
+ new String[]{variable, cls.getName()}), null);
+ } else {
+ l.error(this, org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_FOUND_VARIABLE_PROPERTY",
+ new String[]{variable, token, cls.getName()}), null);
+ }
+ } else if (st.hasMoreTokens()) {
+ // Check property can be read
+ if (pd.getReadMethod() == null) {
+ l.error(this, org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_READABLE_PROPERTY",
+ new String[]{pd.getName(), cls.getName()}), null);
+ }
+ } else {
+ // Check property can be written
+ if (pd.getWriteMethod() == null) {
+ l.error(this, org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_WRITABLE_PROPERTY",
+ new String[]{pd.getName(), cls.getName()}), null);
+ }
+ }
+
+ if (pd != null) {
+ cls = pd.getPropertyType();
+ }
+ } catch(Exception e) {
+ logger.log(java.util.logging.Level.SEVERE,
+ "Failed to check if variable '"+
+ variable+"' exists on session class '"+
+ cls+"'", e);
}
-
- if (f_found == false) {
- l.error(this, org.scribble.util.MessageUtil.format(
- java.util.PropertyResourceBundle.getBundle(
- "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
- "_NOT_FOUND_VARIABLE",
- new String[]{variable, cls.getName()}), null);
- }
- } catch(Exception e) {
- logger.log(java.util.logging.Level.SEVERE,
- "Failed to check if variable '"+
- variable+"' exists on session class '"+
- cls+"'", e);
}
}
}
Modified:
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/test/org/jboss/tools/overlord/jbossesb/model/actions/SetStateActionTest.java
===================================================================
---
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/test/org/jboss/tools/overlord/jbossesb/model/actions/SetStateActionTest.java 2008-07-17
13:25:20 UTC (rev 182)
+++
cdl/trunk/tools/plugins/org.jboss.tools.overlord.jbossesb/src/test/org/jboss/tools/overlord/jbossesb/model/actions/SetStateActionTest.java 2008-07-17
14:54:11 UTC (rev 183)
@@ -86,8 +86,8 @@
}
public void testValidateVariableIsClassProperty() {
- String varName="class";
- Class<?> cls=java.lang.Object.class;
+ String varName="writableProperty";
+ Class<?> cls=TestClass2.class;
TestESBService service=new TestESBService();
service.setRoot(true);
@@ -113,9 +113,105 @@
}
}
+ public void testValidateMultiPartVariableIsClassWritableProperty() {
+ String varName="testClass2.writableProperty";
+ Class<?> cls=TestClass1.class;
+
+ TestESBService service=new TestESBService();
+ service.setRoot(true);
+ service.setSessionClass(cls);
+
+ java.util.Map<String,String> props=new
java.util.Hashtable<String,String>();
+ props.put(SetStateAction.VARIABLE, varName);
+ props.put(SetStateAction.STATE_EXPRESSION, "");
+
+ org.w3c.dom.Element elem=ESBActionTestUtil.getAction(null,
+ props, null);
+
+ SetStateAction action=new SetStateAction(service, elem);
+
+ service.getActions().add(action);
+
+ TestModelListener l=new TestModelListener();
+
+ action.validate(l);
+
+ if (l.isValid() == false) {
+ fail(l.invalidMessage());
+ }
+ }
+
+ public void testValidateMultiPartVariableIsClassNotWritableProperty() {
+ String varName="testClass2.readableProperty";
+ Class<?> cls=TestClass1.class;
+
+ TestESBService service=new TestESBService();
+ service.setRoot(true);
+ service.setSessionClass(cls);
+
+ java.util.Map<String,String> props=new
java.util.Hashtable<String,String>();
+ props.put(SetStateAction.VARIABLE, varName);
+ props.put(SetStateAction.STATE_EXPRESSION, "");
+
+ org.w3c.dom.Element elem=ESBActionTestUtil.getAction(null,
+ props, null);
+
+ SetStateAction action=new SetStateAction(service, elem);
+
+ service.getActions().add(action);
+
+ TestModelListener l=new TestModelListener();
+
+ l.addExpectedError(org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_WRITABLE_PROPERTY",
+ new String[]{"readableProperty", TestClass2.class.getName()}));
+
+ action.validate(l);
+
+ if (l.isValid() == false) {
+ fail(l.invalidMessage());
+ }
+ }
+
+ public void testValidateMultiPartVariableIsClassNotReadableProperty() {
+ String varName="testClass2.writableProperty";
+ Class<?> cls=TestClass3.class;
+
+ TestESBService service=new TestESBService();
+ service.setRoot(true);
+ service.setSessionClass(cls);
+
+ java.util.Map<String,String> props=new
java.util.Hashtable<String,String>();
+ props.put(SetStateAction.VARIABLE, varName);
+ props.put(SetStateAction.STATE_EXPRESSION, "");
+
+ org.w3c.dom.Element elem=ESBActionTestUtil.getAction(null,
+ props, null);
+
+ SetStateAction action=new SetStateAction(service, elem);
+
+ service.getActions().add(action);
+
+ TestModelListener l=new TestModelListener();
+
+ l.addExpectedError(org.scribble.util.MessageUtil.format(
+ java.util.PropertyResourceBundle.getBundle(
+ "org.jboss.tools.overlord.jbossesb.model.actions.Messages"),
+ "_NOT_READABLE_PROPERTY",
+ new String[]{"testClass2", TestClass3.class.getName()}));
+
+ action.validate(l);
+
+ if (l.isValid() == false) {
+ fail(l.invalidMessage());
+ }
+ }
+
public void testValidateMissingExpression() {
- String varName="class";
- Class<?> cls=java.lang.Object.class;
+ String varName="writableProperty";
+ Class<?> cls=TestClass2.class;
TestESBService service=new TestESBService();
service.setRoot(true);
@@ -147,8 +243,8 @@
}
public void testValidateBothExpressions() {
- String varName="class";
- Class<?> cls=java.lang.Object.class;
+ String varName="writableProperty";
+ Class<?> cls=TestClass2.class;
TestESBService service=new TestESBService();
service.setRoot(true);
@@ -182,8 +278,8 @@
}
public void testValidateMessageExpression() {
- String varName="class";
- Class<?> cls=java.lang.Object.class;
+ String varName="writableProperty";
+ Class<?> cls=TestClass2.class;
TestESBService service=new TestESBService();
service.setRoot(true);
@@ -228,4 +324,33 @@
fail("Action is not flagged as a 'SessionBased'");
}
}
+
+ public class TestClass1 {
+ public TestClass1() {
+ }
+
+ public TestClass2 getTestClass2() {
+ return(null);
+ }
+ }
+
+ public class TestClass2 {
+ public TestClass2() {
+ }
+
+ public String getReadableProperty() {
+ return(null);
+ }
+
+ public void setWritableProperty(String str) {
+ }
+ }
+
+ public class TestClass3 {
+ public TestClass3() {
+ }
+
+ public void setTestClass2(TestClass2 tc2) {
+ }
+ }
}