Протокол «7 образов. Протокол Турбо-Суслик «12 представлений, мешающих жить »

20.04.2023

Тестирование

Тест Роршаха

АЛГОРИТМ ПРОВЕДЕНИЯ АНАЛИЗА ПОДПИСИ

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

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

А) необходимо иметь у себя на отдельном листке весь перечень приведенных в данной брошюре факторов.

2. Длина подписи.

3. Начало и конец подписи.

4. Длина букв (заглавных и малых).

5. Закругленность и острота букв.

6. Связанность и разорванность букв.

7. Уверенность в написании букв.

8. Различные украшения в подписи.

9. Размашистость при написании букв.

10. Расстояние между буквами.

11. Сила давления при написании букв.

12. Подчеркивания, «хвостики» в подписи, зачеркивания.

13. Вертикальные линии в подписи.

14. Ровная и неровная подпись.

15. Различные петли в подписи.

16. Точка в подписи.

17. «Нагруженность» в подписи.

18. Одинаковые элементы в подписи.

19. Ясность.

20. Иностранные буквы в подписи.

21. Графалогичность в подписи.

22. Простота в подписи.

21. Скорость написания.

22. Наклон букв в подписи.

25. Степень гармоничности подписи.

26. Различные виды подписей у одного и того же человека.

27. Изменение подписи с течением времени.

28. «Возвраты» в подписи.

29. Аномальные признаки в подписи.

30. Волнистость подписи.

31. Геометрическая выдержанность подписи.

32. Удлиненное начало в подписи.

33. Амплитуда подписи.

34. Комбинаторика в подписи.

35. Признаки симметрии в подписи.

36. Цифровые добавления в конце подписи.

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

Этот окончательный результат и представляют исследуемому.

Вверху одна из самых красочных, содержащих много деталей таблиц теста Роршаха. Никаких толкований ее не приводим, оставляя желающим возможность испытать себя. Внизу таблица III теста Роршаха. Под ней три необычные интерпретации. 1. Испытуемый (больной шизофренией с острым чувственным бредом) объединяет в одном ответе центральное красное пятно, нижний черный участок и белый промежуток между ними. Он увидел во всем этом «медведя на горшке». Налицо три странности: выделение пятен необычной конфигурации; смещение фигуры и фона; алогичность самой ситуации. 2. Другой испытуемый (чудак) выделил в той же таблице только три красных пятна: «пряди волос» и «галстук-бабочку». Их он дорисовал до «человека». Изображение строится в белом пространстве над таблицей и выходит за ее пределы. 3. «Поминальное целование» – именно так истолковала перевернутую на 180° таблицу больная шизофренией с острым чувственным бредом. Она увидела в пятнах трех человеи: в центре «умершую старушку» (в саване, украшенном красной лентой) и двух целующих ее «родственниц». Очертания «тела старушки» не соответствуют контурам пятен. Специалисты определяют такие толкования как ответы с нечеткой формой. В интерпретации отражено тревожное состояние больной.


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

Далее испытуемый прослушивает инструкцию к исследованию, которая заключается в одном предложении: «Что это может быть?». Одновременно с инструкцией он получает карту I. После того, как испытуемый предоставит все ответы на первую карту, он самостоятельно берет следующую по счету карту, и так далее, до последней. Все ответы, комментарии и вопросы испытуемого в ходе тестирования дословно записываются. Когда испытуемый предоставит последний ответ на карту X, проводится процедура опроса. В ходе опроса уточняются: локализация каждого ответа, его содержание и те особенности пятна, которые явились основанием для формирования ответа.

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

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

Использование каждого символа требует строгого соблюдения специальных правил и алгоритмов кодирования. После того как все ответы будут закодированы соответствующими символами, формулы ответов переносятся в специальный бланк формализованного протокола. После формирования формализованного протокола проводятся расчеты. В ходе этой процедуры сначала суммируются все символы по каждой категории. Затем эти суммарные данные по специальным формулам пересчитываются в значения шкал, которые непосредственно подвергаются интерпретации. Эти шкалы представляют собой коэффициенты, проценты, производные и комплексные индексы, каждый из которых также имеет свой собственный символ для обозначения. Результаты расчетов заносятся в Структурную психограмму, которая состоит из трех разделов. В первом разделе под названием «Исходные данные» записываются суммарные значения символов из протокола.

