clean up impl of query hint interpretation
use 'switch' statements
This commit is contained in:
parent
8755129648
commit
6e590a0149
|
@ -29,7 +29,6 @@ import org.hibernate.graph.spi.AppliedGraph;
|
||||||
import org.hibernate.graph.spi.RootGraphImplementor;
|
import org.hibernate.graph.spi.RootGraphImplementor;
|
||||||
import org.hibernate.jpa.internal.util.ConfigurationHelper;
|
import org.hibernate.jpa.internal.util.ConfigurationHelper;
|
||||||
import org.hibernate.jpa.internal.util.FlushModeTypeHelper;
|
import org.hibernate.jpa.internal.util.FlushModeTypeHelper;
|
||||||
import org.hibernate.jpa.internal.util.LockModeTypeHelper;
|
|
||||||
import org.hibernate.metamodel.RuntimeMetamodels;
|
import org.hibernate.metamodel.RuntimeMetamodels;
|
||||||
import org.hibernate.metamodel.model.domain.JpaMetamodel;
|
import org.hibernate.metamodel.model.domain.JpaMetamodel;
|
||||||
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
||||||
|
@ -87,6 +86,10 @@ import static org.hibernate.jpa.SpecHints.HINT_SPEC_FETCH_GRAPH;
|
||||||
import static org.hibernate.jpa.SpecHints.HINT_SPEC_LOAD_GRAPH;
|
import static org.hibernate.jpa.SpecHints.HINT_SPEC_LOAD_GRAPH;
|
||||||
import static org.hibernate.jpa.SpecHints.HINT_SPEC_LOCK_TIMEOUT;
|
import static org.hibernate.jpa.SpecHints.HINT_SPEC_LOCK_TIMEOUT;
|
||||||
import static org.hibernate.jpa.SpecHints.HINT_SPEC_QUERY_TIMEOUT;
|
import static org.hibernate.jpa.SpecHints.HINT_SPEC_QUERY_TIMEOUT;
|
||||||
|
import static org.hibernate.jpa.internal.util.ConfigurationHelper.getBoolean;
|
||||||
|
import static org.hibernate.jpa.internal.util.ConfigurationHelper.getCacheMode;
|
||||||
|
import static org.hibernate.jpa.internal.util.ConfigurationHelper.getInteger;
|
||||||
|
import static org.hibernate.jpa.internal.util.LockModeTypeHelper.interpretLockMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
@ -244,53 +247,40 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
getSession().checkOpen( true );
|
getSession().checkOpen( true );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ( HINT_FLUSH_MODE.equals( hintName ) ) {
|
switch ( hintName ) {
|
||||||
|
case HINT_FLUSH_MODE:
|
||||||
applyFlushModeHint( ConfigurationHelper.getFlushMode( value ) );
|
applyFlushModeHint( ConfigurationHelper.getFlushMode( value ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
case HINT_TIMEOUT:
|
||||||
|
applyTimeoutHint( getInteger( value ) );
|
||||||
if ( HINT_TIMEOUT.equals( hintName ) ) {
|
|
||||||
applyTimeoutHint( ConfigurationHelper.getInteger( value ) );
|
|
||||||
return true;
|
return true;
|
||||||
}
|
case HINT_JAVAEE_QUERY_TIMEOUT:
|
||||||
|
|
||||||
if ( HINT_SPEC_QUERY_TIMEOUT.equals( hintName )
|
|
||||||
|| HINT_JAVAEE_QUERY_TIMEOUT.equals( hintName ) ) {
|
|
||||||
if ( HINT_JAVAEE_QUERY_TIMEOUT.equals( hintName ) ) {
|
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_QUERY_TIMEOUT, HINT_SPEC_QUERY_TIMEOUT );
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_QUERY_TIMEOUT, HINT_SPEC_QUERY_TIMEOUT );
|
||||||
}
|
//fall through:
|
||||||
|
case HINT_SPEC_QUERY_TIMEOUT:
|
||||||
// convert milliseconds to seconds
|
// convert milliseconds to seconds
|
||||||
int timeout = (int)Math.round( ConfigurationHelper.getInteger( value ).doubleValue() / 1000.0 );
|
int timeout = (int) Math.round( getInteger( value ).doubleValue() / 1000.0 );
|
||||||
applyTimeoutHint( timeout );
|
applyTimeoutHint( timeout );
|
||||||
return true;
|
return true;
|
||||||
}
|
case HINT_COMMENT:
|
||||||
|
|
||||||
if ( HINT_COMMENT.equals( hintName ) ) {
|
|
||||||
applyCommentHint( (String) value );
|
applyCommentHint( (String) value );
|
||||||
return true;
|
return true;
|
||||||
}
|
case HINT_NATIVE_SPACES:
|
||||||
|
|
||||||
if ( HINT_NATIVE_SPACES.equals( hintName ) ) {
|
|
||||||
applySynchronizeSpacesHint( value );
|
applySynchronizeSpacesHint( value );
|
||||||
return true;
|
return true;
|
||||||
}
|
default:
|
||||||
|
if ( applySelectionHint( hintName, value ) || applyAdditionalPossibleHints( hintName, value ) ) {
|
||||||
final boolean selectionHintApplied = applySelectionHint( hintName, value );
|
|
||||||
if ( selectionHintApplied ) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
QueryLogging.QUERY_MESSAGE_LOGGER.ignoringUnrecognizedQueryHint( hintName );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch ( ClassCastException e ) {
|
catch ( ClassCastException e ) {
|
||||||
throw new IllegalArgumentException( "Value for Query hint", e );
|
throw new IllegalArgumentException( "Incorrect value for query hint: " + hintName, e );
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean appliedAdditionalHint = applyAdditionalPossibleHints( hintName, value );
|
|
||||||
if ( appliedAdditionalHint ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryLogging.QUERY_MESSAGE_LOGGER.ignoringUnrecognizedQueryHint( hintName );
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void applySynchronizeSpacesHint(Object value) {
|
protected void applySynchronizeSpacesHint(Object value) {
|
||||||
|
@ -298,80 +288,56 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final boolean applySelectionHint(String hintName, Object value) {
|
protected final boolean applySelectionHint(String hintName, Object value) {
|
||||||
final boolean lockingHintApplied = applyLockingHint( hintName, value );
|
if ( applyLockingHint( hintName, value ) ) {
|
||||||
if ( lockingHintApplied ) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( HINT_READONLY.equals( hintName ) ) {
|
|
||||||
applyReadOnlyHint( ConfigurationHelper.getBoolean( value ) );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_FETCH_SIZE.equals( hintName ) ) {
|
|
||||||
applyFetchSizeHint( ConfigurationHelper.getInteger( value ) );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_CACHEABLE.equals( hintName ) ) {
|
|
||||||
applyCacheableHint( ConfigurationHelper.getBoolean( value ) );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_CACHE_REGION.equals( hintName ) ) {
|
|
||||||
applyCacheRegionHint( (String) value );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_CACHE_MODE.equals( hintName ) ) {
|
|
||||||
applyCacheModeHint( ConfigurationHelper.getCacheMode( value ) );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_SPEC_CACHE_RETRIEVE_MODE.equals( hintName ) ) {
|
|
||||||
final CacheRetrieveMode retrieveMode = value != null ? CacheRetrieveMode.valueOf( value.toString() ) : null;
|
|
||||||
applyJpaCacheRetrieveModeHint( retrieveMode );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_SPEC_CACHE_STORE_MODE.equals( hintName ) ) {
|
|
||||||
final CacheStoreMode storeMode = value != null ? CacheStoreMode.valueOf( value.toString() ) : null;
|
|
||||||
applyJpaCacheStoreModeHint( storeMode );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_JAVAEE_CACHE_RETRIEVE_MODE.equals( hintName ) ) {
|
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_CACHE_RETRIEVE_MODE, HINT_SPEC_CACHE_RETRIEVE_MODE );
|
|
||||||
final CacheRetrieveMode retrieveMode = value != null ? CacheRetrieveMode.valueOf( value.toString() ) : null;
|
|
||||||
applyJpaCacheRetrieveModeHint( retrieveMode );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_JAVAEE_CACHE_STORE_MODE.equals( hintName ) ) {
|
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_CACHE_STORE_MODE, HINT_SPEC_CACHE_STORE_MODE );
|
|
||||||
final CacheStoreMode storeMode = value != null ? CacheStoreMode.valueOf( value.toString() ) : null;
|
|
||||||
applyJpaCacheStoreModeHint( storeMode );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_SPEC_FETCH_GRAPH.equals( hintName ) || HINT_SPEC_LOAD_GRAPH.equals( hintName ) ) {
|
|
||||||
applyEntityGraphHint( hintName, value );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_JAVAEE_FETCH_GRAPH.equals( hintName ) || HINT_JAVAEE_LOAD_GRAPH.equals( hintName ) ) {
|
|
||||||
if ( HINT_JAVAEE_FETCH_GRAPH.equals( hintName ) ) {
|
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_FETCH_GRAPH, HINT_SPEC_FETCH_GRAPH );
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_LOAD_GRAPH, HINT_SPEC_LOAD_GRAPH );
|
switch ( hintName ) {
|
||||||
}
|
case HINT_READONLY:
|
||||||
|
applyReadOnlyHint( getBoolean( value ) );
|
||||||
|
return true;
|
||||||
|
case HINT_FETCH_SIZE:
|
||||||
|
applyFetchSizeHint( getInteger( value ) );
|
||||||
|
return true;
|
||||||
|
case HINT_CACHEABLE:
|
||||||
|
applyCacheableHint( getBoolean( value ) );
|
||||||
|
return true;
|
||||||
|
case HINT_CACHE_REGION:
|
||||||
|
applyCacheRegionHint( (String) value );
|
||||||
|
return true;
|
||||||
|
case HINT_CACHE_MODE:
|
||||||
|
applyCacheModeHint( getCacheMode( value ) );
|
||||||
|
return true;
|
||||||
|
case HINT_JAVAEE_CACHE_RETRIEVE_MODE:
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_CACHE_RETRIEVE_MODE, HINT_SPEC_CACHE_RETRIEVE_MODE );
|
||||||
|
//fall through to:
|
||||||
|
case HINT_SPEC_CACHE_RETRIEVE_MODE:
|
||||||
|
applyJpaCacheRetrieveModeHint( value != null ? CacheRetrieveMode.valueOf( value.toString() ) : null );
|
||||||
|
return true;
|
||||||
|
case HINT_JAVAEE_CACHE_STORE_MODE:
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_CACHE_STORE_MODE, HINT_SPEC_CACHE_STORE_MODE );
|
||||||
|
//fall through to:
|
||||||
|
case HINT_SPEC_CACHE_STORE_MODE:
|
||||||
|
applyJpaCacheStoreModeHint( value != null ? CacheStoreMode.valueOf( value.toString() ) : null );
|
||||||
|
return true;
|
||||||
|
case HINT_JAVAEE_FETCH_GRAPH:
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_FETCH_GRAPH, HINT_SPEC_FETCH_GRAPH );
|
||||||
|
//fall through to:
|
||||||
|
case HINT_SPEC_FETCH_GRAPH:
|
||||||
applyEntityGraphHint( hintName, value );
|
applyEntityGraphHint( hintName, value );
|
||||||
return true;
|
return true;
|
||||||
}
|
case HINT_JAVAEE_LOAD_GRAPH:
|
||||||
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_LOAD_GRAPH, HINT_SPEC_LOAD_GRAPH );
|
||||||
|
//fall through to:
|
||||||
|
case HINT_SPEC_LOAD_GRAPH:
|
||||||
|
applyEntityGraphHint( hintName, value );
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
// unrecognized hint
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void applyFetchSizeHint(int fetchSize) {
|
protected void applyFetchSizeHint(int fetchSize) {
|
||||||
getQueryOptions().setFetchSize( fetchSize );
|
getQueryOptions().setFetchSize( fetchSize );
|
||||||
|
@ -394,7 +360,7 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void applyEntityGraphHint(String hintName, Object value) {
|
protected void applyEntityGraphHint(String hintName, Object value) {
|
||||||
final GraphSemantic graphSemantic = GraphSemantic.fromJpaHintName( hintName );
|
final GraphSemantic graphSemantic = GraphSemantic.fromHintName( hintName );
|
||||||
if ( value instanceof RootGraphImplementor ) {
|
if ( value instanceof RootGraphImplementor ) {
|
||||||
applyGraph( (RootGraphImplementor<?>) value, graphSemantic );
|
applyGraph( (RootGraphImplementor<?>) value, graphSemantic );
|
||||||
}
|
}
|
||||||
|
@ -435,34 +401,34 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean applyLockingHint(String hintName, Object value) {
|
private boolean applyLockingHint(String hintName, Object value) {
|
||||||
if ( HINT_SPEC_LOCK_TIMEOUT.equals( hintName ) && value != null ) {
|
switch ( hintName ) {
|
||||||
applyLockTimeoutHint( ConfigurationHelper.getInteger( value ) );
|
case HINT_JAVAEE_LOCK_TIMEOUT:
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( HINT_JAVAEE_LOCK_TIMEOUT.equals( hintName ) && value != null ) {
|
|
||||||
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_LOCK_TIMEOUT, HINT_SPEC_LOCK_TIMEOUT );
|
DEPRECATION_LOGGER.deprecatedSetting( HINT_JAVAEE_LOCK_TIMEOUT, HINT_SPEC_LOCK_TIMEOUT );
|
||||||
applyLockTimeoutHint( ConfigurationHelper.getInteger( value ) );
|
//fall through to:
|
||||||
|
case HINT_SPEC_LOCK_TIMEOUT:
|
||||||
|
if ( value != null ) {
|
||||||
|
applyLockTimeoutHint( getInteger( value ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
if ( HINT_FOLLOW_ON_LOCKING.equals( hintName ) ) {
|
return false;
|
||||||
applyFollowOnLockingHint( ConfigurationHelper.getBoolean( value ) );
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
case HINT_FOLLOW_ON_LOCKING:
|
||||||
if ( HINT_NATIVE_LOCKMODE.equals( hintName ) ) {
|
applyFollowOnLockingHint( getBoolean( value ) );
|
||||||
|
return true;
|
||||||
|
case HINT_NATIVE_LOCKMODE:
|
||||||
applyLockModeHint( value );
|
applyLockModeHint( value );
|
||||||
return true;
|
return true;
|
||||||
}
|
default:
|
||||||
|
|
||||||
if ( hintName.startsWith( HINT_NATIVE_LOCKMODE ) ) {
|
if ( hintName.startsWith( HINT_NATIVE_LOCKMODE ) ) {
|
||||||
applyAliasSpecificLockModeHint( hintName, value );
|
applyAliasSpecificLockModeHint( hintName, value );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void applyLockTimeoutHint(Integer timeout) {
|
protected void applyLockTimeoutHint(Integer timeout) {
|
||||||
if ( timeout != null ) {
|
if ( timeout != null ) {
|
||||||
|
@ -490,7 +456,7 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
applyLockModeType( (LockModeType) value );
|
applyLockModeType( (LockModeType) value );
|
||||||
}
|
}
|
||||||
else if ( value instanceof String ) {
|
else if ( value instanceof String ) {
|
||||||
applyHibernateLockMode( LockModeTypeHelper.interpretLockMode( value ) );
|
applyHibernateLockMode( interpretLockMode( value ) );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
|
@ -510,8 +476,7 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
final String alias = hintName.substring( HINT_NATIVE_LOCKMODE.length() + 1 );
|
final String alias = hintName.substring( HINT_NATIVE_LOCKMODE.length() + 1 );
|
||||||
// determine the LockMode
|
// determine the LockMode
|
||||||
try {
|
try {
|
||||||
final LockMode lockMode = LockModeTypeHelper.interpretLockMode( value );
|
getQueryOptions().getLockOptions().setAliasSpecificLockMode( alias, interpretLockMode( value ) );
|
||||||
getQueryOptions().getLockOptions().setAliasSpecificLockMode( alias, lockMode );
|
|
||||||
}
|
}
|
||||||
catch ( Exception e ) {
|
catch ( Exception e ) {
|
||||||
QueryLogging.QUERY_MESSAGE_LOGGER.unableToDetermineLockModeValue( hintName, value );
|
QueryLogging.QUERY_MESSAGE_LOGGER.unableToDetermineLockModeValue( hintName, value );
|
||||||
|
@ -881,7 +846,9 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final BindableType<P> paramType;
|
final BindableType<P> paramType;
|
||||||
final BasicType<P> basicType = getSession().getFactory().getTypeConfiguration().standardBasicTypeForJavaType( javaType );
|
final BasicType<P> basicType = getSession().getFactory()
|
||||||
|
.getTypeConfiguration()
|
||||||
|
.standardBasicTypeForJavaType( javaType );
|
||||||
if ( basicType != null ) {
|
if ( basicType != null ) {
|
||||||
paramType = basicType;
|
paramType = basicType;
|
||||||
}
|
}
|
||||||
|
@ -965,7 +932,9 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final BindableType<P> paramType;
|
final BindableType<P> paramType;
|
||||||
final BasicType<P> basicType = getSession().getFactory().getTypeConfiguration().standardBasicTypeForJavaType( javaType );
|
final BasicType<P> basicType = getSession().getFactory()
|
||||||
|
.getTypeConfiguration()
|
||||||
|
.standardBasicTypeForJavaType( javaType );
|
||||||
if ( basicType != null ) {
|
if ( basicType != null ) {
|
||||||
paramType = basicType;
|
paramType = basicType;
|
||||||
}
|
}
|
||||||
|
@ -1019,7 +988,9 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final BindableType<P> paramType;
|
final BindableType<P> paramType;
|
||||||
final BasicType<P> basicType = getSession().getFactory().getTypeConfiguration().standardBasicTypeForJavaType( javaType );
|
final BasicType<P> basicType = getSession().getFactory()
|
||||||
|
.getTypeConfiguration()
|
||||||
|
.standardBasicTypeForJavaType( javaType );
|
||||||
if ( basicType != null ) {
|
if ( basicType != null ) {
|
||||||
paramType = basicType;
|
paramType = basicType;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1194,26 +1194,16 @@ public class NativeQueryImpl<R>
|
||||||
if ( value instanceof String ) {
|
if ( value instanceof String ) {
|
||||||
addSynchronizedQuerySpace( (String) value );
|
addSynchronizedQuerySpace( (String) value );
|
||||||
}
|
}
|
||||||
else if ( value instanceof String[] ) {
|
|
||||||
for (String string : (String[]) value) {
|
|
||||||
addSynchronizedQuerySpace( string );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ( value instanceof Class ) {
|
else if ( value instanceof Class ) {
|
||||||
addSynchronizedEntityClass( (Class<?>) value );
|
addSynchronizedEntityClass( (Class<?>) value );
|
||||||
}
|
}
|
||||||
else if ( value instanceof Class[] ) {
|
else if ( value instanceof Object[] ) {
|
||||||
for (Class<?> aClass : (Class<?>[]) value) {
|
for ( Object element : (Object[]) value ) {
|
||||||
addSynchronizedEntityClass( aClass );
|
applySynchronizeSpace( element );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( value instanceof List ) {
|
else if ( value instanceof Iterable ) {
|
||||||
final List<?> list = (List<?>) value;
|
for ( Object element : (Iterable<?>) value ) {
|
||||||
list.forEach( this::applySynchronizeSpace );
|
|
||||||
}
|
|
||||||
else if ( value instanceof Collection ) {
|
|
||||||
final Collection<?> values = (Collection<?>) value;
|
|
||||||
for ( Object element : values ) {
|
|
||||||
applySynchronizeSpace( element );
|
applySynchronizeSpace( element );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue