Java.time.LocalDate and Wicket 7 DateTextField

I am trying to connect a Wicket component DateTextFieldwith a type property java.time.LocalDate.

Following the prompts in this answer , I tried to implement a custom CompoundPropertyModelone that contains a property java.time.LocalDate. I am using Wicket 7.6 and JDK 8.

I am new to Wicket and Java in general.

This is my code:

Class LocaldateModel

import java.time.*;
import java.util.Date;
import org.apache.wicket.model.IModel;

public class LocalDateModel implements IModel<Date>
{
    private static final long serialVersionUID = 7262517323706786573L;
    private IModel<LocalDate> localDateModel;

    public LocalDateModel(IModel<LocalDate> localDateModel)
    {
        this.localDateModel = localDateModel;
    }

    @Override
    public Date getObject()
    {
        return Date.from(localDateModel.getObject().atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    @Override
    public void setObject(Date object)
    {
        localDateModel.setObject(
                Instant.ofEpochMilli(object.getTime()).atZone(ZoneId.systemDefault()).toLocalDate());
    }

    @Override
    public void detach()
    {
        localDateModel.detach();
    }
}

Class LocalDateModelButAlsoWrapping

import java.time.Localdate;
import java.util.Date;

public class LocalDateModelButAlsoWrapping<T> extends LocalDateModel implements IWrapModel<Date>
{
    private static final long serialVersionUID = -8539316259078354206L;

    private IModel<Date> dateModel;

    public LocalDateModelButAlsoWrapping(IModel<LocalDate> localDateModel)
    {
        super(localDateModel);
        LocalDate localDate=localDateModel.getObject();
        dateModel.setObject(Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
    }

    @Override
    public IModel<Date> getWrappedModel()
    {
        return dateModel;
    }

    @Override
    public void setObject(Date object)
    {
       dateModel.setObject(object);
    }
}

Class MyLocalDateCompoundPropertyModel

import java.time.Localdate;
import org.apache.wicket.Component;
import org.apache.wicket.model.*;

public class MyLocalDateCompoundPropertyModel<T> extends CompoundPropertyModel<T>
{
    private static final long serialVersionUID = 7112056989820105247L;

    public MyLocalDateCompoundPropertyModel(IModel<T> model)
    {
        super(model);
    }

    public MyLocalDateCompoundPropertyModel(T object)
    {
        super(object);
    }

    @Override
    public <T> IWrapModel<T> wrapOnInheritance(Component component)
    {
        IWrapModel<T> actualModel;
        actualModel = super.wrapOnInheritance(component);

        if (actualModel.getObject() instanceof LocalDate)
        {
            return new LocalDateModelButAlsoWrapping(actualModel);
        }
        else
        {
            return actualModel;
        }
    }
}

Class with LocalDate Property

import java.time.Localdate;

public class CustomerUI implements Serializable
{
    private static final long serialVersionUID = -4071467669346190367L;

    private CustomerDTO customer;

    public LocalDate getActiveUntil()
    {
        return customer.getActiveUntil();
    }

    public void setActiveUntil(LocalDate activeUntil)
    {
        customer.setActiveUntil(activeUntil);
    }

    // more delegating getters and setters
}    

Component Creation

    detailsDialog = new MyCustomerDetailsDialog("createDialog",
            new MyLocalDateCompoundPropertyModel<CustomerUI>(Model.of(new CustomerUI())))

These are the error messages:

: : class example.ui.customer.CustomerUI : WicketMessage: public example.ui.customer.MyCustomerOverviewPage()". !

Stacktrace:

org.apache.wicket.WicketRuntimeException: Property could not be resolved for class: class example.ui.customer.CustomerUI expression: dialog
     at org.apache.wicket.core.util.lang.PropertyResolver.getGetAndSet(PropertyResolver.java:393)
     at org.apache.wicket.core.util.lang.PropertyResolver.getObjectWithGetAndSet(PropertyResolver.java:355)
     at org.apache.wicket.core.util.lang.PropertyResolver.getObjectWithGetAndSet(PropertyResolver.java:261)
     at org.apache.wicket.core.util.lang.PropertyResolver.getValue(PropertyResolver.java:111)
     at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:86)
     at example.ui.models.MyLocalDateCompoundPropertyModel.wrapOnInheritance(MyLocalDateCompoundPropertyModel.java:35)
     at org.apache.wicket.Component.initModel(Component.java:3841)
     at org.apache.wicket.Component.getDefaultModel(Component.java:1625)
     at org.apache.wicket.MarkupContainer$2.component(MarkupContainer.java:876)
     at org.apache.wicket.MarkupContainer$2.component(MarkupContainer.java:872)
     at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:144)
     at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:123)
     at org.apache.wicket.util.visit.Visits.visitChildren(Visits.java:192)
     at org.apache.wicket.MarkupContainer.visitChildren(MarkupContainer.java:983)
     at org.apache.wicket.MarkupContainer.setDefaultModel(MarkupContainer.java:871)
     at example.ui.customer.MyCustomerDetailsDialog.<init>(MyCustomerDetailsDialog.java:44)
     at example.ui.customer.MyCustomerOverviewPage$2.<init>(MyCustomerOverviewPage.java:95)

35:

 if (actualModel.getObject() instanceof LocalDate)
0
2

,

, . , .

, , , , , .

