1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.net.ftp.parser; 19 20 import java.text.ParseException; 21 import java.util.Calendar; 22 23 import org.apache.commons.net.ftp.Configurable; 24 import org.apache.commons.net.ftp.FTPClientConfig; 25 26 27 /** 28 * <p> 29 * This abstract class implements the common timestamp parsing 30 * algorithm for all the concrete parsers. Classes derived from 31 * this one will parse file listings via a supplied regular expression 32 * that pulls out the date portion as a separate string which is 33 * passed to the underlying {@link FTPTimestampParser delegate} to 34 * handle parsing of the file timestamp. 35 * </p><p> 36 * This class also implements the {@link Configurable Configurable} 37 * interface to allow the parser to be configured from the outside. 38 * </p> 39 * @since 1.4 40 */ 41 /** 42 * To change the template for this generated type comment go to 43 * Window - Preferences - Java - Code Style - Code Templates - Comments 44 */ 45 public abstract class ConfigurableFTPFileEntryParserImpl 46 extends RegexFTPFileEntryParserImpl 47 implements Configurable 48 { 49 50 private final FTPTimestampParser timestampParser; 51 52 /** 53 * Only constructor for this abstract class. 54 * @param regex Regular expression used main parsing of the 55 * file listing. 56 */ 57 public ConfigurableFTPFileEntryParserImpl(String regex) 58 { 59 super(regex); 60 this.timestampParser = new FTPTimestampParserImpl(); 61 } 62 63 /** 64 * This method is called by the concrete parsers to delegate 65 * timestamp parsing to the timestamp parser. 66 * <p> 67 * @param timestampStr the timestamp string pulled from the 68 * file listing by the regular expression parser, to be submitted 69 * to the <code>timestampParser</code> for extracting the timestamp. 70 * @return a <code>java.util.Calendar</code> containing results of the 71 * timestamp parse. 72 */ 73 public Calendar parseTimestamp(String timestampStr) throws ParseException { 74 return this.timestampParser.parseTimestamp(timestampStr); 75 } 76 77 78 /** 79 * Implementation of the {@link Configurable Configurable} 80 * interface. Configures this parser by delegating to the 81 * underlying Configurable FTPTimestampParser implementation, ' 82 * passing it the supplied {@link FTPClientConfig FTPClientConfig} 83 * if that is non-null or a default configuration defined by 84 * each concrete subclass. 85 * 86 * @param config the configuration to be used to configure this parser. 87 * If it is null, a default configuration defined by 88 * each concrete subclass is used instead. 89 */ 90 // @Override 91 public void configure(FTPClientConfig config) 92 { 93 if (this.timestampParser instanceof Configurable) { 94 FTPClientConfig defaultCfg = getDefaultConfiguration(); 95 if (config != null) { 96 if (null == config.getDefaultDateFormatStr()) { 97 config.setDefaultDateFormatStr(defaultCfg.getDefaultDateFormatStr()); 98 } 99 if (null == config.getRecentDateFormatStr()) { 100 config.setRecentDateFormatStr(defaultCfg.getRecentDateFormatStr()); 101 } 102 ((Configurable)this.timestampParser).configure(config); 103 } else { 104 ((Configurable)this.timestampParser).configure(defaultCfg); 105 } 106 } 107 } 108 109 /** 110 * Each concrete subclass must define this member to create 111 * a default configuration to be used when that subclass is 112 * instantiated without a {@link FTPClientConfig FTPClientConfig} 113 * parameter being specified. 114 * @return the default configuration for the subclass. 115 */ 116 protected abstract FTPClientConfig getDefaultConfiguration(); 117 }