aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/core/api/src/main/java/org/onosproject/net/config/ConfigFactory.java
blob: 25a34025355793ebe9f8e8222dd73d6808c92b0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.net.config;


import com.google.common.annotations.Beta;

/**
 * Base abstract factory for creating configurations for the specified subject type.
 *
 * @param <S> type of subject
 * @param <C> type of configuration
 */
@Beta
public abstract class ConfigFactory<S, C extends Config<S>> {

    private final SubjectFactory<S> subjectFactory;
    private final Class<C> configClass;
    private final String configKey;
    private final boolean isList;

    /**
     * Creates a new configuration factory for the specified class of subjects
     * capable of generating the configurations of the specified class. The
     * subject and configuration class keys are used merely as keys for use in
     * composite JSON trees.
     *
     * @param subjectFactory subject factory
     * @param configClass    configuration class
     * @param configKey      configuration class key
     */
    protected ConfigFactory(SubjectFactory<S> subjectFactory,
                            Class<C> configClass, String configKey) {
        this(subjectFactory, configClass, configKey, false);
    }

    /**
     * Creates a new configuration factory for the specified class of subjects
     * capable of generating the configurations of the specified class. The
     * subject and configuration class keys are used merely as keys for use in
     * composite JSON trees.
     * <p>
     * Note that configurations backed by JSON array are not easily extensible
     * at the top-level as they are inherently limited to holding an ordered
     * list of items.
     * </p>
     *
     * @param subjectFactory subject factory
     * @param configClass    configuration class
     * @param configKey      configuration class key
     * @param isList         true to indicate backing by JSON array
     */
    protected ConfigFactory(SubjectFactory<S> subjectFactory,
                            Class<C> configClass, String configKey,
                            boolean isList) {
        this.subjectFactory = subjectFactory;
        this.configClass = configClass;
        this.configKey = configKey;
        this.isList = isList;
    }

    /**
     * Returns the class of the subject to which this factory applies.
     *
     * @return subject type
     */
    public SubjectFactory<S> subjectFactory() {
        return subjectFactory;
    }

    /**
     * Returns the class of the configuration which this factory generates.
     *
     * @return configuration type
     */
    public Class<C> configClass() {
        return configClass;
    }

    /**
     * Returns the unique key (within subject class) of this configuration.
     * This is primarily aimed for use in composite JSON trees in external
     * representations and has no bearing on the internal behaviours.
     *
     * @return configuration key
     */
    public String configKey() {
        return configKey;
    }

    /**
     * Creates a new but uninitialized configuration. Framework will initialize
     * the configuration via {@link Config#init} method.
     *
     * @return new uninitialized configuration
     */
    public abstract C createConfig();

    /**
     * Indicates whether the configuration is a list and should be backed by
     * a JSON array rather than JSON object.
     *
     * @return true if backed by JSON array
     */
    public boolean isList() {
        return isList;
    }

}