Package org.apache.isis.example.application.claims.dom.claim

Source Code of org.apache.isis.example.application.claims.dom.claim.Claim$ClaimStatus$ChoicesSpecification

/*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*
*        http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/

package org.apache.isis.example.application.claims.dom.claim;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.isis.applib.AbstractDomainObject;
import org.apache.isis.applib.annotation.Disabled;
import org.apache.isis.applib.annotation.Hidden;
import org.apache.isis.applib.annotation.MaxLength;
import org.apache.isis.applib.annotation.MemberOrder;
import org.apache.isis.applib.annotation.MustSatisfy;
import org.apache.isis.applib.annotation.Named;
import org.apache.isis.applib.annotation.Optional;
import org.apache.isis.applib.spec.Specification;
import org.apache.isis.applib.util.Reasons;
import org.apache.isis.applib.value.Date;
import org.apache.isis.applib.value.Money;

/**
* @author danhaywood
*/
public class Claim extends AbstractDomainObject /* implements Calendarable */{

    // {{ Title
    public String title() {
        return getStatus() + " - " + getDate();
    }

    // }}

    // {{ Lifecycle
    public void created() {
        status = "New";
        date = new Date(); // applib date uses the Clock
    }

    // }}

    // {{ Rush
    private boolean rush;

    @Hidden
    @MemberOrder(sequence = "1.2")
    public boolean getRush() {
        return rush;
    }

    public void setRush(final boolean flag) {
        this.rush = flag;
    }

    // }}

    // {{ Description
    private String description;

    @MemberOrder(sequence = "1")
    public String getDescription() {
        return description;
    }

    public void setDescription(final String description) {
        this.description = description;
    }

    public String defaultDescription() {
        return "enter a description here";
    }

    public String validateDescription(final String description) {
        if (description == null) {
            return null;
        }
        if (description.contains("foobar")) {
            return "can't contain foobar!";
        }
        return null;
    }

    // }}

    // {{ Date
    private Date date;

    @MemberOrder(sequence = "2")
    public Date getDate() {
        return date;
    }

    public void setDate(final Date date) {
        this.date = date;
    }

    // }}

    // {{ Status
    /**
     * @uml.property name="status"
     */
    private String status;

    /**
     * @return
     * @uml.property name="status"
     */
    @Disabled
    @MemberOrder(sequence = "3")
    @MaxLength(5)
    public String getStatus() {
        return status;
    }

    /**
     * @param status
     * @uml.property name="status"
     */
    public void setStatus(final String status) {
        this.status = status;
    }

    // }}

    // {{ changeStatus
    @MemberOrder(sequence = "1")
    public void changeStatus(@MustSatisfy(ClaimStatus.ChoicesSpecification.class) final String status) {
        setStatus(status);
    }

    public List<String> choices0ChangeStatus() {
        return ClaimStatus.ALL;
    }

    private String ifAlreadySubmitted() {
        return ClaimStatus.SUBMITTED.equals(getStatus()) ? "Already submitted" : null;
    }

    // }}

    // {{ Claimant
    /**
     * @uml.property name="claimant"
     * @uml.associationEnd
     */
    private Claimant claimant;

    /**
     * @return
     * @uml.property name="claimant"
     */
    @Disabled
    @MemberOrder(sequence = "4")
    public Claimant getClaimant() {
        return claimant;
    }

    /**
     * @param claimant
     * @uml.property name="claimant"
     */
    public void setClaimant(final Claimant claimant) {
        this.claimant = claimant;
    }

    // }}

    // {{ Approver
    private Approver approver;

    // @Disabled
    @MemberOrder(sequence = "5")
    @Optional
    public Approver getApprover() {
        return approver;
    }

    public void setApprover(final Approver approver) {
        this.approver = approver;
    }

    public String disableApprover() {
        return getDescription().contains("baz") ? "desc contains baz" : null;
    }

    public String validateApprover(final Approver approver) {
        if (approver == null) {
            return null;
        }
        return approver == getClaimant() ? "Can't approve own claims" : null;
    }

    // }}

    // {{ Items
    private final List<ClaimItem> items = new ArrayList<ClaimItem>();

    @MemberOrder(sequence = "6")
    public List<ClaimItem> getItems() {
        return items;
    }

    public void addToItems(final ClaimItem item) {
        items.add(item);
    }

    public void removeFromItems(final ClaimItem item) {
        items.remove(item);
    }

    // }}

    // {{ action: Submit
    public void submit(final Approver approver) {
        setStatus(ClaimStatus.SUBMITTED);
        setApprover(approver);
    }

    public String disableSubmit(final Approver approver) {
        return !ClaimStatus.SUBMITTED.equals(getStatus()) ? null : "Claim has already been submitted";
    }

    public Approver default0Submit() {
        return getClaimant().getDefaultApprover();
    }

    // }}

    // {{ action: addItem
    @MemberOrder(sequence = "1")
    public void addItem(@Named("Days since") final int days, @Named("Amount") final double amount, @Named("Description") final String description) {
        final ClaimItem claimItem = newTransientInstance(ClaimItem.class);
        Date date = new Date();
        date = date.add(0, 0, days);
        claimItem.setDateIncurred(date);
        claimItem.setDescription(description);
        claimItem.setAmount(new Money(amount, "USD"));
        persist(claimItem);
        addToItems(claimItem);
    }

    public String disableAddItem(final int days, final double amount, final String description) {
        return Reasons.coalesce(ifAlreadySubmitted());
    }

    // }}

    // {{ removeItem
    @MemberOrder(sequence = "2")
    public void removeItem(final ClaimItem claimItem) {
        removeFromItems(claimItem);
    }

    public String disableRemoveItem(final ClaimItem claimItem) {
        return Reasons.coalesce(ifAlreadySubmitted());
    }

    public ClaimItem default0RemoveItem() {
        if (getItems().size() > 0) {
            return getItems().get(getItems().size() - 1);
        } else {
            return null;
        }
    }

    public List<ClaimItem> choices0RemoveItem() {
        return Collections.unmodifiableList(getItems());
    }

    // }}

    public String validate() {
        if (ClaimStatus.INCOMPLETE.equals(getStatus())) {
            return "incomplete";
        }
        if (getDescription().contains("foobaz")) {
            return "no 'foobaz' allowed in description!";
        }
        return null;
    }

    public static class ClaimStatus {

        private static final String NEW = "New";
        private static final String INCOMPLETE = "Incomplete";
        private static final String SUBMITTED = "Submitted";

        public static final List<String> ALL = Collections.unmodifiableList(Arrays.asList(NEW, INCOMPLETE, SUBMITTED));

        public static class ChoicesSpecification implements Specification {

            @Override
            public String satisfies(final Object obj) {
                for (final String str : ALL) {
                    if (str.equals(obj)) {
                        return null;
                    }
                }
                return "Must be one of " + ALL;
            }
        }
    }

}
TOP

Related Classes of org.apache.isis.example.application.claims.dom.claim.Claim$ClaimStatus$ChoicesSpecification

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.