Class MySQLAdapter
- java.lang.Object
-
- org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
-
- org.datanucleus.store.rdbms.adapter.MySQLAdapter
-
- All Implemented Interfaces:
DatastoreAdapter
public class MySQLAdapter extends BaseDatastoreAdapter
Provides methods for adapting SQL language elements to the MySQL database. Note that this also currently supports the MariaDB database. We could contemplate splitting this into separate MySQL and MariaDB support at some point, but one of the issues to overcome with that is that "datanucleus-geospatial" adds support for Geospatial types, including MySQL types and extends this class. We would need to have an equivalent extension for MariaDB.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
BaseDatastoreAdapter.ColumnTypeMappings
-
-
Field Summary
Fields Modifier and Type Field Description static StringNONSQL92_RESERVED_WORDSA string containing the list of MySQL keywords that are not also SQL/92 reserved words, separated by commas.-
Fields inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
catalogSeparator, datastoreMajorVersion, datastoreMinorVersion, datastoreProductName, datastoreProductVersion, datastoreRevisionVersion, driverMajorVersion, driverMinorVersion, driverName, driverVersion, identifierQuoteString, MAX_IDENTIFIER_LENGTH, maxColumnNameLength, maxConstraintNameLength, maxIndexNameLength, maxTableNameLength, NONRESERVED_WORDS, reservedKeywords, SQL2003_RESERVED_WORDS, SQL92_RESERVED_WORDS, SQL99_RESERVED_WORDS, supportedJdbcTypesById, supportedOptions, unsupportedJdbcTypesById
-
Fields inherited from interface org.datanucleus.store.rdbms.adapter.DatastoreAdapter
ACCESS_PARENTQUERY_IN_SUBQUERY_JOINED, ALTER_TABLE_DROP_CONSTRAINT_SYNTAX, ALTER_TABLE_DROP_FOREIGN_KEY_CONSTRAINT, ANSI_CROSSJOIN_SYNTAX, ANSI_JOIN_SYNTAX, BIT_IS_REALLY_BOOLEAN, BLOB_SET_USING_SETSTRING, BOOLEAN_COMPARISON, CATALOGS_IN_TABLE_DEFINITIONS, CHAR_COLUMNS_PADDED_WITH_SPACES, CHECK_IN_CREATE_STATEMENTS, CHECK_IN_END_CREATE_STATEMENTS, CLOB_SET_USING_SETSTRING, COLUMN_LENGTH_SEMANTICS, CREATE_INDEX_COLUMN_ORDERING, CREATE_INDEXES_BEFORE_FOREIGN_KEYS, CROSSJOIN_ASINNER11_SYNTAX, DATETIME_STORES_MILLISECS, DEFAULT_BEFORE_NULL_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_IN_COLUMN_OPTIONS, DEFAULT_KEYWORD_WITH_NOT_NULL_IN_COLUMN_OPTIONS, DEFERRED_CONSTRAINTS, DISTINCT_WITH_SELECT_FOR_UPDATE, ESCAPE_EXPRESSION_IN_LIKE_PREDICATE, EXISTS_SYNTAX, FK_DELETE_ACTION_CASCADE, FK_DELETE_ACTION_DEFAULT, FK_DELETE_ACTION_NULL, FK_DELETE_ACTION_RESTRICT, FK_IN_END_CREATE_STATEMENTS, FK_UPDATE_ACTION_CASCADE, FK_UPDATE_ACTION_DEFAULT, FK_UPDATE_ACTION_NULL, FK_UPDATE_ACTION_RESTRICT, GET_GENERATED_KEYS_STATEMENT, GROUP_BY_REQUIRES_ALL_SELECT_PRIMARIES, GROUPING_WITH_SELECT_FOR_UPDATE, HAVING_WITH_SELECT_FOR_UPDATE, HOLD_CURSORS_OVER_COMMIT, IDENTIFIERS_LOWERCASE, IDENTIFIERS_LOWERCASE_QUOTED, IDENTIFIERS_MIXEDCASE, IDENTIFIERS_MIXEDCASE_QUOTED, IDENTIFIERS_MIXEDCASE_QUOTED_SENSITIVE, IDENTIFIERS_MIXEDCASE_SENSITIVE, IDENTIFIERS_UPPERCASE, IDENTIFIERS_UPPERCASE_QUOTED, IDENTITY_COLUMN_TYPE_SPECIFICATION, IDENTITY_COLUMNS, IDENTITY_KEYS_NULL_SPECIFICATION, IDENTITY_PK_IN_CREATE_TABLE_COLUMN_DEF, INCLUDE_ORDERBY_COLS_IN_SELECT, LOCK_ROW_USING_OPTION_AFTER_FROM, LOCK_ROW_USING_OPTION_WITHIN_JOIN, LOCK_ROW_USING_SELECT_FOR_UPDATE, LOCK_ROW_USING_SELECT_FOR_UPDATE_NOWAIT, MULTITABLES_WITH_SELECT_FOR_UPDATE, NATIVE_ENUM_TYPE, NULL_EQUALS_EMPTY_STRING, NULLS_IN_CANDIDATE_KEYS, NULLS_KEYWORD_IN_COLUMN_OPTIONS, OPERATOR_BITWISE_AND, OPERATOR_BITWISE_OR, OPERATOR_BITWISE_XOR, ORDERBY_NULLS_DIRECTIVES, ORDERBY_NULLS_USING_CASE_NULL, ORDERBY_NULLS_USING_COLUMN_IS_NULL, ORDERBY_NULLS_USING_ISNULL, ORDERBY_USING_SELECT_COLUMN_INDEX, ORDERING_WITH_SELECT_FOR_UPDATE, PARAMETER_IN_CASE_IN_UPDATE_CLAUSE, PERSIST_OF_UNASSIGNED_CHAR, PRIMARYKEY_IN_CREATE_STATEMENTS, PROJECTION_IN_TABLE_REFERENCE_JOINS, RAW_PREFIX_LIKE_STATEMENTS, RESULTSET_TYPE_FORWARD_ONLY, RESULTSET_TYPE_SCROLL_INSENSITIVE, RESULTSET_TYPE_SCROLL_SENSITIVE, RIGHT_OUTER_JOIN, SCHEMAS_IN_TABLE_DEFINITIONS, SEQUENCES, SOME_ANY_ALL_SUBQUERY_EXPRESSIONS, STATEMENT_BATCHING, STORED_PROCEDURES, SUBQUERY_IN_HAVING, TX_ISOLATION_NONE, TX_ISOLATION_READ_COMMITTED, TX_ISOLATION_READ_UNCOMMITTED, TX_ISOLATION_REPEATABLE_READ, TX_ISOLATION_SERIALIZABLE, UNION_SYNTAX, UNIQUE_IN_END_CREATE_STATEMENTS, UPDATE_DELETE_STATEMENT_ALLOW_TABLE_ALIAS_IN_WHERE_CLAUSE, UPDATE_STATEMENT_ALLOW_TABLE_ALIAS_IN_SET_CLAUSE, USE_UNION_ALL, VALUE_GENERATION_UUID_STRING, VIEWS
-
-
Constructor Summary
Constructors Constructor Description MySQLAdapter(DatabaseMetaData metadata)Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description StringgetAddColumnStatement(Table table, Column col)Accessor for the SQL statement to add a column to a table.StringgetAddPrimaryKeyStatement(PrimaryKey pk, IdentifierFactory factory)MySQL, when using AUTO_INCREMENT, requires the primary key specified in the CREATE TABLE, so we do nothing here.StringgetCreateDatabaseStatement(String catalogName, String schemaName)Method to return the statement necessary to create a database with this RDBMS.StringgetCreateIndexStatement(Index idx, IdentifierFactory factory)Returns the appropriate DDL to create an index.StringgetCreateTableStatement(TableImpl table, Column[] columns, Properties props, IdentifierFactory factory)Method to return the CREATE TABLE statement.StringgetDeleteTableStatement(SQLTable tbl)Method to return the basic SQL for a DELETE TABLE statement.StringgetDropDatabaseStatement(String catalogName, String schemaName)Method to return the statement necessary to drop a database with this RDBMS.StringgetDropTableStatement(Table table)Method to return the DROP TABLE statement.StringgetEscapePatternExpression()The character for escaping patterns.StringgetIdentityKeyword(org.datanucleus.store.StoreManager storeMgr)Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).StringgetIdentityLastValueStmt(Table table, String columnName)Accessor for the auto-increment sql statement for this datastore.StringgetRangeByLimitEndOfStatementClause(long offset, long count, boolean hasOrdering)Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.StringgetSelectNewUUIDStmt()The function to creates a unique value of type uniqueidentifier.StringgetSequenceCreateStmt(String sequenceName, Integer min, Integer max, Integer start, Integer increment, Integer cacheSize)Accessor for the sequence statement to create the sequence.StringgetSequenceNextStmt(String sequenceName)Accessor for the statement for getting the next id from the sequence for this datastore.ClassgetSQLMethodClass(String className, String methodName, org.datanucleus.ClassLoaderResolver clr)Accessor for the SQLMethod class for the query invocation of specified class + method name (if available for this datastore).ClassgetSQLOperationClass(String operationName)Accessor for the SQLOperation class for the specified operation (if available for this datastore).StringgetVendorID()Accessor for the Vendor ID for this datastore.voidinitialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler, org.datanucleus.store.connection.ManagedConnection mconn)Initialise the types for this datastore.booleanisReservedKeyword(String word)Tests if a given string is an SQL keyword.protected voidloadColumnMappings(org.datanucleus.plugin.PluginManager mgr, org.datanucleus.ClassLoaderResolver clr)Load all datastore mappings defined in the associated plugins.RDBMSColumnInfonewRDBMSColumnInfo(ResultSet rs)Method to create a column info for the current row.SQLTypeInfonewSQLTypeInfo(ResultSet rs)Create a new SQL type info from the current row of the passed ResultSet.booleanvalidToIndexMapping(JavaTypeMapping mapping)Method to return whether the specified mapping is indexable.-
Methods inherited from class org.datanucleus.store.rdbms.adapter.BaseDatastoreAdapter
addSQLTypeForJDBCType, deregisterColumnMappingsForJDBCType, getAdapterTime, getAddCandidateKeyStatement, getAddForeignKeyStatement, getCatalogName, getCatalogSeparator, getCheckConstraintForValues, getColumnMappingClass, getColumns, getContinuationString, getDatastoreDateStatement, getDatastoreDriverName, getDatastoreDriverVersion, getDatastoreIdentifierMaxLength, getDatastoreProductName, getDatastoreProductVersion, getDefaultSqlTypeForJavaType, getDriverMajorVersion, getDriverMinorVersion, getDropViewStatement, getEscapeCharacter, getExistingIndexes, getIdentifierQuoteString, getIdentityJavaTypeForType, getInsertStatementForNoColumns, getJDBCTypeForName, getMappingManager, getMaxForeignKeys, getMaxIndexes, getMiliseconds, getNameForJDBCType, getNewUUIDFunction, getNumericConversionFunction, getOrderString, getPatternExpressionAnyCharacter, getPatternExpressionZeroMoreCharacters, getPreferredDefaultSQLTypeForJDBCType, getRangeByRowNumberColumn, getRangeByRowNumberColumn2, getRequiredTransactionIsolationLevel, getReservedWords, getSchemaName, getSelectForUpdateText, getSelectWithLockOption, getSQLTypeInfoForJdbcType, getSupportedOptions, getSurrogateForEmptyStrings, getTime, getTransactionIsolationForSchemaCreation, getUnlimitedLengthPrecisionValue, getUpdateTableStatement, initialise, initialiseDatastore, isIdentityFieldDataType, isStatementCancel, isStatementTimeout, isValidPrimaryKeyType, newFKInfo, registerColumnMapping, registerColumnMapping, sequenceExists, supportsOption, supportsQueryFetchSize, supportsTransactionIsolation, toString, validToSelectMappingInStatement
-
-
-
-
Field Detail
-
NONSQL92_RESERVED_WORDS
public static final String NONSQL92_RESERVED_WORDS
A string containing the list of MySQL keywords that are not also SQL/92 reserved words, separated by commas. This list is normally obtained dynamically from the driver using DatabaseMetaData.getSQLKeywords(), but MySQL drivers are known to return an incomplete list.This list was produced based on the reserved word list in the MySQL Manual (Version 4.0.10-gamma) at http://www.mysql.com/doc/en/Reserved_words.html.
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
MySQLAdapter
public MySQLAdapter(DatabaseMetaData metadata)
Constructor. Overridden so we can add on our own list of NON SQL92 reserved words which is returned incorrectly with the JDBC driver.- Parameters:
metadata- MetaData for the DB
-
-
Method Detail
-
initialiseTypes
public void initialiseTypes(org.datanucleus.store.schema.StoreSchemaHandler handler, org.datanucleus.store.connection.ManagedConnection mconn)Initialise the types for this datastore.- Specified by:
initialiseTypesin interfaceDatastoreAdapter- Overrides:
initialiseTypesin classBaseDatastoreAdapter- Parameters:
handler- SchemaHandler that we initialise the types formconn- Managed connection to use
-
getVendorID
public String getVendorID()
Description copied from interface:DatastoreAdapterAccessor for the Vendor ID for this datastore.- Specified by:
getVendorIDin interfaceDatastoreAdapter- Overrides:
getVendorIDin classBaseDatastoreAdapter- Returns:
- Vendor id for this datastore
-
isReservedKeyword
public boolean isReservedKeyword(String word)
Description copied from class:BaseDatastoreAdapterTests if a given string is an SQL keyword.The list of key words tested against is defined to contain all SQL/92 keywords, plus any additional key words reported by the JDBC driver for this adapter via
DatabaseMetaData.getSQLKeywords().In general, use of a SQL key word as an identifier should be avoided. SQL/92 key words are divided into reserved and non-reserved words. If a reserved word is used as an identifier it must be quoted with double quotes. Strictly speaking, the same is not true of non-reserved words. However, as C.J. Date writes in A Guide To The SQL Standard :
The rule by which it is determined within the standard that one key word needs to be reserved while another need not is not clear to this writer. In practice, it is probably wise to treat all key words as reserved.
- Specified by:
isReservedKeywordin interfaceDatastoreAdapter- Overrides:
isReservedKeywordin classBaseDatastoreAdapter- Parameters:
word- The word to test.- Returns:
trueif word is a SQL key word for this DBMS. The comparison is case-insensitive.
-
newRDBMSColumnInfo
public RDBMSColumnInfo newRDBMSColumnInfo(ResultSet rs)
Method to create a column info for the current row. Overrides the dataType for BLOB/CLOB as necessary- Specified by:
newRDBMSColumnInfoin interfaceDatastoreAdapter- Overrides:
newRDBMSColumnInfoin classBaseDatastoreAdapter- Parameters:
rs- ResultSet from DatabaseMetaData.getColumns()- Returns:
- column info
-
newSQLTypeInfo
public SQLTypeInfo newSQLTypeInfo(ResultSet rs)
Description copied from interface:DatastoreAdapterCreate a new SQL type info from the current row of the passed ResultSet. Allows an adapter to override particular types where the JDBC driver is known to be buggy.- Specified by:
newSQLTypeInfoin interfaceDatastoreAdapter- Overrides:
newSQLTypeInfoin classBaseDatastoreAdapter- Parameters:
rs- ResultSet- Returns:
- The SQL type info
-
getCreateDatabaseStatement
public String getCreateDatabaseStatement(String catalogName, String schemaName)
Description copied from interface:DatastoreAdapterMethod to return the statement necessary to create a database with this RDBMS. Note that some RDBMS don't support this.- Specified by:
getCreateDatabaseStatementin interfaceDatastoreAdapter- Overrides:
getCreateDatabaseStatementin classBaseDatastoreAdapter- Parameters:
catalogName- name of the catalogschemaName- Name of the schema- Returns:
- The DDL statement
-
getDropDatabaseStatement
public String getDropDatabaseStatement(String catalogName, String schemaName)
Description copied from interface:DatastoreAdapterMethod to return the statement necessary to drop a database with this RDBMS. Note that some RDBMS don't support this.- Specified by:
getDropDatabaseStatementin interfaceDatastoreAdapter- Overrides:
getDropDatabaseStatementin classBaseDatastoreAdapter- Parameters:
catalogName- Name of the catalogschemaName- Name of the schema- Returns:
- The DDL statement
-
getAddPrimaryKeyStatement
public String getAddPrimaryKeyStatement(PrimaryKey pk, IdentifierFactory factory)
MySQL, when using AUTO_INCREMENT, requires the primary key specified in the CREATE TABLE, so we do nothing here.- Specified by:
getAddPrimaryKeyStatementin interfaceDatastoreAdapter- Overrides:
getAddPrimaryKeyStatementin classBaseDatastoreAdapter- Parameters:
pk- An object describing the primary key.factory- Identifier factory- Returns:
- The PK statement
-
getCreateTableStatement
public String getCreateTableStatement(TableImpl table, Column[] columns, Properties props, IdentifierFactory factory)
Method to return the CREATE TABLE statement. Versions before 5 need INNODB table type selecting for them. It seems, MySQL ≥ 5 still needs innodb in order to support transactions.- Specified by:
getCreateTableStatementin interfaceDatastoreAdapter- Overrides:
getCreateTableStatementin classBaseDatastoreAdapter- Parameters:
table- The tablecolumns- The columns in the tableprops- Properties for controlling the table creationfactory- Identifier factory- Returns:
- The creation statement
-
getDropTableStatement
public String getDropTableStatement(Table table)
Method to return the DROP TABLE statement.- Specified by:
getDropTableStatementin interfaceDatastoreAdapter- Overrides:
getDropTableStatementin classBaseDatastoreAdapter- Parameters:
table- The table- Returns:
- The drop statement
-
getAddColumnStatement
public String getAddColumnStatement(Table table, Column col)
Accessor for the SQL statement to add a column to a table.- Specified by:
getAddColumnStatementin interfaceDatastoreAdapter- Overrides:
getAddColumnStatementin classBaseDatastoreAdapter- Parameters:
table- The tablecol- The column- Returns:
- The SQL necessary to add the column
-
getDeleteTableStatement
public String getDeleteTableStatement(SQLTable tbl)
Method to return the basic SQL for a DELETE TABLE statement. Returns the String asDELETE t1 FROM tbl t1. Doesn't include any where clause.- Specified by:
getDeleteTableStatementin interfaceDatastoreAdapter- Overrides:
getDeleteTableStatementin classBaseDatastoreAdapter- Parameters:
tbl- The SQLTable to delete- Returns:
- The delete table string
-
getCreateIndexStatement
public String getCreateIndexStatement(Index idx, IdentifierFactory factory)
Description copied from class:BaseDatastoreAdapterReturns the appropriate DDL to create an index. It should return something like:CREATE [UNIQUE ]INDEX FOO_U1 ON FOO (BAR,BAZ) [Extended Settings]
- Specified by:
getCreateIndexStatementin interfaceDatastoreAdapter- Overrides:
getCreateIndexStatementin classBaseDatastoreAdapter- Parameters:
idx- An object describing the index.factory- Identifier factory- Returns:
- The text of the SQL statement.
-
getIdentityLastValueStmt
public String getIdentityLastValueStmt(Table table, String columnName)
Accessor for the auto-increment sql statement for this datastore.- Specified by:
getIdentityLastValueStmtin interfaceDatastoreAdapter- Overrides:
getIdentityLastValueStmtin classBaseDatastoreAdapter- Parameters:
table- Name of the table that the autoincrement is forcolumnName- Name of the column that the autoincrement is for- Returns:
- The statement for getting the latest auto-increment key
-
getIdentityKeyword
public String getIdentityKeyword(org.datanucleus.store.StoreManager storeMgr)
Accessor for the auto-increment keyword for generating DDLs (CREATE TABLEs...).- Specified by:
getIdentityKeywordin interfaceDatastoreAdapter- Overrides:
getIdentityKeywordin classBaseDatastoreAdapter- Parameters:
storeMgr- The Store Manager- Returns:
- The keyword for a column using auto-increment
-
getSelectNewUUIDStmt
public String getSelectNewUUIDStmt()
The function to creates a unique value of type uniqueidentifier. MySQL generates 36-character hex uuids.- Specified by:
getSelectNewUUIDStmtin interfaceDatastoreAdapter- Overrides:
getSelectNewUUIDStmtin classBaseDatastoreAdapter- Returns:
- The function. e.g. "SELECT uuid()"
-
getRangeByLimitEndOfStatementClause
public String getRangeByLimitEndOfStatementClause(long offset, long count, boolean hasOrdering)
Method to return the SQL to append to the WHERE clause of a SELECT statement to handle restriction of ranges using the LIMUT keyword.- Specified by:
getRangeByLimitEndOfStatementClausein interfaceDatastoreAdapter- Overrides:
getRangeByLimitEndOfStatementClausein classBaseDatastoreAdapter- Parameters:
offset- The offset to return fromcount- The number of items to returnhasOrdering- Whether ordering is present- Returns:
- The SQL to append to allow for ranges using LIMIT.
-
getEscapePatternExpression
public String getEscapePatternExpression()
The character for escaping patterns.- Specified by:
getEscapePatternExpressionin interfaceDatastoreAdapter- Overrides:
getEscapePatternExpressionin classBaseDatastoreAdapter- Returns:
- Escape character(s)
-
validToIndexMapping
public boolean validToIndexMapping(JavaTypeMapping mapping)
Description copied from interface:DatastoreAdapterMethod to return whether the specified mapping is indexable. Allows a datastore to not index particular column types.- Specified by:
validToIndexMappingin interfaceDatastoreAdapter- Overrides:
validToIndexMappingin classBaseDatastoreAdapter- Parameters:
mapping- The mapping- Returns:
- Whether it is indexable
-
getSequenceCreateStmt
public String getSequenceCreateStmt(String sequenceName, Integer min, Integer max, Integer start, Integer increment, Integer cacheSize)
Accessor for the sequence statement to create the sequence.- Specified by:
getSequenceCreateStmtin interfaceDatastoreAdapter- Overrides:
getSequenceCreateStmtin classBaseDatastoreAdapter- Parameters:
sequenceName- Name of the sequencemin- Minimum value for the sequencemax- Maximum value for the sequencestart- Start value for the sequenceincrement- Increment value for the sequencecacheSize- Cache size for the sequence- Returns:
- The statement for getting the next id from the sequence
-
getSequenceNextStmt
public String getSequenceNextStmt(String sequenceName)
Accessor for the statement for getting the next id from the sequence for this datastore.- Specified by:
getSequenceNextStmtin interfaceDatastoreAdapter- Overrides:
getSequenceNextStmtin classBaseDatastoreAdapter- Parameters:
sequenceName- Name of the sequence- Returns:
- The statement for getting the next id for the sequence
-
getSQLOperationClass
public Class getSQLOperationClass(String operationName)
Description copied from interface:DatastoreAdapterAccessor for the SQLOperation class for the specified operation (if available for this datastore).- Specified by:
getSQLOperationClassin interfaceDatastoreAdapter- Overrides:
getSQLOperationClassin classBaseDatastoreAdapter- Parameters:
operationName- operation name- Returns:
- SQLOperation class (or null if none available)
-
getSQLMethodClass
public Class getSQLMethodClass(String className, String methodName, org.datanucleus.ClassLoaderResolver clr)
Description copied from interface:DatastoreAdapterAccessor for the SQLMethod class for the query invocation of specified class + method name (if available for this datastore).- Specified by:
getSQLMethodClassin interfaceDatastoreAdapter- Overrides:
getSQLMethodClassin classBaseDatastoreAdapter- Parameters:
className- Name of the class (or null if this is a STATIC method)methodName- Method nameclr- ClassLoader resolver, in case className is a subclass of a supported type- Returns:
- The SQLMethod class (or null if not defined for this datastore).
-
loadColumnMappings
protected void loadColumnMappings(org.datanucleus.plugin.PluginManager mgr, org.datanucleus.ClassLoaderResolver clr)Load all datastore mappings defined in the associated plugins. We handle RDBMS datastore mappings so refer to rdbms-mapping-class, jdbc-type, sql-type in particular.- Overrides:
loadColumnMappingsin classBaseDatastoreAdapter- Parameters:
mgr- the PluginManagerclr- the ClassLoaderResolver
-
-