Рассчитанные по специальным формулам значения интерпретационных шкал заносятся в нижний раздел «Коэффициенты, проценты и производные». Данный раздел психограммы имеет кластерную структуру, так как все интерпретационные шкалы Интегративной Системы сгруппированы в кластеры, описывающие основные сферы психической деятельности. В третьем разделе «Комплексные индексы» указываются оценки комплексных индексов, которые определяются на основе значений сразу нескольких шкал.

Документационное обеспечение управления

Контрольная

Вариант 4

1. Протокол, виды протоколов, особенности оформления 4

2. Обработка отправляемой корреспонденции 9

3. Оформить акт списания имущества 11

4. Составить докладную записку 12

Библиографический список 14

1. Протокол, виды протоколов, особенности оформления

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

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

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

Основные виды протокола:

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

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

    Стенографический протокол составляется на основе стенографического отчета о заседании (стенограммы) и дословно передает процесс обсуждения каждого вопроса и выработку решения по нему.

Протоколы оформляются на бланках организации и содержат следующие реквизиты: наименование организации, наименование вида документа, дата заседания, номер протокола, место составления протокола (место проведения заседания), заголовок к тексту, текст, подписи, визы ознакомления. Заголовок к тексту протокола – это название протоколируемого мероприятия (совещание, заседание, собрание) и наименование коллегиального органа, работа которого протоколируется.

Текст протокола состоит из двух частей: вводной и основной. Вводная часть текста протокола должна показывать: кто руководил проведением протоколируемого мероприятия; кто вел протокол; кто присутствовал на совещании (заседании, собрании и т.п.) из числа должностных лиц, входящих в состав коллегиального органа, проводящего совещание; кто был приглашен (при необходимости) на совещание из числа сотрудников организации или из других организаций; какие вопросы обсуждались на совещании.

Информация о руководителе совещания, секретаре и присутствовавших включает фамилии и инициалы должностных лиц, указываемые соответственно после слов: «Председатель», «Секретарь», «Присутствовали» (без кавычек). Для лиц, дополнительно приглашенных на совещание из числа сотрудников организации, помимо фамилии и инициалов указывается занимаемая должность, а для специалистов из других организаций - должность и название организации. Сведения о приглашенных на совещание лицах можно включать в раздел «Присутствовали» или в специальный раздел «Приглашенные».

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

В самом протоколе в разделе «Присутствовали» указывается только общее количество присутствовавших со ссылкой на прилагаемый список. Следует подчеркнуть, что разделы «Присутствовали» и «Приглашенные» имеют особое значение по отношению к другим разделам протокола, так как непосредственно влияют на юридическую силу данного документа, показывая правомерность проведения коллективного мероприятия. В этих разделах отражается наличие кворума собрания, т.е. минимально необходимого количества членов коллегиального органа, достаточного для начала работы собрания (заседания, совещания). При отсутствии нормативно установленного для данного коллегиального органа кворума (простое большинство или 2/3) проведение собрания недопустимо, так как его решения будут неправомерны. Слова «Председатель», «Секретарь», «Присутствовали», «Приглашенные» печатаются от нулевого положения печатающего устройства, от 2-го положения ставят тире, фамилии пишут в именительном падеже, затем ставят инициалы. Фамилии присутствующих и приглашенных располагают в алфавитном порядке и печатают через 1 межстрочный интервал.

Рассмотренные на совещании вопросы перечисляются в разделе ПОВЕСТКА ДНЯ. Слова ПОВЕСТКА ДНЯ печатают от нулевого положения печатающего устройства, после них ставится двоеточие. Вопросы повестки дня нумеруются. Каждый новый вопрос печатают от 1-го положения табулятора. Последовательность расположения вопросов определяется степенью их важности. Формулировка вопросов повестки дня должна начинаться с предлогов о (об), наименование должности и фамилию докладчика дают в родительном падеже. Основная часть текста протокола строится в соответствии с вопросами повестки дня. Построение записи обсуждения каждого вопроса повестки дня осуществляется по схеме: СЛУШАЛИ ВЫСТУПИЛИ ПОСТАНОВИЛИ (РЕШИЛИ). Эти слова печатают прописными буквами. Перед словом СЛУШАЛИ ставят номер вопроса повестки дня, после двоеточие. Фамилию докладчика печатают в именительном падеже от 1-го положения печатающего устройства; после фамилии ставят инициалы, затем тире и с прописной буквы пишут содержание доклада в форме прямой речи. Если текст доклада (выступления) застенографирован или представлен докладчиком в письменной форме, то после тире также с прописной буквы пишут «Доклад прилагается» (в протоколе без кавычек).

