0

I'm quite new to Apache ISIS, and I'm trying to add a custom wicket component by extending ScalarPanelAbstract.

I have a method accepting a pageable parameter. The pageable is an interface that consists Page number and Page size.

//region > findAllWithPage (action)
    @Action(semantics = SemanticsOf.SAFE)
    public PagedList<Employee> findAllWithPage(
            @Parameter(optionality = Optionality.OPTIONAL)
            final Pageable pageable) {

        return employeeRepository.findByOwner(userTenancyService.owner(), pageable);
    }
//endregion

This is what it looks like when you use the action findAllWithPage. It only has one argument which is the pageable.


Now, what I'm trying to do is to make it accept two arguments, Page number and Page size.

My problem is, I could not get the the value of the two textfields. This is the error that I got.

org.apache.wicket.WicketRuntimeException: Method onRequest of interface org.apache.wicket.behavior.IBehaviorListener targeted at org.apache.wicket.ajax.markup.html.form.AjaxButton$1@c6dc7e3 on component [AjaxButton [Component id = okButton]] threw an exception
 at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:268)
 at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)
 at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:250)
 at org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:236)
 at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:890)
 at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
 at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:261)
 at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:218)
 at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:289)
 at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259)
 at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
 at org.apache.wicket.protocol.http.WicketServlet.doPost(WicketServlet.java:159)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
 at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685)
 at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
 at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
 at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
 at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
 at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
 at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
 at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)
 at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
 at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
 at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
 at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
 at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
 at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
 at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
 at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
 at org.eclipse.jetty.server.Server.handle(Server.java:517)
 at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
 at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
 at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
 at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
 at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
 at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
 at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
 at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
 at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
 at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:483)
 at org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
 ... 44 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:483)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract.invokeMethodElseFromCache(ActionInvocationFacetForDomainEventAbstract.java:408)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract$2.execute(ActionInvocationFacetForDomainEventAbstract.java:262)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract$2.execute(ActionInvocationFacetForDomainEventAbstract.java:223)
 at org.apache.isis.applib.services.iactn.Interaction.executeInternal(Interaction.java:173)
 at org.apache.isis.applib.services.iactn.Interaction.execute(Interaction.java:143)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract.doInvoke(ActionInvocationFacetForDomainEventAbstract.java:311)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract$1.execute(ActionInvocationFacetForDomainEventAbstract.java:165)
 at org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:143)
 at org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:133)
 at org.apache.isis.core.runtime.services.persistsession.PersistenceSessionServiceInternalDefault.executeWithinTransaction(PersistenceSessionServiceInternalDefault.java:179)
 at org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract.invoke(ActionInvocationFacetForDomainEventAbstract.java:161)
 at org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault.executeInternal(ObjectActionDefault.java:398)
 at org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault.execute(ObjectActionDefault.java:387)
 at org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault.executeWithRuleChecking(ObjectActionDefault.java:368)
 at org.apache.isis.viewer.wicket.model.models.ActionModel.executeAction(ActionModel.java:483)
 at org.apache.isis.viewer.wicket.model.models.ActionModel.load(ActionModel.java:462)
 at org.apache.isis.viewer.wicket.model.models.ActionModel.load(ActionModel.java:80)
 at org.apache.wicket.model.LoadableDetachableModel.getObject(LoadableDetachableModel.java:124)
 at org.apache.isis.viewer.wicket.model.models.ActionModel.executeHandlingApplicationExceptions(ActionModel.java:568)
 at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionOnTargetAndProcessResults(ActionPanel.java:255)
 at org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeAndProcessResults(ActionPanel.java:204)
 at org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel$ActionParameterForm$1.onSubmit(ActionParametersFormPanel.java:148)
 at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:108)
 at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$AjaxFormSubmitter.onSubmit(AjaxFormSubmitBehavior.java:215)
 at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1305)
 at org.apache.wicket.markup.html.form.Form.process(Form.java:966)
 at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:788)
 at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:171)
 at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:146)
 at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:641)
 ... 49 more

