12ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/*
22ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Copyright 2007 the original author or authors.
32ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
42ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
52ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * you may not use this file except in compliance with the License.
62ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * You may obtain a copy of the License at
72ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
82ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
92ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Unless required by applicable law or agreed to in writing, software
112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * See the License for the specific language governing permissions and
142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * limitations under the License.
152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpackage org.mockftpserver.stub.command;
172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.command.Command;
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.command.CommandHandler;
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.command.InvocationRecord;
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.session.Session;
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.util.Assert;
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * CommandHandler for the RETR (Retrieve) command. Return the configured file contents on the data
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * connection, along with two replies on the control connection: a reply code of 150 and
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * another of 226. By default, return an empty file (i.e., a zero-length byte[]). You can
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * customize the returned file contents by setting the <code>fileContents</code> property,
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * specified either as a String or as a byte array.
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <p/>
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Each invocation record stored by this CommandHandler includes the following data element key/values:
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <ul>
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <li>{@link #PATHNAME_KEY} ("pathname") - the pathname of the file submitted on the invocation (the first command parameter)
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * </ul>
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpublic class RetrCommandHandler extends AbstractStubDataCommandHandler implements CommandHandler {
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public static final String PATHNAME_KEY = "pathname";
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private byte[] fileContents = new byte[0];
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Create new uninitialized instance
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public RetrCommandHandler() {
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Create new instance using the specified fileContents
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileContents - the file contents
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws org.mockftpserver.core.util.AssertFailedException
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *          - if the fileContents is null
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public RetrCommandHandler(String fileContents) {
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        setFileContents(fileContents);
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Create new instance using the specified fileContents
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileContents - the file contents
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws org.mockftpserver.core.util.AssertFailedException
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *          - if the fileContents is null
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public RetrCommandHandler(byte[] fileContents) {
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        setFileContents(fileContents);
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @see org.mockftpserver.stub.command.AbstractStubDataCommandHandler#beforeProcessData(org.mockftpserver.core.command.Command, org.mockftpserver.core.session.Session, org.mockftpserver.core.command.InvocationRecord)
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected void beforeProcessData(Command command, Session session, InvocationRecord invocationRecord) throws Exception {
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        String filename = command.getRequiredParameter(0);
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        invocationRecord.set(PATHNAME_KEY, filename);
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @see org.mockftpserver.stub.command.AbstractStubDataCommandHandler#processData(org.mockftpserver.core.command.Command, org.mockftpserver.core.session.Session, org.mockftpserver.core.command.InvocationRecord)
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected void processData(Command command, Session session, InvocationRecord invocationRecord) {
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        LOG.info("Sending " + fileContents.length + " bytes");
862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        session.sendData(fileContents, fileContents.length);
872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Set the file contents to return from subsequent command invocations
912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileContents - the fileContents to set
932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws org.mockftpserver.core.util.AssertFailedException
942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *          - if the fileContents is null
952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setFileContents(String fileContents) {
972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        Assert.notNull(fileContents, "fileContents");
982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        setFileContents(fileContents.getBytes());
992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Set the file contents to return from subsequent command invocations
1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileContents - the file contents
1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws org.mockftpserver.core.util.AssertFailedException
1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *          - if the fileContents is null
1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setFileContents(byte[] fileContents) {
1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        Assert.notNull(fileContents, "fileContents");
1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.fileContents = fileContents;
1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}
114