Обсуждению доклада могут предшествовать вопросы к докладчику, которые вместе с ответами включаются в раздел СЛУШАЛИ. Перед записью каждого вопроса указываются инициалы, фамилия и должность его автора и ставится тире. Содержание вопроса записывается с прописной буквы в форме прямой речи. Перед формулировкой ответа пишется слово «Ответ» (в протоколе без кавычек), ставится тире и записывается ответ в форме прямой речи. Ход обсуждения доклада отражается в разделе ВЫСТУПИЛИ. После слова ВЫСТУПИЛИ ставится двоеточие. Фамилию выступающего пишут в именительном падеже от 1го положения печатающего устройства, затем указывают инициалы и должность выступающего, ставят тире и с прописной буквы печатают содержание выступления в форме косвенной речи.

Принятые решения содержатся в разделе ПОСТАНОВИЛИ (РЕШИЛИ). Если решений несколько, они нумеруются арабскими цифрами с точкой. Как правило, каждое решение сопровождается указанием должности, фамилии и инициалов ответственного за его выполнение и содержит срок исполнения. Принимаемые коллегиально решения нередко требуют голосования. В этом случае после раздела ПОСТАНОВИЛИ указывается: «Голосование» или «Голосовали» (в протоколе без кавычек) и приводятся результаты голосования: единогласно или за..., против..., воздержались...

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

    все реквизиты заголовочной части протокола: наименование организации, наименование вида документа (ВЫПИСКА ИЗ ПРОТОКОЛА), дату (дата заседания), номер протокола (порядковый номер заседания), место составления (место проведения заседания);

    заголовок к тексту;

    все реквизиты вводной части текста протокола: «Председатель», «Секретарь», «Присутствовали», «Приглашенные», «ПОВЕСТКА ДНЯ»;

    отдельные реквизиты основной части текста протокола: «СЛУШАЛИ», «ПОСТАНОВИЛИ», «Голосование»;

    реквизиты оформляющей части протокола: реквизит «Подпись», включающей слова «Председатель», «Секретарь», инициалы и фамилии председателя и секретаря (без их личных подписей т.к. выписки, как правило, не подписываются подлинными подписями, а заверяются секретарем); отметку о заверении копии.

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

Chrome можно настроить так, чтобы специальные ссылки открывались с помощью соответствующих веб-служб. Хотя большинство ссылок служит для перехода на другие веб-страницы, существуют и такие, которые позволяют запускать программы и выполнять другие операции. Например, по ссылке mailto: открывается приложение для работы с электронной почтой, а webcal: позволяет добавлять мероприятия в календарь. Такие ссылки называются протоколами, а используемые ими программы – обработчиками. Многие современные веб-службы, в том числе Gmail и Календарь Google, могут выступать в роли обработчиков.

Например, если вы используете Gmail в браузере Chrome, вам может быть предложено открывать все ссылки на адреса электронной почты с помощью этой службы. Соответствующий запрос отображается вверху страницы Gmail. Если вы нажмете кнопку Использовать Gmail, то в следующий раз при переходе по ссылке на адрес электронной почты откроется окно Gmail. Если вы выберите Нет, то ссылки на адреса электронной почты будут открываться тем же способом, что и раньше.

Запросы на включение и отключение обработчиков
При посещении сайтов веб-служб вам может быть выдан запрос на установку обработчиков протоколов по умолчанию. Чтобы настроить отображение этих запросов в Chrome, выполните указанные ниже действия.

  1. Нажмите на значок гаечного ключа на панели инструментов браузера.
  2. Выберите Параметры (Настройки в Mac, Linux и Chrome OS) > Расширенные .
  3. Нажмите Настройки содержания .

  4. В появившемся диалоговом окне перейдите к разделу "Обработчики".

    • Чтобы веб-службы могли отображать запросы, выберите параметр "Разрешить сайтам запрашивать установку обработчиков протоколов по умолчанию".
    • Чтобы запросы не выводились, выберите параметр "Запретить сайтам обрабатывать протоколы".

    На странице "Настройки" можно выбрать, какие веб-службы использовать в качестве обработчиков.

Протокол (список завершений, латентных периодов и ранжировок) обрабатывается в пять этапов.

1. Расчет среднего латентного периода. Прежде чем вычислять среднее, следует исключить из подсчета латентные периоды, превышающие 50 секунд (их будет немного).

После этого вычисляется средний латентный период для оставшихся предложений.

