All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.incode.example.settings.dom.jdo.SettingAbstractJdo Maven / Gradle / Ivy

package org.incode.example.settings.dom.jdo;

import javax.inject.Inject;
import javax.jdo.annotations.PersistenceCapable;

import org.joda.time.LocalDate;

import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.Optionality;
import org.apache.isis.applib.annotation.Parameter;
import org.apache.isis.applib.annotation.ParameterLayout;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.services.message.MessageService;
import org.apache.isis.applib.services.repository.RepositoryService;

import org.incode.example.settings.SettingsModule;
import org.incode.example.settings.dom.Setting;
import org.incode.example.settings.dom.SettingAbstract;
import org.incode.example.settings.dom.SettingType;

import lombok.Getter;
import lombok.Setter;

/**
 * Factors out common implementation; however this is not annotated with {@link PersistenceCapable},
 * so that each subclass is its own root entity.
 */
public abstract class SettingAbstractJdo extends SettingAbstract implements Setting {

    //region > domain events

    public static abstract class PropertyDomainEvent
            extends SettingsModule.PropertyDomainEvent { }

    public static abstract class CollectionDomainEvent
            extends SettingsModule.CollectionDomainEvent { }

    public static abstract class ActionDomainEvent
            extends SettingsModule.ActionDomainEvent { }
    //endregion

    @javax.jdo.annotations.Column(allowsNull="false")
    @Getter @Setter
    private String key;

    @Getter @Setter
    private String description;

    @javax.jdo.annotations.Column(allowsNull="false")
    @Getter @Setter
    private SettingType type;

    @javax.jdo.annotations.Column(allowsNull="false")
    @Getter @Setter
    private String valueRaw;

    //region > updateDescription (action)

    public static class UpdateDescriptionDomainEvent
            extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateDescriptionDomainEvent.class
    )
    public SettingAbstractJdo updateDescription(
            @Parameter(optionality = Optionality.OPTIONAL)
            @ParameterLayout(named = "Description")
            final String description) {
        setDescription(description);
        return this;
    }
    public String default0UpdateDescription() {
        return getDescription();
    }


    //endregion

    //region > updateAsString (action)

    public static class UpdateAsStringDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateAsStringDomainEvent.class
    )
    public SettingAbstractJdo updateAsString(
            @ParameterLayout(named = "Value")
            final String value) {
        setValueRaw(value);
        return this;
    }
    public String default0UpdateAsString() {
        return getValueAsString();
    }
    public boolean hideUpdateAsString() {
        return typeIsNot(SettingType.STRING);
    }

    //endregion

    //region > updateAsInt (action)

    public static class UpdateAsIntDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateAsIntDomainEvent.class
    )
    public SettingAbstractJdo updateAsInt(
            @ParameterLayout(named = "Value")
            final Integer value) {
        setValueRaw(value.toString());
        return this;
    }
    public Integer default0UpdateAsInt() {
        return getValueAsInt();
    }
    public boolean hideUpdateAsInt() {
        return typeIsNot(SettingType.INT);
    }

    //endregion

    //region > updateAsLong (action)

    public static class UpdateAsLongDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateAsLongDomainEvent.class
    )
    public SettingAbstractJdo updateAsLong(
            @ParameterLayout(named = "Value") final
            Long value) {
        setValueRaw(value.toString());
        return this;
    }
    public Long default0UpdateAsLong() {
        return getValueAsLong();
    }
    public boolean hideUpdateAsLong() {
        return typeIsNot(SettingType.LONG);
    }

    //endregion

    //region > updateAsLocalDate (action)

    public static class UpdateAsLocalDateDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateAsLocalDateDomainEvent.class
    )
    public SettingAbstractJdo updateAsLocalDate(
            @ParameterLayout(named = "Value")
            final LocalDate value) {
        setValueRaw(value.toString(DATE_FORMATTER));
        return this;
    }
    public LocalDate default0UpdateAsLocalDate() {
        return getValueAsLocalDate();
    }
    public boolean hideUpdateAsLocalDate() {
        return typeIsNot(SettingType.LOCAL_DATE);
    }

    //endregion

    //region > updateAsBoolean (action)

    public static class UpdateAsBooleanDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = UpdateAsBooleanDomainEvent.class
    )
    public SettingAbstractJdo updateAsBoolean(
            @ParameterLayout(named = "Value")
            final Boolean value) {
        setValueRaw(value.toString());
        return this;
    }
    public Boolean default0UpdateAsBoolean() {
        return getValueAsBoolean();
    }
    public boolean hideUpdateAsBoolean() {
        return typeIsNot(SettingType.BOOLEAN);
    }

    //endregion

    //region > delete (action)

    public static class DeleteDomainEvent extends ActionDomainEvent {
    }

    @Action(
            domainEvent = DeleteDomainEvent.class,
            semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE
    )
    @ActionLayout(
            cssClassFa = "trash",
            cssClass = "btn-warning"
    )
    public SettingAbstractJdo delete() {
        repositoryService.remove(this);
        messageService.informUser("Setting deleted");
        return null;
    }

    //endregion

    //region > injected services

    @Inject
    MessageService messageService;

    @Inject
    RepositoryService repositoryService;

    //endregion


}