Żeby było nam wszystkim wygodniej!
Nowy użytkownik
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>
Offline