2. Определение проблемных завершений по индикатору времени. Просматриваются предложения от первого до последнего и там, где латентный период конкретного предложения превышает более, чем на одну секунду средний латентный период, ставится буква «Т».

3. Определение проблемных завершений по индикатору содержания. Нужно определить проблемные и нейтральные предложения. Если наблюдается признак конфликта, рядом с предложением ставится «К».

Формальные признаки «конфликтных» завершений:

q наличие агрессии в завершении. Пример: «В школе мои учителя были... дураками и олухами»;

q наличие негативных эмоций в завершении. Пример: «Я бы мог быть очень счастливым, если бы... не родился на свет»;

q прямое указание на конфликт. Пример: «Если все против меня, то... я против всех»;

q наличие неопределенности и неуверенности в завершении, как прямо высказанной, так и подразумевающейся. Пример: «Мое будущее кажется мне... туманным, неопределенным»;

q отказ от ответа;

q «закрытые» или маскирующие завершения. Это случаи, когда есть основание заподозрить, что на месте данного завершения должно быть что-то другое, хотя формально и грамматически все правильно. Пример: «Я думаю, что мой отец редко... прыгает с парашютом».

4. Работа с ключами. В ключе указано, какие предложения относятся к каждой из сфер (в каждую сферу входят по четыре предложения).

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

В нижней области диаграммы фиксируют количество конфликтов в сферах, т.е. количество букв «Т» и «К» по каждой сфере (отдельно Т и К). Т-конфликты условно обозначаются «/», К-конфликты – «\»; пересечение Т- и К-конфликтов – как «X». В каждой сфере не может быть больше четырех конфликтов (максимальная высота столбиков в нижней диаграмме = 4), но сумма Т и К в отдельной сфере может быть больше четырех (максимально – 8). Часто бывает, что какое-то предложение имеет признаки конфликта и по времени, и по содержанию. Такое пересечение конфликтов обозначается на диаграмме пересечением условных обозначений Т и К. Пересекающиеся Т и К в одном предложении считаются как один конфликт. Эта область диаграммы дает информацию: 1) сколько вообще конфликтов в каждой сфере, 2) какие это конфликты и 3) насколько они пересекаются. Важно: это диаграмма количества, поэтому столбики в ней сплошные, т. е., даже если в какой-то сфере есть только конфликты в первом (по счету) и в последнем предложении, она выглядит как столбик из двух клеток без пробелов в середине.

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

Вот о чем пойдет речь:

Предыстория

Было это давно. Я тогда занимался разработкой системы визуализации больших графов. Писалась эта система на основе библиотеки ILOG JViews . Кстати, мощнейшая библиотека, но и сто ит соответственно. Вся графика там была организована на основе векторного формата SVG, что очень облегчало визуализацию, ибо при больших размерах графов для помещения всего содержимого на экран приходилось сильно менять масштаб, для чего растровая графика вообще не годилась.

Вот тут и выползла проблема. Если 250 узлов графа разложить по определенному алгоритму, а потом втиснуть в окошко пусть даже размером 500x500 – размеры этих узлов будут... как бы это сказать помягче?.. ну, небольшими. Где-нибудь 5х5 максимум. А чаще получалось так, что в них даже мышкой трудно попасть, не то, чтобы рассмотреть, что на них нарисовано и написано. А именно это и было самым важным, ибо система предназначалась для анализа и представления знаний. И у каждого объекта было название и иконка, определяемая типом объекта.

Решение напрашивалось само собой. Сделать всплывающую подсказку (tooltip). Тем более, что Java умеет интерпретировать текст подсказки в формате HTML. Но... Ладно, с текстом никаких проблем. А как быть с иконкой? Ее ведь надо указать в фрагменте HTML-текста этой подсказки. И загружаться она будет автоматически, где-то в недрах swing . То есть – в HTML-тексте надо указать графический файл, который Java сможет загрузить и отобразить. Однако формат SVG стандартная библиотека не понимает. Да, я могу сгенерировать файл сам, используя загруженные SVG-изображения, но... Куда его положить, чтобы указать в тексте подсказки URL? Ладно бы это было обычное приложение, но вся система была написана в виде апплета...

В общем, в тот момент это был тупик. Мы, конечно, выкрутились, сделали растровые копии всех векторных иконок и использовали их. Но это было некрасиво. А я не люблю некрасивых решений. И потому я продолжал искать выход.

Через какое-то время мне пришла в голову интересная мысль. А что, если указать в URL этого изображения нестандартный протокол и написать для него обработчик? Тогда все произойдет естественным образом, и я сам буду отвечать за то, какие данные выдавать.