CompoundPropertyModel , . CompoundPropertyModel, ; , .

, , , , .

, (, ), . , , , ""; , CompoundPropertyModel , "dialog" CustomerUI.

, , , . - ,

@Override
public <T> IWrapModel<T> wrapOnInheritance(Component component)
{
    IWrapModel<T> actualModel;
    actualModel = super.wrapOnInheritance(component);

    if (component instanceof DateTextField && actualModel.getObject() instanceof LocalDate)
    {
        return new LocalDateModelButAlsoWrapping(actualModel);
    }
    else
    {
        return actualModel;
    }
}

, .


, , , CompoundPropertyModel.

IModel<CustomerUI> customerUIModel = Model.of(new CustomerUI());
detailsDialog = new MyCustomerDetailsDialog("createDialog", new CompoundPropertyModel<CustomerUI>(customerUIModel));

, detailsDialog, "activeDate" CustomerUI. , CompoundPropertyModel, - :

IModel<LocalDate> activeDateModel = PropertyModel(customerUIModel, "activeUntil");
detailsDialog.add(new Label("dialog", activeDateModel));

, CompoundPropertyModel , ,

detailsDialog.add(new Label("activeDate"))

, , , , .

CompoundPropertyModel. , . , ? , .

return new PropertyModel(innerModel, component.getId())

- ​​ , CompoundPropertyModel. , CompoundPropertyModel. , :

Property could not be resolved for class: class example.ui.customer.CustomerUI expression: dialog

CompoundPropertyModel. , :

@Override
public <T> IWrapModel<T> wrapOnInheritance(Component component)
{
    IWrapModel<T> actualModel;
    actualModel = super.wrapOnInheritance(component);

    if (actualModel.getObject() instanceof LocalDate)
    {
        return new LocalDateModelButAlsoWrapping(actualModel);
    }
    else
    {
        return actualModel;
    }
}

, CompoundPropertyModel , , LocalDate , , Date.

- CompoundPropertyModel, , , . :

  • detailsDialog, ""
  • actualModel = super.wrapOnInheritance(component); PropertyModel, CustomerUI ( )
  • if (actualModel.getObject() instanceof LocalDate) . CustomerUI ""

, . , , .

. , , . , , , , . , , , .

, , . . , DateTextField:

@Override
public <T> IWrapModel<T> wrapOnInheritance(Component component)
{
    IWrapModel<T> actualModel;
    actualModel = super.wrapOnInheritance(component);

    if (component instanceof DateTextField && actualModel.getObject() instanceof LocalDate)
    {
        return new LocalDateModelButAlsoWrapping(actualModel);
    }
    else
    {
        return actualModel;
    }
}

, , , , LocalDate.

+2

WiseTrees . , , MyLocalDateCompoundPropertyModel.

MyLocalDateModel

package example.ui.models;

import java.time.*;
import java.util.Date;
import org.apache.wicket.model.IModel;
import example.misc.MyDateTimeUtil;

public class MyLocalDateModel implements IModel<Date>
{
    private static final long serialVersionUID = 7262517323706786573L;
    private IModel<LocalDate> localDateModel;

    public MyLocalDateModel(IModel<LocalDate> localDateModel)
    {
        this.localDateModel = localDateModel;
    }

    @Override
    public Date getObject()
    {
        return MyDateTimeUtil.createDateFromLocalDate(localDateModel.getObject());
    }

    @Override
    public void setObject(Date object)
    {
        localDateModel.setObject(MyDateTimeUtil.createLocalDateFromDate(object));
    }

    @Override
    public void detach()
    {
        localDateModel.detach();
    }
}

MyWrappingLocalDateModel

package example.ui.models;

import java.time.LocalDate;
import java.util.Date;
import org.apache.wicket.model.*;

public class MyWrappingLocalDateModel extends MyLocalDateModel implements IWrapModel<Date>
{
    private static final long serialVersionUID = -8539316259078354206L;

    public MyWrappingLocalDateModel(IModel<LocalDate> localDateModel)
    {
        super(localDateModel);
    }

    @Override
    public IModel<Date> getWrappedModel()
    {
        return Model.of(super.getObject());
    }

    @Override
    public void setObject(Date object)
    {
       super.setObject(object);
    }
}

MyLocalDateCompoundPropertyModel

package example.ui.models;

import java.time.LocalDate;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.markup.html.form.DateTextField;
import org.apache.wicket.model.*;

public class MyLocalDateCompoundPropertyModel<T> extends CompoundPropertyModel<T>
{
    private static final long serialVersionUID = 7112056989820105247L;

    public MyLocalDateCompoundPropertyModel(IModel<T> model)
    {
        super(model);
    }

    public MyLocalDateCompoundPropertyModel(T object)
    {
        super(object);
    }

    @Override
    public <T> IWrapModel<T> wrapOnInheritance(Component component)
    // warning: type Parameter 'T' hides type parameter 'T'
    {
        IWrapModel<T> actualModel;
        actualModel = super.wrapOnInheritance(component);

        if ((component instanceof DateTextField) && (actualModel.getObject() instanceof LocalDate))
        {
            return (IWrapModel<T>) new MyWrappingLocalDateModel((IModel<LocalDate>) actualModel);
            // warning: unchecked cast
        }
        else
        {
            return actualModel;
        }

    }
}
0

Source: https://habr.com/ru/post/1652574/


All Articles