/*
 * $Header: /home/cvs/jakarta-struts/contrib/artimus/WEB-INF/src/java/org/apache/artimus/article/Search.java.text,v 1.2 2004/03/14 07:15:05 sraeburn Exp $
 * $Revision: 1.2 $
 * $Date: 2004/03/14 07:15:05 $
 *
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * 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.
 */
 
/**
 * This is an alternative to the seperate Search* classes in this package.
 */

package org.apache.artimus.article;


import java.util.Collection;

import org.apache.scaffold.model.ModelBeanBase;
import org.apache.scaffold.model.ModelException;
import org.apache.scaffold.model.ModelResult;
import org.apache.scaffold.model.ModelResultBase;

import org.apache.artimus.lang.Messages;
import org.apache.artimus.sql.Data;
import org.apache.artimus.search.Engine;


/**
 * Search queries.
 * @author Ted Husted
 * @version $Revision: 1.2 $ $Date: 2004/03/14 07:15:05 $
 */
public class Search extends ModelForm {


    // ------------------------------------------------------------ Public Methods


    /**
     * Execute model for this bean, and return outcome in ModelResult.
     * @exception Collects and returns any Exceptions
     * @returns Null on success, or a collection of Exceptions
     */
    public ModelResult execute(Object source, Object target)
            throws ModelException {

        Collection result = select(target);
        if (result==null) {
            // :TODO: Throw specific exception and catch in helper
            throw new ModelException(Messages.INVALID_QUERY_EXCEPTION);
        }
        return new ModelResultBase(result);

    }


    /**
     * Select <code>key</code> record.
     * :TODO: Separate object for each if.
     * @returns Number of records selected.
     */
    public Collection select(Object target) throws ModelException {

        String key = getKey();
        String column = getColumn();

        try {

            // -- SEARCH ALL --- must be first
            if (("".equals(key))) {
                return Data.articleSearchCurrent(
                    target);
            }

            // -- SELECT ARTICLE -- must be second
            if ((column==null) ||
                ("".equals(column)) ||
                ("key".equals(column)) ||
                ("article".equals(column))) {
               return Data.articleSelect(getKeyInt(),
                    target);
            }

            // -- SEARCH LAST ---
            if (("last".equals(column))) {
                return Data.articleSearchLast(getKeyInt(),
                    target);
            }

            // -- SEARCH HOURS --
            if ("hours".equals(column)) {
                return Data.articleSearchHours(getKeyInt(),
                    target);
            }

            // -- SEARCH TITLE --
            if ("title".equals(column)) {
                    return Engine.articleSearchTitle(getKey(),
                        target);
            }


            // -- SEARCH AUTHOR --
            if ("author".equals(column)) {
                return Engine.articleSearchCreator(getKey(),
                    target);
            }

            // -- SEARCH CONTENT --
            if ("content".equals(column)) {
                return Engine.articleSearchContent(getKey(),
                        target);
            }
        }
        catch (Exception e) {
            throw new ModelException(Messages.SELECT_EXCEPTION,e);
        }

      return null;
    }

}
