{"id":8162,"date":"2025-05-16T09:00:36","date_gmt":"2025-05-16T07:00:36","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=8162"},"modified":"2025-05-16T09:01:01","modified_gmt":"2025-05-16T07:01:01","slug":"hook-contracts","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/","title":{"rendered":"Hook Contracts"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Wprowadzenie\" >Wprowadzenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Opis\" >Opis<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Dzialanie_hookow\" >Dzia\u0142anie hook\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Obiekty_deweloperskie_infrastruktury_Hook\" >Obiekty deweloperskie infrastruktury Hook<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Definicje_i_implementacje_Hook_Contract\" >Definicje i implementacje Hook Contract<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Definicje_Hook_Contract\" >Definicje Hook Contract<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Implementacje_Hook_Contract\" >Implementacje Hook Contract<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Rozszerzalnosc_definicji_hook_contract\" >Rozszerzalno\u015b\u0107 definicji hook contract<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Hooki\" >Hooki<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Hooki_bezstanowe\" >Hooki bezstanowe<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Implementacje\" >Implementacje<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Generics\" >Generics<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Hooki_z_obsluga_stanow\" >Hooki z obs\u0142ug\u0105 stan\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Centralne_interfejsy_hook\" >Centralne interfejsy hook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Klasy_bazowe_hookow\" >Klasy bazowe hook\u00f3w<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#CisHookManager\" >CisHookManager<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Wywolywanie_metod_hook\" >Wywo\u0142ywanie metod hook<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#_Zarzadzanie_hookami_z_obsluga_stanow\" >\u00a0Zarz\u0105dzanie hookami z obs\u0142ug\u0105 stan\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Hooki_w_hierarchiach_dziedziczenia\" >Hooki w hierarchiach dziedziczenia<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Okreslanie_klasy_kontekstu\" >Okre\u015blanie klasy kontekstu<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Wskazowki_dotyczace_rozwoju\" >Wskaz\u00f3wki dotycz\u0105ce rozwoju<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Weryfikacja_ograniczen\" >Weryfikacja ogranicze\u0144<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/hook-contracts\/#Zaleznosc_instalacji\" >Zale\u017cno\u015b\u0107 instalacji<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3 id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span>Wprowadzenie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Hook to technologia interfejsu w Comarch ERP Enterprise, kt\u00f3ra mo\u017ce by\u0107 u\u017cywana do rozszerzania istniej\u0105cego kodu programu w spos\u00f3b bezpieczny i bezkonfliktowy. Hooki s\u0105 u\u017cywane, je\u015bli dodatkowe kontrole funkcjonalne musz\u0105 by\u0107 przeprowadzone dla rozszerzenia obiektu biznesowego w dostosowaniu lub aplikacji, kt\u00f3ra rozszerza standardowy kod, kt\u00f3ry uzupe\u0142nia istniej\u0105ce kontrole w standardzie.<\/p>\n<p>W przeciwie\u0144stwie do zamiennik\u00f3w, istniej\u0105cy kod programu mo\u017ce by\u0107 wielokrotnie rozszerzany niezale\u017cnie od siebie za pomoc\u0105 hook\u00f3w.<\/p>\n<h3 id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Programi\u015bci<\/li>\n<\/ul>\n<h3 id=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"dzialanie-hookow\" ><span class=\"ez-toc-section\" id=\"Dzialanie_hookow\"><\/span>Dzia\u0142anie hook\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Hooki s\u0105 interfejsami pomi\u0119dzy dostawc\u0105 hook\u00f3w a ich u\u017cytkownikami. Dostawca hook\u00f3w definiuje metody w interfejsie Java (hook), kt\u00f3re wywo\u0142uje w okre\u015blonych sytuacjach. U\u017cytkownik hooka implementuje wymagane hooki.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Aby umo\u017cliwi\u0107 rozszerzenie kontroli funkcjonalnej za pomoc\u0105 hook\u00f3w, dostawca hook\u00f3w definiuje metod\u0119<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void validateUpdate(...)<\/code><\/p>\n<p>i wywo\u0142uje t\u0119 metod\u0119 hooka opr\u00f3cz istniej\u0105cej kontroli technicznej.<\/p>\n<p>U\u017cytkownik hooka zapewnia implementacj\u0119 metody. W implementacji metody u\u017cytkownik hooka przeprowadza kontrole i wysy\u0142a komunikaty do kolejki komunikat\u00f3w programu w przypadku wyst\u0105pienia b\u0142\u0119du.<\/div><\/section>\n<p>Dostawca hook\u00f3w udost\u0119pnia dane jako cz\u0119\u015b\u0107 interfejsu implementacji poprzez parametry metody hooka.<\/p>\n<p>Ze wzgl\u0119du na kierunek wywo\u0142ania od dostawcy hooka do u\u017cytkownika, kontrola procesu pozostaje po stronie dostawcy hooka. Implementacje hook\u00f3w mog\u0105 wp\u0142ywa\u0107 na dostawc\u0119 hook\u00f3w tylko w zakresie zdefiniowanego interfejsu.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Je\u015bli u\u017cytkownik hooka wy\u015ble komunikat o b\u0142\u0119dzie do kolejki komunikat\u00f3w programu w metodzie validateUpdate(), uniemo\u017cliwi to zapisanie obiektu. U\u017cytkownik hooka nie mo\u017ce jednak pomin\u0105\u0107 innych kontroli ani wykona\u0107 innych dzia\u0142a\u0144 dla jednostki biznesowej, poniewa\u017c hook nie zapewnia takiej opcji.<\/div><\/section>\n<p>Hook mo\u017cna zaimplementowa\u0107 wielokrotnie, dzi\u0119ki czemu przyk\u0142adowo sprawdzenie jednostki biznesowej mo\u017cna r\u00f3wnie\u017c utworzy\u0107 w innej aplikacji.<\/p>\n<p>Dost\u0119pne hooki i ich implementacje s\u0105 przechowywane w oddzielnych obiektach deweloperskich. Definicja Hook Contract zawiera oferowane hooki, podczas gdy zaimplementowane hooki s\u0105 wymienione w implementacji Hook Contract.<\/p>\n<h4 id=\"obiekty-deweloperskie-infrastruktury-hook\" ><span class=\"ez-toc-section\" id=\"Obiekty_deweloperskie_infrastruktury_Hook\"><\/span>Obiekty deweloperskie infrastruktury Hook<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 id=\"definicje-i-implementacje-hook-contract\" ><span class=\"ez-toc-section\" id=\"Definicje_i_implementacje_Hook_Contract\"><\/span>Definicje i implementacje Hook Contract<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6 id=\"definicje-hook-contract\" ><span class=\"ez-toc-section\" id=\"Definicje_Hook_Contract\"><\/span>Definicje Hook Contract<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Definicja Hook Contract zawiera powi\u0105zane hooki, np. wszystkie hooki na poziomie jednostki biznesowej dla okre\u015blonej jednostki biznesowej. Jednak hooki z warstw logiki i dialogu dla tej samej jednostki biznesowej powinny by\u0107 zawarte w oddzielnych definicjach Hook Contract.<\/p>\n<p>Hooki s\u0105 zwalniane do implementacji tylko przez definicj\u0119 Hook Contract.<\/p>\n<p>Definicje Hook Contract\u00a0 s\u0105 obiektami deweloperskimi typu <em>Hook Contract<\/em>, podtyp <em>Definicja Hook Contract<\/em> (XML: HOOK_DEFINITION). Jest to typ obiektu deweloperskiego XML. Dok\u0142adny opis element\u00f3w XML mo\u017cna znale\u017a\u0107 w artykule<a href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/obiekty-deweloperskie\/\"><em> Obiekty deweloperskie<\/em><\/a>.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad definicji Hook Contract, kt\u00f3ra zwalnia hook stanowy (HookState) i hook bezstanowy:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n\n&lt;HookContract xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"HookXMLSchema.xsd\"&gt;.\n\n&lt;HOOK_DEFINITION&gt;\n\n&lt;contextClass&gt;com.cisag.app.general.log.CountryEntity\n&lt;\/contextClass&gt;\n\n&lt;hookState&gt;\n\n&lt;interface&gt;com.cisag.app.general.hook.log.SingleObjectEntityState\n&lt;\/interface&gt;.\n\n&lt;\/hookState&gt;\n\n&lt;hook&gt;\n\n&lt;interface&gt;com\u00a0 .cisag.app.general.hook.log.SingleObjectValidateUpdateHook &lt;\/interface&gt;\n\n&lt;\/hook&gt;\n\n&lt;\/HOOK_DEFINITION&gt;\n\n&lt;\/HookContract&gt;<\/pre>\n<p>Klasa kontekstu (contextClass) s\u0142u\u017cy do identyfikacji definicji Hook Contract z kodu Java dostawcy hooka. Nale\u017cy u\u017cy\u0107 klasy, kt\u00f3rej zachowanie mo\u017ce zosta\u0107 rozszerzone przez hook.<\/div><\/section>\n<p>Hook mo\u017ce by\u0107 r\u00f3wnie\u017c zwolniony w kilku definicjach Hook Contract. Implementacja hooka zawsze odnosi si\u0119 do definicji Hook Contract. Na przyk\u0142ad, te same hooki s\u0105 cz\u0119sto u\u017cywane na poziomie logiki SingleObjectEntities. Jednak w ka\u017cdym przypadku definicja Hook Contract odnosi si\u0119 do jednego SingleObjectEntity.<\/p>\n<h6 id=\"implementacje-hook-contract\" ><span class=\"ez-toc-section\" id=\"Implementacje_Hook_Contract\"><\/span>Implementacje Hook Contract<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Aby zaimplementowa\u0107 hook, opr\u00f3cz jego implementacji (klasa Java) wymagana jest implementacja Hook Contract. Wszystkie hooki, kt\u00f3re maj\u0105 zosta\u0107 zaimplementowane i odpowiednia klasa implementacji s\u0105 okre\u015blone w implementacji Hook Contract.<\/p>\n<p>Dowolny podzbi\u00f3r oferowanych hook\u00f3w mo\u017ce zosta\u0107 zaimplementowany w celu wdro\u017cenia Hook Contract. Nie jest zatem konieczne implementowanie wszystkich hook\u00f3w.<\/p>\n<p>Implementacja Hook Contract jest obiektem programistycznym typu <em>Hook Contract<\/em>, podtyp <em>Hook Contract Implementation<\/em> (XML: &#8222;HOOK_IMPLEMENTATION&#8221;).<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Przyk\u0142ad implementuje oba hooki z powy\u017cszej definicji hook contract:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">&lt;?xml version=\u201d1.0\u2033 encoding=\u201dUTF-8\u2033?&gt;\n\n&lt;HookContract xmlns:xsi=\u201dhttp:\/\/www.w3.org\/2001\/XMLSchema-instance\u201d xsi:noNamespaceSchemaLocation=\u201dHookXMLSchema.xsd\u201d&gt;\n\n&lt;HOOK_DEFINITION&gt;\n\n&lt;contextClass&gt;com.cisag.app.general.log.CountryEntity\n&lt;\/contextClass&gt;\n\n \n\n&lt;hookState&gt;\n\n&lt;interface&gt;com.cisag.app.general.hook.log.SingleObjectEntityState\n&lt;\/interface&gt;\n\n&lt;\/hookState&gt;\n\n \n\n&lt;hook&gt;\n\n&lt;interface&gt;com.cisag.app.general.hook.log.SingleObjectValidateUpdateHook\n&lt;\/interface&gt;\n\n&lt;\/hook&gt;\n\n&lt;\/HOOK_DEFINITION&gt;\n\n&lt;\/HookContract&gt;<\/pre>\n<p><\/div><\/section>\n<p>Implementacja Hook Contract zawsze implementuje dok\u0142adnie jedn\u0105 jego definicj\u0119. Je\u015bli dla danego zadania musz\u0105 zosta\u0107 zaimplementowane r\u00f3\u017cne definicje hook contract, dla ka\u017cdej z nich wymagana jest osobna implementacja.<\/p>\n<p>Poni\u017csze zasady maj\u0105 zastosowanie do wielu implementacji:<\/p>\n<ul>\n<li>ten sam hook mo\u017ce by\u0107 zaimplementowany kilka razy w implementacji hook contract. Ma to jednak zastosowanie tylko w szczeg\u00f3lnych przypadkach, na przyk\u0142ad gdy wymagane s\u0105 r\u00f3\u017cne ograniczenia hook\u00f3w.<\/li>\n<li>w adaptacji lub aplikacji mo\u017cliwe jest utworzenie kilku implementacji hook contract dla tej samej definicji. Ma to jednak zastosowanie tylko wtedy, gdy nale\u017cy podzieli\u0107 obiekty programistyczne w ramach wi\u0119kszej adaptacji lub aplikacji.<\/li>\n<li>hook stanowy z definicji hook contract mo\u017ce zosta\u0107 zaimplementowany tylko raz w adaptacji (prefiks programistyczny) lub aplikacji. Je\u015bli istniej\u0105 inne implementacje definicji hook contract, implementacja hooka stanowego jest r\u00f3wnie\u017c tam dost\u0119pna (zak\u0142adaj\u0105c odpowiedni parametr metody).<\/li>\n<\/ul>\n<h6 id=\"rozszerzalnosc-definicji-hook-contract\" ><span class=\"ez-toc-section\" id=\"Rozszerzalnosc_definicji_hook_contract\"><\/span>Rozszerzalno\u015b\u0107 definicji hook contract<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Opublikowana definicja hook contract mo\u017ce zosta\u0107 rozszerzona wy\u0142\u0105cznie poprzez wprowadzenie nowych hook\u00f3w. Istniej\u0105ce hooki nie mog\u0105 by\u0107 zmieniane retrospektywnie, tj. metody nie mog\u0105 by\u0107 zmieniane, usuwane lub dodawane.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Hook nie mo\u017ce zosta\u0107 usuni\u0119ty z definicji hook contract, nawet je\u015bli jego interfejs okaza\u0142 si\u0119 niekompletny lub wadliwy. Wszystkie istniej\u0105ce punkty wywo\u0142ania musz\u0105 zosta\u0107 zachowane (wyj\u0105tki, patrz Przestarza\u0142e poni\u017cej).<\/div><\/section>\n<p>W takim przypadku definicje hook contract powinny zosta\u0107 uzupe\u0142nione o nowy hook. Interfejs Java nowego hooka nie mo\u017ce jednak dziedziczy\u0107 po starym hooku ani powiela\u0107 metod starego hooka. W razie potrzeby implementacje hook\u00f3w mog\u0105 jednocze\u015bnie korzysta\u0107 z metod starego i nowego hooaka.<\/p>\n<p>Przestarza\u0142e znaczniki s\u0105 mo\u017cliwe w definicjach um\u00f3w hook\u00f3w (znacznik <em>Rejected<\/em> na obiekcie deweloperskim) i hook\u00f3w (adnotacja <em>@Deprecated<\/em> w kodzie Java). Obiekty deweloperskie mo\u017cna nast\u0119pnie usun\u0105\u0107 w kolejnym wydaniu. Jednak przestarza\u0142e znaczniki powinny pozosta\u0107 wyj\u0105tkiem dla definicji hook contract, hook\u00f3w i stan\u00f3w hook\u00f3w, poniewa\u017c pogarszaj\u0105 one bezpiecze\u0144stwo wydania.<\/p>\n<h5 id=\"hooki\" ><span class=\"ez-toc-section\" id=\"Hooki\"><\/span>Hooki<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Hooki s\u0105 interfejsami Java w przestrzeniach nazw dostawcy hook\u00f3w. Istniej\u0105 hooki:<\/p>\n<ul>\n<li>bezstanowe<\/li>\n<li>stanowe<\/li>\n<\/ul>\n<p>Hook jest zaimplementowany w klasie Java, kt\u00f3ra sama implementuje jego interfejs. Ka\u017cda implementacja hooka musi by\u0107 wymieniona w implementacji Hook Contract.<\/p>\n<h6 id=\"hooki-bezstanowe\" ><span class=\"ez-toc-section\" id=\"Hooki_bezstanowe\"><\/span><span style=\"color: #000000;\">Hooki bezstanowe<\/span><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Hooki bezstanowe zawieraj\u0105 metody hook\u00f3w, kt\u00f3re s\u0105 wywo\u0142ywane przez dostawc\u0119 hook\u00f3w w okre\u015blonych sytuacjach. Hooki bezstanowe rozszerzaj\u0105 interfejs <code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">com.cisag.pgm.base.Hook<\/code>.<\/p>\n<p>Implementacje musz\u0105 by\u0107 <em>CisFactory-Singletons<\/em>\u00a0 i posiada\u0107 domy\u015blny konstruktor. Ich czas \u017cycia jest zazwyczaj kr\u00f3tki. S\u0105 one generowane przez silnik systemu, gdy tylko dostawca hook\u00f3w wywo\u0142a odpowiednie metody w <code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">CisHookManager<\/code>.<\/p>\n<p>Mo\u017cliwe jest zaimplementowanie kilku hook\u00f3w w tej samej klasie Java.<\/p>\n<p><strong>Kolejno\u015b\u0107 wywo\u0142a\u0144<\/strong><\/p>\n<p>Hook mo\u017ce by\u0107 implementowany wielokrotnie. Metody hook\u00f3w s\u0105 zwykle wywo\u0142ywane kolejno we wszystkich implementacjach, chyba \u017ce dla danego hooka przewidziano inn\u0105 procedur\u0119.<\/p>\n<p>Kolejno\u015b\u0107 wywo\u0142a\u0144 jest okre\u015blana przez silnik systemowy i nie mo\u017ce by\u0107 modyfikowana przez implementacje hook\u00f3w. Nie jest zdefiniowana \u017cadna konkretna kolejno\u015b\u0107 wywo\u0142a\u0144 dla implementacji hook\u00f3w.<br data-start=\"399\" data-end=\"402\" \/>Z tego powodu r\u00f3\u017cne implementacje tej samej metody hooka nie powinny by\u0107 od siebie zale\u017cne.<\/p>\n<p><strong>Parametry metod<\/strong><\/p>\n<p>Parametry metod hook\u00f3w stanowi\u0105 cz\u0119\u015b\u0107 interfejsu. Dane dostawcy hook\u00f3w, do kt\u00f3rych implementacja hooka ma mie\u0107 dost\u0119p, s\u0105 przekazywane jako parametry.<\/p>\n<p data-start=\"176\" data-end=\"230\">Najcz\u0119\u015bciej u\u017cywane parametry w metodach hook\u00f3w:<\/p>\n<ul data-start=\"232\" data-end=\"1004\">\n<li class=\"\" data-start=\"232\" data-end=\"785\">widok obiektu zawiera dane jednostki biznesowej. Niekt\u00f3re dane wewn\u0119trzne mog\u0105 nie by\u0107 zawarte w widoku obiektu. Widoki obiekt\u00f3w mog\u0105 mie\u0107 nast\u0119puj\u0105ce poziomy dost\u0119pu:\n<ul data-start=\"212\" data-end=\"428\">\n<li class=\"\" data-start=\"212\" data-end=\"274\">tylko do odczytu<\/li>\n<\/ul>\n<ul data-start=\"232\" data-end=\"1004\">\n<li class=\"\" data-start=\"232\" data-end=\"785\">ograniczona mo\u017cliwo\u015b\u0107 zapisu &#8211; pozwala na zapis tylko atrybutu z rozszerze\u0144 jednostek biznesowych z w\u0142asnym prefiksem deweloperskim.<\/li>\n<li class=\"\" data-start=\"232\" data-end=\"785\">nieograniczona mo\u017cliwo\u015b\u0107 zapisu<\/li>\n<\/ul>\n<\/li>\n<li>\n<article class=\"text-token-text-primary w-full\" dir=\"auto\" data-testid=\"conversation-turn-56\" data-scroll-anchor=\"true\">\n<div class=\"text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group\/turn-messages focus-visible:outline-hidden\" tabindex=\"-1\">\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"relative flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"be3959c0-c005-446a-9346-8bb60f0443b6\" data-message-model-slug=\"gpt-4o\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light\">\n<p class=\"\" data-start=\"0\" data-end=\"32\">Instancja hooka z obs\u0142ug\u0105 stan\u00f3w<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-start\">\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/li>\n<\/ul>\n<p><strong>Izolacja kolejki komunikat\u00f3w programu<\/strong><\/p>\n<p>Ka\u017cda implementacja hooka jest odizolowana od komunikat\u00f3w z innych implementacji tego samego hooka w ramach wywo\u0142ania metody. Oznacza to, \u017ce komunikaty z innych hook\u00f3w, a tak\u017ce od samego dostawcy hooka, nie s\u0105 widoczne w implementacji hooka. Ta izolacja jest wykonywana automatycznie przez silnik systemu.<\/p>\n<p><strong>Wyj\u0105tki w metodach hook<\/strong><\/p>\n<p>Metody hook nie powinny przewidywa\u0107 wyj\u0105tk\u00f3w w swoim interfejsie. Wyj\u0105tki mog\u0105 by\u0107 zg\u0142aszane przez implementacj\u0119 hook tylko w przypadku b\u0142\u0119d\u00f3w programistycznych. W przypadku wyst\u0105pienia wyj\u0105tku, wywo\u0142anie wszystkich implementacji hooka dla tego samego wywo\u0142ania hooka zostaje przerwane.<\/p>\n<p><span style=\"color: #000000;\"><strong>Ograniczenia hook<\/strong><\/span><\/p>\n<p>Bezstanowe hooki mog\u0105 by\u0107 dostarczane z ograniczeniem hooka. Jego ograniczenie powoduje wywo\u0142anie implementacji hooka z dodatkowymi warunkami. Podczas wywo\u0142ywania hooka, dostawca hooka okre\u015bla obiekty deweloperskiego jako ograniczenie hooka. Infrastruktura hook\u00f3w wybiera do wywo\u0142ania tylko te implementacje hooka, kt\u00f3re u\u017cywaj\u0105 tych samych obiekt\u00f3w deweloperskich jako ograniczenie. Klasy Java (Java Class), obiekty biznesowe (Business object), logiczne typy danych (logical data type), widoki obiekt\u00f3w (Data view) i aplikacje (Application) mog\u0105 by\u0107 u\u017cywane jako obiekty deweloperskie.<\/p>\n<p>Ograniczenie hooka jest okre\u015blone w XML definicji hook contract i implementacji hook contract dla hooku, kt\u00f3ry ma by\u0107 ograniczony. Typ i identyfikator s\u0105 okre\u015blone dla ka\u017cdego obiektu deweloperskiego w definicji hook contract:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">&lt;hook&gt;\n\n\u2026\n\n&lt;interface&gt;\u2026&lt;\/interface&gt;\n\n&lt;restriction&gt;\n\n&lt;businessObject id=\u201dobjectClass\u201d\/&gt;\n\n&lt;\/restriction&gt;\n\nIn der Hook-Contract-Implementierung muss nun das Business Object selbst angegeben werden:\n\n&lt;hook&gt;\n\n\u2026\n\n&lt;interface&gt;\u2026&lt;\/interface&gt;\n\n&lt;restriction&gt;\n\n&lt;businessObject id=\u201dobjectClass\u201d&gt;\n\ncom.cisag.app.production.obj.ProductionItem\n&lt;\/businessObject&gt;\n\n&lt;\/restriction&gt;\n\n&lt;implementation&gt;\u2026&lt;\/implementation&gt;<\/pre>\n<p>Implementacja hook oznaczona w ten spos\u00f3b jest wywo\u0142ywana tylko wtedy, gdy dostawca hooka okre\u015bla ten sam obiekt biznesowy (<em>Business Object<\/em>)podczas jego wywo\u0142ywania.<\/p>\n<p>Ograniczenia hook\u00f3w s\u0105 szczeg\u00f3lnie przydatne w definicjach hook contract, kt\u00f3re maj\u0105 zastosowanie do wielu jednostek biznesowych. Przyk\u0142adem takich zastosowa\u0144 s\u0105 BIS-Hooks.<\/p>\n<p>Wi\u0119cej informacji na temat sprawdzania ogranicze\u0144 mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#wdz\">Wskaz\u00f3wki dotycz\u0105ce rozwoju<\/a>.<\/em><\/p>\n<p>Sk\u0142adnia XML:<\/p>\n<p>Definicja pojedynczego ograniczenia w definicji hook contract:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;restriction type id=\"identifier\" [optional=\"boolean\"]\/&gt;<\/code><\/p>\n<p>Dozwolone typy ogranicze\u0144:<\/p>\n<ul>\n<li>javaClass\u00a0dla klas Java<\/li>\n<li>dataView dla widok\u00f3w obiekt\u00f3w<\/li>\n<li>businessObject dla obiekt\u00f3w biznesowych<\/li>\n<li>logicalDatatype dla logicznych typ\u00f3w danych<\/li>\n<li>Application dla aplikacji<\/li>\n<\/ul>\n<p>Identyfikator musi by\u0107 unikalny w ramach bloku ogranicze\u0144.<\/p>\n<p>Atrybut <em>optional <\/em>wskazuje, czy ograniczenie jest opcjonalne (<em>true<\/em>), czy nie (<em>false<\/em>). Je\u015bli nie zostanie okre\u015blony, ograniczenie jest domy\u015blnie wymagane.<\/p>\n<p>Definicja pojedynczego ograniczenia w implementacji hook contract:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;restriction type id=\"identifier\"&gt;\n\n\u00a0\u00a0\u00a0 Nazwa obiektu deweloperskiego\n\n&lt;\/restriction type&gt;<\/pre>\n<p>Zamiast okre\u015blonego obiektu deweloperskiego mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 symbolu wieloznacznego &#8222;*&#8221;. Wi\u0119cej informacji na temat sprawdzania ogranicze\u0144 mo\u017cna znale\u017a\u0107 w rozdziale <em><a href=\"#wdz\">Wskaz\u00f3wki dotycz\u0105ce rozwoju<\/a>.<\/em><\/p>\n<h5 id=\"implementacje\" ><span class=\"ez-toc-section\" id=\"Implementacje\"><\/span>Implementacje<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Poni\u017cszy przyk\u0142ad przedstawia implementacj\u0119 hooka z dost\u0119pem do hooka stanowego udost\u0119pnianego przez widok obiektu.<\/p>\n<p>Implementacje hooka bezstanowego <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">HookImpl<\/code> i hooka stanowego <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">StateImpl<\/code>, s\u0105 zaimplementowane w tej samej adaptacji lub w tej samej aplikacji. Za pomoc\u0105 pomocniczej metody <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">getState()<\/code> implementacja hooka uzyskuje dost\u0119p do \u201eswojej\u201d implementacji hooka z obs\u0142ug\u0105 stan\u00f3w.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">public class HookImpl implements SingleObjectValidateUpdateHook {\n private final CisHookManager hm = CisEnvironment.\n getInstance().getHookManager();\n @Override\n public void validateUpdate( CountryView view) {\n CountryHookStateImpl hookState = hm.getState(\n view.getHookState(), CountryHookStateImpl.class);\n \/\/ method implementation\n }\n} <\/pre>\n<h5 id=\"generics\" id=\"generics\" ><span class=\"ez-toc-section\" id=\"Generics\"><\/span>Generics<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Hooki, kt\u00f3re s\u0105 u\u017cywane w kilku definicjach hook contract, cz\u0119sto okre\u015blaj\u0105 widoki obiekt\u00f3w jako parametry og\u00f3lne, aby m\u00f3c abstrahowa\u0107 od konkretnej jednostki biznesowej definicji hook contract. W implementacji takiego hooka parametry generyczne powinny zosta\u0107 zinstancjonowane w odniesieniu do widoku obiektu odpowiadaj\u0105cego danej definicji hook contract.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Poni\u017cszy hook jest oferowany przez definicj\u0119 hook contract <em>Country:<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">interface\u00a0SingleObjectValidateUpdateHook&lt;V\u00a0extends\u00a0DataView&lt;?&gt;&gt;<\/pre>\n<p>Poniewa\u017c hook jest r\u00f3wnie\u017c u\u017cywany w innych definicjach hook contract, zamiast CountryView okre\u015blono tylko DataView&lt;?&gt;. W implementacji hook contract dla definicji hook contract <em>Country<\/em> nale\u017cy teraz okre\u015bli\u0107 <em>CountryView<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public\u00a0class\u00a0CountryHookImplementation\u00a0implements\nSingleObjectValidateUpdateHook&lt;CountryView&gt;<\/pre>\n<p><\/div><\/section>\n<h6 id=\"hooki-z-obsluga-stanow\" ><span class=\"ez-toc-section\" id=\"Hooki_z_obsluga_stanow\"><\/span>Hooki z obs\u0142ug\u0105 stan\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Hooki stanowe (HookState) daj\u0105 ich u\u017cytkownikom mo\u017cliwo\u015b\u0107 utrzymywania stanu pomi\u0119dzy kilkoma wywo\u0142aniami hook\u00f3w. Na przyk\u0142ad, dane zale\u017cne lub inny stan aplikacji mog\u0105 by\u0107 przechowywane w HookState. Hooki stanowe rozszerzaj\u0105 interfejs <em>com.cisag.pgm.base.HookState<\/em>.<\/p>\n<p>W wi\u0119kszo\u015bci przypadk\u00f3w hooki stanowe nie maj\u0105 metod, ale s\u0105 dost\u0119pne w metodach hook\u00f3w bezstanowych. Jednak hook stanowy jest zwykle zawarty w widoku obiektu.<\/p>\n<p>Hooki stanowe maj\u0105 zdefiniowany cykl \u017cycia. Implementacje s\u0105 tworzone przez silnik systemu i zarz\u0105dzane przez dostawc\u0119 hooak\u00f3w. Od dostawcy hook\u00f3w zale\u017cy, ile obiekt\u00f3w klasy implementacji jest faktycznie tworzonych. Oddzielny obiekt HookState jest tworzony dla ka\u017cdej instancji aplikacji dialogowej.<\/p>\n<p>Je\u015bli hook z obs\u0142ug\u0105 stan\u00f3w deklaruje metody, obowi\u0105zuj\u0105 dla nich te same zasady, co dla metod Hook. Je\u015bli zadeklarowana jest metoda<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void clone()<\/code><\/p>\n<article class=\"text-token-text-primary w-full\" dir=\"auto\" data-testid=\"conversation-turn-38\" data-scroll-anchor=\"true\">\n<div class=\"text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group\/turn-messages focus-visible:outline-hidden\" tabindex=\"-1\">\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"relative flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"b38ffeba-f2ae-4c70-abba-5188018abd03\" data-message-model-slug=\"gpt-4o\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light\">\n<p class=\"\" data-start=\"162\" data-end=\"224\">to jej implementacja musi tworzy\u0107 kopi\u0119 obiektu <em>HookState<\/em>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<p><strong>Implemetacje<\/strong><\/p>\n<p>HookStates musz\u0105 by\u0107 zawsze zaimplementowane w oddzielnej klasie Java ze wzgl\u0119du na ich cykl \u017cycia. Interfejs HookState zwykle nie zawiera \u017cadnych atrybut\u00f3w i metod, a u\u017cytkownik hook mo\u017ce zdefiniowa\u0107 dowolne atrybuty i metody, jak w poni\u017cszym przyk\u0142adzie:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class StateImpl implements AHookState {\n\nprivate String s;\n\npublic StateImpl() {\n\n\/\/ mo\u017ce zainicjowa\u0107 atrybuty\n\n}\n\npublic String someMethod() {\n\n\/\/ ...\n\n}\n\n}<\/pre>\n<p>Ka\u017cda implementacja HookState musi posiada\u0107 domy\u015blny konstruktor.<\/p>\n<h6 id=\"centralne-interfejsy-hook\" ><span class=\"ez-toc-section\" id=\"Centralne_interfejsy_hook\"><\/span>Centralne interfejsy hook<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Interfejsy hook, kt\u00f3re s\u0105 wykorzystywane przez wiele definicji hook contract, np. przez jednostki biznesowe korzystaj\u0105ce z infrastruktury <em>SingleObjectEntity<\/em>, s\u0105 zawarte w nast\u0119puj\u0105cych przestrzeniach nazw:<\/p>\n<ul>\n<li>com.cisag.app.general.hook.log (dla hook\u00f3w logicznych)<\/li>\n<li>com.cisag.app.general.hook.ui (dla hook\u00f3w interfejsu dialogowego)<\/li>\n<\/ul>\n<h6 id=\"klasy-bazowe-hookow\" ><span class=\"ez-toc-section\" id=\"Klasy_bazowe_hookow\"><\/span>Klasy bazowe hook\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p class=\"\" data-start=\"0\" data-end=\"342\">Hook, opr\u00f3cz swojego interfejsu Java, mo\u017ce zawiera\u0107 dodatkowo abstrakcyjn\u0105 klas\u0119 bazow\u0105. Implementacje Hook mog\u0105 w\u00f3wczas wed\u0142ug w\u0142asnego uznania dziedziczy\u0107 z tej klasy bazowej zamiast bezpo\u015brednio implementowa\u0107 interfejs Java. Dzi\u0119ki klasie bazowej implementacje Hook musz\u0105 zaimplementowa\u0107 tylko cz\u0119\u015b\u0107 metod Hook.<\/p>\n<p class=\"\" data-start=\"344\" data-end=\"452\">Je\u015bli istnieje klasa bazowa, jest ona definiowana jako klasa wewn\u0119trzna w interfejsie Java pod nazw\u0105 <em>Base<\/em>.<\/p>\n<h4 id=\"cishookmanager\" ><span class=\"ez-toc-section\" id=\"CisHookManager\"><\/span>CisHookManager<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Hooki s\u0105 wywo\u0142ywane w kodzie Java dostawcy hook\u00f3w za po\u015brednictwem interfejsu PGM CisHookManager.<\/p>\n<p>CisHookManager u\u017cywa kontener\u00f3w hook , aby oddzieli\u0107 dostawc\u0119 hook\u00f3w od liczby dost\u0119pnych konkretnych implementacji hook. Mo\u017cliwy jest jednak r\u00f3wnie\u017c dost\u0119p do poszczeg\u00f3lnych ich implementacji.<\/p>\n<h5 id=\"wywolywanie-metod-hook\" ><span class=\"ez-toc-section\" id=\"Wywolywanie_metod_hook\"><\/span>Wywo\u0142ywanie metod hook<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Metody hook mog\u0105 by\u0107 wywo\u0142ywane zar\u00f3wno w kontenerze hook, jak i bezpo\u015brednio w implementacjach hook. Kontener hook jest proxy Java i w ten spos\u00f3b implementuje odpowiedni interfejs hook.<\/p>\n<p>Wywo\u0142anie kontenera hook automatycznie prowadzi do wywo\u0142ania wszystkich implementacji, a jego wywo\u0142anie jest mo\u017cliwe tylko wtedy, gdy metoda hook u\u017cywa typu zwracanego<i> <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void<\/code><\/i><i><\/i>.<\/p>\n<p>Poni\u017cszy przyk\u0142ad pokazuje wywo\u0142anie kontenera, gdzie hm jest CisHookManager, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">contextClass<\/code> jest klas\u0105 kontekstu wywo\u0142ywanej definicji hook contract, a <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">dataView <\/code>(data view) jest u\u017cywany jako parametr hook.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SingleObjectValidateUpdateHook hook =hm.getHookContainer(\n\ncontextClass, SingleObjectValidateUpdateHook.class);\n\nhook.validateUpdate(dataView);<\/pre>\n<p>To samo wywo\u0142anie hook we wszystkich implementacjach wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">for (SingleObjectValidateUpdateHook hook :\nhm.getHookImplementations(contextClass,\nSingleObjectValidateUpdateHook.class) {\n\nhook.validateUpdate(dataView);\n\n}<\/pre>\n<p>W przypadku metod hook z typami zwracanymi innymi ni\u017c <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">void<\/code>, do poni\u017cszego przyk\u0142adu nale\u017cy doda\u0107 kombinacj\u0119 warto\u015bci zwracanych.<\/p>\n<p>Je\u015bli hook wymaga ogranicze\u0144, nale\u017cy je okre\u015bli\u0107 jako dodatkowe parametry w metodach<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">hm.getHookContainer lub hm.getHookImplementations:\n\nHookRestriction res = HookRestriction.create\n\n(HookRestriction.restrictBusinessObject(\"object\",\n\ncom.cisag.app.general.obj.Partner.class),\n\nHookRestriction.restrictDataView(\"view\",\n\nPurchaseContractDetailView.class));\n\nSingleObjectValidateUpdateHook hook =hm.getHookContainer(\n\ncontextClass, res, SingleObjectValidateUpdateHook.class);<\/pre>\n<p>Istniej\u0105 specjalne hooki (strategie, ActionHooks), dla kt\u00f3rych metody hook musz\u0105 by\u0107 wywo\u0142ywane tylko w niekt\u00f3rych implementacjach, ale nie we wszystkich. W takim przypadku mo\u017cna wywo\u0142a\u0107 tylko implementacj\u0119. HookContainer nie mo\u017ce by\u0107 u\u017cywany.<\/p>\n<h5 id=\"zarzadzanie-hookami-z-obsluga-stanow\" ><span class=\"ez-toc-section\" id=\"_Zarzadzanie_hookami_z_obsluga_stanow\"><\/span>\u00a0Zarz\u0105dzanie hookami z obs\u0142ug\u0105 stan\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Implementacje <em>HookState<\/em> s\u0105 zarz\u0105dzane w kontenerach <em>HookState<\/em>. Kontener <em>HookState<\/em> jest tworzony przez dostawc\u0119 hook\u00f3w przy u\u017cyciu nast\u0119puj\u0105cej metody:<\/p>\n<p>CisHookManager.createStateContainer(contextClass,hookStateClass) <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">CisHookManager.createStateContainer(contextClass,hookStateClass)<\/code><\/p>\n<p>Obiekt kontenera zawiera wszystkie implementacje <em>HookState<\/em>, kt\u00f3re istniej\u0105 dla \u017c\u0105danej definicji hook contract (<em>contextClass<\/em>) i hooka stanowego (<em>hookStateClass<\/em>).<\/p>\n<p>Dostawca hook\u00f3w nie ma dost\u0119pu do poszczeg\u00f3lnych implementacji <em>HookState<\/em>. Zamiast tego musi przekaza\u0107 kontener podczas tworzenia widoku obiektu, aby implementacje by\u0142y dost\u0119pne w hookach.<\/p>\n<h5 id=\"hooki-w-hierarchiach-dziedziczenia\" ><span class=\"ez-toc-section\" id=\"Hooki_w_hierarchiach_dziedziczenia\"><\/span>Hooki w hierarchiach dziedziczenia<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>W przypadku, gdy wielu dostawc\u00f3w Hook jest zintegrowanych w struktur\u0119 dziedziczenia, tak\u0105 jak <em>SingleObjectEntity<\/em>, i te same Hooki maj\u0105 by\u0107 udost\u0119pniane, warto przenie\u015b\u0107 wszystkie wsp\u00f3lne elementy mi\u0119dzy dostawcami Hook do klas bazowych struktury dziedziczenia.<\/p>\n<p>Podobne definicje hook contract cz\u0119sto r\u00f3\u017cni\u0105 si\u0119 tylko klas\u0105 kontekstu i konkretnym typem widoku obiektu. S\u0105 to jedyne aspekty, kt\u00f3re musz\u0105 by\u0107 zdefiniowane w podklasach hierarchii dziedziczenia.<\/p>\n<p>Infrastruktura hook pozwala r\u00f3wnie\u017c poszczeg\u00f3lnym podklasom na brak definicji hook contract, nawet je\u015bli nadklasa wywo\u0142uje metody hooka. W tym celu <em>CisHookManager<\/em> zawsze zwraca pusty kontener hook\u00f3w, je\u015bli jako klasa kontekstu zostanie przekazana warto\u015b\u0107 <em>null<\/em>. Wywo\u0142anie metod hook nie ma wtedy \u017cadnego efektu.<\/p>\n<h5 id=\"okreslanie-klasy-kontekstu\" ><span class=\"ez-toc-section\" id=\"Okreslanie_klasy_kontekstu\"><\/span>Okre\u015blanie klasy kontekstu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Klasa kontekstu nigdy nie powinna by\u0107 okre\u015blana dynamicznie (np. <em>this.getClass()<\/em>), ale zawsze powinna by\u0107 okre\u015blona jako sta\u0142a (<em>com.cisag.app&#8230;X.class)<\/em>. W przeciwnym razie niew\u0142a\u015bciwa klasa kontekstu zostanie u\u017cyta w przypadku zast\u0105pienia klasy dostawcy hook (Replacement).<\/p>\n<h4 id=\"wskazowki-dotyczace-rozwoju\" ><span class=\"ez-toc-section\" id=\"Wskazowki_dotyczace_rozwoju\"><\/span><a id=\"wdz\"><\/a>Wskaz\u00f3wki dotycz\u0105ce rozwoju<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Aby wersja obiektu deweloperskiego hook contract (definicja hook contract, implementacja hook contract) zablokowana w zadaniu deweloperskiego mog\u0142a by\u0107 u\u017cywana przez serwer aplikacji systemu ERP (SAS) w czasie wykonywania, katalogi zadania deweloperskiego (dla blokady w zadaniu lub blokady lokalnej) musz\u0105 by\u0107 dost\u0119pne w \u015bcie\u017cce klas. Dotyczy to w szczeg\u00f3lno\u015bci skompilowanych klas Java w katalogu klas zadania deweloperskiego. W przeciwnym razie SAS u\u017cywa aktywnej wersji obiektu deweloperskiego.<\/p>\n<p>Po utworzeniu nowego obiektu deweloperskiego hook contract, obiekt deweloperski musi zosta\u0107 zapisany co najmniej raz, aby SAS m\u00f3g\u0142 u\u017cy\u0107 obiektu deweloperskiego w czasie wykonywania.<\/p>\n<p>Podczas uruchamiania SAS nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na komunikaty o b\u0142\u0119dach i ostrze\u017ceniach z infrastruktury hook w pliku dziennika lub w konsoli. Komunikaty te wskazuj\u0105, czy okre\u015blone definicje hook contract lub implementacje hook contract s\u0105 niesp\u00f3jne.<\/p>\n<p>Implementacje hook contract, kt\u00f3re nie s\u0105 sp\u00f3jne, nie s\u0105 brane pod uwag\u0119 przez infrastruktur\u0119 hook w czasie wykonywania SAS, tj. stany hook\u00f3w nie s\u0105 generowane, a metody hook\u00f3w z tej implementacji hook contract nie s\u0105 wywo\u0142ywane.<\/p>\n<p>Definicje hook contract, kt\u00f3re nie s\u0105 sp\u00f3jne, nie s\u0105 brane pod uwag\u0119 przez infrastruktur\u0119 hook\u00f3w, podobnie jak wszystkie implementacje hook contract dla tej definicji hook contract.<\/p>\n<h5 id=\"weryfikacja-ograniczen\" ><span class=\"ez-toc-section\" id=\"Weryfikacja_ograniczen\"><\/span>Weryfikacja ogranicze\u0144<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Podczas sprawdzania sp\u00f3jno\u015bci istniej\u0105cych implementacji hook (podczas uruchamiania serwera aplikacji) musz\u0105 by\u0107 spe\u0142nione nast\u0119puj\u0105ce warunki, aby implementacja by\u0142a prawid\u0142owa:<\/p>\n<ul>\n<li>dla ka\u017cdej restrykcji zadeklarowanej w implementacji hook musi istnie\u0107 odpowiednia restrykcja zadeklarowana w definicji<\/li>\n<li>dla ka\u017cdej restrykcji zadeklarowanej jako nieopcjonalna w definicji Hook musi istnie\u0107 odpowiednia restrykcja w implementacji.<\/li>\n<\/ul>\n<p>Definicja restrykcji jest zgodna z deklaracj\u0105 w implementacji, je\u015bli zar\u00f3wno identyfikator, jak i typ s\u0105 identyczne.<\/p>\n<p>Mo\u017cliwo\u015bci okre\u015blenia odpowiednich implementacji w czasie wykonania:<\/p>\n<ul>\n<li><strong>metody dwuelementowe<\/strong> &#8211; metody getHookImplementations (<em>klasa kontekstu, interfejs hook<\/em>) oraz getHookContainer (.,.) nie uwzgl\u0119dniaj\u0105 restrykcji w czasie wykonania i dlatego okre\u015blaj\u0105 wszystkie implementacje interfejsu bez sprawdzania zgodno\u015bci z istniej\u0105cymi definicjami ogranicze\u0144 implementacji.<\/li>\n<li><strong>metody trzyelementowe<\/strong> &#8211; metody getHookImplementations (<em>klasa kontekstu, ograniczenie, interfejs haok<\/em>) i getHookContainer (.,.,.) otrzymuj\u0105 list\u0119 ogranicze\u0144. Maj\u0105 one nast\u0119puj\u0105cy wp\u0142yw na wyb\u00f3r implementacji:\n<ul>\n<li>lista nie musi zawiera\u0107 wszystkich ogranicze\u0144 zadeklarowanych przez implementacj\u0119. Jednak ka\u017cde przekazane ograniczenie w czasie wykonania musi by\u0107 zgodne z ograniczeniem zadeklarowanym w implementacji hook. Oznacza to, \u017ce tylko przekazane restrykcje w czasie wykonania ograniczaj\u0105 wyb\u00f3r implementacji, natomiast brakuj\u0105ce restrykcje nie maj\u0105 wp\u0142ywu.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Ograniczenie w czasie wykonania jest zgodne z deklaracj\u0105 implementacji, je\u015bli identyfikator, typ i warto\u015b\u0107 obiektu deweloperskiego s\u0105 identyczne. Je\u015bli symbol wieloznaczny &#8222;*&#8221; jest okre\u015blony w deklaracji implementacji zamiast konkretnego obiektu deweloperskiego , wszystkie warto\u015bci tego obiektu s\u0105 dozwolone, tylko identyfikator i typ musz\u0105 by\u0107 nadal zgodne.<\/p>\n<p>Deklaracja ograniczenia jako <em>opcjonalnego<\/em> (w definicji hook) nie ma wp\u0142ywu na okre\u015blenie odpowiednich implementacji.<\/p>\n<h5 id=\"zaleznosc-instalacji\" ><span class=\"ez-toc-section\" id=\"Zaleznosc_instalacji\"><\/span>Zale\u017cno\u015b\u0107 instalacji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Okre\u015blenie interfejsu i klasy implementacji w implementacji hook contract tworzy zale\u017cno\u015b\u0107 instalacyjn\u0105 mi\u0119dzy aplikacj\u0105 dostawcy, kt\u00f3ra zapewnia interfejs, a aplikacj\u0105 u\u017cytkownika z jej implementacj\u0105 hook contract. Artyku\u0142 <em>Komunikacja aplikacji bez zale\u017cno\u015bci instalacyjnych<\/em> opisuje mo\u017cliwo\u015bci unikania tej zale\u017cno\u015bci.<\/p>\n\n\n<p><\/p>\n","protected":false},"author":12,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-8162","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-interfejsy-techniczne"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=8162"}],"version-history":[{"count":11,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8162\/revisions"}],"predecessor-version":[{"id":30614,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/8162\/revisions\/30614"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=8162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}