class Builder {
            private JdbcTemplate jdbcTemplate;
            private DatabaseProduct databaseProduct;
            private PlatformTransactionManager transactionManager;
            private String tableName = DEFAULT_TABLE_NAME;
            private TimeZone timeZone;
            private String lockedByValue = Utils.getHostname();
            private ColumnNames columnNames = new ColumnNames("name", "lock_until", "locked_at", "locked_by");
            private boolean dbUpperCase = false;
            private boolean useDbTime = false;
            private Integer isolationLevel;
            private boolean throwUnexpectedException = false;

            public Builder withJdbcTemplate(@NonNull JdbcTemplate jdbcTemplate) {
                this.jdbcTemplate = jdbcTemplate;
                return this;
            }

            public Builder withTransactionManager(PlatformTransactionManager transactionManager) {
                this.transactionManager = transactionManager;
                return this;
            }

            public Builder withTableName(@NonNull String tableName) {
                this.tableName = tableName;
                return this;
            }

            public Builder withTimeZone(TimeZone timeZone) {
                this.timeZone = timeZone;
                return this;
            }

            public Builder withColumnNames(ColumnNames columnNames) {
                this.columnNames = columnNames;
                return this;
            }

            public Builder withDbUpperCase(final boolean dbUpperCase) {
                this.dbUpperCase = dbUpperCase;
                return this;
            }

            /**
             * This is only needed if your database product can't be automatically detected.
             *
             * @param databaseProduct
             *            Database product
             * @return ConfigurationBuilder
             */
            public Builder withDatabaseProduct(final DatabaseProduct databaseProduct) {
                this.databaseProduct = databaseProduct;
                return this;
            }

            /**
             * Value stored in 'locked_by' column. Please use only for debugging purposes.
             */
            public Builder withLockedByValue(String lockedBy) {
                this.lockedByValue = lockedBy;
                return this;
            }

            public Builder usingDbTime() {
                this.useDbTime = true;
                return this;
            }

            /**
             * Sets the isolation level for ShedLock. See {@link java.sql.Connection} for
             * constant definitions. for constant definitions
             */
            public Builder withIsolationLevel(int isolationLevel) {
                this.isolationLevel = isolationLevel;
                return this;
            }

            public Builder withThrowUnexpectedException(boolean throwUnexpectedException) {
                this.throwUnexpectedException = throwUnexpectedException;
                return this;
            }

            public JdbcTemplateLockProvider.Configuration build() {<FILL_FUNCTION_BODY>}
        }

                return new JdbcTemplateLockProvider.Configuration(
                        jdbcTemplate,
                        databaseProduct,
                        transactionManager,
                        dbUpperCase ? tableName.toUpperCase() : tableName,
                        timeZone,
                        dbUpperCase ? columnNames.toUpperCase() : columnNames,
                        lockedByValue,
                        useDbTime,
                        isolationLevel,
                        throwUnexpectedException);
            
<methods>public void clearCache() ,public Optional<net.javacrumbs.shedlock.core.SimpleLock> lock(net.javacrumbs.shedlock.core.LockConfiguration) <variables>private final net.javacrumbs.shedlock.support.LockRecordRegistry lockRecordRegistry,private final non-sealed net.javacrumbs.shedlock.support.StorageAccessor storageAccessor