[help] property descriptor and readibility gates

7 posts / 0 new
Last post
atao
Offline
Joined: 10/15/2008
[help] property descriptor and readibility gates

Hello,

In a wizard step I have a model with an entity property "job" (see below).

When I define this property  with an attribute "writabilityGates", everything works as expected.

But when I replace "writabilityGates" by "readabilityGates", then the property "job" is always readable and writable, whatever the state of the gates.

Any idea?

Pierre

=============================

  <bean
    id="getOtherDataForContractPeriodWizardStep"
    parent="wizardStep"
    >
    <property name="onEnterAction">
      <bean class="org.popsuite.hr.backend.action.CheckContractPeriodTypeAction">
        <property name="descriptors">
          <list>
            <ref bean="WorkPeriod"/>
          </list>
        </property>
      </bean>
    </property>
    <property name="viewDescriptor">
      <bean
        parent="compView">
        <property name="modelDescriptor">
          <bean parent="dateIntervalComponent">
            <property name="propertyDescriptors" >
              <list merge="true">
                <bean parent="booleanType"
                  p:name="isWorkPeriod" />
                <bean parent="refType"
                  p:referencedDescriptor-ref="Job"
                  >
                  <property name="name">
                    <util:constant static-field="org.popsuite.hr.backend.action.GetJobFromContextActionHelper.JOB"/>
                  </property> 
                  <property name="writabilityGates">
                    <list>
                      <bean class="org.jspresso.framework.binding.model.BooleanPropertyModelGate"
                            p:accessorFactory-ref="accessorFactory"
                            p:propertyName="isWorkPeriod" />
                    </list>
                  </property>
                </bean>
              </list>
            </property>
          </bean>
        </property> 
      </bean>
    </property>
  </bean>

vvandens
Offline
Joined: 05/29/2008
[help] property descriptor and readibility gates

Hi Pierre,

See this post about readabilityGates. It is still in the code but should not be used as it is not correctly implemented. If you need a dynamic UI based on arbitrary business rules, you can certainly use a card view. Take a look at AbstractCardViewDescriptor and its concrete subclasses.

 

HTH,

Vincent

Marc
Offline
Joined: 07/08/2009
Pierre, se previous forum

Pierre,

se previous forum item: http://www.jspresso.org/forum/bug-readabilitygate-does-not-seem-work

What is your use case?

Regards,

Marc

atao
Offline
Joined: 10/15/2008
[help] property descriptor and readibility gatesV

Vincent,

I tried cardView, but then I got an exception. See below.

Did I miss something?

Regards

Pierre

PS

Each of WorkPeriod, LeavePeriod and StrikePeriod beans is associated with a class of same name. The three classes are derived from a ContratPeriod class.

=============================================

  <bean
    id="contractPeriodEditFrontAction"
    parent="abstractCollectionAction">
    <property name="name"          value="open.edit.action.name" />
    <property name="description"   value="open.edit.action.tip" />
    <property name="iconImageURL"
        value="classpath:org/jspresso/framework/application/images/view-48x48.png" />
    <property name="nextAction">
      <bean parent="editComponentAction">
        <property name="viewDescriptor">
          <bean
            parent="entityCardView">
            <property name="viewDescriptors">
              <list>
                <bean parent="compView">
                  <property name="modelDescriptor" ref="WorkPeriod" />
                </bean>
                <bean parent="compView">
                  <property name="modelDescriptor" ref="LeavePeriod" />
                </bean>
                <bean parent="compView">
                  <property name="modelDescriptor" ref="StrikePeriod" />
                </bean>
              </list>
            </property>
          </bean>   
        </property>
      </bean>
    </property>
  </bean>

java.lang.NullPointerException
    at org.jspresso.framework.application.frontend.action.std.EditComponentAction.execute(EditComponentAction.java:89)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.executeFrontend(AbstractFrontendController.java:912)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.execute(AbstractFrontendController.java:338)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.execute(DefaultSwingController.java:299)
    at org.jspresso.framework.application.action.AbstractAction.execute(AbstractAction.java:113)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.executeFrontend(AbstractFrontendController.java:912)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.execute(AbstractFrontendController.java:338)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.execute(DefaultSwingController.java:299)
    at org.jspresso.framework.view.swing.SwingActionFactory$ActionAdapter.actionPerformed(SwingActionFactory.java:134)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at org.jvnet.substance.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:109)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
    at java.awt.Component.processMouseEvent(Component.java:6263)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6028)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at org.jspresso.framework.util.swing.WaitCursorEventQueue.dispatchEvent(WaitCursorEventQueue.java:56)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
    at java.awt.Dialog$1.run(Dialog.java:1045)
    at java.awt.Dialog$3.run(Dialog.java:1097)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Dialog.show(Dialog.java:1095)
    at java.awt.Component.show(Component.java:1563)
    at java.awt.Component.setVisible(Component.java:1515)
    at java.awt.Window.setVisible(Window.java:841)
    at java.awt.Dialog.setVisible(Dialog.java:985)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.displayModalDialog(DefaultSwingController.java:189)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.displayModalDialog(DefaultSwingController.java:105)
    at org.jspresso.framework.application.frontend.action.ModalDialogAction.execute(ModalDialogAction.java:99)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.executeFrontend(AbstractFrontendController.java:912)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.execute(AbstractFrontendController.java:338)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.execute(DefaultSwingController.java:299)
    at org.jspresso.framework.application.action.AbstractAction.execute(AbstractAction.java:113)
    at org.jspresso.framework.application.frontend.action.std.EditComponentAction.execute(EditComponentAction.java:94)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.executeFrontend(AbstractFrontendController.java:912)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.execute(AbstractFrontendController.java:338)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.execute(DefaultSwingController.java:299)
    at org.jspresso.framework.application.action.AbstractAction.execute(AbstractAction.java:113)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.executeFrontend(AbstractFrontendController.java:912)
    at org.jspresso.framework.application.frontend.controller.AbstractFrontendController.execute(AbstractFrontendController.java:338)
    at org.jspresso.framework.application.frontend.controller.swing.DefaultSwingController.execute(DefaultSwingController.java:299)
    at org.jspresso.framework.view.swing.SwingActionFactory$ActionAdapter.actionPerformed(SwingActionFactory.java:134)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at org.jvnet.substance.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:109)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
    at java.awt.Component.processMouseEvent(Component.java:6263)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6028)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at org.jspresso.framework.util.swing.WaitCursorEventQueue.dispatchEvent(WaitCursorEventQueue.java:56)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

 

atao
Offline
Joined: 10/15/2008
[help] property descriptor and readibility gates

Hello,

After updating jspresso, I still get the same NPE, this time from AbstractEditComponentAction. But in fact it's the same code.

The actual issue is about the null value provided by the cardViewDescriptor as modelDescriptor. To call createModelConnector, a valid modelDexcriptor is needed. So I replaced

    IValueConnector componentConnector = getBackendController(context)
        .createModelConnector(ACTION_MODEL_NAME,
            getViewDescriptor(context).getModelDescriptor());

by

    IModelDescriptor modelDescriptor = null;
    if (getViewDescriptor(context) instanceof ICardViewDescriptor) {
        ICardViewDescriptor  cvd = (ICardViewDescriptor) getViewDescriptor(context);
        String cardName = cvd.getCardNameForModel(component, null);
        IViewDescriptor vd = cvd.getCardViewDescriptors().get(cardName);
        modelDescriptor = vd.getModelDescriptor();
    } else {
        modelDescriptor = getViewDescriptor(context).getModelDescriptor();
    }
   
    IValueConnector componentConnector = getBackendController(context)
        .createModelConnector(ACTION_MODEL_NAME, modelDescriptor);

I'm not sure it's the right solution, but at least it works.

Pierre

vvandens
Offline
Joined: 05/29/2008
[help] property descriptor and readibility gates

Hi Pierre.

I've applied your patch. Thanks !

 

Vincent

atao
Offline
Joined: 10/15/2008
[help] property descriptor and readibility gates

Vincent,

It works fine. Thanks.

Pierre