HMTL:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:wicket="http://wicket.apache.org">
    <body>
        <wicket:panel>
            <div class="PageablePanel scalarNameAndValueComponentType">
                <div class="form-group" wicket:id="scalarIfRegular">
                    <label wicket:id="scalarName" class="scalarName control-label mandatory">[Label text]</label>
                    <span class="scalarValueWrapper">
                        <span class="uploadFile help-block">
                           <input type="text" class="form-control input-sm" name="scalarValue" wicket:id="scalarValue" />
                        </span>
                    </span>

                    <label wicket:id="scalarName1" class="scalarName control-label mandatory">[Label text]</label>
                    <span class="scalarValueWrapper">
                        <span class="uploadFile help-block">
                           <input type="text" class="form-control input-sm" name="scalarValue1" wicket:id="scalarValue1" />
                        </span>
                        <a wicket:id="scalarIfRegularClear" class="btn btn-primary btn-sm"><span class="clearTitle">Clear</span></a>
                        <span wicket:id="feedback" class="help-block"></span>
                        <span wicket:id="associatedActionLinksBelow"></span>
                    </span>
                    <span wicket:id="associatedActionLinksRight"></span>
                </div>
                <span wicket:id="scalarIfCompact"> </span>
            </div>
        </wicket:panel>
    </body>
</html>

On PageablePanelAbstract.java which extends ScalarPanelAbstract, there are three methods that is being overridden:

  • addComponentForRegular();
  • addComponentForCompact();
  • addFormComponentBehavior();

PageablePanelAbstract.java

public abstract class PageablePanelAbstract<T extends NamedWithMimeType & Serializable> extends ScalarPanelAbstract {

    private static final long serialVersionUID = 1L;
    @SuppressWarnings("unused")
    private static final Logger LOG = LoggerFactory.getLogger(PageablePanelAbstract.class);
    private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
    private static final String ID_SCALAR_IF_REGULAR_CLEAR = "scalarIfRegularClear";
    private static final String ID_SCALAR_NAME = "scalarName";
    private static final String ID_SCALAR_VALUE = "scalarValue";
    private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";

    private static final String PAGE_SIZE = "Page Size";
    private static final String PAGE_NUMBER = "Page Number";
    private TextField<T> textField;
    private TextField<T> textField2;

    protected WebMarkupContainer scalarTypeContainer;

    public PageablePanelAbstract(String id, ScalarModel scalarModel) {
        super(id, scalarModel);
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();

        scalarTypeContainer = new WebMarkupContainer(ID_SCALAR_IF_REGULAR);
        scalarTypeContainer.add(new CssClassAppender(getScalarPanelType()));
        addOrReplace(scalarTypeContainer);
    }

    @Override
    protected FormGroup addComponentForRegular() {

        textField = createTextField(ID_SCALAR_VALUE);
        textField.setLabel(Model.of(getModel().getName()));
        textField.setRequired(getModel().isRequired());

        textField2 = createTextField("scalarValue1");
        textField2.setLabel(Model.of(getModel().getName()));
        textField2.setRequired(getModel().isRequired());

        final FormGroup labelIfRegularTextField = new FormGroup(ID_SCALAR_IF_REGULAR, textField);
        labelIfRegularTextField.add(textField);
        labelIfRegularTextField.add(textField2);

        final Label scalarNameTextField = new Label(ID_SCALAR_NAME, PAGE_NUMBER);
        labelIfRegularTextField.add(scalarNameTextField);

        final Label scalarNameTextField1 = new Label("scalarName1", PAGE_SIZE);
        labelIfRegularTextField.add(scalarNameTextField1);

        // find the links...
        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());

        addPositioningCssTo(labelIfRegularTextField, entityActions);

        addOrReplace(labelIfRegularTextField);
        addFeedbackOnlyTo(labelIfRegularTextField, textField);
        addEditPropertyTo(labelIfRegularTextField);

