The service provided by Consileon was professional and comprehensive with a very good understanding of our needs and constrains.

Wolfgang Hafenmayer, Managing partner, LGT Venture Philanthropy

Technical quality of staff offered, capability of performing various project roles, as well as motivation and dedication to the project (... [...]

dr Walter Benzing, Head of development B2O, net mobile AG

Technical quality of staff offered, capability of performing roles of developers, lead developers, trainers, team leaders, architects as wel [...]

Karl Lohmann, Itellium Systems & Services GmbH

Firma Consileon Polska jest niezawodnym i godnym zaufania partnerem w biznesie, realizującym usługi z należytą starannością (...)

Waldemar Ściesiek, Dyrektor zarządzający IT, Polski Bank

The team was always highly motivated and professional in every aspect to perform on critical needs of our startup environment.

Denis Benic, Founder of Ink Labs

Poprawność nazw komponentów w Seam

Category: Other Tags: ,

Ostatnio jakoś tak natchnęło mnie na eksperymentowanie (związane również z wymyślaniem pytań na JavaBlackBelt). Zastanowiło mnie jak właściwie powinna wyglądać prawidłowa nazwa komponentu Seam. Czy są jakieś ograniczenia co do znaków? Intuicja podpowiada mi, że są (podpowiada nawet jakie to mogą być ograniczenia), jednakże moja intuicja potrafi być zawodna toteż postanowiłem przeglądnąć co na ten temat mówi dokumentacja.

Zacząłem od przeglądu dokumentacji online. Oficjalna strona, mówi mi tylko, że nazwę komponentu mogę nadać za pomocą adnotacji @Name. No to zerkam do jej javadoc-a. Tutaj informacji jeszcze mniej. Dowiadujemy się tylko, że adnotacja ta nadaje nazwę komponentu, ale w jakim celu, jak powinna wyglądać prawidłowa nazwa i do czego ją wykorzystywać ani słowa!

No dobra, na dokumentacji online nikt nie zarabia, toteż nikt się nie stara aby była porządna. Przejdźmy zatem do książek. W „Seam in Action” również dowiaduję się, że nazwy nadaje się za pomocą adnotacji @Name a dodatkowo wymienione są komponenty, które mogą posiadać nazwę. Idziemy dalej, „Seam Framework – Experience the Evolution of Java EE” bez skutku, „Beginning JBoss Seam – From Novice to Profiessional” i też mi się nie udało.

No to skoro się nie udało znaleźć w dokumentacji przejdźmy do eksperymentów metodą doktora Macajewa. Szybka konfiguracja projektu w seam-gen i dodaję taką klasę:

@Name("!@#$%^*()component")
public class TestComponent {
}

Deploy, uruchamianie serwera i dostaję:

java.lang.RuntimeException: Could not create Component: !@#$%^*()component
        at org.jboss.seam.init.Initialization.addComponent(Initialization.java:1202)
        at org.jboss.seam.init.Initialization.installComponents(Initialization.java:1118)
        at org.jboss.seam.init.Initialization.init(Initialization.java:733)
        at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36)
        ...
Caused by: java.lang.IllegalStateException: not a valid Seam component name: !@#$%^*()component
        at org.jboss.seam.Component.checkName(Component.java:266)
        at org.jboss.seam.Component.<init>(Component.java:220)
        at org.jboss.seam.Component.<init>(Component.java:205)
        at org.jboss.seam.init.Initialization.addComponent(Initialization.java:1186)
        ... 72 more

Także widać, że Seam jawnie sprawdza poprawność nazwy komponentu (metoda checkName klasy Component), ale dlaczego nie jest nigdzie udokumentowane jaka powinna być prawidłowa nazwa?!

Rzućmy okiem na metodę sprawdzającą poprawność nazwy:

private void checkName()
{
   for ( char c: name.toCharArray() )
   {
      if ( !Character.isJavaIdentifierPart(c) && c!='.' )
      {
         throw new IllegalStateException("not a valid Seam component name: " + name);
      }
   }
}

Jak widać poprawna nazwa komponentu to taka, która składa się ze znaków dozwolonych dla identyfikatorów w Javie plus znak „.” (kropka). Szybko test dla klasy:

@Name("$component_123")
public class TestComponent {
}

I działa. Czy naprawdę tak ciężko byłoby jednym zdaniem podsumować jak powinna wyglądać prawidłowa nazwa komponentu chociażby w javadoc-u?

Niestety dokumentacyjne niedbalstwo jest wszechobecne w frameworkach spod stajni ludzi odpowiedzialnych za Seama. Wystarczy sobie przeglądnąć dokumentację Hibernate’a. Aż czasami człowieka krew zalewa. Do tego nie ma takiego poręcznego narzędzia jak irb w Ruby aby można było sobie coś szybko sprawdzić. Całe szczęście, że prostą aplikację w Seam można sobie szybko wygenerować, ale problem ten dotyczy też innych frameworków, dla których stworzenie aplikacji nie jest takie szybkie.

Ja już się przyzwyczaiłem, że klasy i metody w Seam są bardzo słabo (o ile w ogóle) udokumentowane, jednakże źle to świadczy o twórcach tego frameworka. Jako coś co ma być wykorzystywane głównie ze względu na swoje API nie może posiadać nieudokumentowanego API!

http://michalorman.pl/blog/2010/01/poprawnosc-nazw-komponentow-w-seam/


Michał Orman

Full stack software developer, konsultant IT.

Niekwestionowany full stack developer, architekt rozwiązań IT, project manager, entuzjasta Agile z biznesowym zacięciem, który lubi robić rzeczy do końca. Prawdziwy człowiek orkiestra, którego największymi zaletami są nieustanne dążenie do perfekcji, produktywność, dbanie o najwyższą jakość wyprodukowanego oprogramowania. Obecnie progra­muje w Ruby on Rails i JavaScript, ale do listy znanych mu technologii bez wątpienia można dopisać Java/J2EE. Tworzył aplikacje mobilne na platformę Android, systemy wbudowane w C/C++. Zapalony wyznawca zasad SOLID lubiący proste rozwiązania oraz czysty kod. Do swojego portfolio technologicznego również może dodać Unix/Linux, VIM oraz Git.

michalorman.com


Tags: ,

Comments

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Trwa ładowanie