Polishing
This commit is contained in:
@@ -403,8 +403,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||||||
throws BeansException {
|
throws BeansException {
|
||||||
|
|
||||||
Object result = existingBean;
|
Object result = existingBean;
|
||||||
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
for (BeanPostProcessor processor : getBeanPostProcessors()) {
|
||||||
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
|
result = processor.postProcessBeforeInitialization(result, beanName);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -417,8 +417,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||||||
throws BeansException {
|
throws BeansException {
|
||||||
|
|
||||||
Object result = existingBean;
|
Object result = existingBean;
|
||||||
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
for (BeanPostProcessor processor : getBeanPostProcessors()) {
|
||||||
result = beanProcessor.postProcessAfterInitialization(result, beanName);
|
result = processor.postProcessAfterInitialization(result, beanName);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -128,10 +128,9 @@ public class AnnotationCacheOperationSource extends AbstractFallbackCacheOperati
|
|||||||
/**
|
/**
|
||||||
* Determine the cache operation(s) for the given {@link CacheOperationProvider}.
|
* Determine the cache operation(s) for the given {@link CacheOperationProvider}.
|
||||||
* <p>This implementation delegates to configured
|
* <p>This implementation delegates to configured
|
||||||
* {@link CacheAnnotationParser}s for parsing known annotations into
|
* {@link CacheAnnotationParser CacheAnnotationParsers}
|
||||||
* Spring's metadata attribute class.
|
* for parsing known annotations into Spring's metadata attribute class.
|
||||||
* <p>Can be overridden to support custom annotations that carry
|
* <p>Can be overridden to support custom annotations that carry caching metadata.
|
||||||
* caching metadata.
|
|
||||||
* @param provider the cache operation provider to use
|
* @param provider the cache operation provider to use
|
||||||
* @return the configured caching operations, or {@code null} if none found
|
* @return the configured caching operations, or {@code null} if none found
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.springframework.context.annotation.Role;
|
|||||||
* to enable proxy-based annotation-driven cache management.
|
* to enable proxy-based annotation-driven cache management.
|
||||||
*
|
*
|
||||||
* @author Chris Beams
|
* @author Chris Beams
|
||||||
|
* @author Juergen Hoeller
|
||||||
* @since 3.1
|
* @since 3.1
|
||||||
* @see EnableCaching
|
* @see EnableCaching
|
||||||
* @see CachingConfigurationSelector
|
* @see CachingConfigurationSelector
|
||||||
@@ -41,8 +42,7 @@ public class ProxyCachingConfiguration extends AbstractCachingConfiguration {
|
|||||||
@Bean(name = CacheManagementConfigUtils.CACHE_ADVISOR_BEAN_NAME)
|
@Bean(name = CacheManagementConfigUtils.CACHE_ADVISOR_BEAN_NAME)
|
||||||
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
||||||
public BeanFactoryCacheOperationSourceAdvisor cacheAdvisor() {
|
public BeanFactoryCacheOperationSourceAdvisor cacheAdvisor() {
|
||||||
BeanFactoryCacheOperationSourceAdvisor advisor =
|
BeanFactoryCacheOperationSourceAdvisor advisor = new BeanFactoryCacheOperationSourceAdvisor();
|
||||||
new BeanFactoryCacheOperationSourceAdvisor();
|
|
||||||
advisor.setCacheOperationSource(cacheOperationSource());
|
advisor.setCacheOperationSource(cacheOperationSource());
|
||||||
advisor.setAdvice(cacheInterceptor());
|
advisor.setAdvice(cacheInterceptor());
|
||||||
advisor.setOrder(this.enableCaching.<Integer>getNumber("order"));
|
advisor.setOrder(this.enableCaching.<Integer>getNumber("order"));
|
||||||
|
|||||||
@@ -189,8 +189,8 @@ class ConfigurationClassEnhancer {
|
|||||||
@Override
|
@Override
|
||||||
public int accept(Method method) {
|
public int accept(Method method) {
|
||||||
for (int i = 0; i < this.callbacks.length; i++) {
|
for (int i = 0; i < this.callbacks.length; i++) {
|
||||||
if (!(this.callbacks[i] instanceof ConditionalCallback) ||
|
Callback callback = this.callbacks[i];
|
||||||
((ConditionalCallback) this.callbacks[i]).isMatch(method)) {
|
if (!(callback instanceof ConditionalCallback) || ((ConditionalCallback) callback).isMatch(method)) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1079,7 +1079,7 @@ public class AnnotatedElementUtils {
|
|||||||
|
|
||||||
if (containerType != null && !processor.aggregates()) {
|
if (containerType != null && !processor.aggregates()) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"Searches for repeatable annotations must supply an aggregating Processor");
|
"Searches for repeatable annotations must supply an aggregating Processor");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2015 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -85,7 +85,7 @@ public class AnnotationTransactionAttributeSource extends AbstractFallbackTransa
|
|||||||
*/
|
*/
|
||||||
public AnnotationTransactionAttributeSource(boolean publicMethodsOnly) {
|
public AnnotationTransactionAttributeSource(boolean publicMethodsOnly) {
|
||||||
this.publicMethodsOnly = publicMethodsOnly;
|
this.publicMethodsOnly = publicMethodsOnly;
|
||||||
this.annotationParsers = new LinkedHashSet<TransactionAnnotationParser>(2);
|
this.annotationParsers = new LinkedHashSet<TransactionAnnotationParser>(4);
|
||||||
this.annotationParsers.add(new SpringTransactionAnnotationParser());
|
this.annotationParsers.add(new SpringTransactionAnnotationParser());
|
||||||
if (jta12Present) {
|
if (jta12Present) {
|
||||||
this.annotationParsers.add(new JtaTransactionAnnotationParser());
|
this.annotationParsers.add(new JtaTransactionAnnotationParser());
|
||||||
@@ -145,14 +145,13 @@ public class AnnotationTransactionAttributeSource extends AbstractFallbackTransa
|
|||||||
* for parsing known annotations into Spring's metadata attribute class.
|
* for parsing known annotations into Spring's metadata attribute class.
|
||||||
* Returns {@code null} if it's not transactional.
|
* Returns {@code null} if it's not transactional.
|
||||||
* <p>Can be overridden to support custom annotations that carry transaction metadata.
|
* <p>Can be overridden to support custom annotations that carry transaction metadata.
|
||||||
* @param ae the annotated method or class
|
* @param element the annotated method or class
|
||||||
* @return TransactionAttribute the configured transaction attribute,
|
* @return the configured transaction attribute, or {@code null} if none was found
|
||||||
* or {@code null} if none was found
|
|
||||||
*/
|
*/
|
||||||
protected TransactionAttribute determineTransactionAttribute(AnnotatedElement ae) {
|
protected TransactionAttribute determineTransactionAttribute(AnnotatedElement element) {
|
||||||
if (ae.getAnnotations().length > 0) {
|
if (element.getAnnotations().length > 0) {
|
||||||
for (TransactionAnnotationParser annotationParser : this.annotationParsers) {
|
for (TransactionAnnotationParser annotationParser : this.annotationParsers) {
|
||||||
TransactionAttribute attr = annotationParser.parseTransactionAnnotation(ae);
|
TransactionAttribute attr = annotationParser.parseTransactionAnnotation(element);
|
||||||
if (attr != null) {
|
if (attr != null) {
|
||||||
return attr;
|
return attr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2012 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -35,8 +35,8 @@ import org.springframework.transaction.interceptor.TransactionAttribute;
|
|||||||
public class Ejb3TransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
public class Ejb3TransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
|
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {
|
||||||
javax.ejb.TransactionAttribute ann = ae.getAnnotation(javax.ejb.TransactionAttribute.class);
|
javax.ejb.TransactionAttribute ann = element.getAnnotation(javax.ejb.TransactionAttribute.class);
|
||||||
if (ann != null) {
|
if (ann != null) {
|
||||||
return parseTransactionAnnotation(ann);
|
return parseTransactionAnnotation(ann);
|
||||||
}
|
}
|
||||||
@@ -49,6 +49,7 @@ public class Ejb3TransactionAnnotationParser implements TransactionAnnotationPar
|
|||||||
return new Ejb3TransactionAttribute(ann.value());
|
return new Ejb3TransactionAttribute(ann.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object other) {
|
public boolean equals(Object other) {
|
||||||
return (this == other || other instanceof Ejb3TransactionAnnotationParser);
|
return (this == other || other instanceof Ejb3TransactionAnnotationParser);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -19,6 +19,7 @@ package org.springframework.transaction.annotation;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||||
import org.springframework.core.annotation.AnnotationAttributes;
|
import org.springframework.core.annotation.AnnotationAttributes;
|
||||||
@@ -38,9 +39,9 @@ import org.springframework.transaction.interceptor.TransactionAttribute;
|
|||||||
public class JtaTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
public class JtaTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
|
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {
|
||||||
AnnotationAttributes attributes =
|
AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(
|
||||||
AnnotatedElementUtils.getMergedAnnotationAttributes(ae, javax.transaction.Transactional.class);
|
element, javax.transaction.Transactional.class);
|
||||||
if (attributes != null) {
|
if (attributes != null) {
|
||||||
return parseTransactionAnnotation(attributes);
|
return parseTransactionAnnotation(attributes);
|
||||||
}
|
}
|
||||||
@@ -55,23 +56,23 @@ public class JtaTransactionAnnotationParser implements TransactionAnnotationPars
|
|||||||
|
|
||||||
protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
|
protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
|
||||||
RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
|
RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
|
||||||
|
|
||||||
rbta.setPropagationBehaviorName(
|
rbta.setPropagationBehaviorName(
|
||||||
RuleBasedTransactionAttribute.PREFIX_PROPAGATION + attributes.getEnum("value").toString());
|
RuleBasedTransactionAttribute.PREFIX_PROPAGATION + attributes.getEnum("value").toString());
|
||||||
ArrayList<RollbackRuleAttribute> rollBackRules = new ArrayList<RollbackRuleAttribute>();
|
|
||||||
Class<?>[] rbf = attributes.getClassArray("rollbackOn");
|
List<RollbackRuleAttribute> rollbackRules = new ArrayList<RollbackRuleAttribute>();
|
||||||
for (Class<?> rbRule : rbf) {
|
for (Class<?> rbRule : attributes.getClassArray("rollbackOn")) {
|
||||||
RollbackRuleAttribute rule = new RollbackRuleAttribute(rbRule);
|
rollbackRules.add(new RollbackRuleAttribute(rbRule));
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
Class<?>[] nrbf = attributes.getClassArray("dontRollbackOn");
|
for (Class<?> rbRule : attributes.getClassArray("dontRollbackOn")) {
|
||||||
for (Class<?> rbRule : nrbf) {
|
rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
|
||||||
NoRollbackRuleAttribute rule = new NoRollbackRuleAttribute(rbRule);
|
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
rbta.getRollbackRules().addAll(rollBackRules);
|
rbta.setRollbackRules(rollbackRules);
|
||||||
|
|
||||||
return rbta;
|
return rbta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object other) {
|
public boolean equals(Object other) {
|
||||||
return (this == other || other instanceof JtaTransactionAnnotationParser);
|
return (this == other || other instanceof JtaTransactionAnnotationParser);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2015 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -19,6 +19,7 @@ package org.springframework.transaction.annotation;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||||
import org.springframework.core.annotation.AnnotationAttributes;
|
import org.springframework.core.annotation.AnnotationAttributes;
|
||||||
@@ -38,8 +39,9 @@ import org.springframework.transaction.interceptor.TransactionAttribute;
|
|||||||
public class SpringTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
public class SpringTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
|
public TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {
|
||||||
AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(ae, Transactional.class);
|
AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(
|
||||||
|
element, Transactional.class);
|
||||||
if (attributes != null) {
|
if (attributes != null) {
|
||||||
return parseTransactionAnnotation(attributes);
|
return parseTransactionAnnotation(attributes);
|
||||||
}
|
}
|
||||||
@@ -54,6 +56,7 @@ public class SpringTransactionAnnotationParser implements TransactionAnnotationP
|
|||||||
|
|
||||||
protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
|
protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
|
||||||
RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
|
RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
|
||||||
|
|
||||||
Propagation propagation = attributes.getEnum("propagation");
|
Propagation propagation = attributes.getEnum("propagation");
|
||||||
rbta.setPropagationBehavior(propagation.value());
|
rbta.setPropagationBehavior(propagation.value());
|
||||||
Isolation isolation = attributes.getEnum("isolation");
|
Isolation isolation = attributes.getEnum("isolation");
|
||||||
@@ -61,31 +64,26 @@ public class SpringTransactionAnnotationParser implements TransactionAnnotationP
|
|||||||
rbta.setTimeout(attributes.getNumber("timeout").intValue());
|
rbta.setTimeout(attributes.getNumber("timeout").intValue());
|
||||||
rbta.setReadOnly(attributes.getBoolean("readOnly"));
|
rbta.setReadOnly(attributes.getBoolean("readOnly"));
|
||||||
rbta.setQualifier(attributes.getString("value"));
|
rbta.setQualifier(attributes.getString("value"));
|
||||||
ArrayList<RollbackRuleAttribute> rollBackRules = new ArrayList<RollbackRuleAttribute>();
|
|
||||||
Class<?>[] rbf = attributes.getClassArray("rollbackFor");
|
List<RollbackRuleAttribute> rollbackRules = new ArrayList<RollbackRuleAttribute>();
|
||||||
for (Class<?> rbRule : rbf) {
|
for (Class<?> rbRule : attributes.getClassArray("rollbackFor")) {
|
||||||
RollbackRuleAttribute rule = new RollbackRuleAttribute(rbRule);
|
rollbackRules.add(new RollbackRuleAttribute(rbRule));
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
String[] rbfc = attributes.getStringArray("rollbackForClassName");
|
for (String rbRule : attributes.getStringArray("rollbackForClassName")) {
|
||||||
for (String rbRule : rbfc) {
|
rollbackRules.add(new RollbackRuleAttribute(rbRule));
|
||||||
RollbackRuleAttribute rule = new RollbackRuleAttribute(rbRule);
|
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
Class<?>[] nrbf = attributes.getClassArray("noRollbackFor");
|
for (Class<?> rbRule : attributes.getClassArray("noRollbackFor")) {
|
||||||
for (Class<?> rbRule : nrbf) {
|
rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
|
||||||
NoRollbackRuleAttribute rule = new NoRollbackRuleAttribute(rbRule);
|
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
String[] nrbfc = attributes.getStringArray("noRollbackForClassName");
|
for (String rbRule : attributes.getStringArray("noRollbackForClassName")) {
|
||||||
for (String rbRule : nrbfc) {
|
rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
|
||||||
NoRollbackRuleAttribute rule = new NoRollbackRuleAttribute(rbRule);
|
|
||||||
rollBackRules.add(rule);
|
|
||||||
}
|
}
|
||||||
rbta.getRollbackRules().addAll(rollBackRules);
|
rbta.setRollbackRules(rollbackRules);
|
||||||
|
|
||||||
return rbta;
|
return rbta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object other) {
|
public boolean equals(Object other) {
|
||||||
return (this == other || other instanceof SpringTransactionAnnotationParser);
|
return (this == other || other instanceof SpringTransactionAnnotationParser);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2013 the original author or authors.
|
* Copyright 2002-2018 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -38,15 +38,13 @@ public interface TransactionAnnotationParser {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the transaction attribute for the given method or class,
|
* Parse the transaction attribute for the given method or class,
|
||||||
* based on a known annotation type.
|
* based on an annotation type understood by this parser.
|
||||||
* <p>This essentially parses a known transaction annotation into Spring's
|
* <p>This essentially parses a known transaction annotation into Spring's metadata
|
||||||
* metadata attribute class. Returns {@code null} if the method/class
|
* attribute class. Returns {@code null} if the method/class is not transactional.
|
||||||
* is not transactional.
|
* @param element the annotated method or class
|
||||||
* @param ae the annotated method or class
|
* @return the configured transaction attribute, or {@code null} if none found
|
||||||
* @return TransactionAttribute the configured transaction attribute,
|
|
||||||
* or {@code null} if none was found
|
|
||||||
* @see AnnotationTransactionAttributeSource#determineTransactionAttribute
|
* @see AnnotationTransactionAttributeSource#determineTransactionAttribute
|
||||||
*/
|
*/
|
||||||
TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae);
|
TransactionAttribute parseTransactionAnnotation(AnnotatedElement element);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user