我正在尝试升级应用程序一部分的代码质量,该部分可以显示动态Form
中的数据,这些数据是通过转换为对象的XML字符串配置的。到目前为止,我仅使用自定义方法进行解析和序列化,几乎自己编写了XML的每一行。显然这是错误的方法,由于我对Codename One非常熟悉,因此我完全理解它。
所以我重写了对象以使用PropertyBusinessObject
接口,这是生成的类:
public class CForm implements PropertyBusinessObject
{
Property<String, CForm> type = new Property<>("type");
Property<String, CForm> label = new Property<>("label");
IntProperty<CForm> currentStep = new IntProperty<>("currentstep");
IntProperty<CForm> maxsteps = new IntProperty<>("maxsteps");
ListProperty<CFormField, CForm> fields = new ListProperty<>("fields", CFormField.class);
ListProperty<CFormStep, CForm> steps = new ListProperty<>("steps", CFormStep.class);
public CForm()
{
}
PropertyIndex index;
@Override
public PropertyIndex getPropertyIndex()
{
if(index == null)
index = new PropertyIndex(this, "CForm",
new PropertyBase[] {type, label, currentStep, maxsteps, fields, steps});
return index;
}
}
该类是主要的类,描述了过程的一般结构。内部使用类型和标签来标识所使用的模型以及在客户所在地进行的工作。字段是将在每个步骤中显示的动态字段,它们是全局字段,例如备注等。这些步骤是不同的动态Form
,它们将显示给用户。 maxSteps
和currentStep
用于了解用户在流程中的位置。
public class CFormStep implements PropertyBusinessObject
{
Property<String, CFormStep> name = new Property<String, CFormStep>("name");
Property<String, CFormStep> label = new Property<String, CFormStep>("label");
IntProperty<CFormStep> value = new IntProperty<CFormStep>("value");
ListProperty<CFormField, CFormStep> fields = new ListProperty<>("fields", CFormField.class);
public CFormStep() {}
PropertyIndex index;
@Override
public PropertyIndex getPropertyIndex()
{
if(index == null)
index = new PropertyIndex(this, "CFormStep",
new PropertyBase[] { label, name, value, fields});
return index;
}
}
每个步骤都用唯一的名称,用作动态表单标题的标签和在CForm
中对步骤进行排序的值来描述。像它的CForm
父项一样,它具有一组字段。
public class CFormField implements PropertyBusinessObject
{
Property<String, CFormField> label = new Property<String, CFormField>("label");
Property<String, CFormField> name = new Property<String, CFormField>("name");
Property<String, CFormField> type = new Property<String, CFormField>("type");
Property<String, CFormField> value = new Property<String, CFormField>("value");
Property<String, CFormField> parent = new Property<String, CFormField>("parent");
public CFormField() {}
PropertyIndex index;
@Override
public PropertyIndex getPropertyIndex()
{
if(index == null)
index = new PropertyIndex(this, "CFormField",
new Property[] { label, name, type, value, parent });
return index;
}
}
这些字段由标签,唯一名称,用于定义将用于呈现它的组件的类型,用户选择的值格式为String以及最后的可选父名称组成。
旧的实现是功能性的,但是又很落后并且很难发展,这就是为什么我来写这个新的实现。
但是我遇到了一个问题:PropertyIndex.fromXML(Element e)
已经退缩了,因为它在调用
public void fromXml(Element e) {
Hashtable atts = e.getAttributes();
for(Object a : atts.keySet()) { <--- NPE there if no attributes
,并且不支持ListProperties
。
从XML读取我的CForm
可以正常工作,但是当我尝试将其序列化回XML时,我得到了一个<CForm><CForm/>
,但并不完全了解PropertyXMLElement
的工作原理...我已经调试了该过程,并且PropertyBusinessObject
根本不是空的。关于如何用这些值填充XML的任何想法吗?
以下是使用的XML的示例:
<CForm>
<type>delivery-install</type>
<label>Intervention Test</label>
<currentstep/>
<maxsteps>3</maxsteps>
<fields>
<CFormField>
<label>Remarques</label>
<name>globalTEXTAREA6</name>
<type>TEXTAREA</type>
<value/>
</CFormField>
</fields>
<steps>
<CFormStep>
<name>step1</name>
<label>Arrivée sur place</label>
<value>1</value>
<fields>
<CFormField>
<label>Heure d'arrivée</label>
<name>step1TIME3</name>
<type>TIME</type>
<value/>
</CFormField>
</fields>
</CFormStep>
<CFormStep>
<name>step2</name>
<label>Sur place</label>
<value>2</value>
<fields>
<CFormField>
<label>Produits livrés / utilisés</label>
<name>step2PRODUCTTABLE7</name>
<type>PRODUCTTABLE</type>
<value/>
</CFormField>
</fields>
</CFormStep>
<CFormStep>
<name>step3</name>
<label>Départ</label>
<value>3</value>
<fields>
<CFormField>
<label>Heure de départ</label>
<name>step3TIME4</name>
<type>TIME</type>
<value/>
</CFormField>
<CFormField>
<label>Signature client</label>
<name>step3SIGN5</name>
<type>SIGN</type>
<value/>
</CFormField>
</fields>
</CFormStep>
</steps>
</CForm>
答案 0 :(得分:1)
属性业务对象中的XML支持仍在开发中,这就是为什么我没有写博客的原因。我修复了NPE问题,并增加了对列表属性的支持,以解决提出的两个问题。注意,我这样做只是为了阅读,所以编写这些对象可能会出现问题,因为我们没有时间对此功能进行质量检查。