Skip to content

Commit 7eacdf7

Browse files
committed
Add new assignments
1 parent 6038284 commit 7eacdf7

File tree

163 files changed

+7080
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

163 files changed

+7080
-0
lines changed

R3S1/Podstawy modelowania programów (L)/Lab03_2/zad01.md renamed to R3S1/Podstawy Modelowania Programów (L)/Lab04/zad01.md

File renamed without changes.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package zad03;
2+
3+
/**
4+
* Główna klasa aplikacji wykorzystująca wzorzec Dependency Injection.
5+
*
6+
* Ta klasa otrzymuje zależność (TrybPracy) przez konstruktor (Constructor Injection),
7+
* co pozwala na:
8+
* - Łatwe testowanie (można wstrzyknąć mock'i)
9+
* - Luźne powiązanie między komponentami
10+
* - Łatwe rozszerzanie o nowe tryby pracy (np. REST API)
11+
*
12+
* Klasa nie wie, jaki konkretny tryb pracy będzie używany - zna tylko interfejs.
13+
* Decyzja o tym, która implementacja zostanie użyta, jest podejmowana
14+
* w klasie Main (Composition Root).
15+
*/
16+
public class Aplikacja {
17+
18+
// Zależność wstrzyknięta przez konstruktor
19+
private final TrybPracy trybPracy;
20+
21+
// Procesor poleceń - może być również wstrzyknięty, ale dla uproszczenia
22+
// tworzymy go wewnętrznie
23+
private final KomendyProcessor processor;
24+
25+
/**
26+
* Konstruktor z wstrzykiwaniem zależności (Constructor Injection).
27+
*
28+
* @param trybPracy tryb pracy do użycia (wstrzyknięta zależność)
29+
*/
30+
public Aplikacja(TrybPracy trybPracy) {
31+
this(trybPracy, new KomendyProcessor());
32+
}
33+
34+
/**
35+
* Konstruktor z pełnym wstrzykiwaniem zależności.
36+
* Pozwala na wstrzyknięcie zarówno trybu pracy, jak i procesora poleceń.
37+
* Przydatne do testowania.
38+
*
39+
* @param trybPracy tryb pracy do użycia
40+
* @param processor procesor poleceń do użycia
41+
*/
42+
public Aplikacja(TrybPracy trybPracy, KomendyProcessor processor) {
43+
// Walidacja - nie akceptujemy null'i
44+
if (trybPracy == null) {
45+
throw new IllegalArgumentException("TrybPracy nie może być null");
46+
}
47+
if (processor == null) {
48+
throw new IllegalArgumentException("KomendyProcessor nie może być null");
49+
}
50+
51+
this.trybPracy = trybPracy;
52+
this.processor = processor;
53+
}
54+
55+
/**
56+
* Uruchamia aplikację z wstrzykniętym trybem pracy.
57+
*
58+
* Metoda deleguje wykonanie do wstrzykniętego trybu pracy,
59+
* przekazując mu procesor poleceń.
60+
*/
61+
public void uruchom() {
62+
System.out.println("Uruchamianie aplikacji...");
63+
System.out.println("Aktywny tryb: " + trybPracy.getNazwaTrybu());
64+
System.out.println();
65+
66+
// Delegacja do wstrzykniętego trybu pracy
67+
trybPracy.uruchom(processor);
68+
}
69+
70+
/**
71+
* Zwraca aktualnie używany tryb pracy.
72+
*
73+
* @return aktualny tryb pracy
74+
*/
75+
public TrybPracy getTrybPracy() {
76+
return trybPracy;
77+
}
78+
79+
/**
80+
* Zwraca procesor poleceń.
81+
*
82+
* @return procesor poleceń
83+
*/
84+
public KomendyProcessor getProcessor() {
85+
return processor;
86+
}
87+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package zad03;
2+
3+
/**
4+
* Klasa odpowiedzialna za przetwarzanie i obsługę poleceń użytkownika.
5+
*
6+
* Ta klasa jest niezależna od sposobu pozyskiwania danych (konsola, plik, REST API)
7+
* i może być używana z dowolną implementacją interfejsu TrybPracy.
8+
*/
9+
public class KomendyProcessor {
10+
11+
// Dane osób implementujących rozwiązanie
12+
private static final String[] IMPLEMENTATORZY = {
13+
"Kowalski", "Nowak", "Wiśniewski"
14+
};
15+
16+
// Grupa dziekańska
17+
private static final String GRUPA_DZIEKANSKA = "Grupa 3A";
18+
19+
/**
20+
* Przetwarza podane polecenie i zwraca odpowiedź.
21+
*
22+
* @param polecenie polecenie wprowadzone przez użytkownika
23+
* @return odpowiedź na polecenie lub komunikat o błędzie
24+
*/
25+
public String przetworzPolecenie(String polecenie) {
26+
if (polecenie == null || polecenie.trim().isEmpty()) {
27+
return "Błąd: Puste polecenie. Wpisz 'pomoc' aby zobaczyć dostępne polecenia.";
28+
}
29+
30+
// Normalizacja polecenia - usunięcie nadmiarowych spacji i konwersja na małe litery
31+
String normalizedPolecenie = polecenie.trim().toLowerCase();
32+
33+
// Obsługa polecenia "pomoc"
34+
if (normalizedPolecenie.equals("pomoc")) {
35+
return obsluzPoleceniePomoc();
36+
}
37+
38+
// Obsługa polecenia "grupa"
39+
if (normalizedPolecenie.equals("grupa")) {
40+
return obsluzPolecenieGrupa();
41+
}
42+
43+
// Obsługa polecenia "czesc + nazwisko"
44+
if (normalizedPolecenie.startsWith("czesc")) {
45+
if (normalizedPolecenie.equals("czesc")) {
46+
return "Błąd: Brak nazwiska. Użyj formatu: 'czesc Nazwisko'";
47+
}
48+
if (normalizedPolecenie.startsWith("czesc ")) {
49+
return obsluzPolecenieCzesc(polecenie);
50+
}
51+
}
52+
53+
// Obsługa poleceń wyjścia
54+
if (normalizedPolecenie.equals("exit") || normalizedPolecenie.equals("quit") ||
55+
normalizedPolecenie.equals("wyjscie") || normalizedPolecenie.equals("koniec")) {
56+
return "EXIT";
57+
}
58+
59+
// Nieznane polecenie
60+
return "Błąd: Nieznane polecenie '" + polecenie + "'. Wpisz 'pomoc' aby zobaczyć dostępne polecenia.";
61+
}
62+
63+
/**
64+
* Obsługuje polecenie "pomoc" - wypisuje nazwiska implementatorów.
65+
*
66+
* @return lista nazwisk osób implementujących rozwiązanie
67+
*/
68+
private String obsluzPoleceniePomoc() {
69+
StringBuilder wynik = new StringBuilder();
70+
wynik.append("Rozwiązanie zaimplementowali:\n");
71+
for (int i = 0; i < IMPLEMENTATORZY.length; i++) {
72+
wynik.append("- ").append(IMPLEMENTATORZY[i]);
73+
if (i < IMPLEMENTATORZY.length - 1) {
74+
wynik.append("\n");
75+
}
76+
}
77+
return wynik.toString();
78+
}
79+
80+
/**
81+
* Obsługuje polecenie "grupa" - wypisuje grupę dziekańską.
82+
*
83+
* @return nazwa grupy dziekańskiej
84+
*/
85+
private String obsluzPolecenieGrupa() {
86+
return "Grupa dziekańska: " + GRUPA_DZIEKANSKA;
87+
}
88+
89+
/**
90+
* Obsługuje polecenie "czesc + nazwisko" - wypisuje powitanie.
91+
*
92+
* @param polecenie pełne polecenie wprowadzone przez użytkownika
93+
* @return powitanie z nazwiskiem lub komunikat o błędzie
94+
*/
95+
private String obsluzPolecenieCzesc(String polecenie) {
96+
// Wyciągnięcie nazwiska z polecenia
97+
String[] czesci = polecenie.trim().split("\\s+");
98+
99+
if (czesci.length < 2) {
100+
return "Błąd: Brak nazwiska. Użyj formatu: 'czesc Nazwisko'";
101+
}
102+
103+
if (czesci.length > 2) {
104+
return "Błąd: Za dużo argumentów. Użyj formatu: 'czesc Nazwisko'";
105+
}
106+
107+
String nazwisko = czesci[1];
108+
109+
// Walidacja nazwiska - sprawdzenie czy zawiera tylko litery
110+
if (!nazwisko.matches("[a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+")) {
111+
return "Błąd: Nazwisko może zawierać tylko litery.";
112+
}
113+
114+
// Kapitalizacja pierwszej litery nazwiska
115+
String skapitalizowaneNazwisko = nazwisko.substring(0, 1).toUpperCase() +
116+
nazwisko.substring(1).toLowerCase();
117+
118+
return "Witaj " + skapitalizowaneNazwisko;
119+
}
120+
121+
/**
122+
* Sprawdza czy polecenie jest poleceniem wyjścia z programu.
123+
*
124+
* @param polecenie polecenie do sprawdzenia
125+
* @return true jeśli to polecenie wyjścia, false w przeciwnym razie
126+
*/
127+
public boolean czyPolecenieWyjscia(String polecenie) {
128+
if (polecenie == null) return false;
129+
String normalized = polecenie.trim().toLowerCase();
130+
return normalized.equals("exit") || normalized.equals("quit") ||
131+
normalized.equals("wyjscie") || normalized.equals("koniec");
132+
}
133+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package zad03;
2+
3+
/**
4+
* Główna klasa programu - pełni rolę "Composition Root" we wzorcu Dependency Injection.
5+
*
6+
* Composition Root to miejsce, gdzie:
7+
* - Tworzone są wszystkie zależności (obiekty)
8+
* - Konfigurowane są powiązania między komponentami
9+
* - Wstrzykiwane są zależności do obiektów, które ich potrzebują
10+
*
11+
* W tej implementacji Main:
12+
* 1. Analizuje argumenty wiersza poleceń
13+
* 2. Tworzy odpowiednią implementację TrybPracy
14+
* 3. Wstrzykuje ją do klasy Aplikacja
15+
* 4. Uruchamia aplikację
16+
*
17+
* Dzięki temu podejściu:
18+
* - Klasa Aplikacja nie wie, jaki konkretny tryb będzie używany
19+
* - Łatwo można dodać nowe tryby (np. REST API) bez modyfikacji Aplikacji
20+
* - Kod jest łatwy do testowania (można wstrzyknąć mock'i)
21+
*/
22+
public class Main {
23+
24+
public static void main(String[] args) {
25+
try {
26+
// Analiza argumentów i utworzenie odpowiedniego trybu pracy
27+
TrybPracy trybPracy = utworzTrybPracy(args);
28+
29+
if (trybPracy == null) {
30+
// Wyświetlono pomoc lub wystąpił błąd - kończymy
31+
return;
32+
}
33+
34+
// === COMPOSITION ROOT ===
35+
// Tutaj tworzymy zależności i wstrzykujemy je do aplikacji
36+
Aplikacja aplikacja = new Aplikacja(trybPracy);
37+
38+
// Uruchomienie aplikacji
39+
aplikacja.uruchom();
40+
41+
} catch (Exception e) {
42+
System.err.println("Wystąpił nieoczekiwany błąd: " + e.getMessage());
43+
e.printStackTrace();
44+
System.exit(1);
45+
}
46+
}
47+
48+
/**
49+
* Tworzy odpowiednią implementację TrybPracy na podstawie argumentów wiersza poleceń.
50+
*
51+
* Ta metoda jest częścią Composition Root - decyduje, która implementacja
52+
* interfejsu TrybPracy zostanie utworzona i wstrzyknięta do aplikacji.
53+
*
54+
* @param args argumenty wiersza poleceń
55+
* @return implementacja TrybPracy lub null jeśli wyświetlono pomoc
56+
*/
57+
private static TrybPracy utworzTrybPracy(String[] args) {
58+
// Brak argumentów - tryb konsolowy
59+
if (args.length == 0) {
60+
System.out.println("Uruchamianie w trybie konsolowym...");
61+
System.out.println();
62+
return new TrybKonsolowy();
63+
}
64+
65+
// Jeden argument
66+
if (args.length == 1) {
67+
String argument = args[0];
68+
69+
// Pomoc
70+
if (argument.equals("--help") || argument.equals("-h")) {
71+
wyswietlPomoc();
72+
return null;
73+
}
74+
75+
// Tryb REST API (demonstracyjny)
76+
if (argument.equals("--rest-demo")) {
77+
System.out.println("Uruchamianie w trybie REST API (demo)...");
78+
System.out.println();
79+
return new TrybRestApi("https://api.example.com/polecenia");
80+
}
81+
82+
// Tryb skryptowy - argument to nazwa pliku
83+
System.out.println("Uruchamianie w trybie skryptowym...");
84+
System.out.println();
85+
86+
TrybSkryptowy trybSkryptowy = new TrybSkryptowy(argument);
87+
88+
// Sprawdzenie czy plik jest dostępny
89+
if (!trybSkryptowy.czyPlikDostepny()) {
90+
System.err.println("Błąd: Plik '" + argument + "' nie istnieje lub nie można go odczytać.");
91+
System.err.println("Sprawdź czy plik istnieje w bieżącym katalogu i czy masz uprawnienia do jego odczytu.");
92+
System.err.println();
93+
System.err.println("Przykład użycia:");
94+
System.err.println(" java zad03.Main test_polecenia.txt");
95+
System.exit(1);
96+
}
97+
98+
return trybSkryptowy;
99+
}
100+
101+
// Dwa argumenty - tryb REST API z własnym URL
102+
if (args.length == 2 && args[0].equals("--rest")) {
103+
String endpointUrl = args[1];
104+
System.out.println("Uruchamianie w trybie REST API...");
105+
System.out.println();
106+
return new TrybRestApi(endpointUrl);
107+
}
108+
109+
// Za dużo argumentów lub nieznane argumenty
110+
System.err.println("Błąd: Nieprawidłowe argumenty.");
111+
System.err.println("Użyj --help aby zobaczyć dostępne opcje.");
112+
System.exit(1);
113+
return null;
114+
}
115+
116+
/**
117+
* Wyświetla pomoc dotyczącą użytkowania programu.
118+
*/
119+
private static void wyswietlPomoc() {
120+
System.out.println("=".repeat(70));
121+
System.out.println(" PROGRAM OBSŁUGI POLECEŃ - DEPENDENCY INJECTION");
122+
System.out.println("=".repeat(70));
123+
System.out.println();
124+
System.out.println("UŻYTKOWANIE:");
125+
System.out.println(" java zad03.Main - tryb konsolowy");
126+
System.out.println(" java zad03.Main <plik> - tryb skryptowy");
127+
System.out.println(" java zad03.Main --rest-demo - tryb REST API (demo)");
128+
System.out.println(" java zad03.Main --rest <url> - tryb REST API z własnym URL");
129+
System.out.println(" java zad03.Main --help - wyświetlenie tej pomocy");
130+
System.out.println();
131+
System.out.println("WZORZEC DEPENDENCY INJECTION:");
132+
System.out.println();
133+
System.out.println(" Ten program wykorzystuje wzorzec Dependency Injection (DI):");
134+
System.out.println(" - Main.java pełni rolę 'Composition Root'");
135+
System.out.println(" - Klasa Aplikacja otrzymuje TrybPracy przez konstruktor");
136+
System.out.println(" - Aplikacja nie wie, jaki konkretny tryb będzie używany");
137+
System.out.println();
138+
System.out.println(" Zalety DI:");
139+
System.out.println(" - Luźne powiązanie między komponentami");
140+
System.out.println(" - Łatwe testowanie (można wstrzyknąć mock'i)");
141+
System.out.println(" - Łatwe rozszerzanie o nowe tryby pracy");
142+
System.out.println();
143+
System.out.println("TRYBY PRACY:");
144+
System.out.println();
145+
System.out.println("1. TRYB KONSOLOWY (brak argumentów)");
146+
System.out.println(" - Polecenia wprowadzane interaktywnie przez użytkownika");
147+
System.out.println(" - Przykład: java zad03.Main");
148+
System.out.println();
149+
System.out.println("2. TRYB SKRYPTOWY (jeden argument - nazwa pliku)");
150+
System.out.println(" - Polecenia wczytywane z podanego pliku");
151+
System.out.println(" - Przykład: java zad03.Main test_polecenia.txt");
152+
System.out.println();
153+
System.out.println("3. TRYB REST API (--rest-demo lub --rest <url>)");
154+
System.out.println(" - Stub przygotowany na przyszłe rozszerzenie");
155+
System.out.println(" - Pokazuje gotowość architektury na nowe źródła danych");
156+
System.out.println(" - Przykład: java zad03.Main --rest-demo");
157+
System.out.println(" - Przykład: java zad03.Main --rest https://api.example.com/polecenia");
158+
System.out.println();
159+
System.out.println("DOSTĘPNE POLECENIA:");
160+
System.out.println(" pomoc - wyświetla nazwiska implementatorów");
161+
System.out.println(" grupa - wyświetla grupę dziekańską");
162+
System.out.println(" czesc <Nazwisko> - wyświetla powitanie z nazwiskiem");
163+
System.out.println(" exit/quit/wyjscie - kończy program");
164+
System.out.println();
165+
}
166+
}

0 commit comments

Comments
 (0)