| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.sqoop.manager.oracle; |
| |
| /** |
| * Constants for OraOop. |
| */ |
| public final class OraOopConstants { |
| private OraOopConstants() { |
| } |
| |
| public static final String ORAOOP_PRODUCT_NAME = |
| "Data Connector for Oracle and Hadoop"; |
| public static final String ORAOOP_JAR_FILENAME = "oraoop.jar"; |
| |
| // Disables OraOop - falling back to the OracleManager inside Sqoop... |
| public static final String ORAOOP_DISABLED = "oraoop.disabled"; |
| |
| // Whether to log Oracle session statistics using Guy Harrison's jar file... |
| public static final String ORAOOP_REPORT_SESSION_STATISTICS = |
| "oraoop.report.session.statistics"; |
| |
| // Disables dynamic JDBC URL generation for each mapper... |
| public static final String ORAOOP_JDBC_URL_VERBATIM = |
| "oraoop.jdbc.url.verbatim"; |
| |
| // The name of the Oracle RAC service each mapper should connect to, via their |
| // dynamically generated JDBC URL... |
| public static final String ORAOOP_ORACLE_RAC_SERVICE_NAME = |
| "oraoop.oracle.rac.service.name"; |
| |
| // The log4j log-level for OraOop... |
| public static final String ORAOOP_LOGGING_LEVEL = "oraoop.logging.level"; |
| |
| // The file names for the configuration properties of OraOop... |
| public static final String ORAOOP_SITE_TEMPLATE_FILENAME = |
| "oraoop-site-template.xml"; |
| public static final String ORAOOP_SITE_FILENAME = "oraoop-site.xml"; |
| |
| // A flag that indicates that the OraOop job has been cancelled. |
| // E.g. An Oracle DBA killed our Oracle session. |
| // public static final String ORAOOP_JOB_CANCELLED = "oraoop.job.cancelled"; |
| |
| // The SYSDATE from the Oracle database when this OraOop job was started. |
| // This is used to generate unique names for partitions and temporary tables |
| // that we create during the job... |
| public static final String ORAOOP_JOB_SYSDATE = "oraoop.job.sysdate"; |
| |
| // The properties are used internally by OraOop to indicate the schema and |
| // name of |
| // the table being imported/exported... |
| public static final String ORAOOP_TABLE_OWNER = "oraoop.table.owner"; |
| public static final String ORAOOP_TABLE_NAME = "oraoop.table.name"; |
| |
| // Constants used to indicate the desired location of the WHERE clause within |
| // the SQL generated by the record-reader. |
| // E.g. A WHERE clause like "rownum <= 10" would want to be located so that |
| // it had an impact on the total number of rows returned by the split; |
| // as opposed to impacting the number of rows returned for each of the |
| // unioned data-chunks within each split. |
| public static final String ORAOOP_TABLE_IMPORT_WHERE_CLAUSE_LOCATION = |
| "oraoop.table.import.where.clause.location"; |
| |
| /** |
| * Location to place the WHERE clause. |
| */ |
| public enum OraOopTableImportWhereClauseLocation { |
| SUBSPLIT, SPLIT |
| } |
| |
| // The SQL statements to execute for each new Oracle session that is |
| // created... |
| public static final String ORAOOP_SESSION_INITIALIZATION_STATEMENTS = |
| "oraoop.oracle.session.initialization.statements"; |
| |
| // Reliably stores the number mappers requested for the sqoop map-reduce |
| // job... |
| public static final String ORAOOP_DESIRED_NUMBER_OF_MAPPERS = |
| "oraoop.desired.num.mappers"; |
| |
| // The minimum number of mappers required for OraOop to accept the import |
| // job... |
| public static final String ORAOOP_MIN_IMPORT_MAPPERS = |
| "oraoop.min.import.mappers"; |
| public static final int MIN_NUM_IMPORT_MAPPERS_ACCEPTED_BY_ORAOOP = 2; |
| |
| // The minimum number of mappers required for OraOop to accept the export |
| // job... |
| public static final String ORAOOP_MIN_EXPORT_MAPPERS = |
| "oraoop.min.export.mappers"; |
| public static final int MIN_NUM_EXPORT_MAPPERS_ACCEPTED_BY_ORAOOP = 2; |
| |
| // The query used to fetch oracle data chunks... |
| public static final String ORAOOP_ORACLE_DATA_CHUNKS_QUERY = |
| "oraoop.oracle.data.chunks.query"; |
| |
| // The minimum number of active instances in an Oracle RAC required for OraOop |
| // to use dynamically generated JDBC URLs... |
| public static final String ORAOOP_MIN_RAC_ACTIVE_INSTANCES = |
| "oraoop.min.rac.active.instances"; |
| public static final int MIN_NUM_RAC_ACTIVE_INSTANCES_FOR_DYNAMIC_JDBC_URLS = |
| 2; |
| |
| // The name of the Oracle JDBC class... |
| public static final String ORACLE_JDBC_DRIVER_CLASS = |
| "oracle.jdbc.OracleDriver"; |
| |
| // How many rows to pre-fetch when executing Oracle queries... |
| public static final String ORACLE_ROW_FETCH_SIZE = "oracle.row.fetch.size"; |
| public static final int ORACLE_ROW_FETCH_SIZE_DEFAULT = 5000; |
| |
| // OraOop does not require a "--split-by" column to be defined... |
| public static final String TABLE_SPLIT_COLUMN_NOT_REQUIRED = "not-required"; |
| |
| // The name of the data_chunk_id column the OraOop appends to each (import) |
| // query... |
| public static final String COLUMN_NAME_DATA_CHUNK_ID = "data_chunk_id"; |
| |
| // The hint that will be used on the SELECT statement for import jobs |
| public static final String IMPORT_QUERY_HINT = "oraoop.import.hint"; |
| |
| // Pseudo-columns added to an partitioned export table (created by OraOop from |
| // a template table) |
| // to store the partition value and subpartition value. The partition value is |
| // the sysdate when |
| // the job was performed. The subpartition value is the mapper index... |
| public static final String COLUMN_NAME_EXPORT_PARTITION = |
| "ORAOOP_EXPORT_SYSDATE"; |
| public static final String COLUMN_NAME_EXPORT_SUBPARTITION = |
| "ORAOOP_MAPPER_ID"; |
| public static final String COLUMN_NAME_EXPORT_MAPPER_ROW = |
| "ORAOOP_MAPPER_ROW"; |
| |
| public static final String ORAOOP_EXPORT_PARTITION_DATE_VALUE = |
| "oraoop.export.partition.date.value"; |
| public static final String ORAOOP_EXPORT_PARTITION_DATE_FORMAT = |
| "yyyy-mm-dd hh24:mi:ss"; |
| |
| // The string we want to pass to dbms_application_info.set_module() via the |
| // "module_name" parameter... |
| public static final String ORACLE_SESSION_MODULE_NAME = ORAOOP_PRODUCT_NAME; |
| |
| // The name of the configuration property containing the string we want to |
| // pass to |
| // dbms_application_info.set_module() via the "action_name" parameter... |
| public static final String ORACLE_SESSION_ACTION_NAME = |
| "oraoop.oracle.session.module.action"; |
| |
| // Boolean whether to do a consistent read based off an SCN |
| public static final String ORAOOP_IMPORT_CONSISTENT_READ = |
| "oraoop.import.consistent.read"; |
| |
| // The SCN number to use for the consistent read - calculated automatically - |
| // cannot be overridden |
| public static final String ORAOOP_IMPORT_CONSISTENT_READ_SCN = |
| "oraoop.import.consistent.read.scn"; |
| |
| // The method that will be used to create data chunks - ROWID ranges or |
| // partitions |
| public static final String ORAOOP_ORACLE_DATA_CHUNK_METHOD = |
| "oraoop.chunk.method"; |
| |
| /** |
| * How should data be split up - by ROWID range, or by partition. |
| */ |
| public enum OraOopOracleDataChunkMethod { |
| ROWID, PARTITION |
| } |
| |
| // List of partitions to be imported, comma seperated list |
| public static final String ORAOOP_IMPORT_PARTITION_LIST = |
| "oraoop.import.partitions"; |
| |
| public static final OraOopOracleDataChunkMethod |
| ORAOOP_ORACLE_DATA_CHUNK_METHOD_DEFAULT = |
| OraOopOracleDataChunkMethod.ROWID; |
| |
| // How to allocate data-chunks into splits... |
| public static final String ORAOOP_ORACLE_BLOCK_TO_SPLIT_ALLOCATION_METHOD = |
| "oraoop.block.allocation"; |
| |
| /** |
| * How splits should be allocated to the mappers. |
| */ |
| public enum OraOopOracleBlockToSplitAllocationMethod { |
| ROUNDROBIN, SEQUENTIAL, RANDOM |
| } |
| |
| // Whether to omit LOB and LONG columns during an import... |
| public static final String ORAOOP_IMPORT_OMIT_LOBS_AND_LONG = |
| "oraoop.import.omit.lobs.and.long"; |
| |
| // Identifies an existing Oracle table used to create a new table as the |
| // destination of a Sqoop export. |
| // Hence, use of this property implies that the "-table" does not exist in |
| // Oracle and OraOop should create it. |
| public static final String ORAOOP_EXPORT_CREATE_TABLE_TEMPLATE = |
| "oraoop.template.table"; |
| |
| // If the table already exists that we want to create, should we drop it?... |
| public static final String ORAOOP_EXPORT_CREATE_TABLE_DROP = |
| "oraoop.drop.table"; |
| |
| // If ORAOOP_EXPORT_CREATE_TABLE_TEMPLATE has been specified, then this flag |
| // indicates whether the created Oracle |
| // tables should have NOLOGGING... |
| public static final String ORAOOP_EXPORT_CREATE_TABLE_NO_LOGGING = |
| "oraoop.no.logging"; |
| |
| // If ORAOOP_EXPORT_CREATE_TABLE_TEMPLATE has been specified, then this flag |
| // indicates whether the created Oracle |
| // tables should be partitioned by job and mapper... |
| public static final String ORAOOP_EXPORT_CREATE_TABLE_PARTITIONED = |
| "oraoop.partitioned"; |
| |
| // Indicates (internally) the the export table we're dealling with has been |
| // paritioned by OraOop... |
| public static final String EXPORT_TABLE_HAS_ORAOOP_PARTITIONS = |
| "oraoop.export.table.has.oraoop.partitions"; |
| |
| // When using the Oracle hint... /* +APPEND_VALUES */ ...a commit must be |
| // performed after each batch insert. |
| // Therefore, the batches need to be quite large to avoid a performance |
| // penality (for the 'extra' commits). |
| // This is the minimum batch size to use under these conditions... |
| public static final String ORAOOP_MIN_APPEND_VALUES_BATCH_SIZE = |
| "oraoop.min.append.values.batch.size"; |
| public static final int ORAOOP_MIN_APPEND_VALUES_BATCH_SIZE_DEFAULT = 5000; |
| |
| // The version of the Oracle database we're connected to... |
| public static final String ORAOOP_ORACLE_DATABASE_VERSION_MAJOR = |
| "oraoop.oracle.database.version.major"; |
| public static final String ORAOOP_ORACLE_DATABASE_VERSION_MINOR = |
| "oraoop.oracle.database.version.minor"; |
| |
| // When OraOop creates a table for a Sqoop export (from a template table) and |
| // the table contains partitions, |
| // this is the prefix of those partition names. (This also allows us to later |
| // identify partitions that OraOop |
| // created.) |
| public static final String EXPORT_TABLE_PARTITION_NAME_PREFIX = "ORAOOP_"; |
| |
| // When OraOop creates temporary tables for each mapper during a Sqoop export |
| // this is the prefix of table names... |
| public static final String EXPORT_MAPPER_TABLE_NAME_PREFIX = "ORAOOP_"; |
| |
| // The format string used to turn a DATE into a string for use within the |
| // names of Oracle objects |
| // that we create. For example, temporary tables, table partitions, table |
| // subpartitions... |
| public static final String ORACLE_OBJECT_NAME_DATE_TO_STRING_FORMAT_STRING = |
| "yyyymmdd_hh24miss"; |
| |
| // Indicates whether to perform a "merge" operation when performing a Sqoop |
| // export. |
| // If false, 'insert' statements will be used (i.e. no 'updates')... |
| public static final String ORAOOP_EXPORT_MERGE = "oraoop.export.merge"; |
| |
| // This property allows the user to enable parallelization during exports... |
| public static final String ORAOOP_EXPORT_PARALLEL = |
| "oraoop.export.oracle.parallelization.enabled"; |
| |
| // Flag used to indicate that the Oracle table contains at least one column of |
| // type BINARY_DOUBLE... |
| public static final String TABLE_CONTAINS_BINARY_DOUBLE_COLUMN = |
| "oraoop.table.contains.binary.double.column"; |
| // Flag used to indicate that the Oracle table contains at least one column of |
| // type BINARY_FLOAT... |
| public static final String TABLE_CONTAINS_BINARY_FLOAT_COLUMN = |
| "oraoop.table.contains.binary.float.column"; |
| |
| // The storage clause to append to the end of any CREATE TABLE statements we |
| // execute for temporary Oracle tables... |
| public static final String ORAOOP_TEMPORARY_TABLE_STORAGE_CLAUSE = |
| "oraoop.temporary.table.storage.clause"; |
| |
| // The storage clause to append to the end of any CREATE TABLE statements we |
| // execute for permanent (export) Oracle tables... |
| public static final String ORAOOP_EXPORT_TABLE_STORAGE_CLAUSE = |
| "oraoop.table.storage.clause"; |
| |
| // Additional columns to include with the --update-key column... |
| public static final String ORAOOP_UPDATE_KEY_EXTRA_COLUMNS = |
| "oraoop.update.key.extra.columns"; |
| |
| // Should OraOop map Timestamps as java.sql.Timestamp as Sqoop does, or as |
| // String |
| public static final String ORAOOP_MAP_TIMESTAMP_AS_STRING = |
| "oraoop.timestamp.string"; |
| public static final boolean ORAOOP_MAP_TIMESTAMP_AS_STRING_DEFAULT = true; |
| |
| // This flag allows the user to force use of the APPEND_VALUES Oracle hint |
| // either ON, OFF or AUTO... |
| public static final String ORAOOP_ORACLE_APPEND_VALUES_HINT_USAGE = |
| "oraoop.oracle.append.values.hint.usage"; |
| |
| /** |
| * Whether to use the append values hint for exports. |
| */ |
| public enum AppendValuesHintUsage { |
| AUTO, ON, OFF |
| } |
| |
| // http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/ |
| // sql_elements001.htm#i45441 |
| public static final String SUPPORTED_IMPORT_ORACLE_DATA_TYPES_CLAUSE = |
| "(DATA_TYPE IN (" |
| + |
| // "'BFILE',"+ |
| "'BINARY_DOUBLE'," |
| + "'BINARY_FLOAT'," |
| + "'BLOB'," |
| + "'CHAR'," |
| + "'CLOB'," |
| + "'DATE'," |
| + "'FLOAT'," |
| + "'LONG'," |
| + |
| // "'LONG RAW',"+ |
| // "'MLSLABEL',"+ |
| "'NCHAR'," |
| + "'NCLOB'," |
| + "'NUMBER'," |
| + "'NVARCHAR2'," |
| + "'RAW'," |
| + "'ROWID'," |
| + |
| // "'UNDEFINED',"+ |
| "'URITYPE'," |
| + |
| // "'UROWID',"+ //<- SqlType = 1111 = "OTHER" Not supported as |
| // "AAAAACAADAAAAAEAAF" is being returned as "AAAAAAgADAAAA" |
| "'VARCHAR2'" |
| + // <- Columns declared as VARCHAR are listed as VARCHAR2 in |
| // dba_tabl_columns |
| // "'XMLTYPE',"+ |
| ")" + " OR DATA_TYPE LIKE 'INTERVAL YEAR(%) TO MONTH'" |
| + " OR DATA_TYPE LIKE 'INTERVAL DAY(%) TO SECOND(%)'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%)'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%) WITH TIME ZONE'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%) WITH LOCAL TIME ZONE'" + ")"; |
| |
| public static final String SUPPORTED_EXPORT_ORACLE_DATA_TYPES_CLAUSE = |
| "(DATA_TYPE IN (" |
| + |
| // "'BFILE',"+ |
| "'BINARY_DOUBLE'," |
| + "'BINARY_FLOAT'," |
| + |
| // "'BLOB',"+ //<- Jira: SQOOP-117 Sqoop cannot export LOB data |
| "'CHAR'," |
| + |
| // "'CLOB',"+ //<- Jira: SQOOP-117 Sqoop cannot export LOB data |
| "'DATE'," |
| + "'FLOAT'," |
| + |
| // "'LONG',"+ //<- "create table as select..." and |
| // "insert into table as select..." do not work when a long column |
| // exists. |
| // "'LONG RAW',"+ |
| // "'MLSLABEL',"+ |
| "'NCHAR'," |
| + |
| // "'NCLOB',"+ //<- Jira: SQOOP-117 Sqoop cannot export LOB data |
| "'NUMBER'," |
| + "'NVARCHAR2'," |
| + |
| // "'RAW',"+ |
| "'ROWID'," |
| + |
| // "'UNDEFINED',"+ |
| "'URITYPE'," |
| + |
| // "'UROWID',"+ //<- SqlType = 1111 = "OTHER" Not supported as |
| // "AAAAACAADAAAAAEAAF" is being returned as "AAAAAAgADAAAA" |
| "'VARCHAR2'" |
| + // <- Columns declared as VARCHAR are listed as VARCHAR2 in |
| // dba_tabl_columns |
| // "'XMLTYPE',"+ |
| ")" + " OR DATA_TYPE LIKE 'INTERVAL YEAR(%) TO MONTH'" |
| + " OR DATA_TYPE LIKE 'INTERVAL DAY(%) TO SECOND(%)'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%)'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%) WITH TIME ZONE'" |
| + " OR DATA_TYPE LIKE 'TIMESTAMP(%) WITH LOCAL TIME ZONE'" + ")"; |
| |
| // Query to get current logged on user |
| public static final String QUERY_GET_SESSION_USER = "SELECT USER FROM DUAL"; |
| |
| // public static final int[] SUPPORTED_ORACLE_DATA_TYPES = { |
| // oracle.jdbc.OracleTypes.BIT // -7; |
| // ,oracle.jdbc.OracleTypes.TINYINT // -6; |
| // ,oracle.jdbc.OracleTypes.SMALLINT // 5; |
| // ,oracle.jdbc.OracleTypes.INTEGER // 4; |
| // ,oracle.jdbc.OracleTypes.BIGINT // -5; |
| // ,oracle.jdbc.OracleTypes.FLOAT // 6; |
| // ,oracle.jdbc.OracleTypes.REAL // 7; |
| // ,oracle.jdbc.OracleTypes.DOUBLE // 8; |
| // ,oracle.jdbc.OracleTypes.NUMERIC // 2; |
| // ,oracle.jdbc.OracleTypes.DECIMAL // 3; |
| // ,oracle.jdbc.OracleTypes.CHAR // 1; |
| // ,oracle.jdbc.OracleTypes.VARCHAR // 12; |
| // ,oracle.jdbc.OracleTypes.LONGVARCHAR // -1; |
| // ,oracle.jdbc.OracleTypes.DATE // 91; |
| // ,oracle.jdbc.OracleTypes.TIME // 92; |
| // ,oracle.jdbc.OracleTypes.TIMESTAMP // 93; |
| // // ,oracle.jdbc.OracleTypes.TIMESTAMPNS // -100; //<- Deprecated |
| // ,oracle.jdbc.OracleTypes.TIMESTAMPTZ // -101; |
| // ,oracle.jdbc.OracleTypes.TIMESTAMPLTZ // -102; |
| // ,oracle.jdbc.OracleTypes.INTERVALYM // -103; |
| // ,oracle.jdbc.OracleTypes.INTERVALDS // -104; |
| // ,oracle.jdbc.OracleTypes.BINARY // -2; |
| // /// ,oracle.jdbc.OracleTypes.VARBINARY // -3; |
| // ,oracle.jdbc.OracleTypes.LONGVARBINARY // -4; |
| // ,oracle.jdbc.OracleTypes.ROWID // -8; |
| // ,oracle.jdbc.OracleTypes.CURSOR // -10; |
| // ,oracle.jdbc.OracleTypes.BLOB // 2004; |
| // ,oracle.jdbc.OracleTypes.CLOB // 2005; |
| // // ,oracle.jdbc.OracleTypes.BFILE // -13; |
| // // ,oracle.jdbc.OracleTypes.STRUCT // 2002; |
| // // ,oracle.jdbc.OracleTypes.ARRAY // 2003; |
| // ,oracle.jdbc.OracleTypes.REF // 2006; |
| // ,oracle.jdbc.OracleTypes.NCHAR // -15; |
| // ,oracle.jdbc.OracleTypes.NCLOB // 2011; |
| // ,oracle.jdbc.OracleTypes.NVARCHAR // -9; |
| // ,oracle.jdbc.OracleTypes.LONGNVARCHAR // -16; |
| // // ,oracle.jdbc.OracleTypes.SQLXML // 2009; |
| // // ,oracle.jdbc.OracleTypes.OPAQUE // 2007; |
| // // ,oracle.jdbc.OracleTypes.JAVA_STRUCT // 2008; |
| // // ,oracle.jdbc.OracleTypes.JAVA_OBJECT // 2000; |
| // // ,oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE // -14; |
| // ,oracle.jdbc.OracleTypes.BINARY_FLOAT // 100; |
| // ,oracle.jdbc.OracleTypes.BINARY_DOUBLE // 101; |
| // ,oracle.jdbc.OracleTypes.NULL // 0; |
| // ,oracle.jdbc.OracleTypes.NUMBER // 2; |
| // // ,oracle.jdbc.OracleTypes.RAW // -2; |
| // // ,oracle.jdbc.OracleTypes.OTHER // 1111; |
| // ,oracle.jdbc.OracleTypes.FIXED_CHAR // 999; |
| // // ,oracle.jdbc.OracleTypes.DATALINK // 70; |
| // ,oracle.jdbc.OracleTypes.BOOLEAN // 16; |
| // }; |
| |
| /** |
| * Constants for things belonging to sqoop... |
| */ |
| public static final class Sqoop { |
| private Sqoop() { |
| } |
| |
| /** |
| * What type of Sqoop tool is being run. |
| */ |
| public enum Tool { |
| UNKNOWN, IMPORT, EXPORT |
| } |
| |
| public static final String IMPORT_TOOL_NAME = "import"; |
| public static final String MAX_MAPREDUCE_ATTEMPTS = |
| "mapred.map.max.attempts"; |
| } |
| |
| /** |
| * Constants for things belonging to Oracle... |
| */ |
| public static final class Oracle { |
| private Oracle() { |
| } |
| |
| public static final int ROWID_EXTENDED_ROWID_TYPE = 1; |
| public static final int ROWID_MAX_ROW_NUMBER_PER_BLOCK = 32767; |
| |
| // This is how you comment-out a line of SQL text in Oracle. |
| public static final String ORACLE_SQL_STATEMENT_COMMENT_TOKEN = "--"; |
| |
| public static final String OBJECT_TYPE_TABLE = "TABLE"; |
| |
| public static final String URITYPE = "URITYPE"; |
| |
| public static final int MAX_IDENTIFIER_LENGTH = 30; // <- Max length of an |
| // Oracle name |
| // (table-name, |
| // partition-name etc.) |
| |
| public static final String HINT_SYNTAX = "/*+ %s */ "; // Syntax for a hint |
| // in Oracle |
| } |
| |
| /** |
| * Logging constants. |
| */ |
| public static class Logging { |
| /** |
| * Level of log to output. |
| */ |
| public enum Level { |
| TRACE, DEBUG, INFO, WARN, ERROR, FATAL |
| } |
| } |
| |
| } |