/*
 * 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.
 *  
 */

/* $Id$ */

package org.apache.lenya.cms.task;

import java.util.Map;

import org.apache.avalon.framework.service.ServiceManager;
import org.apache.lenya.cms.publication.Publication;
import org.apache.lenya.cms.publication.PublicationException;
import org.apache.lenya.cms.publication.PublicationUtil;

/**
 * Task Parameters
 * @deprecated Use the usecase framework instead.
 */
public class TaskParameters extends ParameterWrapper {
    /**
     * <code>REQUIRED_KEYS</code> Required task parameters
     */
    public static final String[] REQUIRED_KEYS = { Task.PARAMETER_SERVLET_CONTEXT,
            Task.PARAMETER_SERVER_URI, Task.PARAMETER_SERVER_PORT, Task.PARAMETER_CONTEXT_PREFIX,
            Task.PARAMETER_PUBLICATION_ID };
    /**
     * <code>PREFIX</code> The task prefix
     */
    public static final String PREFIX = "task";

    private ServiceManager manager;

    /**
     * Ctor.
     * @param prefixedParameters The prefixed parameters .
     * @param manager The service manager.
     */
    public TaskParameters(Map prefixedParameters, ServiceManager manager) {
        super(prefixedParameters);
    }

    /**
     * @see org.apache.lenya.cms.task.ParameterWrapper#getPrefix()
     */
    public String getPrefix() {
        return PREFIX;
    }

    /**
     * @see org.apache.lenya.cms.task.ParameterWrapper#getRequiredKeys()
     */
    protected String[] getRequiredKeys() {
        return REQUIRED_KEYS;
    }

    /**
     * Returns the publication.
     * @return A publication.
     * @throws ExecutionException when something went wrong.
     */
    public Publication getPublication() throws ExecutionException {
        Publication publication;
        try {
            publication = PublicationUtil.getPublication(this.manager,
                    get(Task.PARAMETER_PUBLICATION_ID));
        } catch (PublicationException e) {
            throw new ExecutionException(e);
        }
        return publication;
    }

    /**
     * Sets the publication.
     * @param publication A publication.
     */
    public void setPublication(Publication publication) {
        put(Task.PARAMETER_PUBLICATION_ID, publication.getId());
        put(Task.PARAMETER_SERVLET_CONTEXT, publication.getServletContext().getAbsolutePath());
    }

    /**
     * Sets the servlet context path.
     * @param servletContextPath A string.
     */
    public void setServletContextPath(String servletContextPath) {
        put(Task.PARAMETER_SERVLET_CONTEXT, servletContextPath);
    }

}
