summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/utilities/optionhandling/OptionID.java
blob: 8202f9d39f64c155a5890979449eca543d7a9f70 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package de.lmu.ifi.dbs.elki.utilities.optionhandling;

/*
 This file is part of ELKI:
 Environment for Developing KDD-Applications Supported by Index-Structures

 Copyright (C) 2011
 Ludwig-Maximilians-Universität München
 Lehr- und Forschungseinheit für Datenbanksysteme
 ELKI Development Team

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Affero General Public License for more details.

 You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import de.lmu.ifi.dbs.elki.utilities.ConstantObject;

/**
 * An OptionID is used by option handlers as a unique identifier for specific
 * options. There is no option possible without a specific OptionID defined
 * within this class.
 * 
 * @author Elke Achtert
 */
public final class OptionID extends ConstantObject<OptionID> {
  /**
   * Flag to obtain help-message.
   * <p>
   * Key: {@code -h}
   * </p>
   */
  public static final OptionID HELP = new OptionID("h", "Request a help-message, either for the main-routine or for any specified algorithm. " + "Causes immediate stop of the program.");

  /**
   * Flag to obtain help-message.
   * <p>
   * Key: {@code -help}
   * </p>
   */
  public static final OptionID HELP_LONG = new OptionID("help", "Request a help-message, either for the main-routine or for any specified algorithm. " + "Causes immediate stop of the program.");

  /**
   * OptionID for {@link de.lmu.ifi.dbs.elki.workflow.AlgorithmStep}
   */
  public static final OptionID ALGORITHM = new OptionID("algorithm", "Algorithm to run.");

  /**
   * Optional Parameter to specify a class to obtain a description for.
   * <p>
   * Key: {@code -description}
   * </p>
   */
  public static final OptionID DESCRIPTION = new OptionID("description", "Class to obtain a description of. " + "Causes immediate stop of the program.");

  /**
   * Optional Parameter to specify a class to enable debugging for.
   * <p>
   * Key: {@code -enableDebug}
   * </p>
   */
  public static final OptionID DEBUG = new OptionID("enableDebug", "Parameter to enable debugging for particular packages.");

  /**
   * OptionID for {@link de.lmu.ifi.dbs.elki.workflow.InputStep}
   */
  public static final OptionID DATABASE = new OptionID("db", "Database class.");

  /**
   * OptionID for {@link de.lmu.ifi.dbs.elki.workflow.InputStep}
   */
  // TODO: move to database class?
  public static final OptionID DATABASE_CONNECTION = new OptionID("dbc", "Database connection class.");

  /**
   * OptionID for {@link de.lmu.ifi.dbs.elki.workflow.EvaluationStep}
   */
  public static final OptionID EVALUATOR = new OptionID("evaluator", "Class to evaluate the results with.");

  /**
   * OptionID for {@link de.lmu.ifi.dbs.elki.workflow.OutputStep}
   */
  public static final OptionID RESULT_HANDLER = new OptionID("resulthandler", "Result handler class.");

  /**
   * OptionID for the application output file/folder 
   */
  public static final OptionID OUTPUT = new OptionID("out", "Directory name (or name of an existing file) to write the obtained results in. " + "If this parameter is omitted, per default the output will sequentially be given to STDOUT.");

  /**
   * Flag to allow verbose messages while running the application.
   * <p>
   * Key: {@code -verbose}
   * </p>
   */
  public static final OptionID VERBOSE_FLAG = new OptionID("verbose", "Enable verbose messages.");

  /**
   * The description of the OptionID.
   */
  private String description;

  /**
   * Provides a new OptionID of the given name and description.
   * <p/>
   * All OptionIDs are unique w.r.t. their name. An OptionID provides
   * additionally a description of the option.
   * 
   * @param name the name of the option
   * @param description the description of the option
   */
  private OptionID(final String name, final String description) {
    super(name);
    this.description = description;
  }

  /**
   * Returns the description of this OptionID.
   * 
   * @return the description of this OptionID
   */
  public String getDescription() {
    return description;
  }

  /**
   * Sets the description of this OptionID.
   * 
   * @param description the description to be set
   */
  public void setDescription(String description) {
    this.description = description;
  }

  /**
   * Gets or creates the OptionID for the given class and given name. The
   * OptionID usually is named as the classes name (lowercase) as name-prefix
   * and the given name as suffix of the complete name, separated by a dot. For
   * example, the parameter {@code epsilon} for the class
   * {@link de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN} will be named
   * {@code dbscan.epsilon}.
   * 
   * @param name the name
   * @param description the description is also set if the named OptionID does
   *        exist already
   * @return the OptionID for the given name
   */
  public static OptionID getOrCreateOptionID(final String name, final String description) {
    OptionID optionID = getOptionID(name);
    if(optionID == null) {
      optionID = new OptionID(name, description);
    }
    else {
      optionID.setDescription(description);
    }
    return optionID;
  }

  /**
   * Returns the OptionID for the given name if it exists, null otherwise.
   * 
   * @param name name of the desired OptionID
   * @return the OptionID for the given name
   */
  public static OptionID getOptionID(final String name) {
    return OptionID.lookup(OptionID.class, name);
  }

  /**
   * Returns the name of this OptionID.
   * 
   * @return the name
   * @see java.lang.Object#toString()
   */
  @Override
  public String toString() {
    return getName();
  }

}