Project try как исправить ошибку

Что означает ошибка 503

Код 503 сообщает, что запущенный сервис недоступен (Service Unavailable). Чаще всего это ненадолго: например, доступ к ресурсу закрывают на время перезагрузки или для проведения технического обслуживания.

Но иногда ошибка 503 возникает из-за того, что работа системы организована неправильно. Сервер взаимодействует с очередью запросов: принимает их, обрабатывает и выдаёт ответ. С лёгкими запросами он справляется быстро, со сложными — долго. Если таких тяжёлых запросов много, очередь продвигается медленно.

Длина очереди обычно фиксированная. Когда вы заходите на сайт, то отправляете запрос серверу. Если для него нет места, появится ошибка 503.

Что делать пользователю при ошибке 503

Попробуйте выполнить эти действия — есть шанс, что проблема решится.

Проверьте, у всех ли возникает ошибка

Эти онлайн-сервисы покажут, все ли пользователи не могут получить доступ к сайту или ошибка 503 появляется только у вас:

  • Down for Everyone or Just Me;
  • Website Planet;
  • 2IP.

Последний особенно удобен: он делает запросы к сайту с серверов из разных стран и показывает код ответа. Если хотя бы в одном случае есть ошибка 503, значит, вы точно не одиноки.

Если сервисы показывают, что ресурс доступен, попробуйте зайти на него с другого устройства. Или попросите друзей проверить, всё ли с сайтом в порядке.

Подождите и попробуйте позже

Обновите страницу. Если по-прежнему видите ошибку 503, попробуйте зайти на сайт позднее: через пару минут или когда там потенциально будет меньше пользователей. Это касается прежде всего игр или ресурсов, которые резко стали популярны. Например, если государство объявило о новых выплатах, которые оформляются онлайн, мощностей сервера может на всех не хватить.

Перезагрузите устройство

Если проблема возникает только у вас, перезагрузка смартфона, компьютера или планшета может помочь.

Если это не сработало, перезапустите и роутер. Сделать это можно тремя способами.

1. Через панель управления

Обычно она находится по адресу 192.168.0.1 или 192.168.0.1. IP вводится прямо в браузере, но возможны варианты — сверьтесь с инструкцией к вашей модели.

В панели нужно найти кнопку «Перезагрузка» или «Перезагрузить»: она может быть в меню «Система», «Системные» и так далее. Нажмите и дождитесь, пока страница обновится.

2. С помощью кнопки отключения

Кнопка On / Off обычно находится на задней панели роутера. Нажмите на неё, подождите 20–30 секунд и включите устройство снова. Этого времени хватит, чтобы конденсаторы разрядились, чипы памяти перестали получать питание, все временные данные сбросились.

Важно! Не перепутайте кнопку On / Off с Reset, которая не только перезагружает роутер, но также сбрасывает его настройки. Если кнопка утоплена в корпус и, чтобы нажать на неё, требуется спичка или отвёртка, точно не пытайтесь достать её.

3. С помощью отключения из розетки

Выньте адаптер питания из розетки, подождите 20–30 секунд и подключите снова.

Смените DNS-адреса

DNS (Domain Name System — система доменных имён) переводит текстовые URL-адреса сайтов в IP, например https://lifehacker.ru/ в 116.202.209.72. Такой конвертацией занимаются DNS-серверы. Проблемы на них иногда приводят к тому, что вы видите ошибку 503.

К счастью, адреса DNS-серверов можно сменить. Так, вы можете использовать IP публичных DNS Google: 8.8.8.8 и 8.8.4.4 для стандарта IPv4, 2001:4860:4860::8888 и 2001:4860:4860::8844 для нового IPv6. Вот как это сделать.

1. На компьютере с Windows

Нажмите Win + R. В окне «Выполнить» введите ncpa.cpl и нажмите Enter.

Выберите подключение, которое используете, кликните по нему правой кнопкой, нажмите на «Свойства».

В списке компонентов найдите пункт «IP версии 4» или «TCP/IPv4», нажмите «Свойства». Установите переключатель «Использовать следующие адреса DNS-серверов», введите 8.8.8.8 и 8.8.4.4 в две строки.

Если в списке компонентов у вас есть «IP версии 6» или «TCP/IPv6», можете аналогично задать адреса 2001:4860:4860::8888 и 2001:4860:4860::8844.

Желательно также сбросить кеш DNS. Для этого снова зажмите Win + R, в окне «Выполнить» введите cmd.

В консоли напишите ipconfig /flushdns и кликните Enter.

2. На компьютере с macOS

Зайдите в меню «Системные настройки» — «Сеть». Если слева внизу вы видите иконку с закрытым замком, кликните по ней и в появившемся окне введите пароль администратора.

Кликните по нужному подключению и выберите в меню пункт «Дополнительно».

На вкладке DNS нажмите на «+» и добавьте адреса в список.

Очистите кеш DNS. Запустите терминал, напишите команду sudo killall -HUP mDNSResponder. Затем нажмите Return и введите пароль администратора.

3. На роутере

Зайдите в панель управления роутера и найдите пункт с адресами DNS-серверов — они могут быть в настройках DHCP. Введите два адреса нужного формата (IPv4 или IPv6) — в зависимости от того, что поддерживает ваше устройство.

Очистите кеш YouTube на Android

На Android-устройствах ошибка 503 в приложении YouTube иногда возникает из-за повреждённой информации в кеше. Попробуйте очистить его, чтобы сервис снова заработал. Действуйте так.

Зайдите в настройки. В списке приложений найдите YouTube.

Остановите его работу и нажмите «Очистить кеш». Затем снова запустите приложение.

Уменьшите список воспроизведения YouTube

Иногда ошибка 503 возникает, когда в вашем списке воспроизведения «Смотреть позже» слишком много видео. Попробуйте уменьшить его, а затем перезагрузите страницу или приложение.

Свяжитесь с администрацией ресурса

Возможно, администраторы сайта ещё не в курсе проблемы. Или, наоборот, знают, как её решить либо через сколько всё заработает. Словом, если ничего из перечисленного не помогло, обратитесь к ним.

Что делать администратору при ошибке 503

Всё зависит от движка вашего сайта и его настроек. Выбирайте подходящие варианты и проверяйте, решило ли это проблему.

Установите параметр Retry After

Он показывает, сколько времени после получения ошибки 503 должен подождать клиент до следующего запроса к серверу. Значение указывается в миллисекундах, его величину вы задаёте самостоятельно. Это предупредит слишком частые повторные запросы.

Пересмотрите время выполнения регулярных заданий

Отправку рассылок и другие задачи, которые обычно располагают в системном Cron, перенесите на время минимальной загрузки сервера. А заодно освежите в памяти правила пользования хостингом, чтобы не нарушить ограничения по количеству отправленных писем и времени работы скриптов.

Установите защиту от DDoS-атак

Это также запросы, которые поступают в общую очередь. Избавитесь от них — сможете быстрее предоставлять пользователям доступ к своему ресурсу.

Не передавайте крупные файлы через HTTP

Обычно хостеры ограничивают время работы скриптов. Если вы будете передавать большие файлы через такой скрипт, высока вероятность, что в лимит вы не вложитесь. К тому же передача будет занимать отдельный процесс, а значит, он не сможет обрабатывать запросы из общей очереди.

Передача файлов напрямую в этой ситуации выгоднее. В ней задействуется многопоточный процесс, который не так влияет на скорость загрузки сайта или сервиса в целом.

Удалите тяжёлые или устаревшие компоненты CMS

Попробуйте по очереди отключать компоненты вашей CMS и смотреть, как меняется ситуация. Если вы нашли потенциальный источник проблемы, попробуйте обновить этот компонент. Или подумайте, как обойтись без него — например, заменить на более новый и быстрый аналог.

Объедините ресурсы в один файл, чтобы уменьшить число запросов

Если ваше веб-приложение использует множество мелких ресурсов (изображений, таблиц стилей, скриптов и так далее) и загружает каждый из них отдельным запросом, они могут занимать значительную часть очереди. Чтобы решить проблему, объедините всё в один файл.

Уберите соединения с удалёнными серверами

Они могут не отвечать слишком долго. А тем временем остальные запросы к вашему серверу будут ждать обработки.

Бывает, что в скриптах вместо локальных путей используются глобальные, формата http://…. Они также воспринимаются как запросы к удалённому серверу и замедляют работу.

Поищите такие проблемы в коде, и, если без удалённого сервера не обойтись, выставьте небольшой тайм-аут на ожидание. Предусмотрите действия на случай, если он не успеет ответить.

Оптимизируйте MySQL-запросы

Если вы используете MySQL и часть запросов выполняется достаточно медленно, некоторые хостинги автоматически создают файл логов mysql-slow.log. В нём собираются наиболее проблемные обращения к базе данных. Проанализируйте их и по возможности выполните оптимизацию.

Также проиндексируйте базу и попробуйте задействовать кеширующие компоненты, которые позволили бы уменьшить количество запросов.

Установите антилич

Если другой веб-мастер использует прямые ссылки на ваш ресурс, например вставляет у себя на страницах ваши картинки, это также увеличивает очередь запросов. Антилич-модули и настройки эффективно борются с этим. Некоторые хостеры позволяют включить их в панели администрирования. Для других нужно всё настроить вручную, например через правила mod_rewrite в файле .htaccess или отдельные модули.

Установите кеширующие компоненты

Они помогут вам разгрузить очередь запросов и сократить среднее время их обработки. В результате для новых обращений останется место, и пользователи не будут видеть ошибку 503.

Проконсультируйтесь с хостером

Возможно, проблема не только у вас, и специалисты хостинг-компании знают, как её решить. Нелишним будет перед этим пробежаться по FAQ-материалам и просмотреть свежие темы на форуме ресурса. Есть вероятность, что там уже лежат готовые инструкции.

Читайте также 👩‍💻💻🎮

  • Как исправить ошибку CPU Fan Error при загрузке компьютера
  • Как очистить кеш браузера
  • 21 способ ускорить интернет, если всё висит
  • Что означает 404 Not Found и другие ошибки веб-страниц
  • Что делать с ошибкой «Запуск этого устройства невозможен. (Код 10)» в Windows 10

Вопрос:

Android Studio (1.2 RC0) продолжает рассказывать мне
Error running android: Gradle project sync failed. Please fix your project and try again.
Как я могу узнать, в чем проблема? К сожалению, решения этого потока SO не помогли.

Ответ №1

  • Перейти к файлу → Недействительный кеш/перезагрузка
  • Завершение работы Android Studio
  • Переименовать/удалить папку .gradle в домашнем каталоге пользователя
  • Перезапустите Android Studio (он загрузит метаданные и данные gradle)
  • Gradle выполнить успешную работу
  • Перестроить проект. Готово.

Ответ №2

Решение

  • Подключите компьютер к Интернету

  • Нажмите

Sync project with Gradle files

На панели инструментов enter image description here

Он автоматически синхронизирует gradle.

Ответ №3

Просто проигнорируйте ошибку и попробуйте запустить проект в любом случае. Это не удастся, но на этот раз вы получите ссылку в описании ошибки. Нажатие на ссылку приведет к автоматическому обновлению/загрузке устаревшего/отсутствующего компонента.

В моем случае проект не удалось запустить два раза, каждый раз виновником был другой компонент API/SDK.

В моем случае я просто пытался запустить загруженный образец проекта, не зная, на какой уровень API был нацелен или где искать эту информацию.

Ответ №4

  • Загрузите последний Gradle пакет distribution, например (gradle -2.11-all.zip).
  • Извлеките этот zip файл в папку, например, (D:// Gradle)
  • Загрузите проект в Android Studio и перейдите в меню Файл- > Настройки → Gradle. Нажмите “Использовать локальный дистрибутив Gradle” и укажите его в папку, в которой вы разархивировали последний проект Gradle.
  • Перезапустите проект

Ответ №5

Перейти к File → Invalidate caches/Restart Shutdown Android Studio Переименовать/удалить папку .gradle в домашнем каталоге пользователя. Перезапустить Android Studio (он загрузит метаданные и данные gradle). Сборка Gradle завершена успешно. Перестройте проект. Готово

Ответ №6

Перейдите к

file->settings->build,execution,deployment->gradle.

(и установите gradle домашний путь из вашего каталога)

Ответ №7

Вчера у меня была такая же проблема. После открытия “Android SDK Manager”, обновления всех пакетов и перезагрузки Android Studio, проект снова скомпилирован.

Ответ №8

это выглядит по-разному в разных ситуациях. для меня я сделал установку и обновил много вещей, которые сказал менеджер SDK, тогда у меня была эта проблема. все, что я сделал, было: из файла → Invalidate caches/Restart (появится диалоговое окно), выберите Invalidate и restart.

после перезагрузки. все было исправлено, но мне нужно было создать новый эмулятор и удалить старый. (Android Studio 1.3.1) (один профессионал должен отредактировать это, чтобы быть более понятным). , , Здесь все было хорошо, но ваши машины также нуждаются в перезагрузке, потому что некоторые системные файлы изменены, чтобы синхронизировать их, мы должны перезагрузить систему.

Ответ №9

Это очень распространенная проблема, и решение очень просто…
Просто обновите SDK в менеджере SDK (см. Полные инструкции ниже)

  • Откройте Android Studio и перейдите в Менеджер SDK (Файл > Настройки > SDK
    Менеджер)
  • Проверьте значок (-) перед любым пакетом и щелкните по нему.
  • Нажмите “ОК”, чтобы начать обновление SDK.

Спасибо, что задали этот вопрос:)

Ответ №10

Если сообщения об ошибках не отображаются: иногда они отображаются в командной строке. Просто зайдите в командную строку, перейдите в каталог app и введите

gradle installDebug

или, если детали отсутствуют

gradle --info installDebug

Это может предоставить дополнительную информацию о том, как отладить проблему.

Ответ №11

Удалите папку “build” из корневой папки проекта. Затем выполните “аннулировать кэш и перезапустите”. Это перезапустит вашу Android Studio, а затем соберет приложение снова, решит проблему.

Ответ №12

Мне потребовалось некоторое время, чтобы решить эту проблему.

  • Обновленный SDK Build-Tool [не помог]
  • Обновлен CMake [не помогло]
  • Обновлены платформы Android SDK-Tools [не помогло]
  • Обновлены инструменты Android SDK [не помогло]
  • Обновлен NDK [проблема решена]

Была причина, я не хотел обновлять NDK. Когда все остальное не удалось, я обновил NDK и сделал трюк.

Ответ №13

Если у вас Gradle Scripts → gradle.properties ожидания, проверьте Gradle Scripts → gradle.properties в Android Studio, я обнаружил, что я установил прокси- socket в настройках Android Studio, но в этом файле gradle.properties мой прокси стал http, поэтому я просто удалил этот http proxy setting строки и, наконец, работает.

Ответ №14

У меня возникла эта проблема на Android studio, там была либо синхросигнал, либо квадрат сборки, была эта ссылка, как синий текст об этой проблеме, нажмите эту кнопку и она загрузит что-то, что решит эту проблему

Ответ №15

Разрешение прост. Откройте “Android SDK Manager”, обновите все пакеты и перезапустите Android Studio. После этого вы должны скомпилировать проект без каких-либо проблем.

Ответ №16

Возможно, вы используете gradle в автономном режиме. Чтобы снять этот флажок, выберите ” File > Settings > Gradle, снимите флажок ” Offline Work и нажмите ” Apply Убедитесь, что у вас есть подключение к Интернету, и снова синхронизируйте проект.

Ответ №17

Видимо, некоторые платформы могут отсутствовать. Вот как я решил проблему:

Вы видите сообщение об ошибке, которое отображается внизу окна Android Studio? Это может быть также маленькое окно в правом нижнем углу.., которое выглядит так:

enter image description here

Теперь, нажмите на эту синюю ссылку, сделайте так, как говорят диалоговые окна (если есть)…

Это решило проблему. Надеюсь, поможет…

Ответ №18

Я столкнулся с той же проблемой, но затем сделал следующее, и моя проблема была решена:

  • обновленный Gradle
  • установил последнюю версию Android студии (моя устарела)

И это решило мою проблему.

Примечание: это также помогло мне нажать на журнал событий, потому что он содержит более подробную информацию об ошибках. https://developer.android.com/studio/releases/gradle-plugin#updating-plugin также содержит отличную информацию.

Ответ №19

Загрузите файлы оценок с этого URL и извлеките все в папку: https://gradle.org/releases

Открыть файл → Настройка в ОС Windows или Настройки в Mac OS и в “Сборка, Выполнение, Развертывание”

Нажмите на “Gradle”

Установите флажок “Использовать локальную рассылку” и укажите путь к извлеченной папке.

Запустите gradle.bat для ОС Windows и файл gradle для Mac OS в этой папке.

Затем отметьте “Автономная работа”.

“путь к вашей извлеченной папке”/gradle-4.10.2/bin/.gradle (для версии 4.1.2 вы можете установить свою версию)

Нажмите ОК и наслаждайтесь.

Ответ №20

Это может быть связано с конфликтом версий Android Studio v3 и v4, особенно при импорте проекта в Android Stdio v4, который был ранее встроен в v3.

Вот несколько вещей, которые вам нужно сделать:

  • удалите папки .gradle и .idea из основной папки приложения.
  • импортировать проект в андроид студию.
  • После завершения синхронизации вам будет предложено обновить поддерживаемую версию Android Studio.
  • нажмите обновить.
  • сделанный.

Ответ №21

Ни один из этих ответов не помог мне, поэтому я удалил Android Studio и переустановил его. (Я не удаляю настройки) теперь работает отлично.

Ответ №22

Если у вас есть этот сбой и другие сбои, такие как “Обнаружены неподдерживаемые модули: Компиляция не поддерживается для следующих модулей”
может быть, вам нужно сначала решить их, а потом это тоже будет решено.
это то, что случилось со мной.

Ответ №23

было трудно решить, но я сделал это
посмотри, пойди
C:Users (имя пользователя)

