001 /* 002 * Copyright 2005 The Apache Software Foundation 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.apache.commons.net.ftp.parser; 017 018 import java.text.ParseException; 019 import java.util.Calendar; 020 021 import org.apache.commons.net.ftp.Configurable; 022 import org.apache.commons.net.ftp.FTPClientConfig; 023 024 025 /** 026 * <p> 027 * This abstract class implements the common timestamp parsing 028 * algorithm for all the concrete parsers. Classes derived from 029 * this one will parse file listings via a supplied regular expression 030 * that pulls out the date portion as a separate string which is 031 * passed to the underlying {@link FTPTimestampParser delegate} to 032 * handle parsing of the file timestamp. 033 * </p><p> 034 * This class also implements the {@link Configurable Configurable} 035 * interface to allow the parser to be configured from the outside. 036 * </p> 037 * @since 1.4 038 */ 039 /** 040 * To change the template for this generated type comment go to 041 * Window - Preferences - Java - Code Style - Code Templates - Comments 042 */ 043 public abstract class ConfigurableFTPFileEntryParserImpl 044 extends RegexFTPFileEntryParserImpl 045 implements Configurable 046 { 047 048 private FTPTimestampParser timestampParser; 049 050 /** 051 * Only constructor for this absract class. 052 * @param regex Regular expression used main parsing of the 053 * file listing. 054 */ 055 public ConfigurableFTPFileEntryParserImpl(String regex) 056 { 057 super(regex); 058 this.timestampParser = new FTPTimestampParserImpl(); 059 } 060 061 /** 062 * This method is called by the concrete parsers to delegate 063 * timestamp parsing to the timestamp parser. 064 * <p> 065 * @param timestampStr the timestamp string pulled from the 066 * file listing by the regular expression parser, to be submitted 067 * to the <code>timestampParser</code> for extracting the timestamp. 068 * @return a <code>java.util.Calendar</code> containing results of the 069 * timestamp parse. 070 */ 071 public Calendar parseTimestamp(String timestampStr) throws ParseException { 072 return this.timestampParser.parseTimestamp(timestampStr); 073 } 074 075 076 /** 077 * Implementation of the {@link Configurable Configurable} 078 * interface. Configures this parser by delegating to the 079 * underlying Configurable FTPTimestampParser implementation, ' 080 * passing it the supplied {@link FTPClientConfig FTPClientConfig} 081 * if that is non-null or a default configuration defined by 082 * each concrete subclass. 083 * </p> 084 * @param config the configuration to be used to configure this parser. 085 * If it is null, a default configuration defined by 086 * each concrete subclass is used instead. 087 */ 088 public void configure(FTPClientConfig config) 089 { 090 if (this.timestampParser instanceof Configurable) { 091 FTPClientConfig defaultCfg = getDefaultConfiguration(); 092 if (config != null) { 093 if (null == config.getDefaultDateFormatStr()) { 094 config.setDefaultDateFormatStr(defaultCfg.getDefaultDateFormatStr()); 095 } 096 if (null == config.getRecentDateFormatStr()) { 097 config.setRecentDateFormatStr(defaultCfg.getRecentDateFormatStr()); 098 } 099 ((Configurable)this.timestampParser).configure(config); 100 } else { 101 ((Configurable)this.timestampParser).configure(defaultCfg); 102 } 103 } 104 } 105 106 /** 107 * Each concrete subclass must define this member to create 108 * a default configuration to be used when that subclass is 109 * instantiated without a {@link FTPClientConfig FTPClientConfig} 110 * parameter being specified. 111 * @return the default configuration for the subclass. 112 */ 113 protected abstract FTPClientConfig getDefaultConfiguration(); 114 }