001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.net.ftp.parser;
019
020 import org.apache.commons.net.ftp.FTPFile;
021 import org.apache.commons.net.ftp.FTPFileEntryParser;
022 import org.apache.commons.net.ftp.FTPFileEntryParserImpl;
023
024 /**
025 * This implementation allows to pack some FileEntryParsers together
026 * and handle the case where to returned dirstyle isnt clearly defined.
027 * The matching parser will be cached.
028 * If the cached parser wont match due to the server changed the dirstyle,
029 * a new matching parser will be searched.
030 *
031 * @author Mario Ivankovits <mario@ops.co.at>
032 */
033 public class CompositeFileEntryParser extends FTPFileEntryParserImpl
034 {
035 private final FTPFileEntryParser[] ftpFileEntryParsers;
036 private FTPFileEntryParser cachedFtpFileEntryParser;
037
038 public CompositeFileEntryParser(FTPFileEntryParser[] ftpFileEntryParsers)
039 {
040 super();
041
042 this.cachedFtpFileEntryParser = null;
043 this.ftpFileEntryParsers = ftpFileEntryParsers;
044 }
045
046 public FTPFile parseFTPEntry(String listEntry)
047 {
048 if (cachedFtpFileEntryParser != null)
049 {
050 FTPFile matched = cachedFtpFileEntryParser.parseFTPEntry(listEntry);
051 if (matched != null)
052 {
053 return matched;
054 }
055 }
056 else
057 {
058 for (int iterParser=0; iterParser < ftpFileEntryParsers.length; iterParser++)
059 {
060 FTPFileEntryParser ftpFileEntryParser = ftpFileEntryParsers[iterParser];
061
062 FTPFile matched = ftpFileEntryParser.parseFTPEntry(listEntry);
063 if (matched != null)
064 {
065 cachedFtpFileEntryParser = ftpFileEntryParser;
066 return matched;
067 }
068 }
069 }
070 return null;
071 }
072 }