удалить файл .gradle
его вы не видели, он может быть в скрытых файлах, поэтому, если вы используете Windows 7
щелкните правой кнопкой мыши, затем щелкните по свойствам и нажмите “скрытый”, чтобы не проверяться.

затем появится файл, затем удалите его
я надеюсь, что это работает

Ответ №24

Это потому, что gradle не синхронизируется по многим причинам.

Перейдите в папку проекта, удалите папку .gradle и запустите синхронизацию. Это будет работать

Есть таблица, в которой поле idnt_code должно быть уникальным и есть другая таблица, с которой данные перекачиваются в эту таблицу, в том числе в поле idnt_code. Но бывает что некоторые строки приходят уже с тем значением которое уже есть. Мне надо в catch получить эту строку, провести некоторые манипуляции, чтобы она могла записаться, записать и продолжить выполнение try. Понятно, что try уже закончил свою работу, поэтому мне придётся выполнить его снова.

возможно ли вообще работать со стройкой, в которой ошибка в catch?

Commercial
services for your project

  • Consultancy & Support

    Commercial consulting requests have a guaranteed response
    time.

  • Custom Development

    We can deliver a turn key solution or contribute to your
    project

  • Training

    For fast and deep dive into framework features to shift your
    team productivity.

Haulmont

we develop modern enterprise
solutions

  • Experts in Enterprise software

  • Creators of the CUBA Platform

  • Established in 2008

  • 300+

    developers

  • 400+

    projects

  • Customers in

    60+

    countries

Commercial
services for your project

  • Consultancy & Support

    Commercial consulting requests have a guaranteed response
    time.

  • Custom Development

    We can deliver a turn key solution or contribute to your
    project

  • Training

    For fast and deep dive into framework features to shift your
    team productivity.

Haulmont

we develop modern enterprise
solutions

  • Experts in Enterprise software

  • Creators of the CUBA Platform

  • Established in 2008

  • 300+

    developers

  • 400+

    projects

  • Customers in

    60+

    countries

Платные услуги для вашего проекта

  • Консалтинг и техническая поддержка

    Запросы в рамках коммерческой поддержки имеют гарантированное время ответа

  • Разработка на заказ

    Предоставляем разработку полностью нашими рабочими ресурсами или участвуем в создании вашего проекта

  • Обучение

    Для быстрого и всестороннего освоения особенностей платформы, чтобы повысить продуктивность вашей команды

Haulmont

мы разрабатываем современные корпоративные решения

  • Эксперты в области разработки корпоративного ПО

  • Создатели CUBA Platform

  • Компания основана в 2008

  • 300+

    разработчиков

  • 400+

    проектов

  • Клиенты в

    60+

    странах

Environment

  • Platform version: 6.8.13
  • Client type: Web
  • Long Polling: enabled

Description of the bug or enhancement

  1. Open App
  2. Open Application -> Screen
  3. Open Developer Console (Ctrl+Shift+F5)

After some time you can see error message in developer console:

SEVERE: Trying to start a new request while another is active

Label text stops updating each 0.5 secs and update takes 5-7 seconds for update this text.
When update occurs it refresh whole UI and you can see blink on label text.

On screen there are several background tasks which restarts by timer event. You can see in developer console that push requests are sending to server. After some time (random time) UI receives answer on push request with wrong server id and decide to resync whole state. After that push requests stop working and UI updates only with using resync which updates whole UI. It leads to blinking of UI components.

In developer console you can see:

INFO: Received message with server id 1103 but expected 1099. Postponing handling until the missing message(s) have been received
WARNING: Gave up waiting for message 1099 from the server
INFO: Resynchronizing from server
SEVERE: Trying to start a new request while another is active

I’ve attached sample project with this issue.
push-example.zip

Java developers have access to a number of useful tools that help to write high-quality code such as the powerful IDE IntelliJ IDEA, free analyzers SpotBugs, PMD, and the like. The developers working on CUBA Platform have already been using all of these, and this review will show how the project can benefit even more from the use of the static code analyzer PVS-Studio.

A few words about the project and the analyzer

CUBA Platform is a high-level framework for enterprise application development. The platform abstracts developers from underlying technologies so they can focus on the business tasks, while retaining full flexibility by providing unrestricted access to low-level code. The source code was downloaded from GitHub.

PVS-Studio is a tool for detecting bugs and potential security vulnerabilities in the source code of programs written in C, C++, C#, and Java. The analyzer runs on 64-bit Windows, Linux, and macOS systems. To make things easier for Java programmers, we developed plugins for Maven, Gradle, and IntelliJ IDEA. I checked the project using the Gradle plugin, and it went off without a hitch.

Errors in conditions

Warning 1

V6007 Expression ‘StringUtils.isNotEmpty(«handleTabKey»)’ is always true. SourceCodeEditorLoader.java(60)

@Override
public void loadComponent() {
  ....
  String handleTabKey = element.attributeValue("handleTabKey");
  if (StringUtils.isNotEmpty("handleTabKey")) {
    resultComponent.setHandleTabKey(Boolean.parseBoolean(handleTabKey));
  }
  ....
}

The attribute value extracted from the element is not checked. Instead, the isNotEmpty function gets a string literal as its argument rather than the variable handleTabKey.

A similar error found in the file AbstractTableLoader.java:

  • V6007 Expression ‘StringUtils.isNotEmpty(«editable»)’ is always true. AbstractTableLoader.java(596)

Warning 2

V6007 Expression ‘previousMenuItemFlatIndex >= 0’ is always true. CubaSideMenuWidget.java(328)

protected MenuItemWidget findNextMenuItem(MenuItemWidget currentItem) {
  List<MenuTreeNode> menuTree = buildVisibleTree(this);
  List<MenuItemWidget> menuItemWidgets = menuTreeToList(menuTree);

  int menuItemFlatIndex = menuItemWidgets.indexOf(currentItem);
  int previousMenuItemFlatIndex = menuItemFlatIndex + 1;
  if (previousMenuItemFlatIndex >= 0) {
      return menuItemWidgets.get(previousMenuItemFlatIndex);
  }
  return null;
}

The indexOf function will return -1 if the element is not found in the list. The value 1 is then added to the index, which disguises the problem with the absent element. Another potential problem has to do with the fact that the previousMenuItemFlatIndex variable will always be greater than or equal to zero. For example, if the menuItemWidgets list is found to be empty, the program will end up with an array overrun.

Warning 3

V6009 The ‘delete’ function could receive the ‘-1’ value while non-negative value is expected. Inspect argument: 1. AbstractCollectionDatasource.java(556)

protected DataLoadContextQuery createDataQuery(....) {
  ....
  StringBuilder orderBy = new StringBuilder();
  ....
  if (orderBy.length() > 0) {
      orderBy.delete(orderBy.length() - 2, orderBy.length());
      orderBy.insert(0, " order by ");
  }
  ....
}

The last two characters of the orderBy buffer are deleted if the total number of elements is greater than zero, i.e. if the string contains at least one character. However, the start position from where the deletion begins is offset by 2. So, if orderBy happens to contain one character, attempting to delete it will raise a StringIndexOutOfBoundsException.

Warning 4

V6013 Objects ‘masterCollection’ and ‘entities’ are compared by reference. Possibly an equality comparison was intended. CollectionPropertyContainerImpl.java(81)

@Override
public void setItems(@Nullable Collection<E> entities) {
  super.setItems(entities);
  Entity masterItem = master.getItemOrNull();
  if (masterItem != null) {
    MetaProperty masterProperty = getMasterProperty();
    Collection masterCollection = masterItem.getValue(masterProperty.getName());
    if (masterCollection != entities) {
      updateMasterCollection(masterProperty, masterCollection, entities);
    }
  }
}

In the updateMasterCollection function, the values from entities are copied to masterCollection. One line earlier, the collections have been compared by reference, but the programmer probably intended it to be a comparison by value.

Warning 5

V6013 Objects ‘value’ and ‘oldValue’ are compared by reference. Possibly an equality comparison was intended. WebOptionsList.java(278)

protected boolean isCollectionValuesChanged(Collection<I> value,
                                            Collection<I> oldValue) {
  return value != oldValue;
}

This case is similar to the previous one. The collections are compared in the isCollectionValuesChanged function, and reference comparison is perhaps not what was intended here either.

Redundant conditions

Warning 1

V6007 Expression ‘mask.charAt(i + offset) != placeHolder’ is always true. DatePickerDocument.java(238)

private String calculateFormattedString(int offset, String text) .... {
  ....
  if ((mask.charAt(i + offset) == placeHolder)) {         // <=
    ....
  } else if ((mask.charAt(i + offset) != placeHolder) &&  // <=
             (Character.isDigit(text.charAt(i)))) {
    ....
  }
  ....
}

The second condition checks an expression that is opposite to the one checked in the first condition. The latter can, therefore, be safely removed to shorten the code.

V6007 Expression ‘connector == null’ is always false. HTML5Support.java(169)

private boolean validate(NativeEvent event) {
  ....
  while (connector == null) {
    widget = widget.getParent();
    connector = Util.findConnectorFor(widget);
  }

  if (this.connector == connector) {
      return true;
  } else if (connector == null) {             // <=
      return false;
  } else if (connector.getWidget() instanceof VDDHasDropHandler) {
      return false;
  }
  return true;
}

After leaving the while loop, the value of the connector variable won’t be equal to null, so the redundant check can be deleted.

Another suspicious warning of this type that needs to be examined:

  • V6007 Expression ‘StringUtils.isBlank(strValue)’ is always true. Param.java(818)

Unreachable code in tests

V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(283)

private void throwException() {
  throw new RuntimeException(TEST_EXCEPTION_MSG);
}

@Test
public void testSuspendRollback() {
  Transaction tx = cont.persistence().createTransaction();
  try {
    ....
    Transaction tx1 = cont.persistence().createTransaction();
    try {
      EntityManager em1 = cont.persistence().getEntityManager();
      assertTrue(em != em1);
      Server server1 = em1.find(Server.class, server.getId());
      assertNull(server1);
      throwException();        // <=
      tx1.commit();            // <=
    } catch (Exception e) {
      //
    } finally {
      tx1.end();
    }

    tx.commit();
  } finally {
    tx.end();
  }
}

The throwException function throws an exception that prevents execution of the call of tx1.commit. Those two lines should be swapped for the code to work properly.

There were a few similar problems in other tests too:

  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(218)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(163)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(203)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(137)
  • V6019 Unreachable code detected. It is possible that an error is present. UpdateDetachedTest.java(153)
  • V6019 Unreachable code detected. It is possible that an error is present. EclipseLinkDetachedTest.java(132)
  • V6019 Unreachable code detected. It is possible that an error is present. PersistenceTest.java(223)

Suspicious arguments

Warning 1

V6023 Parameter ‘salt’ is always rewritten in method body before being used. BCryptEncryptionModule.java(47)

@Override
public String getHash(String content, String salt) {
  salt = BCrypt.gensalt();
  return BCrypt.hashpw(content, salt);
}

In cryptography, salt is a data string that you pass along with the password to a hash function. It is mainly used to protect the program against dictionary attacks and rainbow table attacks, as well as to obscure identical passwords. More here: Salt (cryptography).

In this function, the passed string is overwritten right after entering. Ignoring the value passed to the function is a potential vulnerability.

Warning 2

This function triggered two warnings at once:

  • V6023 Parameter ‘offsetWidth’ is always rewritten in method body before being used. CubaSuggestionFieldWidget.java(433)
  • V6023 Parameter ‘offsetHeight’ is always rewritten in method body before being used. CubaSuggestionFieldWidget.java(433)
@Override
public void setPosition(int offsetWidth, int offsetHeight) {
  offsetHeight = getOffsetHeight();
  ....
  if (offsetHeight + getPopupTop() > ....)) {
    ....
  }
  ....
  offsetWidth = containerFirstChild.getOffsetWidth();
  if (offsetWidth + getPopupLeft() > ....)) {
      ....
  } else {
      left = getPopupLeft();
  }
  setPopupPosition(left, top);
}

That’s quite a curious snippet. The function is called with only two variables as arguments, offsetWidth and offsetHeight, and both are overwritten before use.

Warning 3

V6022 Parameter ‘shortcut’ is not used inside constructor body. DeclarativeTrackingAction.java(47)

public DeclarativeTrackingAction(String id, String caption, String description,
                                 String icon, String enable, String visible,
                                 String methodName, @Nullable String shortcut,
                                 ActionsHolder holder) {
  super(id);
  this.caption = caption;
  this.description = description;
  this.icon = icon;

  setEnabled(enable == null || Boolean.parseBoolean(enable));
  setVisible(visible == null || Boolean.parseBoolean(visible));

  this.methodName = methodName;
  checkActionsHolder(holder);
}

The function doesn’t make use of the value passed as the shortcut parameter. Maybe the function’s interface has become obsolete, or this warning is just a false positive.

A few more defects of this type:

  • V6022 Parameter ‘type’ is not used inside constructor body. QueryNode.java(36)
  • V6022 Parameter ‘text2’ is not used inside constructor body. MarkerAddition.java(22)
  • V6022 Parameter ‘selection’ is not used inside constructor body. AceEditor.java(114)
  • V6022 Parameter ‘options’ is not used inside constructor body. EntitySerialization.java(379)

Different functions, same code

Warning 1

V6032 It is odd that the body of method ‘firstItemId’ is fully equivalent to the body of another method ‘lastItemId’. ContainerTableItems.java(213), ContainerTableItems.java(219)

@Override
public Object firstItemId() {
  List<E> items = container.getItems();
  return items.isEmpty() ? null : items.get(0).getId();
}

@Override
public Object lastItemId() {
  List<E> items = container.getItems();
  return items.isEmpty() ? null : items.get(0).getId();
}

The functions firstItemId and lastItemId have the same implementations. The latter was probably meant to get the index of the last element rather than get the element at index 0.

Warning 2

V6032 It is odd that the body of method is fully equivalent to the body of another method. SearchComboBoxPainter.java(495), SearchComboBoxPainter.java(501)

private void paintBackgroundDisabledAndEditable(Graphics2D g) {
  rect = decodeRect1();
  g.setPaint(color53);
  g.fill(rect);
}

private void paintBackgroundEnabledAndEditable(Graphics2D g) {
  rect = decodeRect1();
  g.setPaint(color53);
  g.fill(rect);
}

Two more functions with suspiciously identical bodies. My guess is that one of them was meant to work with some other color instead of color53.

Null dereference

Warning 1

V6060 The ‘descriptionPopup’ reference was utilized before it was verified against null. SuggestPopup.java(252), SuggestPopup.java(251)

protected void updateDescriptionPopupPosition() {
  int x = getAbsoluteLeft() + WIDTH;
  int y = getAbsoluteTop();
  descriptionPopup.setPopupPosition(x, y);
  if (descriptionPopup!=null) {
    descriptionPopup.setPopupPosition(x, y);
  }
}

In just two lines, the programmer managed to write a highly suspicious piece of code. First the method setPopupPosition of the object descriptionPopup is called, and then the object is checked for null. The first call to setPopupPosition is probably redundant and potentially dangerous. I guess it results from bad refactoring.

Warning 2

V6060 The ‘tableModel’ reference was utilized before it was verified against null. DesktopAbstractTable.java(1580), DesktopAbstractTable.java(1564)

protected Column addRuntimeGeneratedColumn(String columnId) {
  // store old cell editors / renderers
  TableCellEditor[] cellEditors =
    new TableCellEditor[tableModel.getColumnCount() + 1];         // <=
  TableCellRenderer[] cellRenderers =
    new TableCellRenderer[tableModel.getColumnCount() + 1];       // <=

  for (int i = 0; i < tableModel.getColumnCount(); i++) {         // <=
      Column tableModelColumn = tableModel.getColumn(i);

      if (tableModel.isGeneratedColumn(tableModelColumn)) {       // <=
          TableColumn tableColumn = getColumn(tableModelColumn);
          cellEditors[i] = tableColumn.getCellEditor();
          cellRenderers[i] = tableColumn.getCellRenderer();
      }
  }

  Column col = new Column(columnId, columnId);
  col.setEditable(false);

  columns.put(col.getId(), col);

  if (tableModel != null) {                                       // <=
      tableModel.addColumn(col);
  }
  ....
}

This case is similar to the previous one. By the time the tableModel object is checked for null, it has already been accessed multiple times.

Another example:

  • V6060 The ‘tableModel’ reference was utilized before it was verified against null. DesktopAbstractTable.java(596), DesktopAbstractTable.java(579)

Probably a logic error

V6026 This value is already assigned to the ‘sortAscending’ variable. CubaScrollTableWidget.java(488)

@Override
protected void sortColumn() {
  ....
  if (sortAscending) {
    if (sortClickCounter < 2) {
      // special case for initial revert sorting instead of reset sort order
      if (sortClickCounter == 0) {
        client.updateVariable(paintableId, "sortascending", false, false);
      } else {
        reloadDataFromServer = false;
        sortClickCounter = 0;
        sortColumn = null;
        sortAscending = true;   // <=

        client.updateVariable(paintableId, "resetsortorder", "", true);
      }
    } else {
      client.updateVariable(paintableId, "sortascending", false, false);
    }
  } else {
    if (sortClickCounter < 2) {
      // special case for initial revert sorting instead of reset sort order
      if (sortClickCounter == 0) {
        client.updateVariable(paintableId, "sortascending", true, false);
      } else {
        reloadDataFromServer = false;
        sortClickCounter = 0;
        sortColumn = null;
        sortAscending = true;

        client.updateVariable(paintableId, "resetsortorder", "", true);
      }
    } else {
      reloadDataFromServer = false;
      sortClickCounter = 0;
      sortColumn = null;
      sortAscending = true;

      client.updateVariable(paintableId, "resetsortorder", "", true);
    }
  }
  ....
}

In the first condition, the variable sortAscending has already been assigned the value true, but it’s still assigned the same value again later on. This must be a mistake, and the author probably meant the value false.

A similar example from a different file:

  • V6026 This value is already assigned to the ‘sortAscending’ variable. CubaTreeTableWidget.java(444)

