    001    /*
    002     * Copyright (c) 2007-2014 Concurrent, Inc. All Rights Reserved.
    003     *
    004     * Project and contact information: http://www.cascading.org/
    005     *
    006     * This file is part of the Cascading project.
    007     *
    008     * Licensed under the Apache License, Version 2.0 (the "License");
    009     * you may not use this file except in compliance with the License.
    010     * You may obtain a copy of the License at
    011     *
    012     *     http://www.apache.org/licenses/LICENSE-2.0
    013     *
    014     * Unless required by applicable law or agreed to in writing, software
    015     * distributed under the License is distributed on an "AS IS" BASIS,
    016     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017     * See the License for the specific language governing permissions and
    018     * limitations under the License.
    019     */
    020
    021    package cascading.property;
    022
    023    import java.util.Map;
    024    import java.util.Properties;
    025
    026    /**
    027     * Class Props is the base class for frameworks specific properties helper classes.
    028     * <p/>
    029     * Use the sub-classes to either create a {@link Properties} instance with custom or default values to be passed
    030     * to any sub-system that requires a Map or Properties instance of properties and values.
    031     * <p/>
    032     * Note some Props sub-classes have static accessors. It is recommended the fluent instance methods be used instead
    033     * of the static methods. All static accessors may be deprecated in future versions.
    034     */
    035    public abstract class Props
    036      {
    037      /**
    038       * Method buildProperties returns a new {@link Properties} instance with all property values for this type.
    039       * <p/>
    040       * If no values have been set, all default properties and values will be returned.
    041       *
    042       * @return a new Properties instance
    043       */
    044      public Properties buildProperties()
    045        {
    046        return buildProperties( (Properties) null );
    047        }
    048
    049      /**
    050       * Method buildProperties returns a new {@link Properties} instance with all property values for this type
    051       * using the given Map of property values as defaults. The given Map will not be modified.
    052       * <p/>
    053       * If no values have been set, all default properties and values will be returned.
    054       *
    055       * @return a new Properties instance
    056       */
    057      public Properties buildProperties( Map<Object, Object> defaultProperties )
    058        {
    059        return buildProperties( PropertyUtil.createProperties( defaultProperties, null ) );
    060        }
    061
    062      /**
    063       * Method buildProperties returns a new {@link Properties} instance with all property values for this type
    064       * using the given Iterable<Map.Entry<String, String>> of property values as defaults. The given Iterable will not be modified.
    065       * <p/>
    066       * If no values have been set, all default properties and values will be returned.
    067       *
    068       * @return a new Properties instance
    069       */
    070      public Properties buildProperties( Iterable<Map.Entry<String, String>> defaultProperties )
    071        {
    072        return buildProperties( PropertyUtil.createProperties( defaultProperties ) );
    073        }
    074
    075      /**
    076       * Method buildProperties returns a new {@link Properties} instance with all property values for this type
    077       * using the given Properties instance of property values as defaults. The given Map will not be modified.
    078       * <p/>
    079       * If no values have been set, all default properties and values will be returned.
    080       *
    081       * @return a new Properties instance
    082       */
    083      public Properties buildProperties( Properties defaultProperties )
    084        {
    085        defaultProperties = defaultProperties != null ? new Properties( defaultProperties ) : new Properties();
    086
    087        addPropertiesTo( defaultProperties );
    088
    089        return defaultProperties;
    090        }
    091
    092      public ConfigDef setProperties( ConfigDef configDef )
    093        {
    094        return setProperties( configDef, ConfigDef.Mode.REPLACE );
    095        }
    096
    097      public ConfigDef setProperties( ConfigDef configDef, ConfigDef.Mode mode )
    098        {
    099        Properties properties = buildProperties();
    100
    101        for( String name : properties.stringPropertyNames() )
    102          configDef.setProperty( mode, name, properties.getProperty( name ) );
    103
    104        return configDef;
    105        }
    106
    107      protected abstract void addPropertiesTo( Properties properties );
    108      }