/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 1998, 2018 IBM Corporation and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     tware - contribution direct from Oracle TopLink
//     tware - updates for new SessionProfiling API
//     09/24/2014-2.6 Rick Curtis
//       - 443762 : Misc message cleanup.
package org.eclipse.persistence.internal.localization.i18n;

import java.util.ListResourceBundle;

/**
* English ResourceBundle for DMSLocalization messages.
*
* @since TOPLink AS 10.0.3
*/
public class DMSLocalizationResource extends ListResourceBundle {
 static final Object[][] contents = {
                                        { "session_name", "The name of the session" },
                                        { "session_login_time", "Time the session was logged in" },
                                        { "client_session_count", "The number of ClientSession was logged in" },
                                        { "unitofwork_count", "Count of total number of UnitOfWork objects created"},
                                        { "unitofwork_commit", "Measures the commit process of the UnitOfWork" },
                                        { "unitofwork_commits", "Number of UnitOfWork commits" },
                                        { "unitofwork_rollback", "Number of UnitOfWork commits that were rollback" },
                                        { "optimistic_lock", "Number of optimistic lock exceptions which were thrown" },
                                         { "query", "Total time spent on operation: {0}" },
                                         { "query_misc", "Total time spent on operation: {0}.  This is for special operations not included in any query nouns, such as batch writing." },
                                        { "rcm_status", "One of [not configured, started, stopped]", "not configured" },
                                        { "rcm_message_received", "Number of messages that been received through the RCM" },
                                        { "rcm_message_sent", "Number of messages that been sent through the RCM" },
                                        { "remote_change_set", "Number of change sets received from remote machines and processed" },
                                        { "connection_in_used", "Number of connections in use per pool for any exclusive ConnectionPool(Write, ExclusiveRead)" },
                                        { "connect_call", "Total number of connect calls made" },
                                        { "disconnect_call", "Total number of disconnect calls made" },
                                        { "cache_hits", "The number of times that the object was found in the cache"},
                                        { "cache_misses", "The number of times that the object was not found in the cache" },
                                        { "sql_prepare", "Time spent in JDBC preparing the Statement. " +
                                                "Also includes the time spent in EIS creating an Interaction associated with a connection, and creating input and output Record objects" },
                                         { "query_prepareation", "Time to prepare the query" },
                                         { "sql_generation", "Time spent generating SQL. In the case of TopLink expressions, time spent converting Expression to SQL" },
                                         { "database_execute", "Time spent in calls to the JDBC Statement, includes time spent in calls to: close, executeUpdate, and executeQuery" },
                                         { "row_fetch", "Time taken to build Record objects from the jdbc ResultSet. Includes regular SQL calls and stored procedure calls" },
                                         { "object_building", "Time spent build persistent objects from database rows" },
                                         { "merge_time", "Time spent merging changes into the shared cache." },
                                         { "unitofwork_register", "Includes time spent in registerExistingObject, registerNewContainerBean, registerNewContainerBeanForCMP, registerNewObject, registerObject, readIntoWorkingCopy)" },
                                         { "distributed_merge", "Time spent merging remote transaction changes into local shared cache. Appears when cache sync is used" },
                                         { "deleted_object", "Object need to be  removed from identityMap from ObjectChangeSet" },
                                         { "assigning_sequence_numbers", "Includes time spent maintaining the sequence number mechanism and actually setting the sequence number on objects" },
                                         { "caching", "Includes time spent adding, looking up, and removing objects in the cache" },
                                         { "connection", "Time spent managing connections including connecting, reconnecting, and disconnecting from a datasource" },
                                         { "change_set_processed", "The number of ObjectChangeSets was found in the cache" },
                                         { "change_set_not_processed", "The number of ObjectChangeSets thrown away because the object was NOT found in the cache" },
                                         { "logging", "Time spent logging TopLink activities" },
                                         { "wrapping", "Time spent wrapping both CMP and BMP beans" },
                                         { "descriptor_event", "Time spent on execute DescriptorEvent" },
                                         { "session_event", "Time spent on execute SessionEvent" },
                                         { "jts_aftercompletion", "Time spent on JTS afterCompletion(Object status) method" },
                                         { "jts_beforecompletion", "Time spent on JTS beforeCompletion() method" },
                                         { "connection_ping", "Time spent testing database connection to determine if it can be used."}
};

 @Override
protected Object[][] getContents() {
     return contents;
 }
}