Strange return values

Warning 1

V6037 An unconditional ‘return’ within a loop. QueryCacheManager.java(128)

public <T> T getSingleResultFromCache(QueryKey queryKey, List<View> views) {
  ....
  for (Object id : queryResult.getResult()) {
    return (T) em.find(metaClass.getJavaClass(), id, views.toArray(....));
  }
  ....
}

The analyzer has detected an unconditional call to return at the very first iteration of a for loop. Either that line is incorrect or the loop should be rewritten as an if statement.

Warning 2

V6014 It’s odd that this method always returns one and the same value. DefaultExceptionHandler.java(40)

@Override
public boolean handle(ErrorEvent event, App app) {
  Throwable t = event.getThrowable();
  if (t instanceof SocketException
      || ExceptionUtils.getRootCause(t) instanceof SocketException) {
    return true;
  }
  if (ExceptionUtils.getThrowableList(t).stream()
      .anyMatch(o -> o.getClass().getName().equals("...."))) {
    return true;
  }
  if (StringUtils.contains(ExceptionUtils.getMessage(t), "....")) {
    return true;
  }
  AppUI ui = AppUI.getCurrent();
  if (ui == null) {
    return true;
  }
  if (t != null) {
    if (app.getConnection().getSession() != null) {
      showDialog(app, t);
    } else {
      showNotification(app, t);
    }
  }
  return true;
}

This function returns true in each case, while the last line obviously calls for false. It looks like a mistake.

Here’s a full list of other similar suspicious functions:

  • V6014 It’s odd that this method always returns one and the same value. ErrorNodesFinder.java(31)
  • V6014 It’s odd that this method always returns one and the same value. FileDownloadController.java(69)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(73)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(48)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(67)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(46)
  • V6014 It’s odd that this method always returns one and the same value. JoinVariableNode.java(57)

Warning 3

V6007 Expression ‘needReload’ is always false. WebAbstractTable.java(2702)

protected boolean handleSpecificVariables(Map<String, Object> variables) {
  boolean needReload = false;

  if (isUsePresentations() && presentations != null) {
    Presentations p = getPresentations();

    if (p.getCurrent() != null && p.isAutoSave(p.getCurrent())
        && needUpdatePresentation(variables)) {
      Element e = p.getSettings(p.getCurrent());
      saveSettings(e);
      p.setSettings(p.getCurrent(), e);
    }
  }
  return needReload;
}

The function returns the needReload variable whose value is always false. Some code for changing that value is probably missing from one of the conditions.

Warning 4

V6062 Possible infinite recursion inside the ‘isFocused’ method. GwtAceEditor.java(189), GwtAceEditor.java(190)

public final native void focus() /*-{
  this.focus();
}-*/;

public final boolean isFocused() {
  return this.isFocused();
}

The analyzer has detected a recursive function with no stop condition. This file contains a lot of functions marked with the keyword native and containing commented-out code. The developers are probably rewriting this file now and will soon notice the isFocused function too.

Miscellaneous

Warning 1

V6002 The switch statement does not cover all values of the ‘Operation’ enum: ADD. DesktopAbstractTable.java(665)

/**
 * Operation which caused the datasource change.
 */
enum Operation {
    REFRESH,
    CLEAR,
    ADD,
    REMOVE,
    UPDATE
}

@Override
public void setDatasource(final CollectionDatasource datasource) {
  ....
  collectionChangeListener = e -> {
    switch (e.getOperation()) {
      case CLEAR:
      case REFRESH:
        fieldDatasources.clear();
        break;

      case UPDATE:
      case REMOVE:
        for (Object entity : e.getItems()) {
          fieldDatasources.remove(entity);
        }
        break;
    }
  };
  ....
}

The switch statement has no case for the value ADD. It’s the only value that’s not being checked, so the developers should take a look at this code.

Warning 2

V6021 Variable ‘source’ is not used. DefaultHorizontalLayoutDropHandler.java(177)

@Override
protected void handleHTML5Drop(DragAndDropEvent event) {
  LayoutBoundTransferable transferable = (LayoutBoundTransferable) event
          .getTransferable();
  HorizontalLayoutTargetDetails details = (HorizontalLayoutTargetDetails) event
          .getTargetDetails();
  AbstractOrderedLayout layout = (AbstractOrderedLayout) details
          .getTarget();
  Component source = event.getTransferable().getSourceComponent(); // <=
  int idx = (details).getOverIndex();

  HorizontalDropLocation loc = (details).getDropLocation();
  if (loc == HorizontalDropLocation.CENTER
          || loc == HorizontalDropLocation.RIGHT) {
      idx++;
  }
  Component comp = resolveComponentFromHTML5Drop(event);
  if (idx >= 0) {
    layout.addComponent(comp, idx);
  } else {
    layout.addComponent(comp);
  }
  if (dropAlignment != null) {
    layout.setComponentAlignment(comp, dropAlignment);
  }
}

The variable source is declared but not used. Perhaps the authors forgot to add source to layout, just like it happened with another variable of this type, comp.

Other functions with unused variables:

  • V6021 Variable ‘source’ is not used. DefaultHorizontalLayoutDropHandler.java(175)
  • V6021 The value is assigned to the ‘r’ variable but is not used. ExcelExporter.java(262)
  • V6021 Variable ‘over’ is not used. DefaultCssLayoutDropHandler.java(49)
  • V6021 Variable ‘transferable’ is not used. DefaultHorizontalLayoutDropHandler.java(171)
  • V6021 Variable ‘transferable’ is not used. DefaultHorizontalLayoutDropHandler.java(169)
  • V6021 Variable ‘beanLocator’ is not used. ScreenEventMixin.java(28)

Warning 3

V6054 Classes should not be compared by their name. MessageTools.java(283)

public boolean hasPropertyCaption(MetaProperty property) {
  Class<?> declaringClass = property.getDeclaringClass();
  if (declaringClass == null)
    return false;

  String caption = getPropertyCaption(property);
  int i = caption.indexOf('.');
  if (i > 0 && declaringClass.getSimpleName().equals(caption.substring(0, i)))
    return false;
  else
    return true;
}

The analyzer has detected a class comparison by name. It’s incorrect to compare classes by name as, according to the specification, the names of JVM classes must be unique only within a package. Such a comparison yields incorrect results and leads to executing the wrong code.

Comment by CUBA Platform developers

Any large project surely has bugs in it. Knowing that, we gladly agreed when the PVS-Studio team offered to check our project. The CUBA repository contains forks of some of the third-party OSS libraries licensed under Apache 2, and it looks like we should pay more attention to that code as the analyzer found quite a number of problems in those sources. We currently use SpotBugs as our primary analyzer, and it fails to notice some of the big bugs reported by PVS-Studio. It seems we should write some additional diagnostics ourselves. Many thanks to the PVS-Studio team for the job.

The developers also told us that the warnings V6013 and V6054 were false positives; it was their conscious decision to write that code the way they did. The analyzer is designed for detecting suspicious code fragments, and the probability of finding genuine bugs varies across different diagnostics. Such warnings, however, can be easily handled using the special mass warning suppression mechanism without having to modify the source files.

Also, the PVS-Studio team cannot take no notice of the phrase «it seems we should write some additional diagnostics ourselves» and do without this picture :)

Picture 3

Conclusion

PVS-Studio can be a perfect complement to existing quality-control tools used in your development process. It’s especially true for companies with dozens, hundreds, or thousands of developers. PVS-Studio is designed not only to detect bugs but also to help you fix them, and what I mean by that is not automatic code editing but reliable means of code quality control. In a large company, it’s impossible for every developer to check their respective parts of the code with different tools, so a better solution for such companies would be to adopt tools like PVS-Studio, which provide code quality control at every development stage, not only on the programmer side.

Sviatoslav Razmyslov

  • О проекте и анализаторе
  • Ошибки в условиях
  • Избыточные условия
  • Недостижимый код в тестах
  • Подозрительные аргументы функций
  • Разные функции с одинаковым кодом
  • Обращение по нулевой ссылке
  • Возможно, логическая ошибка
  • Странные возвращаемые значения функций
  • Разные предупреждения
  • Отзыв разработчиков CUBA Platform
  • Заключение

Для Java программистов существуют полезные инструменты, помогающие писать качественный код, например, мощная среда разработки IntelliJ IDEA, бесплатные анализаторы SpotBugs, PMD и другие. Всё это уже используется в разработке проекта CUBA Platform, и в этом обзоре найденных дефектов кода я расскажу, как ещё можно улучшить качество проекта, используя статический анализатор кода PVS-Studio.

0626_CubaPlatform_ru/image1.png

О проекте и анализаторе

CUBA Platform — это высокоуровневый Java-фреймворк для быстрого создания корпоративных приложений с полноценным веб-интерфейсом. Платформа абстрагирует разработчика от разнородных технологий, чтобы вы могли сфокусироваться на решении задач бизнеса, в то же время, не лишая возможности работать с ними напрямую. Исходный код взят из репозитория на GitHub.

PVS-Studio — это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках C, C++, C# и Java. Работает в 64-битных системах на Windows, Linux и macOS. Для удобства Java-программистов мы разработали плагины для Maven, Gradle и IntelliJ IDEA. Проект CUBA Platform легко проверился с помощью плагина для Gradle.

Ошибки в условиях

Предупреждение 1

V6007 Expression ‘StringUtils.isNotEmpty(«handleTabKey»)’ is always true. SourceCodeEditorLoader.java(60)

@Override
public void loadComponent() {
  ....
  String handleTabKey = element.attributeValue("handleTabKey");
  if (StringUtils.isNotEmpty("handleTabKey")) {
    resultComponent.setHandleTabKey(Boolean.parseBoolean(handleTabKey));
  }
  ....
}

После извлечения значения атрибута из некого элемента не выполняется проверка этого значения. Вместо этого в функцию isNotEmpty передаётся константная строка, а надо было передать переменную handleTabKey.

Есть ещё одна аналогичная ошибка в файле AbstractTableLoader.java:

  • V6007 Expression ‘StringUtils.isNotEmpty(«editable»)’ is always true. AbstractTableLoader.java(596)

Предупреждение 2

V6007 Expression ‘previousMenuItemFlatIndex >= 0’ is always true. CubaSideMenuWidget.java(328)

protected MenuItemWidget findNextMenuItem(MenuItemWidget currentItem) {
  List<MenuTreeNode> menuTree = buildVisibleTree(this);
  List<MenuItemWidget> menuItemWidgets = menuTreeToList(menuTree);

  int menuItemFlatIndex = menuItemWidgets.indexOf(currentItem);
  int previousMenuItemFlatIndex = menuItemFlatIndex + 1;
  if (previousMenuItemFlatIndex >= 0) {
      return menuItemWidgets.get(previousMenuItemFlatIndex);
  }
  return null;
}

Функция indexOf может вернуть значение -1, если в списке не будет найден элемент. Затем к индексу прибавляется единица, скрывая таким образом ситуацию, когда нужный элемент отсутствует. Другой потенциальной проблемой может стать тот факт, что переменная previousMenuItemFlatIndex будет всегда больше или равна нулю. Если, например, список menuItemWidgets будет пустым, то становится возможным выход за границу массива.

Предупреждение 3

V6009 The ‘delete’ function could receive the ‘-1’ value while non-negative value is expected. Inspect argument: 1. AbstractCollectionDatasource.java(556)

protected DataLoadContextQuery createDataQuery(....) {
  ....
  StringBuilder orderBy = new StringBuilder();
  ....
  if (orderBy.length() > 0) {
      orderBy.delete(orderBy.length() - 2, orderBy.length());
      orderBy.insert(0, " order by ");
  }
  ....
}

В буфере символов orderBy удаляют последние 2 символа, если их общее количество больше нуля, т.е. строка содержит один символ или больше. Но стартовую позицию удаления символов задали со смещением на 2 символа. Таким образом, если вдруг orderBy будет состоять из 1 символа, попытка удаления приведёт к исключению StringIndexOutOfBoundsException.

Предупреждение 4

V6013 Objects ‘masterCollection’ and ‘entities’ are compared by reference. Possibly an equality comparison was intended. CollectionPropertyContainerImpl.java(81)

@Override
public void setItems(@Nullable Collection<E> entities) {
  super.setItems(entities);
  Entity masterItem = master.getItemOrNull();
  if (masterItem != null) {
    MetaProperty masterProperty = getMasterProperty();
    Collection masterCollection = masterItem.getValue(masterProperty.getName());
    if (masterCollection != entities) {
      updateMasterCollection(masterProperty, masterCollection, entities);
    }
  }
}

В функции updateMasterCollection значения из entities копируются в masterCollection. Перед этим коллекции сравнили по ссылке, но, возможно, их планировали сравнивать по значению.

Предупреждение 5

V6013 Objects ‘value’ and ‘oldValue’ are compared by reference. Possibly an equality comparison was intended. WebOptionsList.java(278)

protected boolean isCollectionValuesChanged(Collection<I> value,
                                            Collection<I> oldValue) {
  return value != oldValue;
}

Этот пример похож на предыдущий. Здесь isCollectionValuesChanged предназначена для сравнения коллекций. Возможно, сравнение по ссылке тоже не тот способ, который ожидался.

Избыточные условия

Предупреждение 1

V6007 Expression ‘mask.charAt(i + offset) != placeHolder’ is always true. DatePickerDocument.java(238)

private String calculateFormattedString(int offset, String text) .... {
  ....
  if ((mask.charAt(i + offset) == placeHolder)) {         // <=
    ....
  } else if ((mask.charAt(i + offset) != placeHolder) &&  // <=
             (Character.isDigit(text.charAt(i)))) {
    ....
  }
  ....
}

Во втором сравнении проверяется выражение, которое противоположно первому. Вторую проверку можно удалить, что упростит код.

V6007 Expression ‘connector == null’ is always false. HTML5Support.java(169)

private boolean validate(NativeEvent event) {
  ....
  while (connector == null) {
    widget = widget.getParent();
    connector = Util.findConnectorFor(widget);
  }

  if (this.connector == connector) {
      return true;
  } else if (connector == null) {             // <=
      return false;
  } else if (connector.getWidget() instanceof VDDHasDropHandler) {
      return false;
  }
  return true;
}

После завершения цикла while, значение переменной connector не будет равняться null, следовательно, избыточную проверку можно удалить.

Ещё одно подозрительное место, на которое стоит обратить внимание разработчикам:

  • V6007 Expression ‘StringUtils.isBlank(strValue)’ is always true. Param.java(818)

Недостижимый код в тестах

V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(283)

private void throwException() {
  throw new RuntimeException(TEST_EXCEPTION_MSG);
}

@Test
public void testSuspendRollback() {
  Transaction tx = cont.persistence().createTransaction();
  try {
    ....
    Transaction tx1 = cont.persistence().createTransaction();
    try {
      EntityManager em1 = cont.persistence().getEntityManager();
      assertTrue(em != em1);
      Server server1 = em1.find(Server.class, server.getId());
      assertNull(server1);
      throwException();        // <=
      tx1.commit();            // <=
    } catch (Exception e) {
      //
    } finally {
      tx1.end();
    }

    tx.commit();
  } finally {
    tx.end();
  }
}

Функция throwException бросает исключение, из-за которого не выполняется вызов функции tx1.commit. Возможно, эти строки стоит поменять местами.

Ещё несколько похожих мест в других тестах:

  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(218)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(163)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(203)
  • V6019 Unreachable code detected. It is possible that an error is present. TransactionTest.java(137)
  • V6019 Unreachable code detected. It is possible that an error is present. UpdateDetachedTest.java(153)
  • V6019 Unreachable code detected. It is possible that an error is present. EclipseLinkDetachedTest.java(132)
  • V6019 Unreachable code detected. It is possible that an error is present. PersistenceTest.java(223)

Подозрительные аргументы функций

Предупреждение 1

V6023 Parameter ‘salt’ is always rewritten in method body before being used. BCryptEncryptionModule.java(47)

@Override
public String getHash(String content, String salt) {
  salt = BCrypt.gensalt();
  return BCrypt.hashpw(content, salt);
}

В криптографии salt — строка данных, которая передаётся хеш-функции вместе с паролем. Главным образом используется для защиты от перебора по словарю и атак с использованием радужных таблиц, а также сокрытия одинаковых паролей. Подробнее: Соль (криптография).

В этой функции строка перетирается сразу при входе в функцию. Возможно, игнорирование переданного значения является потенциальной уязвимостью.

Предупреждение 2

Для рассматриваемой функции анализатор выдаёт сразу два предупреждения:

  • V6023 Parameter ‘offsetWidth’ is always rewritten in method body before being used. CubaSuggestionFieldWidget.java(433)
  • V6023 Parameter ‘offsetHeight’ is always rewritten in method body before being used. CubaSuggestionFieldWidget.java(433)
@Override
public void setPosition(int offsetWidth, int offsetHeight) {
  offsetHeight = getOffsetHeight();
  ....
  if (offsetHeight + getPopupTop() > ....)) {
    ....
  }
  ....
  offsetWidth = containerFirstChild.getOffsetWidth();
  if (offsetWidth + getPopupLeft() > ....)) {
      ....
  } else {
      left = getPopupLeft();
  }
  setPopupPosition(left, top);
}

Занятный код. Функция принимает всего две переменных: offsetWidth и offsetHeight, обе перезаписываются перед использованием.

Предупреждение 3

V6022 Parameter ‘shortcut’ is not used inside constructor body. DeclarativeTrackingAction.java(47)

public DeclarativeTrackingAction(String id, String caption, String description,
                                 String icon, String enable, String visible,
                                 String methodName, @Nullable String shortcut,
                                 ActionsHolder holder) {
  super(id);
  this.caption = caption;
  this.description = description;
  this.icon = icon;

  setEnabled(enable == null || Boolean.parseBoolean(enable));
  setVisible(visible == null || Boolean.parseBoolean(visible));

  this.methodName = methodName;
  checkActionsHolder(holder);
}

