/*
 * 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 org.apache.lenya.cms.site.usecases;

import org.apache.lenya.cms.publication.Document;
import org.apache.lenya.cms.publication.History;
import org.apache.lenya.cms.workflow.WorkflowUtil;
import org.apache.lenya.workflow.Version;
import org.apache.lenya.workflow.Workflow;
import org.apache.lenya.workflow.Workflowable;

/**
 * Usecase to display revisions of a resource.
 * 
 * @version $Id$
 */
public class Revisions extends SiteUsecase {

    /**
     * @see org.apache.lenya.cms.usecase.AbstractUsecase#initParameters() TODO filter out checkin
     *      entries
     */
    protected void initParameters() {
        super.initParameters();
        Document sourceDoc = getSourceDocument();
        if (sourceDoc != null) {
            try {
                History history = sourceDoc.getHistory();

                int[] numbers = history.getRevisionNumbers();
                Document[] revisions = new Document[numbers.length];
                for (int i = 0; i < numbers.length; i++) {
                    revisions[i] = sourceDoc.getRevision(numbers[i]);
                }
                setParameter("revisions", revisions);

                Boolean canRollback = Boolean
                        .valueOf(WorkflowUtil.canInvoke(sourceDoc, getEvent()));
                setParameter("canRollback", canRollback);

                if (WorkflowUtil.hasWorkflow(sourceDoc)) {
                    Workflowable workflowable = WorkflowUtil.getWorkflowable(sourceDoc);
                    Version latestVersion = workflowable.getLatestVersion();
                    String state;
                    if (latestVersion != null) {
                        state = latestVersion.getState();
                    } else {
                        Workflow workflow = WorkflowUtil.getWorkflowSchema(sourceDoc);
                        state = workflow.getInitialState();
                    }
                    setParameter("workflowState", state);
                }
            } catch (final Exception e) {
                throw new RuntimeException(e);
            }

            /*
             * // since we need both state and canInvoke, we could deal with the avalon // component
             * ourselves rather than using WorkflowUtil - saves one // service manager lookup. //
             * problem is that DocumentWorkflowable is not public and Workflowable is abstract :(
             * 
             * WorkflowManager wfManager = null; String workflowState; Boolean canRollback; try {
             * wfManager = (WorkflowManager) this.manager.lookup(WorkflowManager.ROLE); Workflowable
             * workflowable = new DocumentWorkflowable( this.manager,
             * getDocumentFactory().getSession(), sourceDoc, getLogger() ); workflowState =
             * workflowable.getLatestVersion().getState(); canRollback = new
             * Boolean(wfManager.canInvoke(workflowable, WORKFLOW_EVENT_EDIT)); } catch
             * (ServiceException e) { throw new RuntimeException(e); } finally { if (wfManager !=
             * null) { manager.release(wfManager); } } setParameter("workflowState", workflowState);
             * setParameter("canRollback", canRollback);
             */

        }
    }

    protected String getEvent() {
        return getParameterAsString("workflowEvent");
    }
}
