com.intelligentsia.dowsers.entity.view.View.java Source code

Java tutorial

Introduction

Here is the source code for com.intelligentsia.dowsers.entity.view.View.java

Source

/**
 *        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 com.intelligentsia.dowsers.entity.view;

import java.util.List;

import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.intelligentsia.dowsers.entity.Entity;
import com.intelligentsia.dowsers.entity.manager.EntityManager;
import com.intelligentsia.dowsers.entity.reference.Reference;
import com.intelligentsia.dowsers.entity.view.processor.AbstractProcessorBuilder;
import com.intelligentsia.dowsers.entity.view.processor.Item;
import com.intelligentsia.dowsers.entity.view.processor.Processor;

/**
 * View is definition of a specific view on an aggregate of entities and not a
 * way to iterate over each items.
 * 
 * @author <a href="mailto:jguibert@intelligents-ia.com">Jerome Guibert</a>
 */
public final class View {

    private final String name;

    private final Processor processor;

    private final Splitter splitter;

    private final ImmutableList<Reference> entities;

    private final ViewStore viewStore;

    /**
     * Build a new instance of View.java.
     * 
     * @param name
     * @param processor
     * @param entities
     * @throws NullPointerException
     *             if one of parameters is null
     * @throws IllegalArgumentException
     *             if entities is empty
     */
    public View(final String name, final Processor processor, final ImmutableList<Reference> entities,
            final ViewStore viewStore) throws NullPointerException, IllegalArgumentException {
        this(name, processor, null, entities, viewStore);
    }

    /**
     * Build a new instance of View.java.
     * 
     * @param name
     * @param processor
     * @param entities
     * @throws NullPointerException
     *             if one of parameters is null
     * @throws IllegalArgumentException
     *             if entities is empty
     */
    public View(final String name, final Processor processor, final Splitter splitter,
            final ImmutableList<Reference> entities, final ViewStore viewStore)
            throws NullPointerException, IllegalArgumentException {
        super();
        this.name = Preconditions.checkNotNull(name);
        this.processor = Preconditions.checkNotNull(processor);
        this.splitter = splitter;
        this.entities = Preconditions.checkNotNull(entities);
        Preconditions.checkArgument(!entities.isEmpty());
        this.viewStore = Preconditions.checkNotNull(viewStore);
    }

    /**
     * Compute view for specified entity.
     * 
     * @param entity
     */
    public void compute(final Entity entity) {
        // build item
        final Item item = processor.apply(entity);
        if (splitter != null) {
            final List<Item> items = splitter.apply(item);
            for (final Item item2 : items) {
                viewStore.update(entity.identity(), item2);
            }
        } else {
            // update store
            viewStore.update(entity.identity(), item);
        }
    }

    /**
     * Remove specified entry.
     * 
     * @param identity
     */
    public void remove(final Reference identity) {
        viewStore.remove(identity);
    }

    /**
     * @return view name
     */
    public String name() {
        return name;
    }

    /**
     * @return {@link ViewStore} instance.
     */
    public ViewStore viewStore() {
        return viewStore;
    }

    /**
     * @return a {@link List} of entities class {@link Reference} which this
     *         view depends. First reference, is the origin of this view.
     */
    public ImmutableList<Reference> entities() {
        return entities;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(name);
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final View other = (View) obj;
        return Objects.equal(other.name(), name());
    }

    @Override
    public String toString() {
        return Objects.toStringHelper(getClass()).add("name", name).add("processor", processor)
                .add("entities", entities).toString();
    }

    public static Builder builder() {
        return new Builder();
    }

    /**
     * Builder.
     * 
     * @author <a href="mailto:jguibert@intelligents-ia.com">Jerome Guibert</a>
     */
    public static class Builder {

        private String name;

        private Splitter splitter;

        Processor processor;

        ImmutableList.Builder<Reference> entities = ImmutableList.builder();

        private ViewStore viewStore;

        public Builder() {
            super();
        }

        public Builder name(final String name) {
            this.name = name;
            return this;
        }

        public Builder viewStore(final ViewStore viewStore) {
            this.viewStore = viewStore;
            return this;
        }

        public Builder splitter(final Splitter splitter) {
            this.splitter = splitter;
            return this;
        }

        public Builder splitter(final String attributeName) {
            this.splitter = new SplitterAttribute(attributeName);
            return this;
        }

        public Builder splitter(final String attributeName, final boolean ignoreEmpty) {
            this.splitter = new SplitterAttribute(attributeName, ignoreEmpty);
            return this;
        }

        public Builder processor(final Processor processor) {
            this.processor = processor;
            return this;
        }

        /**
         * @return a {@link ViewProcessorBuilder}.
         */
        public ViewProcessorBuilder processor(final Class<? extends Entity> entityType, final String alias) {
            return new ViewProcessorBuilder(this, entityType, alias);
        }

        /**
         * @return a {@link ViewProcessorBuilder}.
         */
        public ViewProcessorBuilder processor(final Class<? extends Entity> entityType, final String alias,
                final ImmutableSet<String> attributeNames) {
            return new ViewProcessorBuilder(this, entityType, alias, attributeNames);
        }

        /**
         * @return a {@link ViewProcessorBuilder}.
         */
        public ViewProcessorBuilder processor(final Class<? extends Entity> entityType, final String alias,
                final String... names) {
            return new ViewProcessorBuilder(this, entityType, alias, names);
        }

        public View build() {
            return new View(name, processor, splitter, entities.build(), viewStore);
        }
    }

    /**
     * ViewProcessorBuilder.
     * 
     * @author <a href="mailto:jguibert@intelligents-ia.com">Jerome Guibert</a>
     */
    public static class ViewProcessorBuilder extends AbstractProcessorBuilder<Builder> {

        private final Builder builder;

        public ViewProcessorBuilder(final Builder builder, final Class<? extends Entity> entityType,
                final String alias) {
            super(entityType, alias);
            this.builder = builder;
            this.builder.entities.add(Reference.newReferenceOnEntityClass(entityType));
        }

        public ViewProcessorBuilder(final Builder builder, final Class<? extends Entity> entityType,
                final String alias, final ImmutableSet<String> attributeNames) {
            super(entityType, alias, attributeNames);
            this.builder = builder;
            this.builder.entities.add(Reference.newReferenceOnEntityClass(entityType));
        }

        public ViewProcessorBuilder(final Builder builder, final Class<? extends Entity> entityType,
                final String alias, final String... names) {
            super(entityType, alias, names);
            this.builder = builder;
            this.builder.entities.add(Reference.newReferenceOnEntityClass(entityType));
        }

        @Override
        public Builder build() {
            builder.processor = processor;
            return builder;
        }

        @Override
        public AbstractProcessorBuilder<Builder> join(final EntityManager entityManager, final String joinAttribute,
                final Class<? extends Entity> expectedType, final Processor source) throws NullPointerException {
            this.builder.entities.add(Reference.newReferenceOnEntityClass(expectedType));
            return super.join(entityManager, joinAttribute, expectedType, source);
        }

        @Override
        public AbstractProcessorBuilder<Builder> join(final String joinAttribute,
                final Class<? extends Entity> expectedType, final Processor source) throws NullPointerException {
            this.builder.entities.add(Reference.newReferenceOnEntityClass(expectedType));
            return super.join(joinAttribute, expectedType, source);
        }

    }
}