import java.util.Scanner;
import java.text.NumberFormat;
import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.util.ArrayList;
public class Main{
//public class ProductMaintApp{
// declara 2 variables de clase
private static ProductDAO productDAO = null;
private static Scanner sc = null;
public static void main(String args[]){
System.out.println("Bienvenido a la aplicación de Mantenimiento de productos \n");
// set de las variables de clase
productDAO = DAOFactory.getProductDAO();
// conexión con la base de datos
sc = new Scanner(System.in);
displayMenu();
String action = "" ;
while (!action.equalsIgnoreCase("sale")){
action = Validator.getString(sc, "Ingrese un comando: ");
System.out.println() ;
if (action.equalsIgnoreCase("list"))
displayAllProducts () ;
else if (action.equalsIgnoreCase("add"))
addProduct();else if (action.equalsIgnoreCase("eli"))
deleteProduct();
else if (action.equalsIgnoreCase("menu")) displayMenu();
else if (action.equalsIgnoreCase("sale")) System.out.println("Adios.\n");
else System.out.println("Error! comando no válido.\n");
}
}
public static void displayMenu(){
System.out.println("MENU DE COMMADOS");
System.out.println("list - Lista todos los productos");
System.out.println("add - Añade un producto");
System.out.println("eli - Elimina un producto");
System.out.println("menu - Muestra este menu");
System.out.println("sale - salida de la aplicación\n");
}
public static void displayAllProducts (){
System.out.println("LISTA DE PRODUCTOS");
System.out.println(productDAO.getProductsString());
}
public static void addProduct(){
String code =
Validator.getString(sc, "Ingrese el código de producto: ");
String description = Validator.getString(sc, "Ingrese la descripción de producto: ");
double price =
Validator.getDouble(sc, "Ingrese el precio: ");
Product product = new Product();
product.setCode(code);
product.setDescription(description);
product.setPrice(price);
productDAO.addProduct(product);
// añade un producto a la base de datos
System.out.println();
System.out.println(description + " ha sido añadido.\n");
}
public static void deleteProduct(){
String code = Validator.getString(sc,"Ingrese el código a eliminar: ");
Product p = productDAO.getProduct(code); // elimina un producto de la base de datos
System.out.println();
if (p != null){
productDAO.deleteProduct(p);
System.out.println(p.getDescription() + " ha sido eliminado.\n");
}else System.out.println("Ningún producto tiene este código.\n");
}
}
class DAOFactory{
public static ProductDAO getProductDAO(){ // método
ProductDAO pDAO = new ProductFile();
return pDAO;
}
}
interface ProductReader{
Product getProduct(String code);
String getProductsString();
}
interface ProductWriter {
boolean addProduct(Product p) ;
boolean updateProduct(Product p ) ;
boolean deleteProduct(Product p ) ;
}
interface ProductConstants {
int CODESIZE = 4;
int DESCRIPTIONSIZE = 40;
}
interface ProductDAO extends ProductReader, ProductWriter, ProductConstants{ }
final class ProductFile implements ProductDAO{
private ArrayList<Product> products = null;
private Path productsPath = null;
private File productsFile = null;
private final String FIELD_SEP = "\t";
public ProductFile() {
productsPath = Paths.get("products.txt");
productsFile = productsPath.toFile();
products = getProducts();
}
public String getProductsString(){
String sp = "";
if (Files.exists(productsPath)) { // previene FileNotFoundException
try (BufferedReader in = new BufferedReader(
new FileReader(productsFile))) {
// leer todos los productos almacenados en el archivo al array list
String line = in.readLine();
while(line != null){
String[] columns = line.split("\t");
sp += columns[0] + "\t";
sp += columns[1] + "\t";
sp += columns[2]+ "\n";
line = in.readLine();
}
} catch(IOException e){
System.out.println(e) ;
return null;
}
}
return sp;
}
public Product getProduct(String code) {
for (Product p : products) if (p.getCode().equals(code)) return p;
return null;
}
private boolean saveProducts(){
try (PrintWriter out = new PrintWriter(
new BufferedWriter(
new FileWriter(productsFile)))){
for (Product p : products){ // escribe products del array list al archivo
out.print(p.getCode() + "\t");
out.print(p.getDescription() + "\t");
out.println(p.getPrice());
}
}catch(IOException e){
System.out.println(e);
return false;
}
return true;
}
public boolean addProduct(Product p){
products.add(p);
return saveProducts();
}
public boolean deleteProduct(Product p) {
products.remove(p);
return saveProducts();
}
public boolean updateProduct(Product newProduct){
// Toma el product viejo y lo remueve
Product oldProduct = getProduct(newProduct.getCode());
int i = products.indexOf(oldProduct);
products.remove(i);
products.add(i, newProduct); // añade product actualizado
return saveProducts();
}
public ArrayList<Product> getProducts(){
if (products != null) return products;
products = new ArrayList<>() ;
if (Files.exists(productsPath)){
try (BufferedReader in = new BufferedReader(
new FileReader(productsFile))){
String line = in.readLine();
while(line != null){
String [] columns = line.split(FIELD_SEP);
String code = columns[0];
String description = columns [1];
String price = columns[2];
Product p = new Product(code, description, Double.parseDouble(price));
products.add(p);
line = in.readLine();
}
} catch(IOException e){
System.out.println(e) ;
return null;
}
}
return products;
}
}
class Validator {
public static String getString(Scanner sc, String prompt){
System.out.print(prompt);
String s = sc.next();
sc.nextLine();
return s;
}
public static int getInt(Scanner sc, String prompt){
int i = 0 ;
boolean isValid = false;
while (isValid == false){
System.out.print(prompt);
if (sc.hasNextInt()){
i = sc.nextInt();
isValid = true;
} else System.out.println("Err()rl Invalid integer value. Try again.");
sc.nextLine();
}
return i;
}
public static int getInt(Scanner sc, String prompt, int min, int max){
int i = 0;
boolean isValid = false;
while (isValid == false){
i = getInt(sc, prompt);
if (i <= min) System.out.println("Error! Number must be greater than " + min + ".");
else if (i >= max) System.out.println("Err()rl Number must be less than " + max + ".");
else isValid = true;
}
return i ;
}
public static double getDouble(Scanner sc, String prompt){
double d = 0 ;
boolean isValid = false;
while (isValid == false){
System.out.print(prompt);
if (sc.hasNextDouble()){
d = sc.nextDouble();
isValid = true;
} else System.out.println("Error! Invalid decimal value. Try again.");
sc.nextLine();
}
return d;
}
public static double getDouble(Scanner sc, String prompt, double min, double max) {
double d = 0 ;
boolean isValid = false;
while (isValid == false){
d = getDouble(sc, prompt);
if (d <= min) System.out.println("Error! Number must be greater than " + min + ".");
else if (d >= max) System.out.println("Err()r! Number must be less than " + max + ".");
else isValid = true;
}
return d;
}
}
class Product{
private String code;
private String description;
private double price;
public Product(){
code = "";
description = "";
price = 0.0;
}
public Product(String code, String description, double price){
this.code = code;
this.description = description;
this.price = price;
}
public void setCode(String code){this.code = code;}
public String getCode(){return code;}
public void setDescription(String description){this.description = description;}
public String getDescription(){return description;}
public void setPrice(double price){this.price = price;}
public double getPrice(){return price;}
public String getFormattedPrice(){
NumberFormat currency = NumberFormat.getCurrencyInstance();
return currency.format(price);
}
}