{"id":8686,"date":"2024-08-07T14:53:50","date_gmt":"2024-08-07T12:53:50","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/640\/?post_type=ht_kb&#038;p=8686"},"modified":"2024-08-07T14:54:46","modified_gmt":"2024-08-07T12:54:46","slug":"parser-kodu-zrodlowego-java","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/","title":{"rendered":"Parser kodu \u017ar\u00f3d\u0142owego Java"},"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\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#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\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#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-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#Struktura_listy_wykazy_zastosowania\" >Struktura listy wykazy zastosowania<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#Wymagania_wstepne\" >Wymagania wst\u0119pne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#Konstrukcje_rozszerzalne\" >Konstrukcje rozszerzalne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#Konstrukcje_nierozstrzygalne\" >Konstrukcje nierozstrzygalne<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/documentation\/parser-kodu-zrodlowego-java\/#Wykrywanie_zaleznosci_w_aplikacji_Panel_Aktualizacja_oprogramowania\" >Wykrywanie zale\u017cno\u015bci w aplikacji Panel Aktualizacja oprogramowania<\/a><\/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>Niniejszy artyku\u0142 opisuje obszary zastosowania i wydajno\u015b\u0107 parsera kodu \u017ar\u00f3d\u0142owego Java w systemie.<\/p>\n<h3 id=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"struktura-listy-wykazy-zastosowania\" ><span class=\"ez-toc-section\" id=\"Struktura_listy_wykazy_zastosowania\"><\/span>Struktura listy wykazy zastosowania<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Parser kodu \u017ar\u00f3d\u0142owego jest wymagany do rozpoznawania u\u017cycia obiekt\u00f3w programistycznych w klasach Java. W przeciwie\u0144stwie do istniej\u0105cego parsera kodu bajtowego, mo\u017ce on r\u00f3wnie\u017c rozpoznawa\u0107 u\u017cycie typ\u00f3w obiekt\u00f3w programistycznych innych ni\u017c klasy Java. Wyniki s\u0105 wprowadzane do globalnej listy wykazy zastosowania. Mo\u017cna je zobaczy\u0107 na zak\u0142adce <em>Wykazy zastosowania<\/em> w aplikacji <em>Obiekty deweloperskie<\/em>. Parser kodu \u017ar\u00f3d\u0142owego jest automatycznie wykonywany podczas zameldowania, gdy aktywowane jest zadanie programistyczne i gdy instalowane s\u0105 aktualizacje oprogramowania dla odpowiednich klas Java. Wygenerowane klasy Java s\u0105 ignorowane w celu skr\u00f3cenia czasu dzia\u0142ania parsera. Klasy Java, kt\u00f3re s\u0105 wymagane do rozwi\u0105zania pewnych konstrukcji, s\u0105 automatycznie prze\u0142adowywane z systemu plik\u00f3w. Klasy Java, kt\u00f3re s\u0105 zablokowane w tym samym zadaniu programistycznym, s\u0105 \u0142adowane z katalogu roboczego zadania.<\/p>\n<p>Lista <em>Wykazy zastosowania<\/em> jest ca\u0142kowicie przebudowywana dla danej klasy. Najpierw usuwane s\u0105 wszystkie wpisy. Nast\u0119pnie wszystkie znalezione obiekty programistyczne s\u0105 wprowadzane do listy <em>Wykaz\u00f3w zastosowania<\/em>. Lista <em>Wykaz\u00f3w zastosowania<\/em> jest r\u00f3wnie\u017c utrzymywana przez parser kodu bajtowego.<\/p>\n<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Obiekty programistyczne, kt\u00f3re s\u0105 u\u017cywane w klasie Java, mog\u0105 zosta\u0107 usuni\u0119te dopiero po zaewidencjonowaniu dostosowanej klasy Java.<\/div><\/section>\n<h5 id=\"wymagania-wstepne\" ><span class=\"ez-toc-section\" id=\"Wymagania_wstepne\"><\/span>Wymagania wst\u0119pne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Konstruktory i metody, do kt\u00f3rych obiekty programistyczne (zwykle jako ci\u0105gi znak\u00f3w) s\u0105 przekazywane jako parametry, s\u0105 rejestrowane w pliku com\/cisag\/sys\/repository\/parser\/log\/signatures.properties. Plik ten okre\u015bla, kt\u00f3ry parametr reprezentuje \u015bcie\u017ck\u0119 do obiektu deweloperskiego i jest wymagany do rozwi\u0105zania (parametr jest oznaczony numerem typu obiektu deweloperskiego ). Jest to rozpoznawane i oceniane przez parser kodu \u017ar\u00f3d\u0142owego.<\/p>\n<p>Ponadto klasy, kt\u00f3re u\u017cywaj\u0105 klas z pakietu com.cisag.pgm.gui jako klas bazowych (w szczeg\u00f3lno\u015bci com.cisag.pgm.gui.EntityField) s\u0105 rozpoznawane automatycznie. Sprawdza to, czy pierwszy lub drugi parametr konstruktora jest \u015bcie\u017ck\u0105 do obiektu programistycznego. Klasy te nie musz\u0105 by\u0107 zarejestrowane w pliku source\/com\/cisag\/sys\/repository\/parser\/log\/signatures.properties.<\/p>\n<p>Je\u015bli obiekt deweloperskie mo\u017ce zosta\u0107 rozpoznany, lista wykazy zastosowania jest odpowiednio tworzona.<\/p>\n<h5 id=\"konstrukcje-rozszerzalne\" ><span class=\"ez-toc-section\" id=\"Konstrukcje_rozszerzalne\"><\/span>Konstrukcje rozszerzalne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Z regu\u0142y pe\u0142na nazwa obiektu deweloperskiego (przestrze\u0144 nazw + nazwa obiektu deweloperskiego) jest przekazywana jako ci\u0105g znak\u00f3w jako parametr konstruktora lub metody.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">RepositoryInfo.getText(&#8222;com.cisag.app.Stringtable&#8221;, &#8222;constant&#8221;);<\/p>\n<p>RepositoryInfo.getText(&#8222;com.cisag.app.&#8221; + &#8222;Stringtable&#8221;, &#8222;constant&#8221;);<\/p>\n<p>String dev_object = &#8222;com.cisag.app.Stringtable&#8221;;<\/p>\n<p>RepositoryInfo.getText(dev_object, &#8222;constant&#8221;);<\/div><\/section>\n<p>Nazwa obiektu deweloperskiego mo\u017ce by\u0107 r\u00f3wnie\u017c zdefiniowana w sta\u0142ej. Mo\u017cna j\u0105 r\u00f3wnie\u017c zdefiniowa\u0107 w klasie bazowej lub interfejsie. Mo\u017cliwe jest r\u00f3wnie\u017c zdefiniowanie sta\u0142ej w innej klasie lub klasie wewn\u0119trznej.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">public static final String DEV_OBJECT = &#8222;com.cisag.app.Stringtable&#8221;;<\/p>\n<p>RepositoryInfo.getText(DEV_OBJECT, &#8222;constant&#8221;);<\/p>\n<p>RepositoryInfo.getText(Class.DEV_OBJECT, &#8222;sta\u0142a&#8221;);<\/p>\n<p>RepositoryInfo.getText(Class.InnerClass.DEV_OBJECT, &#8222;sta\u0142a&#8221;);<\/div><\/section>\n<p>Je\u015bli nazwa obiektu deweloperskiego jest przekazywana jako obiekt klasy, jest to r\u00f3wnie\u017c rozpoznawane przez parser. Ta procedura jest mo\u017cliwa, je\u015bli dla obiektu deweloperskiego istnieje klasa Java o tej samej nazwie (np. <em>Valueset<\/em>).<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">RepositoryInfo.getValueSetExternalName(ValueSet.class, 1);<\/div><\/section>\n<p>Je\u015bli w sygnaturze u\u017cywany jest identyfikator Guid dla obiektu deweloperskiego, jest on r\u00f3wnie\u017c rozpoznawany i rozwi\u0105zywany.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">byte[] applicationGuid = &#8222;0260AA8F401E1E10BBAB8464961D0000&#8221;;<\/p>\n<p>com.cisag.pgm.appserver.CisApplicationManager.callApplication(applicationGuid, 1, &#8230;);<\/p>\n<p><\/div><\/section>\n<h5 id=\"konstrukcje-nierozstrzygalne\" ><span class=\"ez-toc-section\" id=\"Konstrukcje_nierozstrzygalne\"><\/span><a id=\"kn\"><\/a>Konstrukcje nierozstrzygalne<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Parser kodu \u017ar\u00f3d\u0142owego nie jest interpreterem. Ci\u0105gi znak\u00f3w lub guidy, kt\u00f3re s\u0105 okre\u015blane w czasie wykonywania, mog\u0105 by\u0107 obliczane tylko w prostych przypadkach. Poni\u017csze przyk\u0142ady ilustruj\u0105 ten przypadek:<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">String devObject = ObjectDirEntryLogic.getObjectNameByGuid(&#8230;);<\/p>\n<p>RepositoryInfo.getText(devObject, &#8222;constant&#8221;);<\/p>\n<p>byte[] appGuid = getApplicationGuid()<\/p>\n<p>ApplicationManager.callApplication(appGuid, &#8230;);<\/p>\n<p>Metody nie mog\u0105 by\u0107 wykonywane. W zwi\u0105zku z tym nie mo\u017cna okre\u015bli\u0107 nazwy obiektu programistycznego, a jego u\u017cycie nie jest rozpoznawane.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">public String getText(String objectName, String elementName) {<\/p>\n<p>return RepositoryInfo.getText(objectName, elementName);<\/p>\n<p>}<\/p>\n<p>Call:<\/p>\n<p>getText(DEV_OBJECT, &#8222;constant&#8221;)<\/p>\n<p>Czasami w klasie definiowane s\u0105 procedury pomocnicze, dzi\u0119ki czemu nie zawsze trzeba pisa\u0107 d\u0142ugie wywo\u0142anie. W tym przypadku pojawiaj\u0105 si\u0119 dwa problemy: RepositoryInfo.getText jest monitorowane, ale warto\u015bci objectName i elementName mo\u017cna okre\u015bli\u0107 tylko w czasie wykonywania. Dlatego wywo\u0142anie RepositoryInfo.getText nie prowadzi do wpisu na li\u015bcie wykaz\u00f3w zastosowania. Procedura getText nie jest monitorowana, poniewa\u017c nie jest zadeklarowana w pliku signatures.properties, dlatego jej wywo\u0142anie nie prowadzi do wpisu na li\u015bcie wykaz\u00f3w zastosowania.<\/div><\/section>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">public String getText(String elementName) {<\/p>\n<p>return RepositoryInfo.getText(&#8222;stringtable&#8221;, elementName);<\/p>\n<p>}<\/p>\n<p>Procedura pomocnicza zosta\u0142a tutaj wprowadzona w celu okre\u015blenia tylko tekst\u00f3w z okre\u015blonej tabeli \u0142a\u0144cuch\u00f3w. W tym przypadku u\u017cycie tabeli \u0142a\u0144cuch\u00f3w jest rozpoznawane, ale u\u017cycie element\u00f3w nie.<\/p>\n<p><\/div><\/section>\n<h4 id=\"wykrywanie-zaleznosci-w-aplikacji-panel-aktualizacja-oprogramowania\" ><span class=\"ez-toc-section\" id=\"Wykrywanie_zaleznosci_w_aplikacji_Panel_Aktualizacja_oprogramowania\"><\/span>Wykrywanie zale\u017cno\u015bci w aplikacji <em>Panel Aktualizacja oprogramowania<\/em><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Innym obszarem zastosowania parsera kodu \u017ar\u00f3d\u0142owego Java jest wykrywanie zale\u017cno\u015bci mi\u0119dzy klasami Java. Funkcjonalno\u015b\u0107 ta jest wymagana do automatycznej aktualizacji systemu. Celem jest okre\u015blenie aktualizacji oprogramowania dla wybranej aplikacji, kt\u00f3re s\u0105 wymagane do aktualizacji (aplikacja <em>Panel Aktualizacja oprogramowania<\/em>, widok <em>Aktualizacja systemu docelowego<\/em>).<\/p>\n<p>Aby to zrobi\u0107, parser kodu \u017ar\u00f3d\u0142owego jest wykonywany ponownie, gdy aktywowane jest zadanie programistyczne. Opr\u00f3cz tworzenia listy wykaz\u00f3w zastosowania, rozpoznawane s\u0105 metody klas z przestrzeni nazw com.xxxxx.app, kt\u00f3re s\u0105 u\u017cywane w aktualnie analizowanej klasie Java.<\/p>\n<p>Punktem wyj\u015bcia do okre\u015blenia zale\u017cno\u015bci jest klasa Java wprowadzona w aplikacji. Ta klasa Java jest u\u017cywana do okre\u015blenia wszystkich bezpo\u015brednio u\u017cywanych klas Java. U\u017cywane obiekty programistyczne s\u0105 okre\u015blane na podstawie tych klas Java za po\u015brednictwem listy wykaz\u00f3w zastosowania. Informacje te s\u0105 wykorzystywane do obliczania aktualizacji oprogramowania, do kt\u00f3rych przypisane s\u0105 znalezione obiekty programistyczne.<\/p>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Poni\u017cszy przyk\u0142ad przedstawia struktur\u0119 zale\u017cno\u015bci:<\/p>\n<p>Klasa Java J1 &#8211; metoda M1()<\/p>\n<p>Klasa Java J2 &#8211; metoda M1(), metoda M2()<\/p>\n<p>Klasa Java J3 &#8211; metoda M1()<\/p>\n<p>Klasa Java J4 &#8211; metoda M1()<\/p>\n<p>J1.M1() u\u017cywa J2.M1()<\/p>\n<p>J2.M1() u\u017cywa J3.M1()<\/p>\n<p>J2.M2() u\u017cywa J4.M1()<\/p>\n<p>Je\u015bli klasa Java J1 jest u\u017cywana w aplikacji, klasy Java J2 i J3 s\u0105 okre\u015blane jako zale\u017cne klasy Java. Klasa Java J4 nie jest brana pod uwag\u0119, poniewa\u017c nie jest u\u017cywana bezpo\u015brednio przez klas\u0119 Java J1. Wymagane s\u0105 r\u00f3wnie\u017c wszystkie obiekty programistyczne, kt\u00f3re s\u0105 u\u017cywane w klasach Java J1, J2 i J3.<\/p>\n<p><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Je\u015bli metoda J2.M2() zostanie zmieniona w spos\u00f3b niekompatybilny w tym kontek\u015bcie, u\u017cywane metody nie zostan\u0105 dostarczone. Metoda ta mo\u017ce nie dzia\u0142a\u0107 poprawnie.<\/div><\/section><\/p>\n<p><\/div><\/section>\n<p>Ta procedura nie gwarantuje kompletno\u015bci wyboru. Na przyk\u0142ad mo\u017cliwe jest, \u017ce parser kodu \u017ar\u00f3d\u0142owego nie rozpozna\u0142 wszystkich wymaganych obiekt\u00f3w programistycznych (rozdzia\u0142: <em><a href=\"#kn\">Konstrukcje nierozstrzygalne<\/a><\/em>). Mo\u017cliwe jest r\u00f3wnie\u017c, \u017ce wywo\u0142ania metod nie zosta\u0142y w pe\u0142ni rozpoznane (np. odbicia), a zatem wymagane klasy Java nie s\u0105 brane pod uwag\u0119.<\/p>\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-8686","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-obiekty-deweloperskie"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/comments?post=8686"}],"version-history":[{"count":4,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8686\/revisions"}],"predecessor-version":[{"id":16510,"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/ht_kb\/8686\/revisions\/16510"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/640\/index.php\/wp-json\/wp\/v2\/media?parent=8686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}