/**
 * Copyright 2010 CosmoCode GmbH
 *
 * Licensed 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 de.cosmocode.palava.model.base;

import java.util.Date;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Ordering;

import de.cosmocode.rendering.Renderable;

/**
 * The {@link EntityBase} defines the most basic information almost every
 * entity class should provide.
 *
 * @author Willi Schoenborn
 */
public interface EntityBase extends Renderable {

    /**
     * Allows ascending ordering by id. Beware of autoboxing,
     * as this comparator converts {@code long} to {@link Long} repeatedly.
     */
    Ordering<EntityBase> ORDER_BY_ID = Ordering.natural().nullsLast().onResultOf(new Function<EntityBase, Long>() {
        
        @Override
        public Long apply(EntityBase from) {
            return from.getId();
        };
        
    });
    
    /**
     * Allows ordering by age, which will move the oldest entities to the top.
     */
    Ordering<EntityBase> ORDER_BY_AGE = Ordering.natural().nullsLast().onResultOf(new Function<EntityBase, Date>() {
        
        @Override
        public Date apply(EntityBase from) {
            return from.getCreatedAt();
        }
    
    });
    
    /**
     * Allows ordering by last modification, which will move the recently modified entities to the top.
     */
    Ordering<EntityBase> ORDER_BY_MODIFICATION = Ordering.natural().reverse().nullsLast().onResultOf(
        new Function<EntityBase, Date>() {
        
            @Override
            public Date apply(EntityBase from) {
                return from.getModifiedAt();
            }
            
        });
    
    /**
     * Allows filtering entities which are deleted.
     */
    Predicate<EntityBase> IS_DELETED = new Predicate<EntityBase>() {
        
        @Override
        public boolean apply(EntityBase input) {
            return input.isDeleted();
        }
        
    };
    
    /**
     * Provide the identifier of this entity.
     * 
     * @return this entity's id
     */
    long getId();
    
    /**
     * Provide the date of creation of this entity.
     * 
     * @return this entity's creation date
     */
    Date getCreatedAt();
    
    /**
     * Sets the date of creation of this entity.
     * 
     * @param createdAt the new creation date
     */
    void setCreatedAt(Date createdAt);
    
    /**
     * Updates the date of creation of this entity.
     */
    void setCreated();
    
    /**
     * Provide the date of modification of this entity.
     * 
     * @return this entity's modification date
     */
    Date getModifiedAt();
    
    /**
     * Sets the date of modification of this entity.
     * 
     * @param modifiedAt the new modification date
     */
    void setModifiedAt(Date modifiedAt);
    
    /**
     * Updates the date of modificate of this entity.
     */
    void setModified();
    
    /**
     * Provide the date of deletion of this entity.
     * 
     * @return this entity's deletion date
     */
    Date getDeletedAt();
    
    /**
     * Sets the date of deletion of this entity.
     * 
     * @param deletedAt the new deletion date
     */
    void setDeletedAt(Date deletedAt);
    
    /**
     * Updates the date of deletion of this entity.
     */
    void setDeleted();
    
    /**
     * Check the deletion state of this entity.
     * 
     * @return true if the deletion date of this entity is not null
     */
    boolean isDeleted();
    
}

@@ -1401,25 +1401,24 @@
 );%0A        %7D
-;
 %0A        %0A  

removed empty statement