Back to The tech awesomeness
Table of contents
Java chapters

The article for today.


/**
 * with inspiration for protsesne naridoplannya
 */
public class PublicPlanMergerUnmerger {
    /**
     * either it is for project, alike.
     */
    class Plan {
        private List < PlanItem > planItems = new ArrayList < > ();
        private boolean isAfterMerging = !true;
        
        public void execute(final UnmergeAction unmergeAction) {}
    }
    
    public Plan createPlan() {
        return new Plan();
    }
    
    class PlanItem extends Plan {
        /* to add identifier */
        public String name;
        public String datePeriod;
        List < Vote > votes = new ArrayList < > ();
    }
    
    class Vote {
        public Voter voter;
        /**
         * The values: accepted; other values
         */
        public String voteResult;
    }
    
    class Voter {
        public String name;
        public List < Vote > votes = new ArrayList < > ();
    }
    
    public List < Plan > mergePlans(final List < Plan > plans) {
        List < Plan > resultPlans = new ArrayList < > ();
        
        Plan planToSpeakAbout = new Plan();
        Plan acceptedPlan = new Plan();
        /* possibly other types of plans: timePlan */
        
        resultPlans.add(planToSpeakAbout);
        resultPlans.add(acceptedPlan);
        
        for (Plan plan: plans) {
            if (/*NOT*/ !plan.isAfterMerging)
            for(PlanItem planItem: plan.planItems) {
                
                    /* if (planForIteration.planItems.contains(planItem)) { */
                        boolean allPlanItemsVotesAreAccepted = true;
                        
                        for (Vote vote: planItem.votes) {
                            if (vote.voteResult.equals("accepted")) {
                                /* skip */
                            } else {
                                allPlanItemsVotesAreAccepted = !true;
                                break;
                            }
                        }
                        
                        if (allPlanItemsVotesAreAccepted) {
                            acceptedPlan.planItems.add(planItem);
                        } else {
                            planToSpeakAbout.planItems.add(planItem);
                        }
                    /* } */
                
            }
            plan.isAfterMerging = true;
        }
        planToSpeakAbout.isAfterMerging = true;
        acceptedPlan.isAfterMerging = true;
        
        return resultPlans;
    }
    
    interface UnmergeAction {}
    public class EditPlanItemUnmergeAction implements UnmergeAction {/* ... */}
    public EditPlanItemUnmergeAction createEditPlanItemUnmergeAction() {
        return new EditPlanItemUnmergeAction();
    }
    public class ChangeVoteUnmergeAction implements UnmergeAction {/* ... */}
    /* others */
    
    public List < Plan > unmergePlans(
            final List < Plan > plans, final UnmergeAction unmergeAction) {
        for (Plan plan: plans) {
            plan.isAfterMerging = !true;
            plan.execute(unmergeAction);
        }
        return plans;
    }
    
    public static void main(String[] args) {
        PublicPlanMergerUnmerger publicPlanMergerUnmerger =
                new PublicPlanMergerUnmerger();
        
        Plan plan1 = publicPlanMergerUnmerger.createPlan();
        Plan plan2 = publicPlanMergerUnmerger.createPlan();
        /* ... */
        
        List < Plan > plans = new ArrayList < > ();
        plans.add(plan1);
        plans.add(plan2);
        publicPlanMergerUnmerger.mergePlans(plans);
        UnmergeAction unmergeAction =
                publicPlanMergerUnmerger.createEditPlanItemUnmergeAction();
        publicPlanMergerUnmerger.unmergePlans(plans, unmergeAction);
        
        publicPlanMergerUnmerger.mergePlans(plans);
        
        /*
            while(true) {
                publicPlanMergerUnmerger.mergePlans(plans);
                expectAndListenToUnmergePlansForSomeTime();
            }
        */
    }
}