मैं अपने ऐप के एक हिस्से की कोड गुणवत्ता को अपग्रेड करने का प्रयास कर रहा हूं जो गतिशील Form के भीतर डेटा प्रदर्शित कर सकता है जो किसी ऑब्जेक्ट में अनुवादित एक्सएमएल स्ट्रिंग के माध्यम से कॉन्फ़िगर किया गया है। अब तक, मैं केवल कस्टम विधियों के साथ पार्सिंग और क्रमबद्धता कर रहा था, लगभग एक्सएमएल की प्रत्येक पंक्ति को स्वयं लिख रहा था। यह स्पष्ट रूप से गलत दृष्टिकोण है और अब मैं इसे पूरी तरह से समझता हूं कि मैं कोडनेम वन से बहुत परिचित हूं।

इसलिए मैंने 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;
    }
}

प्रक्रिया की सामान्य संरचना का वर्णन करने वाला यह वर्ग मुख्य है। प्रकार और लेबल का उपयोग आंतरिक रूप से उपयोग किए गए मॉडल और ग्राहक के स्थान पर किए जाने वाले कार्य की पहचान करने के लिए किया जाता है। फ़ील्ड गतिशील फ़ील्ड हैं जो प्रत्येक चरण में दिखाए जाएंगे, ये वैश्विक फ़ील्ड हैं, जैसे टिप्पणियां या तो। चरण विभिन्न गतिशील Forms हैं जो उपयोगकर्ता को दिखाए जाएंगे। 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;
    }
}

फ़ील्ड एक लेबल, एक अद्वितीय नाम, यह परिभाषित करने के लिए उपयोग किया जाने वाला एक प्रकार है कि इसे प्रस्तुत करने के लिए किस घटक का उपयोग किया जाएगा, उपयोगकर्ता द्वारा चयनित मान को स्ट्रिंग के रूप में स्वरूपित किया गया है और अंत में यह वैकल्पिक मूल नाम है।

पुराना कार्यान्वयन कार्यात्मक था, लेकिन धीमा और विकसित करना कठिन था, यही वजह है कि मैं यह नया लिखने आया।

लेकिन मैं एक समस्या से फंस गया हूं: मैंने पहले ही PropertyIndex.fromXML(Element e) को फिर से लिखा है क्योंकि यह कॉल करते समय एनपीई बना रहा था

 public void fromXml(Element e) {
        Hashtable atts = e.getAttributes();
        for(Object a : atts.keySet()) { <--- NPE there if no attributes

और ListProperties का समर्थन नहीं कर रहा था।

एक्सएमएल से मेरा CForm पढ़ना ठीक काम करता है, लेकिन जब मैं इसे वापस एक्सएमएल में क्रमबद्ध करने का प्रयास करता हूं तो मुझे बस एक <CForm><CForm/> मिल जाता है और यह पूरी तरह से समझ में नहीं आता कि PropertyXMLElement कैसे काम करता है... मैंने पहले से ही प्रक्रिया को डीबग कर दिया है और PropertyBusinessObject बिल्कुल भी खाली नहीं है। एक्सएमएल को उन मूल्यों से कैसे भरें इस पर कोई विचार?

यहां इस्तेमाल किए गए एक्सएमएल का एक उदाहरण दिया गया है:

<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>
1
Gauvain Klug 12 फरवरी 2019, 17:22

1 उत्तर

सबसे बढ़िया उत्तर

संपत्ति व्यापार वस्तु में एक्सएमएल समर्थन अभी भी एक कार्य प्रगति पर है इसलिए मैंने इसके बारे में ब्लॉग नहीं किया। मैंने एनपीई मुद्दे को ठीक किया और उठाए गए दो मुद्दों को ठीक करने के लिए सूची गुणों के लिए समर्थन जोड़ा। ध्यान दें कि मैंने इसे केवल पढ़ने के लिए किया था, इसलिए इन वस्तुओं को लिखने में समस्या हो सकती है क्योंकि हमारे पास इस सुविधा पर क्यूए करने का समय नहीं था।

1
Shai Almog 14 फरवरी 2019, 03:05