Значение параметра shortcut не используется в функции. Возможно, интерфейс функции устарел или это предупреждение не является ошибкой.

Ещё несколько подобных мест:

  • V6022 Parameter ‘type’ is not used inside constructor body. QueryNode.java(36)
  • V6022 Parameter ‘text2’ is not used inside constructor body. MarkerAddition.java(22)
  • V6022 Parameter ‘selection’ is not used inside constructor body. AceEditor.java(114)
  • V6022 Parameter ‘options’ is not used inside constructor body. EntitySerialization.java(379)

Разные функции с одинаковым кодом

Предупреждение 1

V6032 It is odd that the body of method ‘firstItemId’ is fully equivalent to the body of another method ‘lastItemId’. ContainerTableItems.java(213), ContainerTableItems.java(219)

@Override
public Object firstItemId() {
  List<E> items = container.getItems();
  return items.isEmpty() ? null : items.get(0).getId();
}

@Override
public Object lastItemId() {
  List<E> items = container.getItems();
  return items.isEmpty() ? null : items.get(0).getId();
}

Функции firstItemId и lastItemId имеют одинаковую реализацию. Скорее всего, в последней необходимо было получать элемент не с индексом 0, а вычислять индекс последнего элемента.

Предупреждение 2

V6032 It is odd that the body of method is fully equivalent to the body of another method. SearchComboBoxPainter.java(495), SearchComboBoxPainter.java(501)

private void paintBackgroundDisabledAndEditable(Graphics2D g) {
  rect = decodeRect1();
  g.setPaint(color53);
  g.fill(rect);
}

private void paintBackgroundEnabledAndEditable(Graphics2D g) {
  rect = decodeRect1();
  g.setPaint(color53);
  g.fill(rect);
}

Ещё две функции с подозрительно одинаковой реализацией. Рискну предположить, что в одной из них нужно было использовать другой цвет, отличный от color53.

Обращение по нулевой ссылке

Предупреждение 1

V6060 The ‘descriptionPopup’ reference was utilized before it was verified against null. SuggestPopup.java(252), SuggestPopup.java(251)

protected void updateDescriptionPopupPosition() {
  int x = getAbsoluteLeft() + WIDTH;
  int y = getAbsoluteTop();
  descriptionPopup.setPopupPosition(x, y);
  if (descriptionPopup!=null) {
    descriptionPopup.setPopupPosition(x, y);
  }
}

Всего в двух строчках автору удалось написать очень подозрительный код. Сначала у объекта descriptionPopup вызывается метод setPopupPosition, а потом объект сравнивается с null. Скорее всего, первый вызов функции setPopupPosition является лишним и опасным. Похоже на последствия неудачного рефакторинга.

Предупреждения 2

V6060 The ‘tableModel’ reference was utilized before it was verified against null. DesktopAbstractTable.java(1580), DesktopAbstractTable.java(1564)

protected Column addRuntimeGeneratedColumn(String columnId) {
  // store old cell editors / renderers
  TableCellEditor[] cellEditors =
    new TableCellEditor[tableModel.getColumnCount() + 1];         // <=
  TableCellRenderer[] cellRenderers =
    new TableCellRenderer[tableModel.getColumnCount() + 1];       // <=

  for (int i = 0; i < tableModel.getColumnCount(); i++) {         // <=
      Column tableModelColumn = tableModel.getColumn(i);

      if (tableModel.isGeneratedColumn(tableModelColumn)) {       // <=
          TableColumn tableColumn = getColumn(tableModelColumn);
          cellEditors[i] = tableColumn.getCellEditor();
          cellRenderers[i] = tableColumn.getCellRenderer();
      }
  }

  Column col = new Column(columnId, columnId);
  col.setEditable(false);

  columns.put(col.getId(), col);

  if (tableModel != null) {                                       // <=
      tableModel.addColumn(col);
  }
  ....
}

Похожая ситуация и в этой функции. После многочисленных обращений к объекту tableModel выполняется проверка, равен он null или нет.

Ещё один пример:

  • V6060 The ‘tableModel’ reference was utilized before it was verified against null. DesktopAbstractTable.java(596), DesktopAbstractTable.java(579)

Возможно, логическая ошибка

V6026 This value is already assigned to the ‘sortAscending’ variable. CubaScrollTableWidget.java(488)

@Override
protected void sortColumn() {
  ....
  if (sortAscending) {
    if (sortClickCounter < 2) {
      // special case for initial revert sorting instead of reset sort order
      if (sortClickCounter == 0) {
        client.updateVariable(paintableId, "sortascending", false, false);
      } else {
        reloadDataFromServer = false;
        sortClickCounter = 0;
        sortColumn = null;
        sortAscending = true;   // <=

        client.updateVariable(paintableId, "resetsortorder", "", true);
      }
    } else {
      client.updateVariable(paintableId, "sortascending", false, false);
    }
  } else {
    if (sortClickCounter < 2) {
      // special case for initial revert sorting instead of reset sort order
      if (sortClickCounter == 0) {
        client.updateVariable(paintableId, "sortascending", true, false);
      } else {
        reloadDataFromServer = false;
        sortClickCounter = 0;
        sortColumn = null;
        sortAscending = true;

        client.updateVariable(paintableId, "resetsortorder", "", true);
      }
    } else {
      reloadDataFromServer = false;
      sortClickCounter = 0;
      sortColumn = null;
      sortAscending = true;

      client.updateVariable(paintableId, "resetsortorder", "", true);
    }
  }
  ....
}

В первом условии переменная sortAscending и так равна true, но ей всё равно присваивают то же самое значение. Возможно, это является ошибкой и хотели присвоить false.

Похожий пример из другого файла:

  • V6026 This value is already assigned to the ‘sortAscending’ variable. CubaTreeTableWidget.java(444)

Странные возвращаемые значения функций

Предупреждение 1

V6037 An unconditional ‘return’ within a loop. QueryCacheManager.java(128)

public <T> T getSingleResultFromCache(QueryKey queryKey, List<View> views) {
  ....
  for (Object id : queryResult.getResult()) {
    return (T) em.find(metaClass.getJavaClass(), id, views.toArray(....));
  }
  ....
}

Анализатор обнаружил безусловный вызов оператора return на первой же итерации цикла for. Возможно, тут ошибка, или нужно переписать код на использование оператора if.

Предупреждение 2

V6014 It’s odd that this method always returns one and the same value. DefaultExceptionHandler.java(40)

@Override
public boolean handle(ErrorEvent event, App app) {
  Throwable t = event.getThrowable();
  if (t instanceof SocketException
      || ExceptionUtils.getRootCause(t) instanceof SocketException) {
    return true;
  }
  if (ExceptionUtils.getThrowableList(t).stream()
      .anyMatch(o -> o.getClass().getName().equals("...."))) {
    return true;
  }
  if (StringUtils.contains(ExceptionUtils.getMessage(t), "....")) {
    return true;
  }
  AppUI ui = AppUI.getCurrent();
  if (ui == null) {
    return true;
  }
  if (t != null) {
    if (app.getConnection().getSession() != null) {
      showDialog(app, t);
    } else {
      showNotification(app, t);
    }
  }
  return true;
}

Эта функция во всех случаях возвращает значение true. Но вот в самой последней строчке напрашивается возврат значения false. Возможно, тут допущена ошибка.

Весь список подозрительных функций с похожим кодом:

  • V6014 It’s odd that this method always returns one and the same value. ErrorNodesFinder.java(31)
  • V6014 It’s odd that this method always returns one and the same value. FileDownloadController.java(69)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(73)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(48)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(67)
  • V6014 It’s odd that this method always returns one and the same value. IdVarSelector.java(46)
  • V6014 It’s odd that this method always returns one and the same value. JoinVariableNode.java(57)

Предупреждение 3

V6007 Expression ‘needReload’ is always false. WebAbstractTable.java(2702)

protected boolean handleSpecificVariables(Map<String, Object> variables) {
  boolean needReload = false;

  if (isUsePresentations() && presentations != null) {
    Presentations p = getPresentations();

    if (p.getCurrent() != null && p.isAutoSave(p.getCurrent())
        && needUpdatePresentation(variables)) {
      Element e = p.getSettings(p.getCurrent());
      saveSettings(e);
      p.setSettings(p.getCurrent(), e);
    }
  }
  return needReload;
}

Функция возвращает переменную needReload, значение которой всегда равно false. Скорее всего, в одном из условий забыли добавить код изменения значения переменной.

Предупреждение 4

V6062 Possible infinite recursion inside the ‘isFocused’ method. GwtAceEditor.java(189), GwtAceEditor.java(190)

public final native void focus() /*-{
  this.focus();
}-*/;

public final boolean isFocused() {
  return this.isFocused();
}

Анализатор обнаружил функцию, которая вызывается рекурсивно без условия остановки рекурсии. В этом файле много функций, которые помечены ключевым словом native и содержат закомментированный код. Скорее всего, файл в данный момент переписывается и вскоре разработчики обратят внимание и на функцию isFocused.

Разные предупреждения

Предупреждение 1

V6002 The switch statement does not cover all values of the ‘Operation’ enum: ADD. DesktopAbstractTable.java(665)

/**
 * Operation which caused the datasource change.
 */
enum Operation {
    REFRESH,
    CLEAR,
    ADD,
    REMOVE,
    UPDATE
}

@Override
public void setDatasource(final CollectionDatasource datasource) {
  ....
  collectionChangeListener = e -> {
    switch (e.getOperation()) {
      case CLEAR:
      case REFRESH:
        fieldDatasources.clear();
        break;

      case UPDATE:
      case REMOVE:
        for (Object entity : e.getItems()) {
          fieldDatasources.remove(entity);
        }
        break;
    }
  };
  ....
}

В операторе switch не рассмотрено значение ADD. Оно является единственным нерассмотренным, поэтому стоит проверить, ошибка это или нет.

Предупреждение 2

V6021 Variable ‘source’ is not used. DefaultHorizontalLayoutDropHandler.java(177)

@Override
protected void handleHTML5Drop(DragAndDropEvent event) {
  LayoutBoundTransferable transferable = (LayoutBoundTransferable) event
          .getTransferable();
  HorizontalLayoutTargetDetails details = (HorizontalLayoutTargetDetails) event
          .getTargetDetails();
  AbstractOrderedLayout layout = (AbstractOrderedLayout) details
          .getTarget();
  Component source = event.getTransferable().getSourceComponent(); // <=
  int idx = (details).getOverIndex();

  HorizontalDropLocation loc = (details).getDropLocation();
  if (loc == HorizontalDropLocation.CENTER
          || loc == HorizontalDropLocation.RIGHT) {
      idx++;
  }
  Component comp = resolveComponentFromHTML5Drop(event);
  if (idx >= 0) {
    layout.addComponent(comp, idx);
  } else {
    layout.addComponent(comp);
  }
  if (dropAlignment != null) {
    layout.setComponentAlignment(comp, dropAlignment);
  }
}

В коде объявляется и не используется переменная source. Возможно, как и другую переменную comp этого же типа, source забыли добавить в layout.

Ещё функции с неиспользуемыми переменными:

  • V6021 Variable ‘source’ is not used. DefaultHorizontalLayoutDropHandler.java(175)
  • V6021 The value is assigned to the ‘r’ variable but is not used. ExcelExporter.java(262)
  • V6021 Variable ‘over’ is not used. DefaultCssLayoutDropHandler.java(49)
  • V6021 Variable ‘transferable’ is not used. DefaultHorizontalLayoutDropHandler.java(171)
  • V6021 Variable ‘transferable’ is not used. DefaultHorizontalLayoutDropHandler.java(169)
  • V6021 Variable ‘beanLocator’ is not used. ScreenEventMixin.java(28)

Предупреждение 3

V6054 Classes should not be compared by their name. MessageTools.java(283)

public boolean hasPropertyCaption(MetaProperty property) {
  Class<?> declaringClass = property.getDeclaringClass();
  if (declaringClass == null)
    return false;

  String caption = getPropertyCaption(property);
  int i = caption.indexOf('.');
  if (i > 0 && declaringClass.getSimpleName().equals(caption.substring(0, i)))
    return false;
  else
    return true;
}

Анализатор обнаружил ситуацию, когда сравнение классов осуществляется по имени. Такое сравнение является некорректным, т.к., согласно спецификации, JVM классы имеют уникальное имя только внутри пакета. Это может стать причиной некорректного сравнения и выполнения не того кода, который планировался.

Безусловно, в любом крупном проекте бывают баги. Именно поэтому мы с радостью согласились на предложение команды PVS-Studio проверить наш проект. В репозиторий CUBA включены форки некоторых сторонних OSS библиотек под лицензией Apache 2 и, кажется, нам нужно уделить этому коду больше внимания, анализатор нашёл довольно много проблем в этих исходниках. Сейчас мы используем SpotBugs в качестве основного анализатора, и он не находит некоторые существенные проблемы, найденные PVS-Studio. Самое время пойти и написать дополнительные проверки самим. Большое спасибо команде PVS-Studio за проделанную работу.

Также разработчики отметили, что предупреждения V6013 и V6054 являются ложными. Код был написан таким намеренно. Статический анализатор предназначен для выявления подозрительных фрагментов кода и вероятность нахождения ошибки у всех инспекций разная. Тем не менее, работать с такими предупреждениями легко, используя удобный механизм массового подавления предупреждений анализатора без модификации файлов исходного кода.

Ещё команда PVS-Studio не может пройти мимо фразы «самое время пойти и написать дополнительные проверки самим» и не оставить эту картинку :)

0626_CubaPlatform_ru/image2.png

Заключение

PVS-Studio будет отличным дополнением для вашего проекта к уже существующим инструментам улучшения качества кода. Особенно, если в штате десятки, сотни и тысячи сотрудников. PVS-Studio предназначен не только для нахождения ошибок, но и для их исправления. Причём речь не об автоматическом редактировании кода, а о надёжном контроле качества кода. В большой компании невозможно представить ситуацию, когда абсолютно все разработчики будут самостоятельно проверять свой код различными инструментами, поэтому таким компаниям больше подходят инструменты типа PVS-Studio, где предусмотрен контроль качества кода на всех этапах разработки, не только у рядового программиста.

Присылаем лучшие статьи раз в месяц

cuba-platform / restapi
Goto Github
PK

View Code? Open in Web Editor
NEW

8.0
7.0
6.0
932 KB

CUBA REST API Add-on

License: Apache License 2.0

Java 92.94%
Shell 0.02%
Groovy 6.68%
HTML 0.36%
cuba-platform
cuba-component
rest-api
rest

restapi’s Introduction

restapi’s People

restapi’s Issues

Introduce a synchronous mode for storing REST API tokens in cluster

Description

When a new REST API token is stored, it is distributed among all nodes of the cluster. Right now, it is done asynchronously. This may cause the problem: in the cluster under a high load the token may be obtained, passed to another node, but the token was not replicated to the second node yet. Probably we should introduce a synchronous way of doing this (like is done for user sessions cuba.syncNewUserSessionReplication).

