<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://192.168.0.11:8044/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uro%C5%A1</id>
	<title>MelanyWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://192.168.0.11:8044/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uro%C5%A1"/>
	<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php/Special:Contributions/Uro%C5%A1"/>
	<updated>2026-04-20T22:08:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=711</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=711"/>
		<updated>2025-11-14T09:44:06Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService ➜ CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;pogresno&amp;quot;&amp;gt;&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;ispravno&amp;quot;&amp;gt;&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} ➜ public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-siva&amp;quot; style=&amp;quot;table-layout: fixed; width: 100%;&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-snow&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=612</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=612"/>
		<updated>2025-11-12T15:49:02Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-snow&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=608</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=608"/>
		<updated>2025-11-12T15:41:30Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-ivory&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=604</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=604"/>
		<updated>2025-11-12T15:36:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-plava&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=602</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=602"/>
		<updated>2025-11-12T15:28:21Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=597</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=597"/>
		<updated>2025-11-12T14:50:13Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Template:WPoruka&amp;diff=596</id>
		<title>Template:WPoruka</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Template:WPoruka&amp;diff=596"/>
		<updated>2025-11-12T14:46:18Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%; background-color:#ffdddd; border:1px solid #ff5757;border-left:10px solid #ff5757;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:1rem 2rem;font-size:1.039rem;&amp;quot;|{{#if: {{{naslov|}}} | &#039;&#039;&#039;{{{naslov}}}&#039;&#039;&#039; |&#039;&#039;&#039;Upozorenje&#039;&#039;&#039;}}&amp;lt;hr /&amp;gt;{{#if: {{{txt|}}} | {{{txt}}} |&#039;&#039;&#039;&amp;lt;span style=&amp;quot;background-color:#ff4000;color:white;padding:.2rem .5rem;&amp;quot;&amp;gt;Dodajte poruku. &amp;lt;nowiki&amp;gt;{{wPoruka|txt=vaša poruka}}&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039;}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Template:PPoruka&amp;diff=595</id>
		<title>Template:PPoruka</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Template:PPoruka&amp;diff=595"/>
		<updated>2025-11-12T14:45:57Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%; background-color:#ddffdd; border:1px solid #4dcb4d;border-left:10px solid #4dcb4d;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:1rem 2rem;font-size:1.039rem;&amp;quot;|{{#if: {{{naslov|}}} | &#039;&#039;&#039;{{{naslov}}}&#039;&#039;&#039; |&#039;&#039;&#039;Preporuka&#039;&#039;&#039;}}&amp;lt;hr /&amp;gt;&lt;br /&gt;
{{#if: {{{txt|}}} | {{{txt}}} |&#039;&#039;&#039;&amp;lt;span style=&amp;quot;background-color:#ff4000;color:white;padding:.2rem .5rem;&amp;quot;&amp;gt;Dodajte poruku. &amp;lt;nowiki&amp;gt;{{pPoruka|txt=vaša poruka}}&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039;}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Template:IPoruka&amp;diff=594</id>
		<title>Template:IPoruka</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Template:IPoruka&amp;diff=594"/>
		<updated>2025-11-12T14:45:32Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%; background-color:#dff0ff; border:1px solid #0088cc;border-left:10px solid #0088cc;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:1rem 2rem;font-size:1.039rem;&amp;quot;|{{#if: {{{naslov|}}} | &#039;&#039;&#039;{{{naslov}}}&#039;&#039;&#039; |&#039;&#039;&#039;Obratite pažnju&#039;&#039;&#039;}}&amp;lt;hr /&amp;gt;{{#if: {{{txt|}}} | {{{txt}}} |&#039;&#039;&#039;&amp;lt;span style=&amp;quot;background-color:#ff4000;color:white;padding:.2rem .5rem;&amp;quot;&amp;gt;Dodajte poruku. &amp;lt;nowiki&amp;gt;{{iPoruka|txt=vaša poruka}}&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039;}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=593</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=593"/>
		<updated>2025-11-12T14:37:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Lokalne varijable i parametri&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Česte konvencije:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Instance varijable (fields)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Static final konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Konvencije za konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Enum konstante&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=592</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=592"/>
		<updated>2025-11-12T14:25:26Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardni prefiksi&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=591</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=591"/>
		<updated>2025-11-12T14:24:08Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Klase (Classes)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Interfejsi (Interfaces)&amp;lt;/big&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=590</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=590"/>
		<updated>2025-11-12T14:22:12Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;Kako odlučiti o dužini ?&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=589</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=589"/>
		<updated>2025-11-12T14:21:12Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;CamelCase Konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=588</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=588"/>
		<updated>2025-11-12T14:20:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
* &#039;&#039;&#039;Koristimo engleski jezik&#039;&#039;&#039; – svi nazivi moraju biti na engleskom&lt;br /&gt;
* &#039;&#039;&#039;Deskripcija obavezna&#039;&#039;&#039; – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
* &#039;&#039;&#039;Izbegavanje skraćenica&#039;&#039;&#039; – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
* &#039;&#039;&#039;Izbegavati nepotrebne reči&#039;&#039;&#039; – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
* PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
* camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=587</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=587"/>
		<updated>2025-11-12T14:16:28Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Osnovne konvencije&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Standardna struktura paketa&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=584</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=584"/>
		<updated>2025-11-12T14:08:07Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=583</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=583"/>
		<updated>2025-11-12T14:02:45Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=580</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=580"/>
		<updated>2025-11-12T13:54:59Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=578</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=578"/>
		<updated>2025-11-12T13:53:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;span&amp;gt;&lt;br /&gt;
&amp;lt;pre class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=576</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=576"/>
		<updated>2025-11-12T13:51:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;span class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=575</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=575"/>
		<updated>2025-11-12T13:50:04Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;pogresno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;span class=&#039;ispravno&#039;&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=573</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=573"/>
		<updated>2025-11-12T13:31:46Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
&#039;&#039;&#039;Getter metode — get&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Setter metode — set&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Query/Find metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Check/Validation metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Create/Save metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Update metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Delete metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Count metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Build/Generate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Convert/Transform metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Calculate metode&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=572</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=572"/>
		<updated>2025-11-12T13:28:17Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi.&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;2. Ako klasa već daje kontekst, skraćuj metode i varijable&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;3. Ako metoda zahteva više od 3-4 reči, razmisli o:&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;5. Izražavanje&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=571</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=571"/>
		<updated>2025-11-12T13:22:35Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu (Controllers,user_service, userService)}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=570</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=570"/>
		<updated>2025-11-12T13:20:36Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat.&lt;br /&gt;
&#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=569</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=569"/>
		<updated>2025-11-12T13:20:06Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;&lt;br /&gt;
Uroš Novaković|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=568</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=568"/>
		<updated>2025-11-12T13:18:09Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=567</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=567"/>
		<updated>2025-11-12T13:13:30Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt=Da li ovo iznad treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=566</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=566"/>
		<updated>2025-11-12T13:12:25Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
{{greska|txt=Da li ovo treba da bude numerisano?}}&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
{{greska|txt={{greska|txt=Da li ovo treba da bude numerisano?}}&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=565</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=565"/>
		<updated>2025-11-12T13:10:15Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=564</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=564"/>
		<updated>2025-11-12T13:09:13Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract|min=8|txt=Konvencije o imenovanju čine programe razumljivijim tako što ih čine lakšim za čitanje. One takođe mogu pružiti informacije o funkciji identifikatora - na primer, da li je u pitanju konstanta, paket ili klasa - što može biti od pomoći u razumevanju koda.&lt;br /&gt;
&#039;&#039;&#039;Obavezno pročitati i pridržavati se.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=563</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=563"/>
		<updated>2025-11-12T13:02:28Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
! Akronim !! Klasa/Interfejs !! Metoda/Varijabla !! Konstanta&lt;br /&gt;
|-&lt;br /&gt;
| API || ApiGateway || apiKey || API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CBA || CbaSession || cbaEvent || CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| CGA || CgaService || cgaUserId || CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| CSA || CsaResource || csaToken || CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
| DTO || UserDto || userDto || DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
| HTTP || HttpClient || httpStatus || HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
| ID || UserId || userId || USER_ID&lt;br /&gt;
|-&lt;br /&gt;
| JSON || JsonParser || jsonContent || JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| JWT || JwtService || jwtToken || JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
| SQL || SqlQuery || sqlStatement || SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
| URL || UrlBuilder || apiUrl || BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
| XML || XmlParser || xmlDocument || XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=560</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=560"/>
		<updated>2025-11-12T12:49:47Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kako odlučiti o dužini ? ===&lt;br /&gt;
==== 1. Ime mora biti jasno definisano da svako ko prvi put uđe u kod može da razume o čemu se radi. ====&lt;br /&gt;
&lt;br /&gt;
==== 2. Ako klasa već daje kontekst, skraćuj metode i varijable ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U UserService klasi&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserService {&lt;br /&gt;
    public User create(CreateUserRequest request) { } -  Ne treba &#039;createUser&#039;&lt;br /&gt;
    public void updateEmail(Long id, String email) { } -  Jasno je da je User&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;U generičkim utility klasama&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DatabaseUtils {&lt;br /&gt;
    public User createUser(UserData data) { } - Treba &#039;User&#039; za jasnoću&lt;br /&gt;
    public Group createGroup(GroupData data) { } - Specifično&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Ako metoda zahteva više od 3-4 reči, razmisli o: ====&lt;br /&gt;
* Korišćenju parametara/DTO objekta&lt;br /&gt;
* Refaktorisanju klase&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primeri&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;LOŠE - Predugačko&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAllActiveUsersWithAccessToFirmByGroupId(Integer groupId, Integer firmId) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;DOBRO - Kraće, sa DTO parametrom&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public List&amp;lt;User&amp;gt; findActiveUsers(UserSearchCriteria criteria) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4. Izbegavati nedefinsane pojmove kao Manager, Helper, Util, Data, Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserDataManager&amp;lt;/code&amp;gt; – Šta je Data ? Šta je Manager? &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;public class UserInfo { }&amp;lt;/code&amp;gt; – Zasto ne samo User?? &lt;br /&gt;
&lt;br /&gt;
==== 5. Izražavanje ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void processData() {}&lt;br /&gt;
public void handleRequest() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void selectFirm() {}&lt;br /&gt;
public void issueClusterToken() {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Refaktorisanje primer&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class CgaBulkOperationService {} → public class CgaBulkService {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u klasama i intefejsima (PascalCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JwtService {}&lt;br /&gt;
public class HttpClient {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class JWTService&lt;br /&gt;
public class HTTPClient&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Akronimi u metodama i varijablama (camelCase)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String jwtToken;&lt;br /&gt;
private Integer httpStatus;&lt;br /&gt;
public void parseXml() { }   &lt;br /&gt;
public String getApiKey() { }  &lt;br /&gt;
private Long userId;       &lt;br /&gt;
private String xmlContent;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private String JWTToken;           &lt;br /&gt;
private Integer HTTPStatus;     &lt;br /&gt;
private Long userID;     &lt;br /&gt;
private String XMLContent; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Imenovanje u konstantama i enum članovima&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_SECRET = &amp;quot;secret&amp;quot;;&lt;br /&gt;
public static final int HTTP_OK = 200;&lt;br /&gt;
public static final String API_VERSION = &amp;quot;v1&amp;quot;;&lt;br /&gt;
public static final String XML_HEADER = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot;?&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    JWT,&lt;br /&gt;
    OAUTH,&lt;br /&gt;
    API_KEY&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final String JWT_TOKEN_PREFIX = &amp;quot;Bearer&amp;quot;;&lt;br /&gt;
public static final int HTTP_401_UNAUTHORIZED = 401;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specijalni slučajevi sa više akronima&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HttpApiClient { }     &lt;br /&gt;
public class XmlHttpParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class HTTPAPIClient { }     &lt;br /&gt;
public class XMLHTTPParser { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Primer Akronima iz Auth servisa&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
!	Akronim	!!	Klasa/Interfejs	!!	Metoda/Varijabla	!!	Konstanta&lt;br /&gt;
|-&lt;br /&gt;
|	API	||	ApiGateway	||	apiKey	||	API_VERSION&lt;br /&gt;
|-&lt;br /&gt;
|	CBA	||	CbaSession	||	cbaEvent	||	CBA_VERSION&lt;br /&gt;
|-&lt;br /&gt;
|	CGA	||	CgaService	||	cgaUserId	||	CGA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
|	CSA	||	CsaResource	||	csaToken	||	CSA_ROLE&lt;br /&gt;
|-&lt;br /&gt;
|	DTO	||	UserDto	||	userDto	||	DTO_VERSION&lt;br /&gt;
|-&lt;br /&gt;
|	HTTP	||	HttpClient	||	httpStatus	||	HTTP_OK&lt;br /&gt;
|-&lt;br /&gt;
|	ID	||	UserId	||	userId	||	USER_ID&lt;br /&gt;
|-&lt;br /&gt;
|	JSON	||	JsonParser	||	jsonContent	||	JSON_TYPE&lt;br /&gt;
|-&lt;br /&gt;
|	JWT	||	JwtService	||	jwtToken	||	JWT_SECRET&lt;br /&gt;
|-&lt;br /&gt;
|	SQL	||	SqlQuery	||	sqlStatement	||	SQL_TIMEOUT&lt;br /&gt;
|-&lt;br /&gt;
|	URL	||	UrlBuilder	||	apiUrl	||	BASE_URL&lt;br /&gt;
|-&lt;br /&gt;
|	XML	||	XmlParser	||	xmlDocument	||	XML_HEADER&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=559</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=559"/>
		<updated>2025-11-12T12:15:07Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* PascalCase format&lt;br /&gt;
* Imenica ili imenička fraza&lt;br /&gt;
* Jasno opisuje šta klasa predstavlja&lt;br /&gt;
&#039;&#039;&#039;Osnovne klase&#039;&#039;&#039; {{greska|txt=na šta se ovo odnosi?}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class user { }         &lt;br /&gt;
public class Usr { }             &lt;br /&gt;
public class MyUser { }          &lt;br /&gt;
public class UserClass { }   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sufiksi po tipu klase&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Entity Classes&#039;&#039;&#039; (JPA/Domain models):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class User { }    &lt;br /&gt;
public class Group { }&lt;br /&gt;
public class CbaSession { }&lt;br /&gt;
public class Firm { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Service Classes&#039;&#039;&#039; - logika:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationService { }&lt;br /&gt;
public class SessionService { }&lt;br /&gt;
public class GroupService { }&lt;br /&gt;
public class CgaBulkOperationService { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Controller/Resource Classes&#039;&#039;&#039; - REST endpoints:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthController { }&lt;br /&gt;
public class UserResource { }&lt;br /&gt;
public class GroupResource { }&lt;br /&gt;
public class CgaOperationsResource { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{iPoruka|txt=U Quarkus svetu standardniji je sufiks Resource. Ako ćemo koristiti Controller, mora biti konzistentan kroz ceo projekat. &#039;&#039;&#039;Moj predlog - Resource.&#039;&#039;&#039;|naslov=Napomena o Controller vs Resource:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO Classes&#039;&#039;&#039; - Data Transfer Objects:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class LoginRequest { }&lt;br /&gt;
public class LoginResponse { }&lt;br /&gt;
public class SelectFirmRequest { }&lt;br /&gt;
public class BulkUserCreateRequest { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exception Classes&#039;&#039;&#039; - Izuzeci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class AuthenticationException { }&lt;br /&gt;
public class UserLockedException { }&lt;br /&gt;
public class FirmAccessException { }&lt;br /&gt;
public class TenantDatabaseException { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repository Classes&#039;&#039;&#039; (ako koristite Repository pattern):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class UserRepository { }&lt;br /&gt;
public class GroupRepository { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utility Classes&#039;&#039;&#039; - Pomoćne klase:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class PasswordEncoder { }&lt;br /&gt;
public class JwtService { }&lt;br /&gt;
public class StringUtils { }&lt;br /&gt;
public class DateUtils { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=558</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=558"/>
		<updated>2025-11-12T11:56:50Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
=== Klase (Classes) ===&lt;br /&gt;
&lt;br /&gt;
=== Interfejsi (Interfaces) ===&lt;br /&gt;
&#039;&#039;&#039;Imenovanje - Dva Pristupa&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Pristup 1: Bez prefiksa/sufiksa &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Čist naziv&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface UserService { }&lt;br /&gt;
public interface Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
public interface Validator { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Implementacije koriste deskriptivne nazive&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class DefaultUserService implements UserService { }&lt;br /&gt;
public class UserServiceImpl implements UserService { }  - Samo ako nema bolji naziv&lt;br /&gt;
public class JpaRepository&amp;lt;T&amp;gt; implements Repository&amp;lt;T&amp;gt; { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{pPoruka|txt=Izbegavaj Impl suffix ako možeš dati deskriptivniji naziv implementaciji|naslov=VAŽNO:}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=557</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=557"/>
		<updated>2025-11-12T11:36:25Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=556</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=556"/>
		<updated>2025-11-12T11:31:18Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String username;&lt;br /&gt;
Integer userId;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&lt;br /&gt;
LocalDateTime createdAt;&lt;br /&gt;
boolean isActive.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String Username;&lt;br /&gt;
String usr;&lt;br /&gt;
String strUsername;&lt;br /&gt;
String user_name.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Long userId;&lt;br /&gt;
Integer firmId;&lt;br /&gt;
Long accountId.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
boolean isActive;&lt;br /&gt;
boolean hasAccess;&lt;br /&gt;
boolean canDelete;&lt;br /&gt;
boolean shouldValidate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&lt;br /&gt;
CreateUserRequest createRequest;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&lt;br /&gt;
UserResponse userResponse.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=555</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=555"/>
		<updated>2025-11-12T11:26:03Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
=== 1. Osnovne konvencije ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase (počinje malim slovom)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Stil: glagol ili glagolska fraza&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void login() { }&lt;br /&gt;
public User findUserByUsername(String username) { }&lt;br /&gt;
public boolean isValid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; getAccessibleFirms() { }&lt;br /&gt;
public void Login() { }&lt;br /&gt;
public User user(String username) { }&lt;br /&gt;
public boolean valid() { }&lt;br /&gt;
public List&amp;lt;Firm&amp;gt; firms() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 2. Standardni prefiksi ===&lt;br /&gt;
==== Getter metode — get ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String getUsername() { }&lt;br /&gt;
public Integer getFirmId() { }&lt;br /&gt;
public List&amp;lt;Group&amp;gt; getGroups() { }&lt;br /&gt;
public LocalDateTime getCreatedAt() { }&lt;br /&gt;
Boolean getteri koriste is/has/can:&lt;br /&gt;
public boolean isActive() { }&lt;br /&gt;
public boolean isLocked() { }&lt;br /&gt;
public boolean hasAccess() { }&lt;br /&gt;
public boolean canAccess() { }&lt;br /&gt;
public boolean getActive() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Setter metode — set ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void setUsername(String username) { }&lt;br /&gt;
public void setActive(boolean active) { }&lt;br /&gt;
public void setGroupIds(List&amp;lt;Integer&amp;gt; groupIds) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Query/Find metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User findByUsername(String username) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findByGroupId(Integer groupId) { }&lt;br /&gt;
public Optional&amp;lt;User&amp;gt; findById(Long id) { }&lt;br /&gt;
public List&amp;lt;User&amp;gt; findAll() { }&lt;br /&gt;
public Page&amp;lt;User&amp;gt; findAllByStatus(Integer status, Pageable pageable) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Check/Validation metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public boolean exists(Long id) { }&lt;br /&gt;
public boolean existsByUsername(String username) { }&lt;br /&gt;
public void validate(LoginRequest request) { }&lt;br /&gt;
public void validatePassword(String password) { }&lt;br /&gt;
public boolean isPasswordValid(String password) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Create/Save metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User create(User user) { }&lt;br /&gt;
public User save(User user) { }&lt;br /&gt;
public void persist(User user) { }&lt;br /&gt;
public User createUser(CreateUserRequest request) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Update metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User update(User user) { }&lt;br /&gt;
public User updateEmail(Long userId, String newEmail) { }&lt;br /&gt;
public void updateStatus(Long userId, Integer status) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Delete metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void delete(Long id) { }&lt;br /&gt;
public void deleteById(Long id) { }&lt;br /&gt;
public void deactivate(Long id) { }&lt;br /&gt;
public void softDelete(Long id) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Count metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public long count() { }&lt;br /&gt;
public long countByStatus(Integer status) { }&lt;br /&gt;
public int countActiveUsers() { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Build/Generate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public String buildToken(User user) { }&lt;br /&gt;
public String generatePassword() { }&lt;br /&gt;
public String generateSessionId() { }&lt;br /&gt;
public User buildUser(UserData data) { &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Convert/Transform metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public UserResponse toResponse(User user) { }&lt;br /&gt;
public User toEntity(UserRequest request) { }&lt;br /&gt;
@Override public String toString() { }&lt;br /&gt;
public List&amp;lt;Integer&amp;gt; parseGroupIds(String groupIdString) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Calculate metode ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public BigDecimal calculateTotal() { }&lt;br /&gt;
public int calculateAge(LocalDate birthDate) { }&lt;br /&gt;
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=554</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=554"/>
		<updated>2025-11-12T11:09:21Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim &#039;Primeri&#039; u sadržaju, ali ih ne vidim na kraju dokumenta - iza &#039;Paketi&#039;}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=553</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=553"/>
		<updated>2025-11-12T11:07:00Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
&#039;&#039;&#039;1. Osnovne konvencije&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format: sva mala slova, bez underscore ili camelCase.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Struktura: obrnuti domen + aplikacija + modul.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package com.balans.auth.controllers;&lt;br /&gt;
package com.balans.auth.services;&lt;br /&gt;
package com.balans.auth.domain;&lt;br /&gt;
package com.balans.auth.dto;&lt;br /&gt;
package com.balans.auth.Controllers;&lt;br /&gt;
package com.balans.auth.user_service;&lt;br /&gt;
package com.balans.auth.userService;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{greska|txt=poslednja 3 reda su u nedozvoljenom formatu}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Standardna struktura paketa&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;Root com.balans.auth&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
{{greska|txt=Vidim primere u sadržaju, ali ih ne vidim na kraju dokumenta}}&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Template:Greska&amp;diff=551</id>
		<title>Template:Greska</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Template:Greska&amp;diff=551"/>
		<updated>2025-11-12T10:56:59Z</updated>

		<summary type="html">&lt;p&gt;Uroš: Created page with &amp;quot;&amp;lt;span&amp;gt;{{{txt}}}&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span&amp;gt;{{{txt}}}&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=550</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=550"/>
		<updated>2025-11-12T10:26:20Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=549</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=549"/>
		<updated>2025-11-12T10:24:31Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-zelena&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=548</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=548"/>
		<updated>2025-11-12T10:23:44Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=547</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=547"/>
		<updated>2025-11-12T10:23:16Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-siva&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=544</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=544"/>
		<updated>2025-11-12T10:20:57Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot; class=&amp;quot;mst mst-cyan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=536</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=536"/>
		<updated>2025-11-10T16:14:58Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
Svasta pre tabele&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Paket!!Svrha!!Tipične klase&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.controllers||HTTP endpoint-i (REST sloj)||AuthResource, UserResource&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.services||Poslovna logika i orkestracija||AuthenticationService, SessionService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.domain||JPA/entiteti i domenski modeli||User, Group, CbaSession&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.dto||Ulazno/izlazni DTO objekti||LoginRequest, LoginResponse&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.exceptions||Domen-specifični izuzeci||AuthenticationException, UserLockedException&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.security||Bezbednosni utili i komponente||PasswordEncoder, JwtService&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.repositories||Pristup podacima (repo sloj)||UserRepository, GroupRepository&lt;br /&gt;
|-&lt;br /&gt;
|com.balans.auth.config||Konfiguracija modula i bean-ovi||AuthConfig, ObjectMapperConfig&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=535</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=535"/>
		<updated>2025-11-10T16:07:32Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum TokenType {&lt;br /&gt;
    CLUSTER,&lt;br /&gt;
    FIRM,&lt;br /&gt;
    ARCHIVE&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum UserStatus {&lt;br /&gt;
    ACTIVE,&lt;br /&gt;
    INACTIVE,&lt;br /&gt;
    LOCKED&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum RoleType {&lt;br /&gt;
    USER,&lt;br /&gt;
    CGA,&lt;br /&gt;
    CSA&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public enum HttpStatus {&lt;br /&gt;
    OK(200),&lt;br /&gt;
    UNAUTHORIZED(401),&lt;br /&gt;
    FORBIDDEN(403);&lt;br /&gt;
&lt;br /&gt;
    private final int code;&lt;br /&gt;
    HttpStatus(int code) { this.code = code; }&lt;br /&gt;
    public int getCode() { return code; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
	<entry>
		<id>http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=534</id>
		<title>Imenovanja u Java okruženju</title>
		<link rel="alternate" type="text/html" href="http://192.168.0.11:8044/index.php?title=Imenovanja_u_Java_okru%C5%BEenju&amp;diff=534"/>
		<updated>2025-11-10T16:04:05Z</updated>

		<summary type="html">&lt;p&gt;Uroš: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{abstract}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Test prve strane&lt;br /&gt;
&lt;br /&gt;
== Opšta pravila ==&lt;br /&gt;
# Koristimo engleski jezik – svi nazivi moraju biti na engleskom&lt;br /&gt;
# Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi&lt;br /&gt;
# Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP) &lt;br /&gt;
# Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)&lt;br /&gt;
&lt;br /&gt;
=== CamelCase Konvencije ===&lt;br /&gt;
# PascalCase (UpperCamelCase) – UserService, AuthenticationController&lt;br /&gt;
# camelCase (lowerCamelCase) – userName, calculateTotal&lt;br /&gt;
&lt;br /&gt;
== Dužina imenovanja ==&lt;br /&gt;
{|style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Element !! Idealno (cilj) !! Gornja granica !! Napomene&lt;br /&gt;
|-&lt;br /&gt;
| Naziv paketa || 1-3 kratka segmenta || 4-5 segmenata || com.balans.auth.services ✅; izbegavati dublje hijerarhije&lt;br /&gt;
|-&lt;br /&gt;
| Klasa/Interfejs || ≤ 20-25 karaktera || ≤ 40-50 || AuthenticationService ✅; CgaBulkOperationService → CgaBulkService&lt;br /&gt;
|-&lt;br /&gt;
| Metoda || ≤ 20-30 karaktera || ≤ 50-60 || Glagol + objekat: findByUsername, issueFirmToken&lt;br /&gt;
|-&lt;br /&gt;
| Varijabla || ≤ 15-20 karaktera || ≤ 30 || Kratko i jasno: attemptCount, accessibleFirms&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || ≤ 25-30 karaktera || ≤ 40-50 || TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tretiranje akronima ==&lt;br /&gt;
fghtfng&lt;br /&gt;
&lt;br /&gt;
== Klase i interfejsi ==&lt;br /&gt;
fgnfgn&lt;br /&gt;
&lt;br /&gt;
== Metode ==&lt;br /&gt;
eeeeeeeeeeee&lt;br /&gt;
&lt;br /&gt;
== Varijable i konstante ==&lt;br /&gt;
=== 1. Lokalne varijable i parametri ===&lt;br /&gt;
&#039;&#039;&#039;Format: camelCase&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;stil: imenica koja opisuje podatak&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String username;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;Firm&amp;gt; availableFirms;&amp;lt;br /&amp;gt;&lt;br /&gt;
LocalDateTime createdAt;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
String Username;&amp;lt;br /&amp;gt;&lt;br /&gt;
String usr;&amp;lt;br /&amp;gt;&lt;br /&gt;
String strUsername;&amp;lt;br /&amp;gt;&lt;br /&gt;
String user_name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Česte konvencije: ====&lt;br /&gt;
&#039;&#039;&#039;ID varijable&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long userId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Integer firmId;&amp;lt;br /&amp;gt;&lt;br /&gt;
Long accountId.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kolekcije (uvek množina)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
List&amp;lt;User&amp;gt; users;&amp;lt;br /&amp;gt;&lt;br /&gt;
Set&amp;lt;Integer&amp;gt; firmIds;&amp;lt;br /&amp;gt;&lt;br /&gt;
Map&amp;lt;String, User&amp;gt; userMap.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Boolean varijable (pitanje ili stanje)&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean isActive;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean hasAccess;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean canDelete;&amp;lt;br /&amp;gt;&lt;br /&gt;
boolean shouldValidate.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DTO/Request objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginRequest loginRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
CreateUserRequest createRequest;&amp;lt;br /&amp;gt;&lt;br /&gt;
BulkUserCreateRequest bulkRequest.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Response objekti&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
LoginResponse loginResponse;&amp;lt;br /&amp;gt;&lt;br /&gt;
UserResponse userResponse.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Instance varijable (fields) ===&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long accId;&lt;br /&gt;
    private String username;&lt;br /&gt;
    private String email;&lt;br /&gt;
    private Integer roleType;&lt;br /&gt;
    private LocalDateTime createdAt;&lt;br /&gt;
    private List&amp;lt;Integer&amp;gt; groupIds;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;public class User {&lt;br /&gt;
    private Long AccId;&lt;br /&gt;
    private String _username;&lt;br /&gt;
    private String m_email;&lt;br /&gt;
    private Integer role_type;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Static final konstante ===&lt;br /&gt;
&#039;&#039;&#039;Format: SCREAMING_SNAKE_CASE&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dobro&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int MAX_LOGIN_ATTEMPTS = 5;&lt;br /&gt;
public static final String DEFAULT_ROLE = &amp;quot;USER&amp;quot;;&lt;br /&gt;
public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24);&lt;br /&gt;
public static final String JWT_ISSUER = &amp;quot;balans&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loše&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public static final int maxLoginAttempts = 5;&lt;br /&gt;
public static final int max_attempts = 5;&lt;br /&gt;
public static final String defaultRole = &amp;quot;USER&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Konvencije za konstante ====&lt;br /&gt;
&#039;&#039;&#039;HTTP status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_OK = 200;&lt;br /&gt;
public static final int STATUS_UNAUTHORIZED = 401;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DB status&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int STATUS_ACTIVE = 0;&lt;br /&gt;
public static final int STATUS_INACTIVE = 1;&lt;br /&gt;
public static final int STATUS_LOCKED = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role type&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final int ROLE_USER = 0;&lt;br /&gt;
public static final int ROLE_CGA = 1;&lt;br /&gt;
public static final int ROLE_CSA = 2;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Token types&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String TOKEN_TYPE_CLUSTER = &amp;quot;CLUSTER&amp;quot;;&lt;br /&gt;
public static final String TOKEN_TYPE_FIRM = &amp;quot;FIRM&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Error codes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String ERROR_AUTH_INVALID = &amp;quot;AUTH_INVALID&amp;quot;;&lt;br /&gt;
public static final String ERROR_USER_LOCKED = &amp;quot;USER_LOCKED&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delimiter konstante&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;public static final String GROUP_DELIMITER = &amp;quot;,&amp;quot;;&lt;br /&gt;
public static final String FIRM_DELIMITER = &amp;quot;,&amp;quot;;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Enum konstante ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paketi ==&lt;br /&gt;
erfvsvsvrvr&lt;br /&gt;
&lt;br /&gt;
== Primeri ==&lt;br /&gt;
ryjgjmugdhmn&lt;/div&gt;</summary>
		<author><name>Uroš</name></author>
	</entry>
</feed>