Мысль здравая. Однако, ее реализация натолкнулась на банальный недостаток опыта. Я несколько запутался в документации, задача мне представлялась каким-то монстром. Реализация фабрик, обработчиков, прописывание свойств... Одним словом, я эту задачу отложил до лучших времен. Было это три года назад.

А где-то год назад выдались у меня свободные полдня. И я решил вернуться к этой задаче. В общем, полдня мне хватило. :) Тем не менее, вспомнив все сложности, которые у меня были раньше, я решил написать по этому поводу статью.

Итак, предыстория окончена, перейдем к делу.

URL, протоколы и обработчики

Обращение к ресурсам в Java осуществляется через класс java.net.URL . Этот класс представляет собой реализацию понятия Uniform Resource Locator . Его синтаксис определен . И одной из частей URL является протокол.

Протоколов существует великое множество. Более чем уверен, что вы имели дело с http и ftp . Существуют также nntp , gopher , mailto и много других. Все они отличаются друг от друга – форматом обмена данными прежде всего. Возникает резонный вопрос: каким образом класс java.net.URL обрабатывает все эти протоколы?

Ответ простой. А никаким! java.net.URL вообще этим не занимается. Обработка протокола – это конкретика. И занимается этим соответствующий класс. Или классы. java.net.URL только обеспечивает загрузку соответствующего обработчика и передает ему управление всякий раз, когда это необходимо.

Итак, существуют два абстрактных класса, которые использует java.net.URL – java.net.URLStreamHandler и java.net.URLConnection . Первый из них отвечает за соединение с соответствующим ресурсом (в версии Java 5.0 может использовать прокси-сервер). Второй – за непосредственный обмен с ресурсом и получение данных. Собственно, эти два класса и надо реализовать для реализации поддержки протокола.

Однако, кроме реализации обработчика надо еще и дать понять классу java.net.URL , где этот обработчик искать. Об этом – в следующей части.

Регистрация обработчика

Каким образом java.net.URL вообще ищет обработчик для протокола?

Во-первых, проверяется наличие реализации интерфейса java.net.URLStreamHandlerFactory . Этот интерфейс содержит всего один метод, возвращающий реализацию java.net.URLStreamHandler , соответствующую переданному ему протоколу.

Недостаток этого способа в том, что реализация java.net.URLStreamHandlerFactory может быть установлена только один раз. Соответственно, совсем не факт, что нам удасться установить собственную.

Во-вторых, если реализация java.net.URLStreamHandlerFactory не найдена, или если она возвращает null для переданного ей протокола, делается попытка прочитать системное свойство java.protocol.handler.pkgs . Это свойство содержит список пакетов, в которых находятся обработчики протоколов. Разделителем в этом списке является "|" . Для каждого имени пакета, указанного в этом списке, делается попытка загрузить класс с именем <имя пакета>.<имя протокола>.Handler .

Если класс не обработчика не найден в указаных пакетах, или свойство не установлено – обработчик ищется в системном пакете. Его имя – sun.net.www.protocol . Соответственно, класс обработчика для протокола http имеет имя sun.net.www.protocol.http.Handler , для ftp – sun.net.www.protocol.ftp.Handler и т.д. Гарантированно существование обработчиков для протоколов http , https , ftp , file и jar .

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

Именно этот способ мы и будем использовать для регистрации обработчика. Имя пакета – ru.skipy.net.protocol , его надо указать в системном свойстве java.protocol.handler.pkgs . Имя протокола – jarres . Соответственно, имя класса обработчика будет ru.skipy.net.protocol.jarres.Handler .

Теперь на очереди...

Реализация обработчика

Для начала хочу сказать пару слов. Прежде всего, это иллюстрация именно реализации протокола. И именно на этом заострено внимание. Я не хотел перегружать пример, и делать генерацию изображения на лету (собственно, то, из чего выплыла задача) я не стал. Это можно сделать, к примеру, с помощью Java Image IO (javax.imageio.*), и проблем тут особых возникнуть не должно.

А потому – изображение я загружаю из jar-файла, как ресурс. В принципе, я могу делать это любым другим способом, суть от этого не меняется. Собственно, отсюда и название протокола – jarres (JAR RESource).

