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 */
017package org.apache.commons.vfs2;
018
019import java.time.Duration;
020import java.util.Objects;
021import java.util.function.Function;
022
023import org.apache.commons.lang3.StringUtils;
024import org.apache.commons.lang3.time.DurationUtils;
025
026/**
027 * Abstracts configuring {@link FileSystemOptions}s.
028 */
029public abstract class FileSystemConfigBuilder {
030
031    /** Default prefix to use when resolving system properties */
032    private static final String PREFIX = "vfs.";
033
034    /** The root URI of the file system */
035    private static final String ROOTURI = "rootURI";
036
037    /** The prefix to use when resolving system properties */
038    private final String prefix;
039
040    /**
041     * Constructs builder with default prefix.
042     *
043     * @since 1.0
044     */
045    protected FileSystemConfigBuilder() {
046        prefix = PREFIX;
047    }
048
049    /**
050     * Constructs builder with specified component name.
051     *
052     * @param component component name to be used in prefix
053     * @since 2.0
054     */
055    protected FileSystemConfigBuilder(final String component) {
056        prefix = PREFIX + component;
057    }
058
059    /**
060     * Gets a named option as a Boolean.
061     *
062     * @param fileSystemOptions file system options to query, may be null.
063     * @param name the option name
064     * @return the option in {@code opts} or system properties, otherwise null
065     * @see #getBoolean(FileSystemOptions, String, Boolean)
066     * @since 2.0
067     */
068    protected Boolean getBoolean(final FileSystemOptions fileSystemOptions, final String name) {
069        return getBoolean(fileSystemOptions, name, null);
070    }
071
072    /**
073     * Gets a named option as a Boolean.
074     *
075     * @param fileSystemOptions file system options to query, may be null.
076     * @param name the option name
077     * @param defaultValue value to return if option is not present
078     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
079     * @see #getBoolean(FileSystemOptions, String, Boolean)
080     * @since 2.0
081     */
082    protected boolean getBoolean(final FileSystemOptions fileSystemOptions, final String name,
083        final boolean defaultValue) {
084        return getBoolean(fileSystemOptions, name, Boolean.valueOf(defaultValue)).booleanValue();
085    }
086
087    /**
088     * Gets a named option as a Boolean.
089     *
090     * @param fileSystemOptions file system options to query, may be null.
091     * @param name the option name
092     * @param defaultValue value to return if option is not present
093     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
094     * @see #getBoolean(FileSystemOptions, String, Boolean)
095     * @since 2.0
096     */
097    protected Boolean getBoolean(final FileSystemOptions fileSystemOptions, final String name,
098        final Boolean defaultValue) {
099        return getParam(fileSystemOptions, name, defaultValue, Boolean::valueOf);
100    }
101
102    /**
103     * Gets a named option as a Byte.
104     *
105     * @param fileSystemOptions file system options to query, may be null.
106     * @param name the option name
107     * @return the option in {@code opts} or system properties, otherwise null
108     * @see #getByte(FileSystemOptions, String, Byte)
109     * @since 2.0
110     */
111    protected Byte getByte(final FileSystemOptions fileSystemOptions, final String name) {
112        return getByte(fileSystemOptions, name, null);
113    }
114
115    /**
116     * Gets a named option as a Byte.
117     *
118     * @param fileSystemOptions file system options to query, may be null.
119     * @param name the option name
120     * @param defaultValue value to return if option is not present
121     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
122     * @see #getByte(FileSystemOptions, String, Byte)
123     * @since 2.0
124     */
125    protected byte getByte(final FileSystemOptions fileSystemOptions, final String name, final byte defaultValue) {
126        return getByte(fileSystemOptions, name, Byte.valueOf(defaultValue)).byteValue();
127    }
128
129    /**
130     * Gets a named option as a Byte.
131     *
132     * @param fileSystemOptions file system options to query, may be null.
133     * @param name the option name
134     * @param defaultValue value to return if option is not present
135     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
136     * @since 2.0
137     */
138    protected Byte getByte(final FileSystemOptions fileSystemOptions, final String name, final Byte defaultValue) {
139        return getParam(fileSystemOptions, name, defaultValue, Byte::valueOf);
140    }
141
142    /**
143     * Gets a named option as a Character.
144     *
145     * @param fileSystemOptions file system options to query, may be null.
146     * @param name the option name
147     * @return the option in {@code opts} or system properties, otherwise null
148     * @see #getCharacter(FileSystemOptions, String, Character)
149     * @since 2.0
150     */
151    protected Character getCharacter(final FileSystemOptions fileSystemOptions, final String name) {
152        return getCharacter(fileSystemOptions, name, null);
153    }
154
155    /**
156     * Gets a named option as a Character.
157     *
158     * @param fileSystemOptions file system options to query, may be null.
159     * @param name the option name
160     * @param defaultValue value to return if option is not present
161     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
162     * @see #getCharacter(FileSystemOptions, String, Character)
163     * @since 2.0
164     */
165    protected char getCharacter(final FileSystemOptions fileSystemOptions, final String name, final char defaultValue) {
166        return getCharacter(fileSystemOptions, name, Character.valueOf(defaultValue)).charValue();
167    }
168
169    /**
170     * Gets a named option as a Character.
171     *
172     * @param fileSystemOptions file system options to query, may be null.
173     * @param name the option name
174     * @param defaultValue value to return if option is not present
175     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
176     * @since 2.0
177     */
178    protected Character getCharacter(final FileSystemOptions fileSystemOptions, final String name,
179        final Character defaultValue) {
180        Character value = getParam(fileSystemOptions, name);
181        if (value == null) {
182            final String str = getProperty(name);
183            if (StringUtils.isEmpty(str)) {
184                return defaultValue;
185            }
186            value = Character.valueOf(str.charAt(0));
187        }
188        return value;
189    }
190
191    /**
192     * Gets the target of this configuration.
193     *
194     * @return the specific file system class
195     * @since 1.0
196     */
197    protected abstract Class<? extends FileSystem> getConfigClass();
198
199    /**
200     * Gets a named option as a Double.
201     *
202     * @param fileSystemOptions file system options to query, may be null.
203     * @param name the option name
204     * @return the option in {@code opts} or system properties, otherwise null
205     * @see #getDouble(FileSystemOptions, String, Double)
206     * @since 2.0
207     */
208    protected Double getDouble(final FileSystemOptions fileSystemOptions, final String name) {
209        return getDouble(fileSystemOptions, name, null);
210    }
211
212    /**
213     * Gets a named option as a Double.
214     *
215     * @param fileSystemOptions file system options to query, may be null.
216     * @param name the option name
217     * @param defaultValue value to return if option is not present
218     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
219     * @see #getDouble(FileSystemOptions, String, Double)
220     * @since 2.0
221     */
222    protected double getDouble(final FileSystemOptions fileSystemOptions, final String name,
223        final double defaultValue) {
224        return getDouble(fileSystemOptions, name, Double.valueOf(defaultValue)).doubleValue();
225    }
226
227    /**
228     * Gets a named option as a Double.
229     *
230     * @param fileSystemOptions file system options to query, may be null.
231     * @param name the option name
232     * @param defaultValue value to return if option is not present
233     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
234     * @since 2.0
235     */
236    protected Double getDouble(final FileSystemOptions fileSystemOptions, final String name,
237        final Double defaultValue) {
238        return getParam(fileSystemOptions, name, defaultValue, Double::valueOf);
239    }
240
241    /**
242     * Gets a named option as a Duration.
243     *
244     * @param fileSystemOptions file system options to query, may be null.
245     * @param name the option name
246     * @return the option in {@code opts} or system properties, otherwise null
247     * @see #getLong(FileSystemOptions, String, Long)
248     * @since 2.8.0
249     */
250    protected Duration getDuration(final FileSystemOptions fileSystemOptions, final String name) {
251        return getDuration(fileSystemOptions, name, null);
252    }
253
254    /**
255     * Gets a named option as a Duration.
256     *
257     * @param fileSystemOptions file system options to query, may be null.
258     * @param name the option name
259     * @param defaultValue value to return if option is not present
260     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
261     * @since 2.8.0
262     */
263    protected Duration getDuration(final FileSystemOptions fileSystemOptions, final String name,
264        final Duration defaultValue) {
265        return getParam(fileSystemOptions, name, defaultValue, Duration::parse);
266    }
267
268    /**
269     * Gets a named option as a Duration bound to the integer range.
270     *
271     * @param fileSystemOptions file system options to query, may be null.
272     * @param name the option name
273     * @return the option in {@code opts} or system properties, otherwise null
274     * @see #getLong(FileSystemOptions, String, Long)
275     * @since 2.8.0
276     */
277    protected Integer getDurationInteger(final FileSystemOptions fileSystemOptions, final String name) {
278        return getDurationInteger(fileSystemOptions, name, null);
279    }
280
281    /**
282     * Gets a named option as a Duration bound to the integer range.
283     *
284     * @param fileSystemOptions file system options to query, may be null.
285     * @param name the option name
286     * @param defaultValue value to return if option is not present
287     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
288     * @since 2.8.0
289     */
290    protected Integer getDurationInteger(final FileSystemOptions fileSystemOptions, final String name,
291        final Duration defaultValue) {
292        return DurationUtils.toMillisInt(getParam(fileSystemOptions, name, defaultValue, Duration::parse));
293    }
294
295    /**
296     *Gets a named option as a Double.
297     *
298     * @param <E> enumeration type
299     * @param enumClass class of enumeration type
300     * @param fileSystemOptions file system options to query, may be null.
301     * @param name the option name *
302     * @return the option in {@code opts} or system properties, otherwise null
303     * @see #getEnum(Class, FileSystemOptions, String, Enum)
304     * @throws IllegalArgumentException if option value is not a known enumeration.
305     * @since 2.1
306     */
307    protected <E extends Enum<E>> E getEnum(final Class<E> enumClass, final FileSystemOptions fileSystemOptions,
308        final String name) {
309        return this.getEnum(enumClass, fileSystemOptions, name, null);
310    }
311
312    /**
313     * Gets a named option as an Enum.
314     *
315     * @param <E> enumeration type
316     * @param enumClass class of enumeration type
317     * @param fileSystemOptions file system options to query, may be null.
318     * @param name the option name
319     * @param defaultValue value to return if option is not present
320     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
321     * @see #getEnum(Class, FileSystemOptions, String, Enum)
322     * @throws IllegalArgumentException if option value is not a known enumeration.
323     * @since 2.1
324     */
325    protected <E extends Enum<E>> E getEnum(final Class<E> enumClass, final FileSystemOptions fileSystemOptions,
326        final String name, final E defaultValue) {
327        E value = getParam(fileSystemOptions, name);
328        if (value == null) {
329            final String str = getProperty(name);
330            if (str == null) {
331                return defaultValue;
332            }
333            value = Enum.valueOf(enumClass, str);
334        }
335        return value;
336    }
337
338    /**
339     * Gets a named option as a Float.
340     *
341     * @param fileSystemOptions file system options to query, may be null.
342     * @param name the option name
343     * @return the option in {@code opts} or system properties, otherwise null
344     * @see #getFloat(FileSystemOptions, String, Float)
345     * @throws NumberFormatException if option value is not a valid float.
346     * @since 2.0
347     */
348    protected Float getFloat(final FileSystemOptions fileSystemOptions, final String name) {
349        return getFloat(fileSystemOptions, name, null);
350    }
351
352    /**
353     * Gets a named option as a Float.
354     *
355     * @param fileSystemOptions file system options to query, may be null.
356     * @param name the option name
357     * @param defaultValue value to return if option is not present
358     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
359     * @see #getFloat(FileSystemOptions, String, Float)
360     * @throws NumberFormatException if option value is not a valid float.
361     * @since 2.0
362     */
363    protected float getFloat(final FileSystemOptions fileSystemOptions, final String name, final float defaultValue) {
364        return getFloat(fileSystemOptions, name, Float.valueOf(defaultValue)).floatValue();
365    }
366
367    /**
368     * Gets a named option as a Float.
369     *
370     * @param fileSystemOptions file system options to query, may be null.
371     * @param name the option name
372     * @param defaultValue value to return if option is not present
373     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
374     * @throws NumberFormatException if option value is not a valid float.
375     * @since 2.0
376     */
377    protected Float getFloat(final FileSystemOptions fileSystemOptions, final String name, final Float defaultValue) {
378        return getParam(fileSystemOptions, name, defaultValue, Float::valueOf);
379    }
380
381    /**
382     * Gets a named option as an Integer.
383     *
384     * @param fileSystemOptions file system options to query, may be null.
385     * @param name the option name
386     * @return the option in {@code opts} or system properties, otherwise null
387     * @see #getInteger(FileSystemOptions, String, Integer)
388     * @throws NumberFormatException if option value is not a valid integer.
389     * @since 2.0
390     */
391    protected Integer getInteger(final FileSystemOptions fileSystemOptions, final String name) {
392        return getInteger(fileSystemOptions, name, null);
393    }
394
395    /**
396     * Gets a named option as an Integer.
397     *
398     * @param fileSystemOptions file system options to query, may be null.
399     * @param name the option name
400     * @param defaultValue value to return if option is not present
401     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
402     * @see #getInteger(FileSystemOptions, String, Integer)
403     * @throws NumberFormatException if option value is not a valid integer.
404     * @since 2.0
405     */
406    protected int getInteger(final FileSystemOptions fileSystemOptions, final String name, final int defaultValue) {
407        return getInteger(fileSystemOptions, name, Integer.valueOf(defaultValue)).intValue();
408    }
409
410    /**
411     * Gets a named option as an Integer.
412     *
413     * @param fileSystemOptions file system options to query, may be null.
414     * @param name the option name
415     * @param defaultValue value to return if option is not present
416     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
417     * @throws NumberFormatException if option value is not a valid integer.
418     * @since 2.0
419     */
420    protected Integer getInteger(final FileSystemOptions fileSystemOptions, final String name,
421        final Integer defaultValue) {
422        return getParam(fileSystemOptions, name, defaultValue, Integer::valueOf);
423    }
424
425    /**
426     * Gets a named option as a Long.
427     *
428     * @param fileSystemOptions file system options to query, may be null.
429     * @param name the option name
430     * @return the option in {@code opts} or system properties, otherwise null
431     * @see #getLong(FileSystemOptions, String, Long)
432     * @throws NumberFormatException if option value is not a valid long.
433     * @since 2.0
434     */
435    protected Long getLong(final FileSystemOptions fileSystemOptions, final String name) {
436        return getLong(fileSystemOptions, name, null);
437    }
438
439    /**
440     * Gets a named option as a Long.
441     *
442     * @param fileSystemOptions file system options to query, may be null.
443     * @param name the option name
444     * @param defaultValue value to return if option is not present
445     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
446     * @see #getLong(FileSystemOptions, String, Long)
447     * @throws NumberFormatException if option value is not a valid long.
448     * @since 2.0
449     */
450    protected long getLong(final FileSystemOptions fileSystemOptions, final String name, final long defaultValue) {
451        return getLong(fileSystemOptions, name, Long.valueOf(defaultValue)).longValue();
452    }
453
454    /**
455     * Gets a named option as a Long.
456     *
457     * @param fileSystemOptions file system options to query, may be null.
458     * @param name the option name
459     * @param defaultValue value to return if option is not present
460     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
461     * @throws NumberFormatException if option value is not a valid long.
462     * @since 2.0
463     */
464    protected Long getLong(final FileSystemOptions fileSystemOptions, final String name, final Long defaultValue) {
465        return getParam(fileSystemOptions, name, defaultValue, Long::valueOf);
466    }
467
468    /**
469     * Gets a named parameter.
470     *
471     * @param <T> The expected return type.
472     * @param fileSystemOptions file system options to query, may be null.
473     * @param name get option with this name
474     * @return the named option or null
475     * @since 1.0
476     */
477    protected <T> T getParam(final FileSystemOptions fileSystemOptions, final String name) {
478        return fileSystemOptions == null ? null : fileSystemOptions.getOption(getConfigClass(), name);
479    }
480
481    /**
482     * Gets a named parameter.
483     *
484     * @param <T> The expected return type.
485     * @param fileSystemOptions file system options to query, may be null.
486     * @param name get option with this name
487     * @param defaultValue value to use if the system property value is null.
488     * @param function Builds an instance of T from a system property String value.
489     * @return the named option or null
490     * @since 2.8.0
491     */
492    private <T> T getParam(final FileSystemOptions fileSystemOptions, final String name, final T defaultValue,
493        final Function<String, T> function) {
494        T value = getParam(fileSystemOptions, name);
495        if (value == null) {
496            final String str = getProperty(name);
497            if (str == null) {
498                return defaultValue;
499            }
500            if (function != null) {
501                value = function.apply(str);
502            }
503        }
504        return value;
505    }
506
507    /**
508     * Gets a named parameter.
509     *
510     * @param <T> The expected return type.
511     * @param fileSystemOptions file system options to query, may be null.
512     * @param name get option with this name
513     * @param defaultValue The default value if absent.
514     * @return the named option or {@code defaultValue}.
515     * @since 2.10.0
516     */
517    protected <T> T getParamOrDefault(final FileSystemOptions fileSystemOptions, final String name, final T defaultValue) {
518        return fileSystemOptions == null ? defaultValue : fileSystemOptions.getOptionOrDefault(getConfigClass(), name, defaultValue);
519    }
520
521    /**
522     * Gets the system property for the given name.
523     *
524     * @param name The name to lookup combined with the prefix.
525     * @return a system property or null
526     * @since 2.1
527     */
528    private String getProperty(final String name) {
529        return System.getProperty(toPropertyKey(name));
530    }
531
532    /**
533     * Gets the root URI of the file system.
534     *
535     * @param fileSystemOptions file system options to query, may be null.
536     * @return The root URI, or null.
537     * @since 2.0
538     */
539    public String getRootURI(final FileSystemOptions fileSystemOptions) {
540        return getString(fileSystemOptions, ROOTURI);
541    }
542
543    /**
544     * Gets a named option as a Short.
545     *
546     * @param fileSystemOptions file system options to query, may be null.
547     * @param name the option name
548     * @return the option in {@code opts} or system properties, otherwise null
549     * @see #getShort(FileSystemOptions, String, Short)
550     * @throws NumberFormatException if option value is not a valid short.
551     * @since 2.0
552     */
553    protected Short getShort(final FileSystemOptions fileSystemOptions, final String name) {
554        return getShort(fileSystemOptions, name, null);
555    }
556
557    /**
558     * Gets a named option as a Short.
559     *
560     * @param fileSystemOptions file system options to query, may be null.
561     * @param name the option name
562     * @param defaultValue value to return if option is not present
563     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
564     * @see #getShort(FileSystemOptions, String, Short)
565     * @throws NumberFormatException if option value is not a valid short
566     * @since 2.0
567     */
568    protected short getShort(final FileSystemOptions fileSystemOptions, final String name, final short defaultValue) {
569        return getShort(fileSystemOptions, name, Short.valueOf(defaultValue)).shortValue();
570    }
571
572    /**
573     * Gets a named option as a Short.
574     *
575     * @param fileSystemOptions file system options to query, may be null.
576     * @param name the option name
577     * @param defaultValue value to return if option is not present
578     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
579     * @throws NumberFormatException if option value is not a valid short
580     * @since 2.0
581     */
582    protected Short getShort(final FileSystemOptions fileSystemOptions, final String name, final Short defaultValue) {
583        return getParam(fileSystemOptions, name, defaultValue, Short::valueOf);
584    }
585
586    /**
587     * Gets a named option as a String.
588     *
589     * @param fileSystemOptions file system options to query, may be null.
590     * @param name the option name
591     * @return the option in {@code opts} or system properties, otherwise null
592     * @see #getString(FileSystemOptions, String, String)
593     * @since 2.0
594     */
595    protected String getString(final FileSystemOptions fileSystemOptions, final String name) {
596        return getString(fileSystemOptions, name, null);
597    }
598
599    /**
600     * Gets a named option as a String.
601     *
602     * @param fileSystemOptions file system options to query, may be null.
603     * @param name the option name
604     * @param defaultValue value to return if option is not present
605     * @return the option in {@code opts} or system properties, otherwise {@code defaultValue}
606     * @since 2.0
607     */
608    protected String getString(final FileSystemOptions fileSystemOptions, final String name,
609        final String defaultValue) {
610        return getParam(fileSystemOptions, name, defaultValue, String::valueOf);
611    }
612
613    /**
614     * Checks the named setting specified.
615     *
616     * @param fileSystemOptions file system options to query, may be null.
617     * @param name the option to check in {@code opts} or system properties
618     * @return true if option exists
619     * @since 2.0
620     */
621    protected boolean hasObject(final FileSystemOptions fileSystemOptions, final String name) {
622        return hasParam(fileSystemOptions, name) || System.getProperties().containsKey(toPropertyKey(name));
623    }
624
625    /**
626     * Checks if option exists.
627     *
628     * @param fileSystemOptions file system options to query, may be null.
629     * @param name the name to look up in {@code opts}
630     * @return true if opts have the named parameter
631     * @since 1.0
632     */
633    protected boolean hasParam(final FileSystemOptions fileSystemOptions, final String name) {
634        return fileSystemOptions != null && fileSystemOptions.hasOption(getConfigClass(), name);
635    }
636
637    /**
638     * Sets the named parameter.
639     *
640     * @param fileSystemOptions the file system options to modify
641     * @param name set option with this name
642     * @param value boolean value to set
643     * @since 2.1
644     */
645    protected void setParam(final FileSystemOptions fileSystemOptions, final String name, final boolean value) {
646        setParam(fileSystemOptions, name, Boolean.valueOf(value));
647    }
648
649    /**
650     * Sets the named parameter.
651     *
652     * @param fileSystemOptions the file system options to modify
653     * @param name set option with this name
654     * @param value object value to set
655     * @since 1.0
656     */
657    protected void setParam(final FileSystemOptions fileSystemOptions, final String name, final Object value) {
658        Objects.requireNonNull(fileSystemOptions, "fileSystemOptions").setOption(getConfigClass(), name, value);
659    }
660
661    /**
662     * Sets the root URI of the file system.
663     *
664     * @param fileSystemOptions the file system options to modify
665     * @param rootURI The creator name to be associated with the file.
666     * @since 2.0
667     */
668    public void setRootURI(final FileSystemOptions fileSystemOptions, final String rootURI) {
669        setParam(fileSystemOptions, ROOTURI, rootURI);
670    }
671
672    /**
673     * Converts the given primitive boolean to a Boolean object.
674     *
675     * @param value a primitive boolean.
676     * @return the given primitive boolean as Boolean object.
677     * @since 2.7.0
678     */
679    protected Boolean toBooleanObject(final boolean value) {
680        return value ? Boolean.TRUE : Boolean.FALSE;
681    }
682
683    /**
684     * Converts the given name into a System property key.
685     *
686     * @param name a name to combine with the builder prefix
687     * @return name of system property
688     * @since 2.1
689     */
690    private String toPropertyKey(final String name) {
691        return prefix + name;
692    }
693
694}