-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#1329 Исправлена ошибка в проверке manager-module-named-self-reference #1336
base: master
Are you sure you want to change the base?
#1329 Исправлена ошибка в проверке manager-module-named-self-reference #1336
Conversation
…f-reference Исправлена ошибка в проверке manager-module-named-self-reference: проверка срабатывала ложно, если в конфигурации есть несколько объектов метаданных с одинаковым наименованием.
…eature/1329-manager-module-named-self-reference-bug
feature/1329-manager-module-named-self-reference-bug
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@VAGoncharov извини что долго делали ревью.
EObject eObject = objectDesc.getEObjectOrProxy(); | ||
if (!monitor.isCanceled() && eObject.equals(module.getOwner())) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Зачитывать 2 объекта метаданных - только чтобы сравнить их полные имена - это очень дорого.
Предлагаю способ дешевле!
return StringUtils.equals(bslQualifiedNameProvider.getFullyQualifiedName(module).getSegment(1), | ||
source.getName()); | ||
IScope scope = scopeProvider.getScope(source, reference); | ||
String fqn = | ||
topObjectFqnGenerator.generateStandaloneObjectFqn(MANAGERS_FOR_MDOBJECT.get(reference), source.getName()); | ||
return scope.getSingleElement(qualifiedNameConverter.toQualifiedName(fqn)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут нет смысла генерить FQN для целевого объекта, а еще получать сам объект из скоупа - это дорогостоящее!
Достаточно проверить URI для текущего объекта (модуль не нужно получать выше!) с именем ссылки:
private boolean isReferenceExcessive(DynamicFeatureAccess source, , EReference reference)
{
URI uri = EcoreUtil.getURI(source).trimFragment(); // тут будет URI текущего модуля
return uri.segmentCount()==5 && source.getName() != null && source.getName().equals(uri.segment(3)) && reference.getName().equals(uri.segment(2));
}
reference.getName() - всегда английское, и имя каталога для типа менеджера - тоже всегда будет английским.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно так же второй способ - более тяжелый т.к. получает лишний объект, но выглядящий менее хакирующе:
private boolean isReferenceExcessive(DynamicFeatureAccess source, Module module, EReference reference)
{
EObject owner = module.getOwner();
return owner instanceof MdObject && source.getName() != null && source.getName().equals(((MdObject)owner).getName) && reference.getEReferenceType().equals(owner.eClass());
}
@@ -80,8 +122,7 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete | |||
Expression featureAccessSource = ((DynamicFeatureAccess)object).getSource(); | |||
Module module = EcoreUtil2.getContainerOfType(featureAccessSource, Module.class); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Модуль не нужно получать если дальше не используется
Что сделано
Чек-лист
Общее:
master
и нет конфликтовЕсли применимо:
Закрываемые задачи
Closes #1329
@1C-Company @marmyshev прошу сделать аудит