/*****************************************************************************
 * Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License Version
 * 1.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is available at http://www.sun.com/
 *
 * The Original Code is the CVS Client Library.
 * The Initial Developer of the Original Code is Robert Greig.
 * Portions created by Robert Greig are Copyright (C) 2000.
 * All Rights Reserved.
 *
 * Contributor(s): Robert Greig.
 *****************************************************************************/
package org.netbeans.lib.cvsclient.request;

import org.netbeans.lib.cvsclient.file.FileDetails;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.jetbrains.annotations.NonNls;

/**
 * Sends the server a copy of a locally modified file.
 * @author  Robert Greig
 */
public final class ModifiedRequest extends AbstractFileStateRequest {

        // Fields =================================================================

        private final FileDetails fileDetails;
        private final boolean writable;

        // Setup ==================================================================

        public ModifiedRequest(FileObject fileObject, boolean isBinary, boolean writable) {
                super(fileObject);

                this.fileDetails = new FileDetails(fileObject, isBinary);
                this.writable = writable;
        }

        // Implemented ============================================================

        /**
         * Get the request String that will be passed to the server
         * @return the request String
         */
        public String getRequestString() {
                @NonNls final StringBuffer request = new StringBuffer();
                request.append("Modified ");
                request.append(getFileName());
                request.append('\n');
                if (writable) {
                        request.append("u=rw,g=r,o=r");
                }
                else {
                        request.append("u=r,g=r,o=r");
                }
                request.append('\n');
                return request.toString();
        }

        /**
         * If a file transmission is required, get the file object representing
         * the file to transmit after the request string. The default
         * implementation returns null, indicating no file is to be transmitted
         * @return the file details object, if one should be transmitted, or null
         * if no file object is to be transmitted.
         */
        public FileDetails getFileForTransmission() {
                return fileDetails;
        }
}