Итак, начнем с реализации URLStreamHandler . Роль этого класса – он "знает", как создать соединение с ресурсом, на который ссылается переданный его методу openConnection экземпляр класса java.net.URL . В нашем случае этот метод только создает экземпляр нашего же наследника URLConnection – JarResourceURLConnection . Как я уже упоминал, имя этого класса должно оканчиваться на jarres.Handler , а начало может быть произвольным (его просто надо указать в системном свойстве), в нашем случае – ru.skipy.net.protocol:

package import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; /** * URLStreamHandler for jarres protocol * * @author Eugene Matyushkin * @version 1.0 */ public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL url) throws IOException { return new JarResourceURLConnection(url); } }

Как видите – все предельно просто. Поэтому перейдем к непосредственно JarResourceURLConnection . Во-первых, мы обязаны реализовать его метод connect , по той простой причине, что он абстрактный. Этот метод должен начинать обмен данными с ресурсом (посылать запрос, если это необходимо) и подготавливать чтение данных. Далее, если мы хотим читать данные, то нам надо реализовать getInputStream , потому как имеющаяся реализация просто бросает исключение UnknownServiceException .

Итак, JarResourceURLConnection выглядит следующим образом (несущественные методы и комментарии опущены):

package ru.skipy.net.protocol.jarres; import java.io.*; import java.net.URL; import java.net.URLConnection; /** * URLConnection implementation for jarres protocol. * * @author Eugene Matyushkin * @version 1.0 */ public class JarResourceURLConnection extends URLConnection { private String resourcePath; private boolean connected = false ; private InputStream is = null ; JarResourceURLConnection(URL url) { super (url); resourcePath = url.getPath(); } public synchronized void connect() throws IOException { if (connected) return ; byte data = readData(); is = (data == null ) ? null : new ByteArrayInputStream(data); connected = true ; } private byte readData() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream resourceStream = getClass().getResourceAsStream(resourcePath); if (resourceStream == null ) return null ; DataInputStream dis = new DataInputStream(resourceStream); byte buffer = new byte ; while (true ) { int readed = dis.read(buffer); if (readed == -1) break ; if (readed > 0) baos.write(buffer, 0, readed); } return baos.toByteArray(); } public synchronized InputStream getInputStream() throws IOException { connect(); if (is == null ) throw new FileNotFoundException(resourcePath); return is; } }

Небольшие комментарии. В методе connect читаются данные (если есть, что читать, а то ведь url может быть неправильным). Если данные прочитаны – создается BytaArrayInputStream .

Метод getInputStream возвращает поток, из которого клиентский код будет читать данные. Если данные прочитаны быть не могут – выбрасывается исключение FileNotFoundException .

Хочу обратить внимание на вызов connect в методе getInputStream . Теоретически клиентский код должен явно вызывать connect , и только после этого – getInputStream . Во всяком случае именно так я понимаю документацию. Практически же этого не происходит. Если вы закомментируете этот вызов, изображение не будет появляться на всплывающей подсказке.

Собственно, это всё. Реализация окончена. Осталось всё это только запустить. Для этого есть маленький тестовый пример. Весь его код я приводить не буду. Единственное, что там интересно – это обращение к ресурсу, в html-содержимом подсказки:

public static final String TOOLTIP_TEXT = "
IMAGE below!
" + "
"
;

Как видите, в url опущено имя хоста. Оно должно следовать за "jarres://" . В данном случае оно не используется, однако его можно было бы использовать, если бы ресурсы, например, хранились в нескольких zip-файлах. Тогда имя хоста можно было бы расценивать как имя файла, из которого должен быть загружен ресурс. Оставшаяся часть url – "/resources/images/vzhik2.gif" – как раз и представляет собой путь к ресурсу, который используется для его загрузки.

Запуск примера

Полный код, со всеми комментариями, можно взять тут: protocolHandler.zip . Как обычно, вместе с кодом лежит build-файл для ant . По умолчанию он настроен на запуск примера (т.е. запустить пример можно с помощью команды ant в корне примера). Если кому-то захочется сгенерировать документацию – это можно сделать с помощью команды ant javadoc .

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

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

Теоретически это свойство вообще можно устанавливать в приложении – через System.setProperty(String,String) . Однако я бы не рекомендовал этого делать. Во-первых, это совершенно неочевидно. И если не будет отражено в документации, то пользователь этого кода может с чистой совестью установить это свойство в то, что нужно ему. Потом это значение будет переписано – и разработчик тихо сойдет с ума, пытаясь понять, почему его код не работает. А если даже это описать в документации... Общеизвестно, что документация читается в самую последнюю очередь. А иногда не читается принципиально.

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

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

Спасибо за внимание! Если я где-то неправ – пишите!