    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 java.text.ParseException;
    021    import java.util.Calendar;
    022
    023    import org.apache.commons.net.ftp.Configurable;
    024    import org.apache.commons.net.ftp.FTPClientConfig;
    025
    026
    027    /**
    028     * <p>
    029     * This abstract class implements the common timestamp parsing
    030     * algorithm for all the concrete parsers.  Classes derived from
    031     * this one will parse file listings via a supplied regular expression
    032     * that pulls out the date portion as a separate string which is
    033     * passed to the underlying {@link FTPTimestampParser delegate} to
    034     * handle parsing of the file timestamp.
    035     * </p><p>
    036     * This class also implements the {@link Configurable Configurable}
    037     * interface to allow the parser to be configured from the outside.
    038     * </p>
    039     * @since 1.4
    040     */
    041    /**
    042     * To change the template for this generated type comment go to
    043     * Window - Preferences - Java - Code Style - Code Templates - Comments
    044     */
    045    public abstract class ConfigurableFTPFileEntryParserImpl
    046    extends RegexFTPFileEntryParserImpl
    047    implements Configurable
    048    {
    049
    050        private final FTPTimestampParser timestampParser;
    051
    052        /**
    053         * Only constructor for this abstract class.
    054         * @param regex  Regular expression used main parsing of the
    055         * file listing.
    056         */
    057        public ConfigurableFTPFileEntryParserImpl(String regex)
    058        {
    059            super(regex);
    060            this.timestampParser = new FTPTimestampParserImpl();
    061        }
    062
    063        /**
    064         * This method is called by the concrete parsers to delegate
    065         * timestamp parsing to the timestamp parser.
    066         * <p>
    067         * @param timestampStr the timestamp string pulled from the
    068         * file listing by the regular expression parser, to be submitted
    069         * to the <code>timestampParser</code> for extracting the timestamp.
    070         * @return a <code>java.util.Calendar</code> containing results of the
    071         * timestamp parse.
    072         */
    073        public Calendar parseTimestamp(String timestampStr) throws ParseException {
    074            return this.timestampParser.parseTimestamp(timestampStr);
    075        }
    076
    077
    078        /**
    079         * Implementation of the {@link  Configurable  Configurable}
    080         * interface. Configures this parser by delegating to the
    081         * underlying Configurable FTPTimestampParser implementation, '
    082         * passing it the supplied {@link  FTPClientConfig FTPClientConfig}
    083         * if that is non-null or a default configuration defined by
    084         * each concrete subclass.
    085         * </p>
    086         * @param config the configuration to be used to configure this parser.
    087         * If it is null, a default configuration defined by
    088         * each concrete subclass is used instead.
    089         */
    090        public void configure(FTPClientConfig config)
    091        {
    092            if (this.timestampParser instanceof Configurable) {
    093                FTPClientConfig defaultCfg = getDefaultConfiguration();
    094                if (config != null) {
    095                    if (null == config.getDefaultDateFormatStr()) {
    096                        config.setDefaultDateFormatStr(defaultCfg.getDefaultDateFormatStr());
    097                    }
    098                    if (null == config.getRecentDateFormatStr()) {
    099                        config.setRecentDateFormatStr(defaultCfg.getRecentDateFormatStr());
    100                    }
    101                    ((Configurable)this.timestampParser).configure(config);
    102                } else {
    103                    ((Configurable)this.timestampParser).configure(defaultCfg);
    104                }
    105            }
    106        }
    107
    108        /**
    109         * Each concrete subclass must define this member to create
    110         * a default configuration to be used when that subclass is
    111         * instantiated without a {@link  FTPClientConfig  FTPClientConfig}
    112         * parameter being specified.
    113         * @return the default configuration for the subclass.
    114         */
    115        protected abstract FTPClientConfig getDefaultConfiguration();
    116    }