In addition to using clusterManagerAPI.send(new TokenStoreAddAccessTokenMsg(.... we may optionally use the clusterManagerAPI.sendSync(new TokenStoreAddAccessTokenMsg( in the ServerTokenStoreImpl.

There may be an application property cuba.syncTokenReplication. The default value is false. In the ServerTokenStoreImpl all invocations of clusterManagerAPI.send must be replaced with sendAsync if the app property is set to true. See UserSessions.add(UserSession session) method as an example.

Updates

The config cuba.rest.syncTokenReplication is added, the default value is false.
If true, tokens will be sent to the cluster in a synchronous way.

Ability to set max results and offset for predefined rest queries

REST API: token revocation request with the wrong content type should returns the 400 Bad Request with the description

app/rest/v2/oauth/revoke request with the wrong content type returns the Internal Server Error with 500 code
The following exception appears in tomcat.log

org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'token' is not present
        at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:195) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:104) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) [servlet-api.jar:na]
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:na]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) [catalina.jar:8.5.9]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [catalina.jar:8.5.9]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.9]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [catalina.jar:8.5.9]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [catalina.jar:8.5.9]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]
        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) [spring-security-web-4.1.3.RELEASE.jar:4.1.3.RELEASE]```

---
Original issue: https://youtrack.haulmont.com/issue/PL-9936

Support batch entity commit

Description

Provide an ability to commit several entities (of the same type) with a single request

Updates

Added the ability to create multiple entities, one request.

Example:

POST : http://localhost:8080/app/rest/v2/entities/sec$Group

Request body:

[
	{
		"name":"Group1"		
	},
	{
		"name":"Group2"		
	},
	{
		"name":"Group3"
	}
]

Swagger scheme contains errors

A topic on support forum: link

REST API does not support entities with composite primary key

Since id of such entities is passed as object it’s not possible to call some methods where id is used in path fragment

DELETE /entities/{entityName}/{entityId}
GET /entities/{entityName}/{entityId}
PUT /entities/{entityName}/{entityId}

Solution:
Represent composite key identifier as JSON string and apply base64 URL encoding.

Model:

@Entity(name = "ref$CompositeKeyEntity")
@Table(name = "REF_COMPOSITE_KEY")
public class CompositeKeyEntity extends BaseGenericIdEntity<EntityKey> {

    private static final long serialVersionUID = -2538345720324624741L;

    @EmbeddedId
    private EntityKey id;

    @Column(name = "NAME")
    private String name;  
}

@Embeddable
@MetaClass(name = "ref$EntityKey")
public class EntityKey extends EmbeddableEntity {

    @Column(name = "TENANT")
    private Integer tenant;

    @Column(name = "ENTITY_ID")
    private Long entityId;
}

Encoding sample:

  • JSON: {tenant : 1, entityId: 1}
  • Base 64: e3RlbmFudCA6IDEsIGVudGl0eUlkOiAxfQ==
  • GET /entities/ref$CompositeKeyEntity/e3RlbmFudCA6IDEsIGVudGl0eUlkOiAxfQ==

Original issue: https://youtrack.haulmont.com/issue/PL-9444

Introduce isNull entity search condition

Description

Introduce isNull entity search condition for Rest API Add-on.

Updates

Created a platform-independent enum RestFilterOp for the Rest API Add-on and added a new condition isNull.

Example:

  "filter": {
    "conditions": [
      {
        "property": "name",
        "operator": "isNull"
      }
    ]
  }
}

There is no ability to restrict specific REST end-points

Impossible to handle REST API services exception

If the service method throws an exception, it is caught and new RestAPIException is thrown (ServicesControllerManager._invokeServiceMethod). That makes impossible to handle custom exception types.


Original issue: https://youtrack.haulmont.com/issue/PL-9864

Merge sql scripts

Fix a problem with the migration of projects.

  1. Refresh create scripts
  2. Remove update scripts

«responseView» method parameter for entity create and update operations

By default, entity create and update operation must return a result that contains just the following fields:

{
   "id": "<entityId>",
   "_entityName": "<entityName>",
   "_instanceName": "<intanceName>"
}

If other entity fields are required in the response, then an optional «responseView» query parameter must be passed in the request URL. In the case the creates/updated entity must be reloaded with this view and returned in the response JSON.

Updates

Breaking changes

Added optional parameter «responseView» for create/update request. Now, by default, only 3 parameters are passed in the response.

{
   "id": "<entityId>",
   "_entityName": "<entityName>",
   "_instanceName": "<intanceName>"
}

To disable this function, you must set the config cuba.rest.responseViewEnabled to false.

Error creating SingleWAR

Environment

  • Platform version: 7.1-SNAPSHOT

Description of the bug or enhancement

  1. Create singleWAR for restapi-addon
  2. Download singleWar to Tomcat
  3. Start a project

ER:
Successful start

AR:
INFO: Server initialization in [564] milliseconds ╨░╨┐╤А 18, 2019 11:23:54 AM org.apache.catalina.core.StandardService startInternal INFO: Starting service [Catalina] ╨░╨┐╤А 18, 2019 11:23:54 AM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet engine: [Apache Tomcat/9.0.14] ╨░╨┐╤А 18, 2019 11:23:55 AM org.apache.catalina.startup.HostConfig deployWAR INFO: Deploying web application archive [C:ProjectsAddonsrestapideploytomcatwebappsrestapi.war] 11:24:06.505 INFO c.h.cuba.core.sys.AppComponents - Using app components: [com.haulmont.cuba] 11:24:06.559 INFO c.h.c.c.s.AbstractWebAppContextLoader - Loading app properties from classpath:com/haulmont/addon/restapi/web-app.properties 11:24:06.567 INFO c.h.c.c.s.AbstractWebAppContextLoader - Loading app properties from /WEB-INF/local.app.properties 11:24:08.299 ERROR c.h.c.c.s.AbstractWebAppContextLoader - Error initializing application org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [com/haulmont/cuba/web-spring.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'cuba_DataManager' for bean class [com.haulmont.cuba.core.app.DataManagerBean] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.cuba.client.sys.DataManagerClientImpl] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:419) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:257) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:128) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:94) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:636) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:521) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:95) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at com.haulmont.cuba.core.sys.CubaClassPathXmlApplicationContext.<init>(CubaClassPathXmlApplicationContext.java:27) ~[cuba-global-7.1-SNAPSHOT.jar:7.1-SNAPSHOT] at com.haulmont.cuba.core.sys.AbstractAppContextLoader.createApplicationContext(AbstractAppContextLoader.java:90) ~[cuba-global-7.1-SNAPSHOT.jar:7.1-SNAPSHOT] at com.haulmont.cuba.core.sys.AbstractAppContextLoader.initAppContext(AbstractAppContextLoader.java:62) ~[cuba-global-7.1-SNAPSHOT.jar:7.1-SNAPSHOT] at com.haulmont.cuba.core.sys.AbstractWebAppContextLoader.contextInitialized(AbstractWebAppContextLoader.java:78) ~[cuba-global-7.1-SNAPSHOT.jar:7.1-SNAPSHOT] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4663) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5131) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.14] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:713) [catalina.jar:9.0.14] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) [catalina.jar:9.0.14] at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978) [catalina.jar:9.0.14] at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1850) [catalina.jar:9.0.14] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_181] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_181] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.14] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) [na:1.8.0_181] at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773) [catalina.jar:9.0.14] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427) [catalina.jar:9.0.14] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1577) [catalina.jar:9.0.14] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:424) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:367) [catalina.jar:9.0.14] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:934) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.14] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382) [catalina.jar:9.0.14] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372) [catalina.jar:9.0.14] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_181] at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:9.0.14] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_181] at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.14] at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933) [catalina.jar:9.0.14] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:9.0.14] at org.apache.catalina.startup.Catalina.start(Catalina.java:637) [catalina.jar:9.0.14] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350) [bootstrap.jar:9.0.14] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) [bootstrap.jar:9.0.14] Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'cuba_DataManager' for bean class [com.haulmont.cuba.core.app.DataManagerBean] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.cuba.client.sys.DataManagerClientImpl] at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:348) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:286) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:90) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1366) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1352) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:179) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:149) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:96) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:513) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:393) ~[spring-beans-5.1.6.RELEASE.jar:5.1.6.RELEASE] ... 58 common frames omitted ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.catalina.core.StandardContext startInternal SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.catalina.core.StandardContext startInternal SEVERE: Context [/restapi] startup failed due to previous errors ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.catalina.startup.HostConfig deployWAR INFO: Deployment of web application archive [C:ProjectsAddonsrestapideploytomcatwebappsrestapi.war] has finished in [13┬а331] ms ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-nio-8080"] ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-nio-8009"] ╨░╨┐╤А 18, 2019 11:24:08 AM org.apache.catalina.startup.Catalina start INFO: Server startup in [13┬а419] milliseconds

Support base64 encoded files in REST API file upload

Support anonymousAllowed for REST queries

See the topic on support forum https://www.cuba-platform.com/discuss/t/can-set-anonymousallowed-for-a-jpql-query/9804

Updates

In the queries configuration file for the REST API added boolean attribute anonymousAllowed.

<?xml version="1.0"?>
<queries xmlns="http://schemas.haulmont.com/cuba/rest-queries.xsd">
    <query name="allUsers" entity="sec$User" anonymousAllowed="true">
        <jpql><![CDATA[select u from sec$User u]]></jpql>
    </query>
</queries>

When anonymousAllowed = "true" the anonymous user can call this query.

WebSocket & PUSH support for REST-API controllers

Connect dependency through bom file

Update all dependencies in the gradle.build file using bom file.

Provide an easy way to customize date format for REST API

REST API: The ‘Accept-Language’ request header is ignored when middleware service is invoked

Environment

  • Platform version: 6.10.9

Description of the bug or enhancement

If the middleware service is invoked with the standard rest api and the Accept-Language header is set in the request, then it is expected that UserSession in the service implementation will have the corresponding locale. However, it doesn’t.

The problem is that REST API filter sets the locale from the Accept-Language header to the UserInvocationContext:

UserInvocationContext.setRequestScopeInfo(sessionId, locale, null, null, null);

When the middleware service is invoked after that, this value is not used.

Forum: https://www.cuba-platform.ru/discuss/t/ignoriruetsya-accept-language-pri-poluchenii-access-tokena-s-pomoshhyu-refresh-tokena-cherez-rest-api/2926

Publish Addon Swagger

Support serialization for NULL values for REST services

RefreshToken and AccessToken entity classes are not enhanced

Environment

  • Platform version: 7.1
  • Addon version: 0.1-SNAPSHOT
  • Client type: Web

Description of the bug or enhancement

  • Minimal reproducible example

Run application on 7.1-SNAPSHOT with REST-API.

  • Actual behavior
2019-04-19 11:27:38.381 ERROR [main] com.haulmont.cuba.core.sys.persistence.EclipseLinkSessionEventListener - 
=================================================================
Problems with entity enhancement detected:
Entity class RefreshToken is missing some of enhancing interfaces: CubaEnhanced; PersistenceObject; PersistenceWeaved; PersistenceWeavedFetchGroups; PersistenceWeavedChangeTracking;
Entity class AccessToken is missing some of enhancing interfaces: CubaEnhanced; PersistenceObject; PersistenceWeaved; PersistenceWeavedFetchGroups; PersistenceWeavedChangeTracking;

Also, there is no entitiesEnhancing in build.gradle of the addon: https://github.com/cuba-platform/restapi/blob/master/build.gradle#L128

JSON in responses for entity create and update operations should not contain not-persistent meta-properties

JSON in responses for entity create and update operations should not contain not-persistent attributes. Requests for entity read should return not-persistent attributes.
This should be done because of the following case.
There are a Debtor and a Case entities. The Case entity has a not-persistent property that relates to debtor property:

@Table(name = "DEBT_CASE")
@Entity(name = "debt$Case")
public class Case extends StandardEntity {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "DEBTOR_ID")
    protected Debtor debtor;

    @MetaProperty(related = "debtor")
    public String getNonPersistentDebtorTitle() {
        return debtor == null ? null : debtor.getTitle();
    }
}

Suppose we create or update the Case. We accidentally passed the «nonPersistentDebtorTitle» in JSON as well. The JSON has a reference to the Debtor.

{
   "number": "CASE-001",
   "nonPersistentDebtorTitle": "someValue",
   "debtor": {
      "id": "60885987-1b61-4247-94c7-dff348347f93"
   }
}

In this case, after the entity is commited by the DataManager, it is serialized using the EntitySerializationAPI. By default, non-persistent meta-properties are also serialized, so a property value is read during the serialization. But since the «debtor.title» property is not read, an UnfetchedAttributeException is thrown.

IllegalArgumentException via REST API with Composition with back references and m-to-n relationship

Provide method to obtain entity search count

Description

Currently it’s possible to obtain search result count by using returnCount parameter. However there are some cases when only count is needed.

Updates

Added a new endpoint /entities/{entityName}/search/count for GET and POST methods.

Permission config is not registered in app-component.xml

It’s not possible to setup REST API permissions from Generic UI.

STR:

  • Open Role editor
  • Open Specific tab

AR:
REST API permissions are not present.

ER:
Use REST API permission should be available

REST API: Login is performed twice when a new access token is obtained

See: cuba-platform/cuba#2277

Environment

  • Platform version: 6.10.10

Description of the bug

  • Obtain a new REST API access token (http://localhost:8080/app/rest/v2/oauth/token)
  • In the log you’ll see that login was performed twice:
01:42:12.406 INFO  c.h.c.s.a.AuthenticationManagerBean     - Logged in: 24668c0b-ce4d-a14c-da21-27ff4adb7735 [admin]
01:42:16.460 INFO  c.h.c.s.a.AuthenticationManagerBean     - Logged in: 78e5c771-47cf-bc42-2e69-9a35d391ed28 [admin]
01:42:17.419 INFO  c.h.r.auth.ClientProxyTokenStore        - REST API access token stored: [9265540714] ***-9c786317e72d

The error is probably caused by the issue cuba-platform/cuba#2045

Forum topic: https://www.cuba-platform.com/discuss/t/custom-portal-rest-api-failure-after-platform-upgrade/9571

Custom REST controllers improvements

IDP Integration does not work

REST-API: not-permitted entities serialization on service invocation

STR:

  1. Disable read of some entity (i.e. sec$User)

  2. Provide a method which loads these entities and expose it in REST API

    @Override
    public List<User> getUsers() {
        LoadContext<User> lc = new LoadContext<>(User.class);
        lc.setQueryString("select u from sec$User u");
        return dataManager.loadList(lc);
    }
  1. Invocation of the method from REST API returns list of entities but all attributes are stripped:
[
  {
    "_entityName": "sec$User",
    "_instanceName": "[]",
    "id": "12000811-36f9-9055-42bb-d2546c46e32a"
  }, {
    "_entityName": "sec$User",
    "_instanceName": "[]",
    "id": "09f10596-832f-2873-0968-05892effd3e5"
  }
]

Consider: not to strip attributes or do not return entities at all


Original issue: https://youtrack.haulmont.com/issue/PL-9272

Entity JSON returned by the REST API should display fields of nested entities that are cyclic dependencies

For example:
Notice how one of the nested books holds title but the other, which is the same book as the parent of author, does not.

[ // books
  {
    "id": "123",
    "_entityName": "book",
    "title": "Book cuba-platform/cuba#123",
    "author": {
      "id": "234",
      "_entityName": "author",
      "name": "James Person",
      "books": [
        { // note that this does not include "title"
          "id": "123",
          "_entityName": "book"
        },
        { // but this does
          "id": "456",
          "_entityName": "book",
          "title": "Book cuba-platform/cuba#456"
        }
      ]
    }
  }
]

Original issue: https://youtrack.haulmont.com/issue/PL-10398

Publish XSD schemes

Cannot set null value to dynamic attribute with the REST API

Swagger documentation is not generated correctly for overloaded REST service methods#707

In case of some REST service has few methods with the same name but with different parameters (overloaded methods) we cannot generate correct Swagger documentation due to restrictions in the Swagger 2.0 Specification (OAI/OpenAPI-Specification#182).

Will be fixed when swagger-core will be released with 2.0.0 version.

REST API ignores attribute permissions for related entities

Environment

  • Platform version: 7.0.8
  • Client type: Web
  • Browser: Chrome, Firefox
  • Database: PostgreSQL
  • Operating system: Windows, Linux

Description of the bug or enhancement

  • Minimal reproducible example
  1. Create an entity «Fruit» with attributes «description» and «size»
  2. Create an entity «Person» with attribute «name» of type string and another attribute «favouriteFruit» of type «Fruit»
  3. Create a role using standard cuba framework screens, with «description» attribute of «Fruit» set to «hide»
  4. Create a user and assign above role
  5. Create a person using POST REST API
  6. Query fruit directly GET REST API
  • Expected behavior
    Both 5 and 6 only show «size» for the fruit entity

  • Actual behavior
    5 shows «description» as well, it should not due to permissions

When a new access token is obtained using the refresh token, an ‘Accept-Language’ header must be read

Create a FileDescriptor with the provided ID when a file is uploaded

Add ability to dynamically define view similarly to GraphQL for REST get requests

Currently, it is not possible to describe the graph of data to be fetched via rest API on the fly (using not predefined views on the server side). To make it possible developers could define them in the body of a get request, similarly to how it is achieved with GraphQL.

To prevent DDos, ability to use such functionality should be restrictable on the role level.


Original issue: https://youtrack.haulmont.com/issue/PL-9991

It’s impossible to disable file upload with the REST API

Missing _instanceName on entity create/update response

REST API queries should support params like in the datasource query filter

Support jMockit 1.46

Environment

  • Platform version: 7.2
  • Addon version: 7.2

Description of the bug or enhancement

In the platform updated jMockit.
It is necessary to add an argument to run the tests correctly.

test {
        jvmArgs "-javaagent:${classpath.find { it.name.contains("jmockit") }.absolutePath}"
}

Related: cuba-platform/cuba#2151

Ability to upload temporary file for processing in a service using REST-API

REST API: provide an option to include built-in views in method which returns entity views

Method for loading entity views does not return info about built-in views (_minimal, _base, _local). We can get built-in views separately using /metadata/entities/{entityName}/views/{viewName} but it will require many separate requests e.g. if you want to build correct deep graph for some complex view.
So it makes sense to introduce includeSystem flag which will return built-in views along with explicitly defined.

The release must have a version corresponding to the platform version

AR:
Platform 7.1.0 — Add-on 0.1-SNAPSHOT

ER:
For example:
Platform 7.1-SNAPSHOT — Add-on 7.1-SNAPSHOT
Platform 7.1.0 — Add-on 7.1.0 (or 7.1.1, 7.1.2, etc)
Platform 7.2.3 — Add-on 7.2.2

@Future and @Past validations have wrong invalidValue in the response body in the REST API

@sukhova commented on Thu Nov 01 2018

Environment

  • Platform version: 6.10, 7.0
  • Operating system: Windows

Description of the bug or enhancement

  1. Set the @past annotation for some date field
  2. Try to create new instance with invalid date using REST API
  3. See the response body:
    AR:
    {
        "message": "must be in the past",
        "messageTemplate": "{javax.validation.constraints.Past.message}",
        "path": "dateOfBirth",
        "invalidValue": 1572617541047
    }

ER
«invalidValue» param must have the Date type

Updates

Now «InvalidValue» returned in the format that depends on the locale and @Temporal.
https://doc.cuba-platform.com/manual-7.1/datatype_ui_format.html

Ability to sort entities by multiple attributes

Currently in entities load/search methods it’s possible to specify the only attribute for sorting.

REST-API anonymous access tests

When trying to update a read-only entity attribute an error should be returned

When we try to update a read-only attribute the 200 (OK) status is returned, although the attribute is not actually updated. Probably we should return an error in this case.


Original issue: https://youtrack.haulmont.com/issue/PL-9968

REST healthcheck endpoint does not respect CORS settings

Entity tokens are not created when rest-addon is connected

Sql-scripts restapi are not executed when restapi-addon is connected

Recommend Projects

  • React photo
    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo
    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo
    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo
    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo
    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo
    Laravel

    A PHP framework for web artisans

  • D3 photo
    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo
    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo
    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo
    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo
    Alibaba

    Alibaba Open Source for everyone

  • D3 photo
    D3

    Data-Driven Documents codes.

  • Tencent photo
    Tencent

    China tencent open source team.

CLI installation guide

In this video, we’ll get an overview of CUBA command line interface. In a nutshell, CUBA CLI is a command line utility that allows you to easily create projects based on CUBA Platform. Also, it provides the lightweight scaffolding of the main project artifacts: entities, screens, services, and so on. With this tool, you can use the framework without any additional tools.

I will show you how to create a simple application for customers and orders management using only a command line and a Java IDE.

Creating a project

Open a terminal and run the cuba-cli command to start CUBA CLI.

To create a new application, input the command create-app. You can use TAB auto-completion. CLI will ask you about the project. If a question implies the default answer, you can press ENTER to accept it. You will be asked the following questions:

  • Repository to be used in the project. The list of repositories already contains binary artifacts repository URL and authentication parameters. Feel free to choose any of them.

  • Project name – for sample projects, CLI generates random names that can be selected by default.

  • Project namespace – the namespace which will be used as a prefix for entity names and database tables. The namespace can consist of Latin letters only and should be as short as possible.

  • Root package – the root package of Java classes.

  • Platform version – the platform artifacts of the selected version will be automatically downloaded from the repository on project build.

  • Database – the SQL database to use. For the sample application, choose HSQLDB.

An empty project will be created in a new folder in the current directory.

Close CLI or open a new terminal window and navigate to the project folder.

Run gradlew assemble. At this stage, all the required libraries will be downloaded, and CLI will build project artifacts in the build subfolders of the project folder.

Run gradlew startDb to start the local HyperSQL server.

Run gradlew createDb to create the database instance.

Run gradlew setupTomcat deploy start. The Tomcat server with the application will be deployed in the deploy subfolder of the project.

Open the web browser and proceed to the default application URL (http://localhost:8080/app). The username and password are admin — admin, they are filled in by default.

The running out-of-the-box application contains two main menu items: Administration and Help, as well as the functionality for security and administration.

To stop the application, run gradlew stop.

CUBA plugin for IntelliJ IDEA

In order to develop business logic, you can use any Java IDE. To make it easier, I will use the free version of dedicated CUBA Studio IDE. It is based on the open-source IntelliJ IDEA Platform and extends its functionality with some CUBA-specific features: database scripts generation, navigation between screen descriptor, controller and data model components, advanced injections, CUBA-specific code generation and refactoring, and so on. Some part of these tasks can also be done in CLI.

Import the project into IDE as described in the documentation and wait for Gradle synchronization and project indexing process to complete. The CUBA project tree should appear in the Project tool window.

Creating the data model

Let’s create a data model and a graphic interface for our simple CUBA-based application for customers and orders management. In our data model, the Order entity should have a many-to-one relationship to Customer.

Let’s start with creating a Customer class. Enter create-entity in a terminal. You will be asked to enter the entity class name — Customer — and select the entity class package name. Accept default.

An entity may be Persistent, Persistent Embedded or Not Persistent. Choose Persistent to make the entity able to be saved in the database.

Let’s add some fields. Open the created class in Studio. It has appeared in the Data Model section of the project tree. Add the name and email fields, both of String type, and create getters and setters for them. CUBA platform supports localization in the same way as other Java applications: by using message.properties files. Let’s add messages for the new attributes. We will also set the name pattern to get a meaningful Customer instance representation in UI. CUBA CLI generates DB scripts stubs for the created entities. To add the custom fields, I will use the Generate Database Scripts command in the main menu. If the new script conflicts with or overlays the older one, the older one will be marked to be deleted. Of course, you can manage the database script files and add fields manually without Studio.

You can run the gradlew updateDb task either from Studio or command line interface.

Creating the UI

Now let’s create the user interface for the application. CUBA CLI can generate the standard CRUD screens using the predefined screen templates. For example, the browser is a screen for viewing all records from a database, it includes data filter and supports paging by default. The editor is a screen for viewing or editing an individual record.

Enter create-screen, select new browse screen_,_ select the Customerentity and accept the defaults. Create the Edit screen for the Customer entity in the same way.

The screens have been created in the web module package. They are now available in the Generic UI section of the project tree. Let’s customize them a little, adding name and email fields to the browse table and editor form. Use the Studio popups and intentions to speed up the process.

Enhancing the data model

Let’s create the Order entity. Feel free to use TAB auto-completion in CLI. Add the following attributes: date — the order date, amount — the order amount of BigDecimal type, and customer — the many-to-one reference to the Customer entity. Don’t forget to create getters and setters and define the messages.

Now let’s add two more entities: OrderLine and Product, so the Order will contain a set of order lines which refer to some product. Furthermore, we will implement the order amount calculation based on the quantity and price of the selected products.

So, we create the Product entity and define its attributes: name which is a String and price which is a BigDecimal. Select name as the Product’s name pattern.

Now let’s create the OrderLine entity. Add the following attributes: order which is a many-to-one reference to Order; product which is a many-to-one reference to Product; finally, the quantity attribute of BigDecimal type which sets the product quantity for a given order line.

Add the collection of lines for the order: create the lines attribute which is a Composition reference to the OrderLine entity. That means that the order lines are created and edited alongside the original order. The corresponding attribute on the reverse side of the relationship is defined with the mappedBy attribute.

The constraints for the database integrity will be created on the next scripts generation.

Enhancing the UI

Now. let’s scaffold the user interface for the new entities. At first, create the standard screens for Product.

After that, create the UI for OrderLine. The list of order lines should be displayed only in the Order editor, so we don’t need an OrderLine browser.

Since the OrderLine entity includes the reference attribute product, we have to create an entity view that includes this attribute. A view, in CUBA terms, is a declarative way to specify which data (attributes and nested instances/collections) should be extracted from a database.

Now we can display products in the OrderLine editor.

Let’s create the standard screens for the Order. The Order entity contains two reference attributes — customer and lines. Suppose we would like to display customers in the browse screen, and the complete graph of entities in the Order editor. In this case, we need two separate views.

Now we can add all the necessary fields to Order screens. To display the list of customers in the lookup field, create a new data container that will load the collection of customers from the database. Let’s also add the table for displaying the order lines.

We will also make the Customer editor display the list of orders. Open the customer-edit.xml file and create a new data container for loading the linked Order instances. Pass the edited Customer instance as a parameter for the container’s loader.

All the screens are done now. Start the application server and make sure they are functional.

Development beyond CRUD

We still have to implement the order amount calculations based on the product price and quantity. Switch to the Java controller of the Order editor. To begin with, let’s inject the link to the linesDc data container into the controller class. Now subscribe to the CollectionChangeEvent that will call the new calculateAmount() method every time the lines collection is changed.

The changes in the existing screens will be hot deployed, and we will see the changes simply by switching to the web browser and reopening the order editor, without stopping the application server.

As we can see, the order amount corresponds to the order lines, and if you modify them, the amount is recalculated.

Our application is done, at a first approximation. Feel free to develop it using any tools you like. Thank you for your attention.

Главная / Офисные технологии /
Управление проектами с использованием MS Project 2003 / Тест 3

Упражнение 1:


Номер 1

Какова загрузка ресурса "Тестировщик" при выполнении подзадачи "Тестирование на эмуляторе"? files

Ответ:

&nbsp(1) 0%&nbsp

&nbsp(2) 50%&nbsp

&nbsp(3) 100%&nbsp

&nbsp(4) загрузка для данной задачи неизвестна&nbsp


Номер 2

Какова загрузка ресурса "Разработчик" при выполнении подзадачи "Исправление ошибок"? files

Ответ:

&nbsp(1) 0%&nbsp

&nbsp(2) 50%&nbsp

&nbsp(3) 100%&nbsp

&nbsp(4) загрузка для данной задачи неизвестна&nbsp


Номер 3

При выполнении каких подзадач суммарной задачи "Тестирование" ресурсы имеют загрузку 100%? files

Ответ:

&nbsp(1) «Тестирование на эмуляторе»&nbsp

&nbsp(2) «Тестирование на реальном устройстве»&nbsp

&nbsp(3) «Исправление ошибок»&nbsp

&nbsp(4) «Повторное тестирование на реальном устройстве»&nbsp

&nbsp(5) ни для одной из указанных подзадач ни один ресурс не имеет загрузки 100%&nbsp


Упражнение 2:


Номер 1

Какой инструмент из панели представлений позволяет определить момент времени, в который возникает перегрузка для ресурса?

Ответ:

&nbsp(1) «Лист ресурсов»&nbsp

&nbsp(2) «График ресурсов»&nbsp

&nbsp(3) «Использование ресурсов»&nbsp


Номер 2

Какой инструмент из панели представлений позволяет определить возникновение перегрузки для ресурса?

Ответ:

&nbsp(1) «Лист ресурсов»&nbsp

&nbsp(2) «График ресурсов»&nbsp

&nbsp(3) «Использование ресурсов»&nbsp


Номер 3

Какой инструмент из панели представлений не позволяет определить момент времени, в который возникает перегрузка для ресурса?

Ответ:

&nbsp(1) «Лист ресурсов»&nbsp

&nbsp(2) «График ресурсов»&nbsp

&nbsp(3) «Использование ресурсов»&nbsp


Упражнение 3:


Номер 1

Как выглядит представление "Лист ресурсов"?

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Номер 2

Как выглядит представление "График ресурсов"?

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Номер 3

Как выглядит представление "Использование ресурсов"?

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Упражнение 4:


Номер 1

Какие утверждения являются верными? files

Ответ:

&nbsp(1) 10 апреля ресурс «Тестировщик» имеет перегрузку&nbsp

&nbsp(2) ресурс «Тестировщик» имеет перегрузку в течение 4 дней в заданный период&nbsp

&nbsp(3) ресурс «Тестировщик» работает сверхурочно в течение 4 дней в заданный период&nbsp


Номер 2

Какие утверждения являются неверными? files

Ответ:

&nbsp(1) 10 апреля ресурс «Тестировщик» имеет перегрузку&nbsp

&nbsp(2) ресурс «Тестировщик» имеет перегрузку в течение 4 дней в заданный период&nbsp

&nbsp(3) ресурс «Тестировщик» работает сверхурочно в течение 4 дней в заданный период&nbsp


Номер 3

Какую перегрузку имеет ресурс "Тестировщик" 10 апреля? files

Ответ:

&nbsp(1) 40%&nbsp

&nbsp(2) 60%&nbsp

&nbsp(3) ресурс не имеет перегрузки&nbsp


Упражнение 5:


Номер 1

Какую информацию содержит базовый план проекта?

Ответ:

&nbsp(1) информацию о задачах&nbsp

&nbsp(2) информацию о назначениях&nbsp

&nbsp(3) информацию о ресурсах&nbsp


Номер 2

Для чего используется базовый план?

Ответ:

&nbsp(1) для отслеживания хода выполнения проекта&nbsp

&nbsp(2) для сохранения шаблона проекта&nbsp

&nbsp(3) для сохранения итоговых результатов выполнения проекта&nbsp


Номер 3

Какое максимальное количество базовых планов можно сохранить для одного проекта?

Ответ:

&nbsp(1) 1&nbsp

&nbsp(2) 11&nbsp

&nbsp(3) зависит от проекта&nbsp


Упражнение 6:


Номер 1

Каковы запланированные трудозатраты на выполнение задачи "Тестирование на эмуляторе" 14 апреля? files

Ответ:

&nbsp(1) 8 часов&nbsp

&nbsp(2) 6 часов&nbsp

&nbsp(3) 4 часа&nbsp


Номер 2

Каковы фактические трудозатраты на выполнение задачи "Тестирование на эмуляторе" 14 апреля? files

Ответ:

&nbsp(1) 8 часов&nbsp

&nbsp(2) 6 часов&nbsp

&nbsp(3) 4 часа&nbsp


Номер 3

Каковы фактические трудозатраты на выполнение задачи "Тестирование на эмуляторе" 12 апреля? files

Ответ:

&nbsp(1) 4 часа&nbsp

&nbsp(2) 8 часов&nbsp

&nbsp(3) фактические трудозатраты не отображаются&nbsp


Упражнение 7:


Номер 1

Какая команда позволяет ввести фактическое выполнение задачи? files

Ответ:

&nbsp(1) Обновить задачи&nbsp

&nbsp(2) Обновить проект&nbsp

&nbsp(3) Синхронизировать с защищенными фактическими данными&nbsp


Номер 2

Какое представление позволяет задать фактическое выполнение задачи? files

Ответ:

&nbsp(1) Использование задач&nbsp

&nbsp(2) Календарь&nbsp

&nbsp(3) График ресурсов&nbsp


Номер 3

Как изменится длительность проекта при увеличении длительности выполнения задачи, не лежащей на критическом пути?

Ответ:

&nbsp(1) уменьшится&nbsp

&nbsp(2) увеличится&nbsp

&nbsp(3) не изменится&nbsp


Упражнение 8:


Номер 1

Выполнение каких задач фактически заняло больше времени, чем было запланировано? files

Ответ:

&nbsp(1) Подключение DLL библиотек к программе&nbsp

&nbsp(2) Бета-версия программы&nbsp

&nbsp(3) Тестирование на эмуляторе&nbsp

&nbsp(4) Тестирование на реальном устройстве&nbsp

&nbsp(5) Исправление ошибок&nbsp

&nbsp(6) Повторное тестирование на реальном устройстве&nbsp


Номер 2

Какие утверждения являются верными? files

Ответ:

&nbsp(1) выполнение задачи «Бета-версия» программы заняло на 50% меньше времени, чем было запланировано&nbsp

&nbsp(2) выполнение задачи «Тестирование на эмуляторе» заняло больше времени, чем было запланировано&nbsp

&nbsp(3) выполнение задачи «Тестирование на реальном устройстве» заняло меньше времени, чем было запланировано&nbsp


Номер 3

Какие утверждения являются неверными? files

Ответ:

&nbsp(1) выполнение задачи «Бета-версия» программы заняло на 50% меньше времени, чем было запланировано&nbsp

&nbsp(2) выполнение задачи «Тестирование на эмуляторе» заняло больше времени, чем было запланировано&nbsp

&nbsp(3) выполнение задачи «Тестирование на реальном устройстве» заняло меньше времени, чем было запланировано&nbsp


Упражнение 9:


Номер 1

Выполнение каких задач было или будет начато со сдвигом? files

Ответ:

&nbsp(1) Подключение DLL библиотек к программе&nbsp

&nbsp(2) Бета-версия программы&nbsp

&nbsp(3) Тестирование на эмуляторе&nbsp

&nbsp(4) Тестирование на реальном устройстве&nbsp

&nbsp(5) Исправление ошибок&nbsp

&nbsp(6) Повторное тестирование на реальном устройстве&nbsp


Номер 2

Из-за чего произошел сдвиг начала выполнения задачи "Тестирование на реальном устройстве"? files

Ответ:

&nbsp(1) из-за сдвига начала выполнения задачи «Тестирование на эмуляторе»&nbsp

&nbsp(2) из-за увеличения длительности выполнения задачи «Тестирование на эмуляторе»&nbsp

&nbsp(3) из-за сдвига начала выполнения задачи «Исправление ошибок»&nbsp


Номер 3

Какие утверждения являются верными?

Ответ:

&nbsp(1) увеличение фактической длительности выполнения предшествующей задачи не может привести к сдвигу начала выполнения последующей задачи&nbsp

&nbsp(2) в диоаграмме Ганта с отслеживанием на нижнем отрезке задачи отображаются начальная и конечная даты базового плана&nbsp

&nbsp(3) представление «Диаграмма Ганта с отслеживанием» позволяет видеть различия между плановыми и текущими значениями&nbsp


Упражнение 10:


Номер 1

Какую информацию предоставляет диаграмма Ганта с отслеживанием?

Ответ:

&nbsp(1) ход выполнения суммарных задач&nbsp

&nbsp(2) различия между плановыми и текущими значениями&nbsp

&nbsp(3) фактически затраченное время на выполнение каждой отдельной задачи по дням&nbsp

&nbsp(4) ход выполнения проекта в целом&nbsp


Номер 2

Какая диаграмма соответсвует заданной таблице отклонений? files

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Номер 3

Какие диаграммы не соответсвуют заданной таблице отклонений? files

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Упражнение 11:


Номер 1

Какую команду нужно выбрать для отображения заданной информации? files

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Номер 2

Какая информация будет отображена после выбора указанной команды меню? files

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Номер 3

Какую команду нужно выбрать для отображения заданной информации? files

Ответ:

&nbsp(1) files&nbsp

&nbsp(2) files&nbsp

&nbsp(3) files&nbsp


Упражнение 12:


Номер 1

Что произойдет при увеличении фактических затрат на выполнение задачи "Тестирование на эмуляторе" на 2000? files

Ответ:

&nbsp(1) общие затраты будут 18800 рублей&nbsp

&nbsp(2) базовые затраты будут 18800 рублей&nbsp

&nbsp(3) фактические затраты на задачу «Тестирование на эмуляторе» будут 6000 рублей&nbsp

&nbsp(4) отклонение будет -2000 рублей&nbsp


Номер 2

Что произойдет при уменьшении фактических затрат на выполнение задачи "Тестирование на эмуляторе" на 2000? files

Ответ:

&nbsp(1) общие затраты будут 18800 рублей&nbsp

&nbsp(2) базовые затраты будут 16800 рублей&nbsp

&nbsp(3) фактические затраты на задачу «Тестирование на эмуляторе» будут 2000 рублей&nbsp

&nbsp(4) отклонение будет -2000 рублей&nbsp


Номер 3

Какие значения изменятся при увеличении фактических затрат на выполнение задачи "Тестирование на эмуляторе" на 2000? files

Ответ:

&nbsp(1) фиксированные затраты на задачу «Тестирование на эмуляторе»&nbsp

&nbsp(2) базовые затраты на задачу «Тестирование»&nbsp

&nbsp(3) отклонение для задачи «Тестирование на эмуляторе»&nbsp

&nbsp(4) отклонение для задачи «Тестирование»&nbsp

&nbsp(5) оставшиеся затраты для задачи «Тестирование»&nbsp


Делимся опытом, как исправить ошибки в логической целостности в базе 1С, размещенной на Microsoft SQL Server.

Поступила жалоба от бухгалтера о проблемах с проведением документов в 1С.

Из скриншота выяснилось, что 1С «ругается» на проблемы с согласованностью «внутри» базы данных и предлагает провести проверку на согласованность.

Переходим в SQL Server Management Studio и, сделав, на всякий случай, бэкап текущего состояния, выполняем проверку:

Для начала переводим нужную нам БД в однопользовательский режим

Запускаем Окно запросов (CTRL+N). Выбираем Новый запрос и вводим запрос Transact-SQL (T-SQL) в этом окне:

	 ALTER DATABASE KA
	 SET SINGLE_USER
	 WITH ROLLBACK IMMEDIATE

Далее, вводим запрос на сканирование базы данных:

	 USE [ka]
	 GO
	 DBCC CHECKDB(N'ka') WITH NO_INFOMSGS
	 GO

Проверка продлилась около 15 минут, после чего выдала следующее:

CHECKDB обнаружил 0 ошибок размещения и 766 ошибок согласованности, не связанных ни с одним объектом.

CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysdbfiles» (идентификатор объекта 20).


CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysxmlcomponent» (идентификатор объекта 91).


CHECKDB обнаружил 0 ошибок размещения и 49 ошибок согласованности в таблице «_AccRg1025» (идентификатор объекта 1778313595).


CHECKDB обнаружил 0 ошибок размещения и 3 ошибок согласованности в таблице «_AccRgAT21046» (идентификатор объекта 1826313766).


CHECKDB обнаружил 0 ошибок размещения и 1783 ошибок согласованности в таблице «_AccRg1051» (идентификатор объекта 1906314051).


CHECKDB обнаружил 0 ошибок размещения и 2603 ошибок согласованности в базе данных «KA».

Вариант решения №1: восстановление из бэкапа выявило накопительный характер ошибки: чем раньше сделан бэкап – тем меньше в базе ошибок, вплоть до самого «дальнего» (14 дней). Примерно на третьем бэкапе количество ошибок перестало уменьшаться – стало ясно, что этим путём мы придём только к потере актуальности базы и проблему не решить

Вариант решения №2: В
справочной информации описаны три возможных варианта исправления этих ошибок, рассмотрим каждый:

REPAIR_FAST

Синтаксис поддерживается только для обеспечения обратной совместимости. Действия по восстановлению не выполняются.

REPAIR_REBUILD

Выполняет действия по восстановлению данных, которые можно выполнить без риска их потери. Это может быть быстрое восстановление (например, восстановление отсутствующих строк в некластеризованных индексах) или более ресурсоемкие операции (например, перестроение индекса).

REPAIR_ALLOW_DATA_LOSS

Пытается устранить все обнаруженные ошибки. Эти исправления могут привести к частичной потере данных.

Аргумент REPAIR_FAST нам не подходит, REPAIR_ALLOW_DATA_LOSS оставим на крайний случай — пробуем REPAIR_REBUILD:

	 DBCC CHECKDB(N'ka', REPAIR_REBUILD) WITH NO_INFOMSGS

CHECKDB обнаружил 0 ошибок размещения и 766 ошибок согласованности, не связанных ни с одним объектом.

CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysdbfiles» (идентификатор объекта 20).


CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysxmlcomponent» (идентификатор объекта 91).


CHECKDB обнаружил 0 ошибок размещения и 49 ошибок согласованности в таблице «_AccRg1025» (идентификатор объекта 1778313595).


CHECKDB обнаружил 0 ошибок размещения и 3 ошибок согласованности в таблице «_AccRgAT21046» (идентификатор объекта 1826313766).


CHECKDB обнаружил 0 ошибок размещения и 1783 ошибок согласованности в таблице «_AccRg1051» (идентификатор объекта 1906314051).


CHECKDB обнаружил 0 ошибок размещения и 2603 ошибок согласованности в базе данных «KA».

Не помогло, переводим базу данных обратно в многопользовательский режим:

	 ALTER DATABASE KA
	 SET MULTI_USER

На всякий случай, я попробовал провести обслуживание базы данных и перепроверил – результат тот же.

Решил провести тестирование и исправление информационной базы средствами 1С, на что получил ошибку

Выгрузить базу данных в *.dt файл тоже не удалось:

Что ж, стало понятно, что часть потерянных данных – меньшее зло, по сравнению с «развалившейся» базой данных, пробуем REPAIR_ALLOW_DATA_LOSS:

	 DBCC CHECKDB (N'KA', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS

И, наконец, после нескольких прогонов, количество ошибок немного уменьшилось:

CHECKDB обнаружил 0 ошибок размещения и 733 ошибок согласованности, не связанных ни с одним объектом.

CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysdbfiles» (идентификатор объекта 20).


CHECKDB обнаружил 0 ошибок размещения и 1 ошибок согласованности в таблице «sys.sysxmlcomponent» (идентификатор объекта 91).


CHECKDB обнаружил 0 ошибок размещения и 1783 ошибок согласованности в таблице «_AccRg1051» (идентификатор объекта 1906314051).


CHECKDB обнаружил 0 ошибок размещения и 2518 ошибок согласованности в базе данных «KA «.

Ситуацию это не спасло: база, по-прежнему не выгружалась и не «лечилась» средствами 1С.

Дальнейшие попытки (по очереди несколько раз запускал REPAIR_REBUILD и REPAIR_ALLOW_DATA_LOSS) не увенчались успехом: количество ошибок не уменьшилось, база, по-прежнему, не выгружалась и не «лечилась».

Коллеги подсказали попробовать очистить (именно очистить, без удаления самой таблицы) «проблемную» таблицу в MS SQL.

Больше всего ошибок в таблице «_AccRg1051» – ей и было принято решение заняться:

Вводим запрос

	 TRUNCATE TABLE _AccRg1051

И, после успешного выполнения, прогоняем проверку еще раз:

	 DBCC CHECKDB(N'ka') WITH NO_INFOMSGS

15 минут ожидания и, о чудо – все ошибки исчезли, в том числе и в остальных таблицах.

Перевожу базу в многопользовательский режим, выгружаю в *.dt файл и загружаю обратно.

Звоню бухгалтеру – прошу проверить проблемные документы: всё работает нормально. Пускаю остальных пользователей в базу.

Через час снова ошибка:

Делаем вывод, что выгрузка в *.dt – не панацея. Выгоняем Вежливо просим пользователей выйти и ещё немного потерпеть и тестируем базу с исправлением ошибок в режиме конфигуратора 1С со следующими параметрами

Видим, что всё ОК

Пускаем обратно пользователей в 1С и идём молиться настраивать планы обслуживания баз данных.

Все приложения Microsoft Office поддерживают проверку орфографии, и большинство из них поддерживает проверку грамматики.

Если проверка правописания работает не так, как вы ожидали, см. статью Средство проверки орфографии и грамматики помечает текст, который не должен быть помечен. Если вам нужно выполнить проверку правописания на языке, отличном от языка по умолчанию, см. статью Проверка орфографии и грамматики на другом языке.

Используете Microsoft 365? Возможно, вас заинтересует новая функция Word — «Корректор»! Подробные сведения см. в статье Корректор.

Запуск средства проверки орфографии и грамматики вручную

Чтобы запустить проверку правописания в файле, нажмите клавишу F7 или выполните следующие действия:

  1. Откройте приложение Office и перейдите на вкладку Рецензирование. В Access и InfoPath можно пропустить это действие. В Project перейдите на вкладку Проект.

  2. Нажмите кнопку Орфография или Правописание.

    Кнопка "Правописание" на вкладке "Рецензирование"

  3. Если программа обнаружит орфографические ошибки, появится диалоговое окно с первым из слов с ошибками, найденных средством проверки орфографии.

  4. После того как вы примете решение по ошибке (пропустить ее, добавить слово в словарь или изменить его), приложение перейдет к следующему неправильно написанному слову.

Щелкните заголовок ниже, чтобы получить дополнительные сведения.

В большинстве приложений Office по мере ввода текста выполняется автоматическая проверка правописания, поэтому вы сразу можете увидеть ошибки во время работы. 

Примечания: 

  • Автоматическая проверка орфографии и грамматики отсутствует в Access, Excel и Project. Можно вручную запустить проверку орфографии, нажав клавишу F7.

  • Автоматическая проверка грамматики доступна только в Outlook, Word и PowerPoint 2013 (или более новой версии).

Офис отмечает потенциальные орфографические ошибки красной волнистой линией, а потенциальные грамматические ошибки отмечены синей волнистой линией.

Если орфографические или грамматические ошибки не помечаются, автоматическая проверка может быть отключена. Можно включить автоматическую проверку правописания.

Если вы видите орфографическую или грамматическую ошибку и вам нужна помощь, чтобы ее исправить, щелкните подчеркнутое слово или фразу правой кнопкой мыши и выберите один из предложенных вариантов.

Если в приложении Office слово отмечено, как содержащее ошибку, но вы написали его правильно, выберите пункт Добавить в словарь, чтобы в будущем это слово не отмечалось как неправильное. Дополнительные сведения см. в статье Добавление слов в словарь проверки орфографии и их изменение.

Если вы не хотите, чтобы в процессе работы приложение Office помечало возможные ошибки волнистыми линиями, вы можете отключить автоматическую проверку правописания.

  1. Откройте параметры проверки правописания:

    • В OneNote, PowerPoint, Publisher, Visio и Word: в меню Файл выберите пункт Параметры и щелкните Правописание.

    • В InfoPath: на вкладке Главная щелкните стрелку рядом с надписью Орфография и выберите команду Параметры проверки орфографии.

    • В Outlook: в меню Файл щелкните Параметры, выберите Почта и нажмите кнопку Орфография и автозамена.

  2. Установите или снимите флажок Проверять орфографию в процессе набора текста. Кроме того, в приложениях с автоматической проверкой грамматики можно установить или снять флажок Отмечать грамматические ошибки в процессе набора текста.

    Флажок "Автоматически проверять орфографию"

    Примечание: В Word можно включать и отключать средство проверки орфографии для документа, с которым вы работаете, или для всех новых документов. Выберите значение в списке Исключения, а затем установите или снимите флажки Скрыть орфографические ошибки только в этом документе и Скрыть грамматические ошибки только в этом документе.

Если вы не хотите, чтобы в приложении Office проверялась грамматика (ни при запуске проверки правописания, ни автоматически по мере ввода), эту функцию можно отключить.

  1. Откройте параметры проверки правописания:

    • В OneNote, PowerPoint, Publisher, Visio и Word: в меню Файл выберите пункт Параметры и щелкните Правописание.

    • В InfoPath: на вкладке Главная щелкните стрелку рядом с надписью Орфография и выберите команду Параметры проверки орфографии.

    • В Outlook: в меню Файл щелкните Параметры, выберите Почта и нажмите кнопку Орфография и автозамена.

  2. Снимите флажки Автоматически проверять грамматику и Также проверять грамматику.

    Флажки, связанные с грамматикой

    Примечание: не во всех приложениях Office присутствуют оба эти параметра.

В Word, Outlook, PowerPoint 2013 (или более новой версии) можно принудительно выполнить повторную проверку ранее пропущенных слов и выражений.

  1. Откройте документ или элемент, который вы хотите проверить.

  2. Откройте вкладку Файл и выберите команды Параметры > Правописание > Повторная проверка. В Outlook нужно выбрать пункты Файл > Параметры > Почта и нажать кнопку Орфография и автозамена.

  3. Нажмите кнопку Да, когда появится предупреждение о сбросе параметров проверки орфографии и грамматики.

  4. Нажмите кнопку ОК в диалоговом окне, чтобы вернуться к документу, а затем еще раз запустите проверку орфографии и грамматики.

См. также

Проверка удобочитаемости документа

Средство проверки орфографии и грамматики помечает текст, который не должен быть помечен

Выбор параметров грамматики и стиля письма в Office 2013 и более ранних версий

Добавление слов в словарь проверки орфографии

Средство проверки правописания неправильно работает с другим языком

Настройка автозамены: написание прописными буквами, правописание и символы

Проверка орфографии перед отправкой сообщения в Outlook

Узнайте, как максимально эффективно использовать Редактор в Microsoft 365

Приложения Office для Mac автоматически проверяют наличие возможных орфографических и грамматических ошибок при вводе текста. Если вы предпочитаете проверять орфографию и грамматику уже в готовом документе, отключите автоматическую проверку или можно одновременно выполнить проверку орфографии и грамматики.

Word

Автоматическая проверка орфографии и грамматики при вводе

Слово помечает потенциальные орфографические ошибки красной волнистой линией, а потенциальные грамматические ошибки отмечены зеленой волнистой линией.

Совет: Если орфографические и грамматические ошибки не помечаются, вероятно, вам нужно включить автоматическую проверку правописания, о которой пойдет речь в следующей процедуре.

Если вы видите орфографическую и грамматическую ошибку, удерживая нажатой клавишу CONTROL, щелкните слово или фразу и выберите один из вариантов.

Если приложение Word неправильно пометило слово как опечатку и вы хотите добавить это слово в словарь, чтобы приложение Word правильно распознавало его в дальнейшем, см. раздел Добавление слов в словарь проверки орфографии и их изменение

  1. В меню Word выберите Параметры > Правописание.

  2. В диалоговом окне Правописание в разделе Орфография установите или снимите флажок Автоматически проверять орфографию.

  3. В разделе Грамматика установите или снимите флажок Автоматически проверять грамматику.

  4. Закройте диалоговое окно, чтобы сохранить изменения.

  1. На вкладке Рецензирование нажмите кнопку Правописание.

  2. Если Word находит возможную ошибку, открывается диалоговое окно Правописание, в котором орфографические ошибки выделяются красным цветом, а грамматические — зеленым.

  3. Чтобы устранить ошибку, выполните одно из указанных ниже действий.

    • Введите исправление в соответствующем поле и нажмите кнопку Изменить.

    • В разделе Варианты выберите нужное слово и нажмите кнопку Изменить.

    Чтобы пропустить ошибку, выполните одно из указанных ниже действий.

    • Чтобы пропустить только этот экземпляр ошибки, нажмите кнопку Пропустить.

    • Чтобы пропустить все экземпляры ошибки, нажмите кнопку Пропустить все.

    • Для грамматической ошибки щелкните Следующее предложение, чтобы пропустить экземпляр этой ошибки и перейти к следующей.

    Если нужно пропускать слово с ошибкой во всех документах, нажмите кнопку Добавить, чтобы добавить слово в словарь. Это применимо только для слов с орфографическими ошибками. Свою грамматику вы не можете добавить в словарь.

  4. После исправления или пропуска ошибки Word переходит к следующей. По окончании проверки документа в Word появляется сообщение о том, что проверка правописания завершена.

  5. Нажмите кнопку ОК, чтобы вернуться к документу.

Список пропускаемых слов и грамматических ошибок можно очистить, после чего приложение Word снова проверит ошибки в орфографии и грамматике, которые вы до этого решили пропустить.

Примечание: Список пропускаемых слов и грамматики сбрасывается только для документа, который открыт в данный момент. Это действие на затрагивает орфографические и грамматические ошибки, которые вы решили пропустить в других документах Word.

  1. Откройте документ, который необходимо проверить.

  2. В меню Сервис наведите указатель на пункт Правописание и выберите Сбросить пропускаемые слова и грамматику.

    Чтобы очистить списки слов и выражений, которые Word пропускает, выберите пункт "Сбросить пропускаемые слова и грамматику".

    Word предупредит вас о том, что эта операция приведет к сбросу средств проверки орфографии и грамматики.

    Если нажать кнопку "Да", Word заново проверит орфографию и грамматику для случаев, в которых вы раньше решили пропустить ошибки.

  3. Нажмите кнопку Да, чтобы продолжить.

  4. Откройте вкладку Рецензирование и щелкните Правописание, чтобы проверить орфографию и грамматику.

Outlook

Автоматическая проверка орфографии и грамматики при вводе

По умолчанию приложение Outlook проверяет орфографию в процессе ввода текста. В Outlook используется красная пунктирная линия подчеркивания для обозначения возможных орфографических ошибок, а также зеленая пунктирная линия для обозначения возможных грамматических ошибок.

  1. Если вы видите слово с пунктирной линией подчеркивания, то удерживая нажатой клавишу Control, щелкните слово или фразу и выберите один из вариантов.

  2. В контекстном меню выполните одно из указанных ниже действий.

    • Выберите один из предлагаемых вариантов в верхней части контекстного меню.

    • Нажмите кнопку Пропустить правописание, чтобы пропустить одно вхождение слова.

    • Чтобы добавить слово в орфографический словарь, щелкните Добавить в словарь.

Открыв сообщение электронной почты, выполните указанные ниже действия.

  • Чтобы Outlook автоматически выполнял исправление орфографических ошибок, в меню Outlook выберите пункт Параметры. В разделе Личные параметры щелкните Правописание. Щелкните в поле рядом сПроверкаорфографии при вводе текста.

  • Чтобы включить или отключить автоматическую проверку грамматики, в меню Outlook выберите пункт Параметры. В разделе Личные параметры щелкните Правописание. Щелкните в поле рядом с пунктом Проверка грамматики при вводе.

Проверка орфографии в качестве вашего параметра набора текста

Вы можете исправить орфографические и грамматические ошибки во всем тексте после создания сообщения или другого элементы.

  1. В меню Правка наведите указатель на пункт Правописание и выберите Правописание.

  2. Выполните любое из описанных ниже действий.

    • В списке вариантов выберите нужное слово или введите новый вариант правописания в поле в верхней части, и нажмите Изменить.

    • Нажмите Пропустить, чтобы пропустить это слово и перейти к следующему слову с ошибкой.

    • Чтобы добавить слово в орфографический словарь, щелкните Добавить.

Совет: Для пропуска слова и перехода к следующей ошибке правописания используется сочетание клавиш COMMAND+;.

PowerPoint

В PowerPoint можно проверять орфографию, но не грамматику.

Автоматическая проверка орфографии при вводе

PowerPoint автоматически проверяет и отмечает потенциальные орфографические ошибки с волнистым красным подчеркиванием.

Совет: Если орфографические ошибки не помечаются, вероятно, вам нужно включить автоматическую проверку орфографии, о которой пойдет речь в следующей процедуре.

Если вы увидите орфографическую ошибку, щелкните слово или фразу правой кнопкой мыши (или левой, удерживая клавишу CTRL) и выберите один из предложенных вариантов.

  1. В меню PowerPoint выберите разделы Параметры > Проверка орфографии.

  2. В диалоговом окне Проверка орфографии установите или снимите флажок Автоматически проверять орфографию.

  1. На вкладке Рецензирование нажмите кнопку Проверка орфографии.

  2. При обнаружении ошибки откроется область Проверка орфографии с возможными вариантами исправления.

  3. Чтобы устранить ошибку, выполните одно из указанных ниже действий.

    • Исправьте ошибку на слайде.

    • Выберите одно из слов, предложенных в области Проверка орфографии, а затем нажмите кнопку Изменить.

    Чтобы пропустить ошибку, выполните одно из указанных ниже действий.

    • Чтобы пропустить только этот экземпляр ошибки, нажмите кнопку Пропустить.

    • Чтобы пропустить все экземпляры ошибки, нажмите кнопку Пропустить все.

    • Чтобы пропускать ошибку во всех документах и добавить слово в словарь, нажмите кнопку Добавить.

  4. После исправления, игнорирования или пропуска PowerPoint перейдет к следующей ошибке. После завершения проверки презентации в PowerPoint появится сообщение о том, что проверка орфографии закончена.

  5. Нажмите кнопку ОК, чтобы вернуться к презентации. 

Excel

В Excel можно проверять орфографию, но не грамматику.

Проверка орфографии во всей презентации

  1. На вкладке Рецензирование нажмите кнопку Проверка орфографии.

    Примечание: Диалоговое окно Орфография не откроется, если ошибки правописания не обнаружены или вы пытаетесь добавить слово, которое уже есть в словаре.

  2. Выполните любое из описанных ниже действий.

    Задача

    Необходимые действия

    Замена слова

    В разделе Варианты выберите нужное слово и нажмите кнопку Изменить.

    Изменение каждого экземпляра этого слова в данном документе

    В разделе Варианты выберите нужное слово и нажмите кнопку Изменить все.

    Пропуск слова и переход к следующему слову с ошибкой

    Нажмите кнопку Пропустить.

    Пропуск каждого экземпляра этого слова в данном документе и переход к следующему слову с ошибкой

    Нажмите Пропустить все.

Дополнительные материалы

Проверка орфографии и грамматики на другом языке


Презентация на тему: MS Project

Скачать эту презентацию

Скачать эту презентацию

№ слайда 1
Выравнивание ресурсов в Microsoft Office Project Информационные технологии в упр

Описание слайда:

Выравнивание ресурсов в Microsoft Office Project Информационные технологии в управлении

№ слайда 2
Перегрузка ресурсов – это превышение максимально возможного для этого ресурса об

Описание слайда:

Перегрузка ресурсов – это превышение максимально возможного для этого ресурса объема назначения. Максимальный объем назначения указывается в окне свойств ресурса на вкладке Общие.

№ слайда 3
Причины перегрузки: ресурс назначен на несколько задач, которые выполняются одно

Описание слайда:

Причины перегрузки: ресурс назначен на несколько задач, которые выполняются одновременно; после изменений параметров задачи произошли изменения ее длительности, трудозатрат и объема ресурсов; ресурсу запланированы трудозатраты в дни, когда он недоступен.

№ слайда 4
Способы выявления перегруженности (элементы пункта меню Вид): представление Лист

Описание слайда:

Способы выявления перегруженности (элементы пункта меню Вид): представление Лист ресурсов; представление График ресурсов; представление Использование ресурсов, дополненный показателем Превышение доступности.

№ слайда 5
Анализ перегрузки в представлении Использование ресурсов На примере видно, что п

Описание слайда:

Анализ перегрузки в представлении Использование ресурсов На примере видно, что перегруженным является Постановщик с 19.10.09 по 23.10.09. Ежедневная величина сверхнормативных трудозатрат составляет 8ч в день. Перегрузка возникла при выполнении задач Тестирование и устранение ошибок и Составление программной документации, поскольку они выполняются параллельно и Постановщик назначен на обе эти задачи со стопроцентным объемом назначения.

№ слайда 6
В этом случае отображаются: перегруженные ресурсы (их названия выделены красным

Описание слайда:

В этом случае отображаются: перегруженные ресурсы (их названия выделены красным шрифтом, а столбец индикаторов содержит специальный знак); дни, когда эти ресурсы перегружены (значения трудозатрат в эти дни выделены красным цветом); объем запланированных сверх нормы трудозатрат (указан красным шрифтом в строке Превыш); задачи, при выполнении которых ресурс перегружен (те задачи, которые он выполняет в дни, когда имеется перегрузка).

№ слайда 7
Выравнивание ресурсов – это процесс реорганизации плана проекта с целью ликвидац

Описание слайда:

Выравнивание ресурсов – это процесс реорганизации плана проекта с целью ликвидации перегруженности ресурсов. Четких рекомендаций по выравниванию нет. В каждом конкретном случае оно выполняется в зависимости от индивидуальных особенностей проекта и ресурсов, а качество выравнивания существенно зависит от опыта менеджера проекта.

№ слайда 8
В Microsoft Office Project имеется два способа выравнивания: автоматический и вр

Описание слайда:

В Microsoft Office Project имеется два способа выравнивания: автоматический и вручную.

№ слайда 9
Автоматическое выравнивание ресурсов Microsoft Project сам пытается избавиться о

Описание слайда:

Автоматическое выравнивание ресурсов Microsoft Project сам пытается избавиться от перегрузки перемещением задач на другие сроки или вставкой перерывов между задачами, оперируя резервами времени некритических задач.

№ слайда 10
Для автоматического выравнивания следует выбрать пункт меню Сервис/Выравнивание

Описание слайда:

Для автоматического выравнивания следует выбрать пункт меню Сервис/Выравнивание загрузки ресурсов, в результате чего откроется окно с параметрами выравнивания:

№ слайда 11
В разделе Вычисления для выравнивания задаются общие параметры выравнивания загр

Описание слайда:

В разделе Вычисления для выравнивания задаются общие параметры выравнивания загрузки: Выполнять автоматически. Установка этого режима означает, что загрузка ресурсов будет автоматически выравниваться при нажатии кнопки Выровнять, а также при создании новых назначений. Выполнять вручную. Выравнивание загрузки будет выполняться пользователем вручную. Поиск превышений доступности. Задает временной интервал, в течение которого ищется перегрузка. Имеет значения: по минутам, часам, дням, неделям, месяцам. Это значение должно соответствовать минимальному интервалу планирования. Например, если сотруднику с 8-часовым рабочим днем на один день запланированы две работы по 4 часа, начинающиеся с 8:00, то при значении по часам будет обнаружена перегрузка, а при значении по дням перегрузки не будет.

№ слайда 12
Очистка данных предыдущего выравнивания перед новым выравниванием. Установка это

Описание слайда:

Очистка данных предыдущего выравнивания перед новым выравниванием. Установка этого флажка позволяет удалить из расписания все изменения, внесенные в него при предыдущем выравнивании. Раздел Диапазон выравнивания для проекта задает временной интервал, в течение которого будет выполняться выравнивание: Выравнивание во всем проекте. Выравниванию подлежат все задачи проекта. Выравнивание в диапазоне. Задаются начало и конец временного интервала, и выравниванию подлежат только задачи, входящие в этот интервал.

№ слайда 13
Раздел Устранение превышений доступности задает принцип выполнения выравнивания

Описание слайда:

Раздел Устранение превышений доступности задает принцип выполнения выравнивания загрузки: Окно Порядок выравнивания содержит значения: Только по идентификаторам. В первую очередь откладываются или прерываются задачи с большим значением идентификатора, т.е. расположенные в конце списка задач. Стандартный. Этот режим устанавливается по умолчанию. При нем анализируются связи, временные резервы, даты начала/окончания, приоритеты и ограничения. По приоритетам, стандартный. Задачи сначала выстраиваются по приоритету, а затем обрабатываются стандартным способом.

№ слайда 14
Выравнивание только в пределах имеющегося резерва. Установка этого флага означае

Описание слайда:

Выравнивание только в пределах имеющегося резерва. Установка этого флага означает, что при выравнивании сдвигать задачи можно только в пределах их временных резервов, что не вызовет удлинения проекта. В противном случае разрешается перемещать задачи произвольным образом и увеличивать длительность проекта. При выравнивании допускается коррекция отдельных назначений для задачи. Установка этого флага позволяет системе в случае, когда у задачи перегружен только один ресурс, изменять параметры назначения только этого ресурса, а не задачи в целом. В противном случае, система изменяет параметры всей задачи.

№ слайда 15
При выравнивании допускается прерывание оставшихся трудозатрат. Включение этого

Описание слайда:

При выравнивании допускается прерывание оставшихся трудозатрат. Включение этого флага разрешает системе прерывать задачи. В противном случае в процессе выравнивания прерывание задач запрещено. Выравнивание загрузки предложенных ресурсов. По умолчанию этот флажок снят, и выравнивание происходит только по подтвержденным ресурсам. При включенном флажке помимо подтвержденных выравниваются и предложенные ресурсы.

№ слайда 16
После нажатия кнопки Выровнять преобразовывается план проекта, в результате чего

Описание слайда:

После нажатия кнопки Выровнять преобразовывается план проекта, в результате чего могут измениться длительности и сроки задач. Для просмотра внесенных в план изменений используется представление Диаграмма Ганта с выравниванием (пункт меню Вид/Другие представления – Диаграмма Ганта с выравниванием – Применить).

№ слайда 17
На этой диаграмме зеленым цветом изображен календарный график до выравнивания, а

Описание слайда:

На этой диаграмме зеленым цветом изображен календарный график до выравнивания, а синим – после. В этом примере изменения коснулись только одной задачи Составление программной документации, которая перенесена на более поздний срок. Это обеспечивает ее выполнение после Тестирование и исправление ошибок. Тем самым устраняется перегрузка Постановщик, который назначен на обе эти задачи со стопроцентным участием.

№ слайда 18
Автоматическое выравнивание не всегда дает приемлемый результат. Для удаления из

Описание слайда:

Автоматическое выравнивание не всегда дает приемлемый результат. Для удаления изменений, внесенных при последнем выравнивании нужно в окне выравнивания загрузки ресурсов нажать кнопку Очистить выравнивание.

№ слайда 19
Ручное выравнивание ресурсов При этом используются следующие типовые приемы: изм

Описание слайда:

Ручное выравнивание ресурсов При этом используются следующие типовые приемы: изменение объемов назначений; замена одного ресурса другим; редактирование распределения трудозатрат; прерывание задачи; перенос трудозатрат в сверхурочные.

№ слайда 20
1. Изменение объемов назначений выполняется в окне свойств задач на вкладке Ресу

Описание слайда:

1. Изменение объемов назначений выполняется в окне свойств задач на вкладке Ресурсы. Для перегруженного ресурса следует сократить значение Единицы.

№ слайда 21
Например, если ресурс Постановщик одновременно участвует в двух задачах (Тестиро

Описание слайда:

Например, если ресурс Постановщик одновременно участвует в двух задачах (Тестирование и исправление ошибок и Составление программной документации) с загрузкой в 100%, изменив ее на 50% для обеих задач, мы исключим перегрузку. Длительность задач (и проекта в целом) при этом увеличивается.

№ слайда 22
может быть полной или частичной. В обоих случаях сначала нужно подобрать аналоги

Описание слайда:

может быть полной или частичной. В обоих случаях сначала нужно подобрать аналогичный свободный ресурс. Для этого используется представление Диаграмма Ганта, в котором выделяют задачу, для которой требуется заменить ресурс, и выбирают пункт меню Сервис/Назначить ресурсы. 2. Замена одного ресурса другим

№ слайда 23
В этом окне сначала перечислены назначенные задаче ресурсы (отмечены «галочкой»)

Описание слайда:

В этом окне сначала перечислены назначенные задаче ресурсы (отмечены «галочкой»), а затем – все остальные ресурсы проекта. Для уменьшения второго списка имеется кнопка Параметры списка ресурсов, при помощи которой можно установить фильтр по видам ресурсов и указать минимум имеющейся доступности. В примере используется фильтр Ресурсы – трудовые с имеющейся доступностью 4ч. В нашем примере такого не оказалось и Постановщика заменить не кем.

№ слайда 24
Кнопка Графики… выводит окно с графиком выбранных из списка ресурсов. График мож

Описание слайда:

Кнопка Графики… выводит окно с графиком выбранных из списка ресурсов. График может отображать одну из следующих величин: оставшаяся доступность, трудозатраты и трудозатраты назначения. Для подбора замены ресурса предназначена оставшаяся доступность, которая показывает изменение объемов неиспользованных трудозатрат.

№ слайда 25
Анализируя графики доступности ресурсов, подбираем тот, который свободен в то вр

Описание слайда:

Анализируя графики доступности ресурсов, подбираем тот, который свободен в то время, когда перегружен заменяемый ресурс. При полной замене в окне Назначение ресурсов следует выделить строку с заменяемым ресурсом, нажать кнопку Заменить и выбирать подобранный ресурс. При частичной замене в окне Назначение ресурсов добавить задаче подобранный ресурс с 0% единиц и закрыть это окно. Перейти в представление Использование задач и в его правой таблице вручную перенести трудозатраты с заменяемого ресурса на добавленный.

№ слайда 26
3. Редактирование распределения трудозатрат Выполняется на основе представления

Описание слайда:

3. Редактирование распределения трудозатрат Выполняется на основе представления Использование ресурсов. Редактирование заключается во вводе чисел в ячейки правой таблицы представления. При этом редактироваться могут только строки, соответствующие назначениям ресурсов на задачи. Суммарные строки ресурсов редактироваться не могут.

№ слайда 27
Выполним перераспределение трудозатрат Постановщика, используя выходные дни 24,

Описание слайда:

Выполним перераспределение трудозатрат Постановщика, используя выходные дни 24, 25, 31 октября и 1 ноября. Для этого внесем в его календарь исключения (в окне Сведения о ресурсе из меню Проект), делающие эти дни рабочими.

№ слайда 28
Система передвинула трудозатраты задачи Тестирование и исправление ошибок на 24

Описание слайда:

Система передвинула трудозатраты задачи Тестирование и исправление ошибок на 24 и 25 октября. Перегрузка сократилась с 5 до 3 дней (с 40ч до 24ч).

№ слайда 29
Перенесем трудозатраты Постановщика по задаче Составление программной документац

Описание слайда:

Перенесем трудозатраты Постановщика по задаче Составление программной документации с 26 и 27 октября на 31 октября и 1 ноября. В результате перегрузка еще уменьшится до одного дня (8ч). Главное достоинство проделанных преобразований – проект не увеличился в длительности.

№ слайда 30
используется как средство временного освобождения ее ресурсов. Прерывание выполн

Описание слайда:

используется как средство временного освобождения ее ресурсов. Прерывание выполняется на диаграмме Ганта: щелкнуть правой кнопкой мыши на отрезке задачи и в контекстном меню выбрать команду Прервать задачу. Затем установить курсор в точку отрезка, с которой начнется перерыв, и тащить его вправо. Задача разделится на две составляющие, соединенные точками. Того же эффекта можно добиться в представлении Использование задач ручным переносом трудозатрат всех назначенных задаче ресурсов на более поздний срок. 4. Прерывание задачи

№ слайда 31
Примеры

№ слайда 32
Прерывание задачи может быть частичным, когда требуется прервать работу не всех,

Описание слайда:

Прерывание задачи может быть частичным, когда требуется прервать работу не всех, а только нескольких назначенных ей ресурсов. Такое прерывание называется прерыванием назначений. Оно также реализуется ручным переносом трудозатрат ресурсов на более поздние сроки в представлении Использование задач или представлении Использование ресурсов.

№ слайда 33
5. Перенос трудозатрат в сверхурочные Это действие выполняется в представлении И

Описание слайда:

5. Перенос трудозатрат в сверхурочные Это действие выполняется в представлении Использование ресурсов. Сначала для него следует установить таблицу Трудозатраты, затем найти в столбце Сверхурочные ячейку, соответствующую перегруженному назначению, и ввести количество переводимых в сверхурочные трудозатрат. При этом у ресурса должна быть введена ставка оплаты сверхурочных. График распределения сверхурочных трудозатрат нельзя редактировать вручную. Они распределяются самой системой по всей длительности назначения.

№ слайда 34
Перенесём оставшиеся 8ч перегрузки Постановщика в сверхурочные для задачи Тестир

Описание слайда:

Перенесём оставшиеся 8ч перегрузки Постановщика в сверхурочные для задачи Тестирование и исправление ошибок. В результате перегрузка окончательно ликвидирована, о чем свидетельствует отсутствие надписей красного цвета.

№ слайда 35
Таким образом, вопросы, связанные с выравниванием (сглаживанием) ресурсов, являю

Описание слайда:

Таким образом, вопросы, связанные с выравниванием (сглаживанием) ресурсов, являются наиболее сложными и трудоемкими в работе менеджера проекта. Эффективность их решения требует внимательного, индивидуального и творческого подхода. Поиск решения выполняется всякий раз, исходя из конкретных условий и особенностей, в которых осуществляется жизнедеятельность соответствующей системы управления.

Смотреть видео Тестирование и исправление ошибок базы 1С на videozubrit бесплатно

Тестирование и исправление ошибок базы 1С - Видео онлайн

Компания «Complit» основана в 2012 году. Опыт работы наших специалистов в сфере Информационных Технологий свыше 10 лет. Компания имеет статус официального партнера Фирмы «1C» г. Москва. Имеет права на продажу и внедрение программных продуктов от Microsoft, Adobe, Kaspersky, и т.д. Основным направлением компании является автоматизация бизнеса. (Розничные магазины, аптеки, рестораны, торговые компании) IT Аутсорсинг.
тел +7 (727) 329 98 51
e-mail alex.kim@complit.kz
Сайт: http://www.complit.kz

Понравилась статья? Поделить с друзьями:
  • Project nevada для fallout new vegas ошибка
  • Project expert ошибка не могу создать файл
  • Project expert ошибка доступа к файлу
  • Project cars ошибка при запуске приложения 0xc0000142
  • Progressnotificationcommon dll citrix ошибка при установки