com.jivesoftware.os.tasmo.test.EventFireGenerator.java Source code

Java tutorial

Introduction

Here is the source code for com.jivesoftware.os.tasmo.test.EventFireGenerator.java

Source

/*
 * $Revision$
 * $Date$
 *
 * Copyright (C) 1999-$year$ Jive Software. All rights reserved.
 *
 * This software is the proprietary information of Jive Software. Use is subject to license terms.
 */
package com.jivesoftware.os.tasmo.test;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.jivesoftware.os.tasmo.event.api.write.Event;
import com.jivesoftware.os.tasmo.event.api.write.EventBuilder;
import com.jivesoftware.os.tasmo.id.Id;
import com.jivesoftware.os.tasmo.id.IdProvider;
import com.jivesoftware.os.tasmo.id.ObjectId;
import com.jivesoftware.os.tasmo.id.TenantId;
import com.jivesoftware.os.tasmo.model.path.ModelPath;
import com.jivesoftware.os.tasmo.model.path.ModelPathStep;
import com.jivesoftware.os.tasmo.model.path.ModelPathStepType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Generates test input for tasmo tests
 *
 */
public class EventFireGenerator {

    private final TenantId tenant;
    private final Id actor;

    public EventFireGenerator(TenantId tenant, Id actor) {
        this.tenant = tenant;
        this.actor = actor;
    }

    public static void main(String[] args) {
        IdProvider idProvider = new IdProvider() {
            private long number;

            @Override
            public Id nextId() {
                ++number;
                return new Id(number);
            }
        };
        EventFireGenerator eventFireGenerator = new EventFireGenerator(new TenantId("test"), new Id("actor"));

        List<ModelPathStep> steps = new ArrayList<>();
        steps.add(new ModelPathStep(true, Sets.newHashSet("A"), "ref_B", ModelPathStepType.ref,
                Sets.newHashSet("B"), null));
        steps.add(new ModelPathStep(false, Sets.newHashSet("C"), "backrefs_B", ModelPathStepType.backRefs,
                Sets.newHashSet("B"), null));
        steps.add(new ModelPathStep(false, Sets.newHashSet("C"), "refs_D", ModelPathStepType.refs,
                Sets.newHashSet("D"), null));
        steps.add(new ModelPathStep(false, Sets.newHashSet("D"), null, ModelPathStepType.value, null,
                Arrays.asList("Value1", "Value2", "Value3")));

        ModelPath path = new ModelPath("testpath", steps);

        EventsAndViewId eventsAndViewId = eventFireGenerator.deriveEventsFromPath(idProvider, path,
                idProvider.nextId(), 2);

        for (EventFire eventFire : eventFireGenerator.generateEventFireCombinationsForPath("TestView",
                eventsAndViewId, path)) {
            StringBuilder builder = new StringBuilder("Event fire: ");
            String sep = "";
            for (Event event : eventFire.getFiredEvents()) {
                builder.append(sep).append(event);
                sep = ", ";
            }

            System.out.println(builder.toString());
        }
    }

    public List<EventFire> generateEventFireCombinationsForPath(String viewClass, EventsAndViewId eventsAndViewId,
            ModelPath path) {
        List<EventFire> eventFires = new ArrayList<>();
        List<Event> events = eventsAndViewId.getEvents();
        ObjectId viewId = new ObjectId(viewClass, eventsAndViewId.getViewId());

        for (int i = 0; i < events.size(); i++) {
            Collections.rotate(events, 1);
            eventFires.add(new EventFire(viewId, events, path.getPathMembers().get(path.getPathMemberSize() - 1),
                    eventsAndViewId.getIdTree()));
        }

        Collections.reverse(events);

        for (int i = 0; i < events.size(); i++) {
            Collections.rotate(events, 1);
            eventFires.add(new EventFire(viewId, events, path.getPathMembers().get(path.getPathMemberSize() - 1),
                    eventsAndViewId.getIdTree()));
        }

        return eventFires;
    }

    public EventsAndViewId deriveEventsFromPath(IdProvider idProvider, ModelPath path, Id viewId, int fanOut) {
        List<Event> events = new ArrayList<>();

        IdTreeNode rootId = new IdTreeNode(null, viewId);

        generateIdsForPathStep(idProvider, rootId, 0, path, fanOut);

        generateEventsForPathStep(rootId, 0, path, events);

        return new EventsAndViewId(viewId, events, rootId);
    }

