PLIKI Z PROJEKT 2 package finanse; public class Kwota { private int zlote; private int grosze;
public Kwota(int zlote, int grosze) { //sprawdzamy czy zlote i grosze są ujemne, jeśli są to wyrzuca wyjątek if (zlote < 0 || grosze < 0) { throw new IllegalArgumentException(); } else { //jeśli groszę wynoszą więcej niż 99 wtedy odpowiednio przelicza xD if (grosze > 99) { // dlatego int mamy - usuwa nam końcówkę i gdy grosze = 510 to po podzieleniu ile = 5 int ile = grosze / 100; grosze = grosze - 100 * ile; // grosze = 510-(100*5) da nam wynik 10gr zlote = zlote + 1 * ile; // zlote = zlote+(1*5) } this.zlote = zlote; //Przypisuje nam wartości do zmiennej globalnej this.grosze = grosze; } } public int getZlote() { return zlote; } //generujemy (PPM) - get pobiera nam dane public int getGrosze() { return grosze; } public Kwota() { } // pusty konstruktor, który tworzymy aby móc podłączyć bean'a // Tworzymy toString: Zamienia nam wartości liczbowe zmiennych (złotówki i grosze) na łańcuch znaków. @Override public String toString() { if (grosze > 9) { return zlote + "," + grosze; } else { return zlote + ",0" + grosze; } }
public Kwota dodaj(Kwota druga) { // Dodajemy. Jako parametr deklarujemy "drugą" kwotę. int zl = this.zlote + druga.zlote; int gr = this.grosze + druga.grosze; if (gr>99){ //gdy grosze większe od 99 wtedy: zl ++; zwiększamy ilość złotówek o 1. aod gr = gr - 100; groszy odejmujemy 100 // wtedy: gdy gr = 155 -> (nowe) gr = 155 - 100 i wtedy dostajemy dobre grosze } return new Kwota(zl, gr); }
public Kwota pomnoz(int liczba){ //Mnożenie. Mnożymy przez liczbę, dlatego ze w sklepie możemy sprzedać ilość jednego produktu. int gr = (this.grosze * liczba)%100; // gdy dzielimy z % dostajemy resztę czyli nasze grosze int zl = this.zlote * liczba + this.grosze * liczba / 100; // Przykład (int daje nam zaokrągloną wartość) zl = 4 * 5 + 65 * 5 / 100; return new Kwota(zl,gr); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;
Kwota kwota = (Kwota) o;
if (zlote != kwota.zlote) return false; return grosze == kwota.grosze; } @Override public int hashCode() { int result = zlote; result = 31 * result + grosze; return result; }
LOGGER.JAVA package api;
public interface Logger { void log(String message); void setName(String name); void setVersion(int version); } //Biblioteka do logowania LOGGER ma za zadanie przekazać komunikat // wygenerowany w kodzie - np. info, że jakaś operacja się nie powiodła. // do odpowiedniego miejsca (np. standardowe wyjście konsoli, plik, serwer zdalny). // Logi trafiaja do plików (U NAS ZAPISYWANE SĄ PRZY POMOCY PLIKU LoggerImplFile)
LOGGERIMPL.JAVA package impl;
import api.Logger; //importujemy Klasę Logger (nasz interfejs) import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;
@Service public class LoggerImpl implements Logger { // Nasza klasa implementuje interface Logger @Value("${name}") private String name = "Logger"; @Value("${version}") private int version;
public LoggerImpl(String name, int version) { // konstruktor this.name = name; this.version = version; } public LoggerImpl(){} // pusty konstruktor do bean'a
public void log(String message) { // W jaki sposób ma wyświetlać się nam message ===WARNING v.3 : "treść warningu" System.out.println("===" + name + " v." + version + ": " + message); }
public void setName(String name) { //set ustawia this.name = name; }
public void setVersion(int version) { this.version = version; } }
LOGGERIMPLFILE.JAVA package impl;
import api.Logger; //importuje Klasę Logger import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service;
import java.io.File; // biblioteka, umożliwiająca działania na pliku import java.io.FileWriter; // Jest to klasa która służy do zapisywania ciągu znaków do pliku tekstowego, przy użyciu domyślnego kodowania. import java.io.PrintWriter; // zapisuje nam dane z pliku
public class LoggerImplFile implements Logger { // Klasa LoggerImplFile jest implementacją interface'u Logger private String name; private int version; private File file = new File("plik.log"); //utworzyć obiekt przechowujący dane pliku to File private PrintWriter pw;
public LoggerImplFile(){ //konstruktor do beana try { pw = new PrintWriter(new FileWriter(file, true)); //dodaj do pliku } catch (Exception e) { System.out.println("Wyjatek"); } } public void log(String message) { pw.append(message + "\n"); // append - dodaje pw.flush(); // opróżnia sprumień - aby wyczyścic } public void setName(String name) { //ustawia Name this.name = name; } public void setVersion(int version) { //ustawia wersje this.version = version; } }
PRODUCT.JAVA package impl; import finanse.Kwota; //import klasy Kwota
public class Product { private String name; private Kwota price; private int amount;
public String getName() { return name;} //metody typu get pobiera nam nazwę, cenę, ilość public Kwota getPrice() { return price;} public int getAmount() { return amount;} public void setPrice(Kwota price) { //metody typu set do price i amount this.price = price; } public void setAmount(int amount) { this.amount = amount;} public Product(String name, Kwota price, int amount) { this.name = name; //konstruktor this.price = price; this.amount = amount; } @Override // Tworzy się przy pomocy (PPM) public String toString() { return "Product{" + "name='" + name + '\'' + ", price=" + price + ", amount=" + amount + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;
Product product = (Product) o; return name.equals(product.name); } @Override public int hashCode() { return name.hashCode(); } } PRODUCTREPOSITORY.JAVA package api; import impl.Product; import java.util.Set;
public interface ProductRepository {
void setLogger(Logger logger); Product findByName(String name); Product create(Product product); Product update(Product product); void delete(String name); Set<Product> findAll(); }
PRODUCTREPOSITORYIMPL.JAVA package impl;
import api.Logger; import api.ProductRepository; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set;
@Service public class ProductRepositoryImpl implements ProductRepository {
private Product product; private Map<String, Product> database = new HashMap<String,Product>() //specjalnej kolekcji, która pozwala do danego parametru przypisać wartość klucza. // Dzięki temu, znając wartość klucza, jesteśmy wstanie wyciągnąć z mapy interesujące nasze dane. private Logger logger;
public ProductRepositoryImpl(Logger logger){ //System.out.println("Tworzenie repozytorium;"); this.logger = logger; } public void setProduct(Product product) { this.product=product; }
public void setLogger(Logger logger) { this.logger=logger;
}
public Product findByName(String name) { logger.log("wyszukiwanie produktu o nazwie: "+name); return database.get(name); } public Set<Product> findAll() { logger.log("Tworzenie zbioru produktow"); Set<Product> set = new HashSet<Product>(database.values()); return set; } public void delete(String name){ logger.log("Usuwanie produktu o nazwie: "+name); database.remove(name); }
public Product create(Product product){ logger.log("Proba wstawienia do bazy istniejacy produkt"); if(exists(product.getName())){ throw new IllegalArgumentException("Nie mozna zdublowac produktu"); } else{ logger.log("Wstawienie do bazy produktu o nazwie: "+ product.getName()); database.put(product.getName(),product); return product; } ) private boolean exists(String name) { boolean ok = database.containsKey(name); logger.log("W bazie istnieje uzytkownik o loginie: "+name+" wynik: "+ok); return ok; } public Product update(Product product){ logger.log("Modyfikacja (lub dodanie) uzytkownika o loginie: "+product.getName()); database.put(product.getName(), product); return product;
} }
//Mapa - obiekt mapujący wartości parametrów na podstawie klucza. // W danej mapie może istnieć tylko jeden unikatowy klucz. // Szeroko stosowany w komunikacji między aplikacjami, // dzięki możliwości przypisanie wartości do stałych, ustalonych parametrów.
//Map<String, Integer> Oceny = new HashMap<String, Integer>(); //Oceny.put("Matematyka", 5); //Oceny.put("Polski", 2);
//Zaimplementowana mapa to HashMap
STORE.JAVA package impl;
import api.Logger; import api.ProductRepository; import finanse.Kwota; import org.springframework.stereotype.Service;
import java.util.HashSet; import java.util.Set;
@Service public class Store implements ProductRepository {
private ProductRepository repository;
public Store(ProductRepository repository) { this.repository = repository; }
public void productDelivery(String name, Kwota price, int amount) {
//dostawa produktu do magazynu //przyjmiemy, ze nowa cena ma byc ustawiona a ilosc zwiekszona
Product product = repository.findByName(name); if (product == null) { repository.create(new Product(name, price, amount)); } else { repository.update(new Product(name, price, amount)); }
}
public void productSale(String name, int amount) {
Product product = repository.findByName(name); if ((product == null) || product.getAmount() < amount) { throw new IllegalArgumentException(); } else { repository.update(new Product(name, product.getPrice(), product.getAmount() - amount));
} //jesli sie nie da, wyrzucic IllegalArgumentException //zaktualizowac baze danych //kwote do zaplay za amount jednostek produktu o nazwie name }
public Kwota priceToPay(String name, int amount) { Product product = repository.findByName(name); if (product == null) throw new IllegalArgumentException(); return product.getPrice().pomnoz(amount); }
public Kwota productPrice(String name) {
Product product = repository.findByName(name); if (product != null) { return product.getPrice(); } else { return null; } }
public int productAmount(String name) { Product product = repository.findByName(name); if (product != null) { return product.getAmount(); } else { return 0; } }
public void setLogger(Logger logger) {
}
public Product findByName(String name) { return null; }
public Product create(Product product) { return null; }
public Product update(Product product) { return null; }
public void delete(String name) {
}
public Set<Product> findAll() { return null; }
public String toString() { HashSet<Product> set = (HashSet) repository.findAll(); String s = ""; for (Product i : set) { s = s + i.toString() + "\n"; } return s; } }
STOTETEST.JAVA package impl;
import finanse.Kwota; import org.junit.Assert; import org.junit.Test;
public class StoreTest {
private Store sklep = new Store(new ProductRepositoryImpl(new LoggerImplFile()));
@Test public void should_deliver_product_when_no_exists(){ //when sklep.productDelivery("kurtka", new Kwota(80,99), 7); //then Assert.assertEquals(7,sklep.productAmount("kurtka")); Assert.assertEquals(new Kwota(80,99), sklep.productPrice("kurtka")); }
@Test public void should_deliver_product_when_exists(){ //given sklep.productDelivery("pasek", new Kwota(70,20), 2); //when sklep.productDelivery("pasek", new Kwota(70,20), 5 ); //then Assert.assertEquals(7, sklep.productAmount("pasek")); Assert.assertEquals(new Kwota(70,20), sklep.productPrice("pasek")); }
@Test public void should_sale_product_when_exists(){ //given sklep.productDelivery("spodnie", new Kwota(12,99), 5); //when sklep.productSale("spodnie",2); //then Assert.assertEquals(3,sklep.productAmount("spodnie")); Assert.assertEquals(new Kwota(12,99),sklep.productPrice("spodnie")); }
@Test public void counts_price_to_pay_when_product_exists(){ //given sklep.productDelivery("krawat", new Kwota(12,20), 16); //when sklep.priceToPay("krawat",3); //then Assert.assertEquals(new Kwota(36,60), sklep.priceToPay("krawat", 3)); }
@Test(expected = IllegalArgumentException.class) public void should_throw_when_trying_to_count_price_when_no_exists(){ sklep.priceToPay("buty",2);
}
@Test(expected = IllegalArgumentException.class) public void should_throw_when_trying_to_sale_product_when_no_exists(){ sklep.productDelivery("skarpety",new Kwota(5,50), 4); sklep.productSale("skarpety", 6); }
@Test(expected = IllegalArgumentException.class) public void should_throw_when_trying_to_sale_product_when_not_enought(){ //given sklep.productDelivery("bluzka",new Kwota(20,99), 5); //when sklep.productSale("bluzka",6); } }
MAIN.JAVA import finanse.Kwota; import impl.Store; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
public class Main {
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("konfiguracja.xml"); Store store = context.getBean("store", Store.class);
int nr = 0; Scanner sc = new Scanner(System.in);
while (nr != 4) { hello(); menu(); nr = Integer.parseInt(sc.nextLine()); switch (nr) { case 1: System.out.println(store.toString()); break; case 2: sale(store); break; case 3: delivery(store); break; case 4: goodbye(); } } }
private static void delivery(Store store) { String name; int i; int zl, gr; String price; Scanner sc = new Scanner(System.in); try { System.out.print("Podaj nazwę: "); name = sc.nextLine(); System.out.print("Podaj ilosc: "); i = Integer.parseInt(sc.nextLine()); System.out.print("Podaj cene w formacie zl,gr: "); price = sc.nextLine(); zl = Integer.parseInt(price.substring(0, price.indexOf(","))); gr = Integer.parseInt(price.substring(price.indexOf(",") + 1)); store.productDelivery(name, new Kwota(zl, gr), i); } catch (IllegalArgumentException iae) { System.out.println("Błąd, spróbuj jeszcze raz"); } }
private static void sale(Store store) { String name; int i; int zl, gr; String price; Scanner sc = new Scanner(System.in); try { System.out.print("Podaj nazwę produktu do kupienia: "); name = sc.nextLine(); System.out.print("Podaj ilosc: "); i = Integer.parseInt(sc.nextLine()); int nr = store.productAmount(name); if (nr == 0) { System.out.println("Brak produktu w sklepie"); } else if (i <= nr) { System.out.println("Do zaplaty: " + store.priceToPay(name, i)); store.productSale(name, i); } else { System.out.println("Za mało produktu w sklepie"); } } catch (IllegalArgumentException iae) { System.out.println("Błąd, spróbuj jeszcze raz"); } }
private static void menu() { String menu = " 1. Wyswietl produkty\n 2. Kup produkt\n 3. Dostawa produktu do sklepu\n 4. Koniec "; System.out.println("Wybierz opcję:"); System.out.println(menu); }
private static void hello() { System.out.println("============================="); System.out.println(" Aplikacja obsługująca sklep"); System.out.println("============================="); }
private static void goodbye() { System.out.println("============================="); System.out.println(" KONIEC"); System.out.println("============================="); } }
KONFIGURACJA.XML <?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/b … ns-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/c … "> <context:property-placeholder location="file:C:\Documents and Settings\student\Java_GRI\ProjektDrugi\properties.txt"/> <context:annotation-config/> <context:component-scan base-package="impl"/> <bean id = "store" class = "impl.Store"> <constructor-arg ref="repo"/ </bean>
<bean id="repo" class="impl.ProductRepositoryImpl"> <constructor-arg ref="logger"/> </bean> <bean id="logger" class="impl.LoggerImpl"/> <bean id="logger" class="impl.LoggerImpl"/> </beans>
POM.TXT <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.umcs.monika</groupId> <artifactId>ProjektDrugi</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.1.RELEASE</version> </dependency> </dependencies> </project>
|