        // ... add entity links to panel (below and to right)
        addEntityActionLinksBelowAndRight(labelIfRegularTextField, entityActions);

        return labelIfRegularTextField;
    }

    @Override
    protected Component addComponentForCompact() {
        final MarkupContainer scalarIfCompact = new WebMarkupContainer(ID_SCALAR_IF_COMPACT);
        addOrReplace(scalarIfCompact);
        return scalarIfCompact;
    }

    @Override
    protected void addFormComponentBehavior(Behavior behavior) {
        textField.add(behavior);
    }

    protected void onBeforeRenderWhenViewMode() {
        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
    }

    protected void onBeforeRenderWhenDisabled(final String disableReason) {
        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
    }

    protected void onBeforeRenderWhenEnabled() {
        updateRegularFormComponents(InputFieldVisibility.VISIBLE);
    }

    @SuppressWarnings("unchecked")
    private T getText(final ScalarModel model) {
        ObjectAdapter adapter = model.getObject();
        return adapter != null ? (T) adapter.getObject() : null;
    }

    private void updateRegularFormComponents(final InputFieldVisibility visibility) {
        MarkupContainer formComponent = (MarkupContainer) getComponentForRegular();
        formComponent.get(ID_SCALAR_VALUE).setVisible(visibility == InputFieldVisibility.VISIBLE);

        updateClearLink(visibility);

    }

    private void updateClearLink(InputFieldVisibility visibility) {
        final MarkupContainer formComponent = (MarkupContainer) getComponentForRegular();
        formComponent.setOutputMarkupId(true); // enable ajax link

        final AjaxLink<Void> ajaxLink = new AjaxLink<Void>(ID_SCALAR_IF_REGULAR_CLEAR) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                setEnabled(false);
                ScalarModel model = PageablePanelAbstract.this.getModel();
                model.setObject(null);
                target.add(formComponent);
                // target.add(fileNameLabel);
            }
        };
        ajaxLink.setOutputMarkupId(true);
        formComponent.addOrReplace(ajaxLink);

        final T txt = getTextFromModel();
        formComponent.get(ID_SCALAR_IF_REGULAR_CLEAR).setVisible(txt != null && visibility == InputFieldVisibility.VISIBLE);
    }

    private T getTextFromModel() {
        return getText(getModel());
    }

    protected enum InputFieldVisibility {
        VISIBLE, NOT_VISIBLE
    }

    protected TextField<T> createTextField(final String componentId) {

        return new TextField<>(componentId, newTextFieldValueModel());
        // return (TextField) textField;
    }

    protected TextFieldValueModel<T> newTextFieldValueModel() {
        return new TextFieldValueModel<>(this);
    }

    protected abstract IModel<String> getScalarPanelType();
}

Any idea on which of these methods I could manipulate to get the value of the two textfields? Thanks.

Arjun
  • 41
  • 1
  • 9
  • Please show us the code of the new/non-working method. Isn't there another exception or at least "Caused by" of this one ? – martin-g Feb 22 '17 at 14:13
  • @martin-g I've updated my question, hope it helps. Thanks. – Arjun Feb 23 '17 at 01:32
  • Could you please share the source code of PageablePanelAbstract.java too ? `addComponentForRegular()` constructs the Wicket component tree for `edit` mode, `addComponentForCompact()` - for `view` mode. – martin-g Feb 24 '17 at 07:52
  • @martin-g I've updated my post providing the code for **PageablePanelAbstract.java**, I'm really new to adding wicket and only has a vague idea on how this works. Thanks in advance for your help martin. – Arjun Feb 27 '17 at 00:26
  • Can I ask, what is the user goal you are trying to support here? I'm just wondering if there's a better way without implementing a custom component? Or, if it's a legitimate and common use case, then maybe we should add in support into the framework directly.? – Dan Haywood Mar 25 '17 at 11:30

0 Answers0