    private void generateIdsForPathStep(IdProvider idProvider, IdTreeNode previousId, int pathIndex, ModelPath path,
            int fanOut) {
        if (pathIndex < path.getPathMemberSize()) {
            ModelPathStep currentStep = path.getPathMembers().get(pathIndex);
            ModelPathStepType currentType = currentStep.getStepType();

            switch (currentType) {
            case ref:
                IdTreeNode referencedId = new IdTreeNode(previousId, idProvider.nextId());
                generateIdsForPathStep(idProvider, referencedId, pathIndex + 1, path, fanOut);
                break;
            case refs:
            case backRefs:
            case count:
                for (int i = 0; i < fanOut; i++) {
                    IdTreeNode idTreeNode = new IdTreeNode(previousId, idProvider.nextId());
                    generateIdsForPathStep(idProvider, idTreeNode, pathIndex + 1, path, fanOut);
                }
                break;
            case latest_backRef:
                IdTreeNode referencingId = new IdTreeNode(previousId, idProvider.nextId());
                generateIdsForPathStep(idProvider, referencingId, pathIndex + 1, path, fanOut);
                break;
            case value:
                return; //id for this node was generated in the previous step
            default:
                throw new IllegalArgumentException("Unhandled model path step type: " + currentType);
            }
        }
    }

    private void generateEventsForPathStep(IdTreeNode currentId, int pathIndex, ModelPath path,
            List<Event> accumulator) {
        if (pathIndex < path.getPathMemberSize()) {
            ModelPathStep currentStep = path.getPathMembers().get(pathIndex);
            ModelPathStepType currentType = currentStep.getStepType();
            List<IdTreeNode> nextIds = currentId.children();
            String currentOrigin = currentStep.getOriginClassNames().iterator().next();
            String currentDestination = currentType.equals(ModelPathStepType.value) ? null
                    : currentStep.getDestinationClassNames().iterator().next();

            switch (currentType) {
            case ref:

                accumulator.add(generateEvent(new ObjectId(currentOrigin, currentId.value()), currentStep,
                        Arrays.asList(new ObjectId(currentDestination, nextIds.get(0).value()))));
                break;
            case refs:

                ObjectId referrer = new ObjectId(currentOrigin, currentId.value());
                List<ObjectId> referenced = new ArrayList<>();
                for (IdTreeNode nextNode : nextIds) {
                    referenced.add(new ObjectId(currentDestination, nextNode.value()));
                }
                accumulator.add(generateEvent(referrer, currentStep, referenced));
                break;
            case backRefs:
            case count:
                ObjectId referred = new ObjectId(currentDestination, currentId.value());
                for (IdTreeNode nextNode : nextIds) {
                    accumulator.add(generateEvent(new ObjectId(currentOrigin, nextNode.value()), currentStep,
                            Arrays.asList(referred)));
                }
                accumulator.add(generateEvent(referred, currentStep, null));
                break;
            case latest_backRef:

                accumulator.add(generateEvent(new ObjectId(currentOrigin, nextIds.get(0).value()), currentStep,
                        Arrays.asList(new ObjectId(currentDestination, currentId.value()))));
                accumulator
                        .add(generateEvent(new ObjectId(currentDestination, currentId.value()), currentStep, null));
                break;
            case value:
                accumulator.add(generateEvent(new ObjectId(currentOrigin, currentId.value()), currentStep, null));
                break;
            default:
                throw new IllegalArgumentException("Unhandled model path step type: " + currentType);
            }

            for (IdTreeNode next : nextIds) {
                generateEventsForPathStep(next, pathIndex + 1, path, accumulator);
            }
        }
    }

    private Event generateEvent(ObjectId eventObjectId, ModelPathStep currentStep, List<ObjectId> referencedIds) {
        EventBuilder builder = EventBuilder.update(eventObjectId, tenant, actor);
        ModelPathStepType currentType = currentStep.getStepType();
        if (ModelPathStepType.value.equals(currentType)) {
            for (String fieldName : currentStep.getFieldNames()) {
                builder.set(fieldName, "ValueFor_" + fieldName);
            }
        } else if (ModelPathStepType.refs.equals(currentType) || ModelPathStepType.backRefs.equals(currentType)) {
            if (referencedIds != null) {
                builder.set(currentStep.getRefFieldName(),
                        Lists.transform(referencedIds, new Function<ObjectId, String>() {
                            @Override
                            public String apply(ObjectId referencedId) {
                                return referencedId.toStringForm();
                            }
                        }));
            } else {
                builder.set("deleted", false);
            }
        } else {
            if (referencedIds != null) {
                builder.set(currentStep.getRefFieldName(), referencedIds.get(0).toStringForm());
            } else {
                builder.set("deleted", false);
            }
        }

        return builder.build();

    }
}