From 346c76633ee6d4e7a9e4a75e2a729b09fdc99345 Mon Sep 17 00:00:00 2001 From: Caleb Fontenot Date: Mon, 1 Apr 2024 15:32:23 -0500 Subject: [PATCH] :( --- .gitignore | 1 + .../Assignments/StockBrokerAjaxThreads.zip | Bin 0 -> 27183 bytes .../faces-config.NavData | 6 + .../nb-configuration.xml | 20 + .../StockBrokerAjaxThreads/pom.xml | 53 +++ .../main/java/asdv/mp1_ajax/pojos/Stock.java | 138 ++++++ .../JakartaRestConfiguration.java | 13 + .../resources/JakartaEE10Resource.java | 20 + .../src/main/java/beans/ClientBean.java | 188 ++++++++ .../src/main/java/beans/Login.java | 57 +++ .../src/main/java/beans/OneToManyBean.java | 82 ++++ .../src/main/java/beans/StockPricesBean.java | 179 ++++++++ .../slcc/ajax/bl/CheckStockPricesThread.java | 87 ++++ .../src/main/java/edu/slcc/ajax/bl/Dao.java | 28 ++ .../main/java/edu/slcc/ajax/bl/StockDB.java | 413 ++++++++++++++++++ .../ajax/utilities/UtilitiesDatabase.java | 111 +++++ .../src/main/java/factory_1_m/OneToMany.java | 68 +++ .../java/factory_1_m/OneToManyFactory.java | 204 +++++++++ .../src/main/java/factory_1_m/TestMap.java | 39 ++ .../main/resources/META-INF/persistence.xml | 7 + .../src/main/webapp/WEB-INF/beans.xml | 6 + .../src/main/webapp/WEB-INF/faces-config.xml | 16 + .../src/main/webapp/WEB-INF/glassfish-web.xml | 25 ++ .../src/main/webapp/WEB-INF/web.xml | 60 +++ .../src/main/webapp/client-page.xhtml | 97 ++++ .../src/main/webapp/login.xhtml | 35 ++ .../src/main/webapp/stock-prices.xhtml | 79 ++++ .../src/main/webapp/test-page.xhtml | 11 + Semester 3/Assignments/nyse-1.sql | 109 +++++ 29 files changed, 2152 insertions(+) create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads.zip create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/faces-config.NavData create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/nb-configuration.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/pom.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/mp1_ajax/pojos/Stock.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/JakartaRestConfiguration.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/resources/JakartaEE10Resource.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/ClientBean.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/Login.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/OneToManyBean.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/StockPricesBean.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/CheckStockPricesThread.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/Dao.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/StockDB.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/utilities/UtilitiesDatabase.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToMany.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToManyFactory.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/TestMap.java create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/resources/META-INF/persistence.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/beans.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/glassfish-web.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/web.xml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/client-page.xhtml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/login.xhtml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/stock-prices.xhtml create mode 100644 Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/test-page.xhtml create mode 100644 Semester 3/Assignments/nyse-1.sql diff --git a/.gitignore b/.gitignore index e067009..65e59ee 100644 --- a/.gitignore +++ b/.gitignore @@ -99,3 +99,4 @@ /Semester 3/Assignments/TermProject1_CalebFontenot/target/ /Semester 3/Assignments/params/target/ /Semester 3/Assignments/templatesMatricesSample/target/ +/Semester 3/Assignments/StockBrokerAjaxThreads/target/ diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads.zip b/Semester 3/Assignments/StockBrokerAjaxThreads.zip new file mode 100644 index 0000000000000000000000000000000000000000..a990ca541dc191c27b4994d0e7901d3b1ccccf90 GIT binary patch literal 27183 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 L=;%~U;otrTSVej2 literal 0 HcmV?d00001 diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/faces-config.NavData b/Semester 3/Assignments/StockBrokerAjaxThreads/faces-config.NavData new file mode 100644 index 0000000..298bfc5 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/faces-config.NavData @@ -0,0 +1,6 @@ + + + + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/nb-configuration.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/nb-configuration.xml new file mode 100644 index 0000000..5e1a2de --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/nb-configuration.xml @@ -0,0 +1,20 @@ + + + + + + 10-web + gfv700ee10 + Facelets + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/pom.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/pom.xml new file mode 100644 index 0000000..9943544 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + asdv + StockBrokerAjaxThreads + 1 + war + StockBrokerAjaxThreads-1 + + + UTF-8 + 10.0.0 + + + + + jakarta.platform + jakarta.jakartaee-api + ${jakartaee} + provided + + + org.primefaces + primefaces + 13.0.2 + jakarta + + + com.mysql + mysql-connector-j + 8.1.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + + + \ No newline at end of file diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/mp1_ajax/pojos/Stock.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/mp1_ajax/pojos/Stock.java new file mode 100644 index 0000000..bf20264 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/mp1_ajax/pojos/Stock.java @@ -0,0 +1,138 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package asdv.mp1_ajax.pojos; + +import java.io.Serializable; + + +public class Stock implements Serializable +{ + private static final long serialVersionUID = 1L; + + private String stockId; + + private String companyName; + + private double priceCurrent; + + private double priceClosing; + + private long numberOfSharesAvailable; + + private long numberOfSharesSold; + + public Stock() + { + } + + public Stock(String stockId) + { + this.stockId = stockId; + } + + public Stock(String stockId, String companyName, double priceCurrent, double priceClosing, long numberOfSharesAvailable, long numberOfSharesSold) + { + this.stockId = stockId; + this.companyName = companyName; + this.priceCurrent = priceCurrent; + this.priceClosing = priceClosing; + this.numberOfSharesAvailable = numberOfSharesAvailable; + this.numberOfSharesSold = numberOfSharesSold; + } + + public String getStockId() + { + return stockId; + } + + public void setStockId(String stockId) + { + this.stockId = stockId; + } + + public String getCompanyName() + { + return companyName; + } + + public void setCompanyName(String companyName) + { + this.companyName = companyName; + } + + public double getPriceCurrent() + { + return priceCurrent; + } + + public void setPriceCurrent(double priceCurrent) + { + this.priceCurrent = priceCurrent; + } + + public double getPriceClosing() + { + return priceClosing; + } + + public void setPriceClosing(double priceClosing) + { + this.priceClosing = priceClosing; + } + + public long getNumberOfSharesAvailable() + { + return numberOfSharesAvailable; + } + + public void setNumberOfSharesAvailable(long numberOfSharesAvailable) + { + this.numberOfSharesAvailable = numberOfSharesAvailable; + } + + public long getNumberOfSharesSold() + { + return numberOfSharesSold; + } + + public void setNumberOfSharesSold(long numberOfSharesSold) + { + this.numberOfSharesSold = numberOfSharesSold; + } + + + @Override + public int hashCode() + { + int hash = 0; + hash += (stockId != null ? stockId.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) + { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof Stock)) + { + return false; + } + Stock other = (Stock) object; + if ((this.stockId == null && other.stockId != null) || (this.stockId != null && !this.stockId.equals(other.stockId))) + { + return false; + } + return true; + } + + @Override + public String toString() + { + return "asdv.mp1_ajax.entities.Stock[ stockId=" + stockId + " ]"; + } + + + +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/JakartaRestConfiguration.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/JakartaRestConfiguration.java new file mode 100644 index 0000000..b1bd3ef --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/JakartaRestConfiguration.java @@ -0,0 +1,13 @@ +package asdv.stockbrokerajaxthreads; + +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; + +/** + * Configures Jakarta RESTful Web Services for the application. + * @author Juneau + */ +@ApplicationPath("resources") +public class JakartaRestConfiguration extends Application { + +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/resources/JakartaEE10Resource.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/resources/JakartaEE10Resource.java new file mode 100644 index 0000000..cbe26f3 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/asdv/stockbrokerajaxthreads/resources/JakartaEE10Resource.java @@ -0,0 +1,20 @@ +package asdv.stockbrokerajaxthreads.resources; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; + +/** + * + * @author + */ +@Path("jakartaee10") +public class JakartaEE10Resource { + + @GET + public Response ping(){ + return Response + .ok("ping Jakarta EE") + .build(); + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/ClientBean.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/ClientBean.java new file mode 100644 index 0000000..f12d19c --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/ClientBean.java @@ -0,0 +1,188 @@ + +package beans; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import jakarta.faces.context.FacesContext; +import jakarta.faces.event.AbortProcessingException; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import java.util.Date; + +@Named(value = "clientBean") +@ViewScoped +public class ClientBean implements Serializable +{ + + + private boolean viewStcokPrices = false; + + + private String fromCallerUrlOfParent; + private String fromCallerEmail; + private String name = ""; + private String totalValue = "120.00"; + private String email = ""; + private String emailAgain = ""; + private Date date; + private String tickets = "1"; + private String price = "120"; + private Map ticketAttrs; + + public ClientBean() + { + getParametersFromCaller(); + this.ticketAttrs = new HashMap<>(); + this.ticketAttrs.put("type", "number"); + this.ticketAttrs.put("min", "1"); + this.ticketAttrs.put("max", "4"); + this.ticketAttrs.put("required", "required"); + this.ticketAttrs.put("title", + "Enter a number between 1 and 4 inclusive."); + } + private void getParametersFromCaller() + { + //> Get parameters from caller + Map m = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); + this.fromCallerUrlOfParent = m.get("parent"); + this.fromCallerEmail = m.get("email"); + } + + public boolean isViewStcokPrices() + { + return viewStcokPrices; + } + + public void setViewStcokPrices(boolean viewStcokPrices) + { + this.viewStcokPrices = viewStcokPrices; + } + public String getFromCallerStockId() + { + return fromCallerEmail; + } + + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getTotalValue() + { + return totalValue; + } + + public void setTotalValue(String totalValue) + { + this.totalValue = totalValue; + } + + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + public String getEmailAgain() + { + return emailAgain; + } + + public void setEmailAgain(String emailAgain) + { + this.emailAgain = emailAgain; + } + + public Date getDate() + { + return date; + } + + public void setDate(Date date) + { + this.date = date; + } + + public String getTickets() + { + return tickets; + } + + public void setTickets(String tickets) + { + this.tickets = tickets; + } + + public String getPrice() + { + return price; + } + + public void setPrice(String price) + { + this.price = price; + } + + public Map getTicketAttrs() + { + return ticketAttrs; + } + + public void setTicketAttrs(Map ticketAttrs) + { + this.ticketAttrs = ticketAttrs; + } + + public void calculateTotal(AjaxBehaviorEvent event) + throws AbortProcessingException + { + int ticketsNum = 1; + int ticketPrice = 0; + int total; + if (tickets.trim().length() > 0) + { + ticketsNum = Integer.parseInt(tickets); + } + if (price.trim().length() > 0) + { + ticketPrice = Integer.parseInt(price); + } + total = (ticketsNum * ticketPrice); + totalValue = String.valueOf(total) + ".00"; + } + + public void clear(AjaxBehaviorEvent event) + throws AbortProcessingException + { + name = ""; + email = ""; + emailAgain = ""; + date = null; + price = "120.00"; + totalValue = "120.00"; + tickets = "1"; + } + + + + + + + + + + + +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/Login.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/Login.java new file mode 100644 index 0000000..a251c5e --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/Login.java @@ -0,0 +1,57 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSF/JSFManagedBean.java to edit this template + */ +package beans; + +import asdv.mp1_ajax.pojos.Stock; +import jakarta.inject.Named; +import jakarta.enterprise.context.RequestScoped; +import jakarta.faces.application.ConfigurableNavigationHandler; +import jakarta.faces.context.ExternalContext; +import jakarta.faces.context.FacesContext; + +/** + * + * @author asdv5 + */ +@Named(value = "login") +@RequestScoped +public class Login +{ + private String email; + private String password; + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + + + public void go() + { + FacesContext fc = FacesContext.getCurrentInstance(); + ExternalContext ec = fc.getExternalContext(); + String page = "client-page"; + String params = "&parent=" + "login"; + params += "&email=" + this.email; + ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) fc.getApplication().getNavigationHandler(); + handler.performNavigation(page + "?faces-redirect=true" + params); + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/OneToManyBean.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/OneToManyBean.java new file mode 100644 index 0000000..8933c7a --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/OneToManyBean.java @@ -0,0 +1,82 @@ + +package beans; + +import factory_1_m.OneToMany; +import factory_1_m.OneToManyFactory; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collection; + +@Named(value = "oneToManyBean") +@ViewScoped +public class OneToManyBean implements Serializable +{ + private String country; + private String city; + private String[] countries = + { + "Greece", "USA" + }; + private String[] citiesGreece = + { + "Athens", "Sparta" + }; + private String[] citiesUsa = + { + "Lafayette", "New Orleans", "Houston" + }; + private OneToMany oneToMany = OneToManyFactory.createOneToMany(); + + public OneToManyBean() + { + country = this.countries[1]; + oneToMany.initializeOne(this.countries); + oneToMany.initializeMany(this.countries[0], citiesGreece); + oneToMany.initializeMany(this.countries[1], citiesUsa); + } + + public OneToMany getOneToMany() + { + return oneToMany; + } + + public String getCountry() + { + return country; + } + + public void setCountry(String country) + { + this.country = country; + } + + public String getCity() + { + return city; + } + + public void setCity(String city) + { + this.city = city; + } + + + public void handleCountryChange() + { + if (country != null && !country.equals("")) + { + getMany(); + } + } + + public Collection getMany() + { + if (country != null && !country.equals("")) + { + return this.oneToMany.getMany(country); + } + return Arrays.asList(citiesGreece); + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/StockPricesBean.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/StockPricesBean.java new file mode 100644 index 0000000..76d80b4 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/beans/StockPricesBean.java @@ -0,0 +1,179 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSF/JSFManagedBean.java to edit this template + */ +package beans; + +import asdv.mp1_ajax.pojos.Stock; +import edu.slcc.ajax.bl.CheckStockPricesThread; +import edu.slcc.ajax.utilities.UtilitiesDatabase; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.event.AbortProcessingException; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Named; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.primefaces.PrimeFaces; + +/** + * + * @author a.v. markou + */ +@Named(value = "stockPricesBean") +@ViewScoped +public class StockPricesBean implements Serializable +{ + private boolean isThreadRunning = false; + private List stocks; + private CheckStockPricesThread stocksThread; + private Thread thread; + private Object parentIDfromJSF;//the id of the element that contains the + // client-page.xhtml + // the ID is: "id_form_container:id_pgStocks" + + /** + * Creates a new instance of StockBean + * + * @throws java.lang.Exception + */ + public StockPricesBean() + throws Exception + { + stocksThread = new CheckStockPricesThread(); + } + + public void parametersFromJSF(Object o) + { + parentIDfromJSF = o; + System.out.println(o + " ------------------parametersFromJSF"); + } + + @PostConstruct + void init() + { + try + { + thread = new Thread(stocksThread); + thread.start(); + isThreadRunning = true; + stocks = this.stocksThread.getStocks(); + } + catch (Exception e) + { + System.out.println(e); + UtilitiesDatabase.addMessage(FacesMessage.SEVERITY_FATAL, "Problem occurred with the database.", e.getMessage()); + } + } + + /** + * The PreDestroy for this bean will not be called until the application + * terminates There is an issue with JSF. You can verify this by looking ta + * the log of Glassfish for the sout "destroy called" WE HAVE TO KILL THE + * THREADS manually with stop method since pre-destroy is not called when + * the this Bean is not viewed anymore. + * + * @ViewScoped: a bean in this scope lives as long as you're interacting + * with the same JSF view in the browser window/tab. It get created upon a + * HTTP request and get destroyed once you postback to a different view. It + * doesn't immediately get destroyed when you leave/close the view by a GET + * request, but it is not accessible the usual way anymore. JSF stores the + * bean in the UIViewRoot#getViewMap() with the managed bean name as key, + * which is in turn stored in the session. You need to return null or void + * from action (listener) methods to keep the bean alive. Use this scope for + * more complex forms which use ajax, data tables and/or several + * rendered/disabled attributes whose state needs to be retained in the + * subsequent requests within the same browser window/tab (view). When you + * want to destroy the bean manually) call the @PreDesroy, use commandLink + * to leave the page. + */ + @PreDestroy + void destroy() + { + System.out.println("destroy called"); + if (thread != null) + { + if (thread.isAlive()) + { + thread.stop(); + isThreadRunning = false; + } + } + } + + public List getStocks() + { + return stocks; + } + + public void setStocks(List stocks) + { + this.stocks = stocks; + } + + public void mouseClickListener(AjaxBehaviorEvent event) + throws AbortProcessingException + { + System.out.println("+++on click called" + " isThreadRunning=" + isThreadRunning); + if (thread != null) + { + if (!thread.isAlive()) + { + if (isThreadRunning == false) + { + isThreadRunning = true; + System.out.println("\tthread.isAlive()=" + thread.isAlive()); + System.out.println("\tcreating new thread"); + thread = new Thread(stocksThread); + thread.start(); + System.out.println("\tthread.start() called"); + refresh(); + UtilitiesDatabase.addMessage(FacesMessage.SEVERITY_INFO, "on click", "started a thread"); + } + } + else//thread is alive, kill it + { + System.out.println("\tthread=" + thread); + System.out.println("\tthread.isAlive()=" + thread.isAlive()); + thread.stop(); + System.out.println("\tthread.stop() called"); + isThreadRunning = false; + UtilitiesDatabase.addMessage(FacesMessage.SEVERITY_INFO, "on click", "destoyed a thread"); + } + } + else + { + if (isThreadRunning == false) + { + isThreadRunning = true; + System.out.println("\tthread.isAlive()=" + thread.isAlive()); + System.out.println("\tcreating new thread"); + thread = new Thread(stocksThread); + thread.start(); + System.out.println("\tthread.start() called"); + refresh(); + UtilitiesDatabase.addMessage(FacesMessage.SEVERITY_INFO, "on click", "started a thread"); + } + } + } + + public void refresh() + { + System.out.println("refresh!!!()"); + if (stocksThread != null) + { + List id = new ArrayList(); + id.add(this.parentIDfromJSF.toString()); + stocks = stocksThread.getStocks(); + PrimeFaces.current().ajax().update(this.parentIDfromJSF.toString()); + } + else + { + UtilitiesDatabase.addMessage(FacesMessage.SEVERITY_INFO, "stocksThread is null", ""); + } +//FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("f1:id_dataTable1"); + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/CheckStockPricesThread.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/CheckStockPricesThread.java new file mode 100644 index 0000000..6a811c7 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/CheckStockPricesThread.java @@ -0,0 +1,87 @@ +package edu.slcc.ajax.bl; + +import asdv.mp1_ajax.pojos.Stock; +import edu.slcc.ajax.utilities.UtilitiesDatabase; +import java.io.Serializable; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +public class CheckStockPricesThread + implements Runnable, Serializable +{ + static int numberOfThreads = 0;// + long numberOfCallsToDatabase = 0; + StockDB stockDB; + List stocks; + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + PreparedStatement ps = null; + Connection con = null; + + public CheckStockPricesThread() throws Exception + { + con = new UtilitiesDatabase().connection(databaseName, userName, password, URL2); + // close the resources + stockDB = new StockDB(); + System.out.println("CheckStockPrices Runnable created."); + stocks = stockDB.findAll( + con, + databaseName, + userName, + password, + URL2 + ); + } + + public List getStocks() + { + return stocks; + } + + @Override + public void run() + { + numberOfThreads++; + + try + { + while (true)//isInterrupted method Does not clear flag + { + System.out.println("threads = " + numberOfThreads + "\t" + this +": database-calls = " + ++numberOfCallsToDatabase); + stocks = stockDB.findAll( + con, + databaseName, + userName, + password, + URL2 + ); + Thread.sleep(2000); + } + } + catch (InterruptedException e) + { + System.out.println("---------------------------------Thread interrupt:" + e); + } + catch (Exception e) + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + } + catch (SQLException se) + { + System.out.println(se); + } + } + finally + { + numberOfThreads--; + System.out.println(this + " finally called threads=" + numberOfThreads + ", \ttotal database-calls=" + ++numberOfCallsToDatabase); + numberOfCallsToDatabase = 0; + } + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/Dao.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/Dao.java new file mode 100644 index 0000000..ff1300d --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/Dao.java @@ -0,0 +1,28 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Interface.java to edit this template + */ +package edu.slcc.ajax.bl; + +import java.sql.SQLException; +import java.util.List; + +public interface Dao +{ + void create(T t) + throws Exception; + + void edit(T t) + throws Exception; + + void remove(T t) + throws Exception; + + T find(Object id) + throws Exception; + + List findAll() + throws Exception; + + int count() throws Exception; +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/StockDB.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/StockDB.java new file mode 100644 index 0000000..09137b7 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/bl/StockDB.java @@ -0,0 +1,413 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package edu.slcc.ajax.bl; + +import edu.slcc.ajax.utilities.UtilitiesDatabase; +import asdv.mp1_ajax.pojos.Stock; +import java.io.Serializable; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author asdv5 + */ +public class StockDB + implements Dao, Serializable +{ + @Override + public List findAll() + throws Exception + { + List tableStocks = new ArrayList(); + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + PreparedStatement ps = null; + Connection con = null; + try + { + con = new UtilitiesDatabase().connection( + databaseName, userName, password, URL2); + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + String table = ""; + ResultSet rs = null; + String sqlStr = "SELECT * FROM stock"; + //prepare statement + ps = con.prepareStatement(sqlStr); + //execute + rs = ps.executeQuery(); + while (rs.next()) + { + String stockId = rs.getString(1); + String companyName = rs.getString(2); + double priceCurrent = rs.getDouble(3); + double priceClosing = rs.getDouble(4); + long numberOfSharesAvailable = rs.getLong(5); + long numberOfSharesSold = rs.getLong(6); + Stock stock = new Stock(stockId, companyName, priceCurrent, priceClosing, numberOfSharesAvailable, numberOfSharesSold); + tableStocks.add(stock); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + throw ex; + } + finally + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + // close the resources + if (ps != null) + { + ps.close(); + } + } + catch (SQLException sqle) + { + System.out.println(sqle); + sqle.printStackTrace(); + throw sqle; + } + } + return tableStocks; + } + + public List findAll(Connection con, + String databaseName, + String userName, + String password, + String URL2 + ) + throws Exception + { + List tableStocks = new ArrayList(); + PreparedStatement ps = null; + try + { + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + String table = ""; + ResultSet rs = null; + String sqlStr = "SELECT * FROM stock"; + //prepare statement + ps = con.prepareStatement(sqlStr); + //execute + rs = ps.executeQuery(); + while (rs.next()) + { + String stockId = rs.getString(1); + String companyName = rs.getString(2); + double priceCurrent = rs.getDouble(3); + double priceClosing = rs.getDouble(4); + long numberOfSharesAvailable = rs.getLong(5); + long numberOfSharesSold = rs.getLong(6); + Stock stock = new Stock(stockId, companyName, priceCurrent, priceClosing, numberOfSharesAvailable, numberOfSharesSold); + tableStocks.add(stock); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + throw ex; + } + finally + { + if (ps != null) + { + ps.close(); + } + } + return tableStocks; + } + + @Override + public void create(Stock t) + throws Exception + { + int result = 0; + Connection con = null; + try + { + con = new UtilitiesDatabase().connection( + "nyse", "java", "java", "com.mysql.jdbc.Driver"); + } + catch (Exception e) + { + System.err.println(e); + throw e; + } + PreparedStatement updateStock = null; + try + { + updateStock = con.prepareStatement( + "INSERT INTO stock (stock_id, company_name, price_current, price_closing, number_of_shares_available, number_of_shares_sold ) " + + "VALUES ( ?, ?, ? , ? ,? , ?)"); + updateStock.setString(1, t.getStockId()); + updateStock.setString(2, t.getCompanyName()); + updateStock.setDouble(3, t.getPriceCurrent()); + updateStock.setDouble(4, t.getPriceClosing()); + updateStock.setLong(5, t.getNumberOfSharesAvailable()); + updateStock.setLong(6, t.getNumberOfSharesSold()); + int updateCount = updateStock.executeUpdate(); + result = updateCount; + } + catch (SQLException ex) + { + System.err.println(ex.toString()); + throw ex; + } + finally + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + // close the resources + if (updateStock != null) + { + updateStock.close(); + } + } + catch (SQLException e) + { + System.err.println(e.toString()); + throw e; + } + } + } + + @Override + public void edit(Stock t) + throws Exception + { + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + Connection con = null; + PreparedStatement updateSupplier = null; + try + { + con = new UtilitiesDatabase().connection( + databaseName, userName, password, URL2); + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + updateSupplier = null; + updateSupplier = con.prepareStatement( + "UPDATE stock SET stock_id=?, company_name=?, price_current=?, price_closing=?, number_of_shares_available=?, " + + "number_of_shares_sold=? " + + "WHERE stock_id=?"); + updateSupplier.setString(1, t.getStockId()); + updateSupplier.setString(2, t.getCompanyName()); + updateSupplier.setDouble(3, t.getPriceCurrent()); + updateSupplier.setDouble(4, t.getPriceClosing()); + updateSupplier.setLong(5, t.getNumberOfSharesAvailable()); + updateSupplier.setLong(6, t.getNumberOfSharesSold()); + updateSupplier.setString(7, t.getStockId()); + int result = updateSupplier.executeUpdate(); + } + catch (SQLException ex) + { + System.err.println(ex.toString()); + throw ex; + } + finally + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + // close the resources + if (updateSupplier != null) + { + updateSupplier.close(); + } + } + catch (SQLException sqlee) + { + sqlee.printStackTrace(); + throw sqlee; + } + } + } + + @Override + public void remove(Stock t) + throws Exception + { + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + Connection con = null; + PreparedStatement ps = null; + try + { + con = new UtilitiesDatabase().connection( + databaseName, userName, password, URL2); + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + int rowsAffected = -1; + String query = "DELETE FROM stock WHERE stock_id=? "; + ps = con.prepareStatement(query); + ps.setString(1, t.getStockId()); + rowsAffected = ps.executeUpdate(); + } + catch (Exception ex) + { + System.err.println(ex.toString()); + } + finally + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + // close the resources + if (ps != null) + { + ps.close(); + } + } + catch (SQLException sqlee) + { + sqlee.printStackTrace(); + } + } + } + + @Override + public Stock find(Object id) + throws Exception + { + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + PreparedStatement ps = null; + Connection con = null; + try + { + con = new UtilitiesDatabase().connection( + databaseName, userName, password, URL2); + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + String table = ""; + ResultSet rs = null; + String sqlStr = "SELECT * FROM stock WHERE stock_id=? "; + //prepare statement + ps = con.prepareStatement(sqlStr); + ps.setString(1, (String) id); + //execute + rs = ps.executeQuery(); + if (rs.next()) + { + String stockId = rs.getString(1); + String companyName = rs.getString(2); + double priceCurrent = rs.getDouble(3); + double priceClosing = rs.getDouble(4); + long numberOfSharesAvailable = rs.getLong(5); + long numberOfSharesSold = rs.getLong(6); + Stock stock = new Stock(stockId, companyName, priceCurrent, priceClosing, numberOfSharesAvailable, numberOfSharesSold); + return stock; + } + } + catch (Exception ex) + { + ex.printStackTrace(); + throw ex; + } + finally + { + try + { + new UtilitiesDatabase().closeDatabaseConnection(con); + // close the resources + if (ps != null) + { + ps.close(); + } + } + catch (SQLException sqle) + { + System.out.println(sqle); + sqle.printStackTrace(); + throw sqle; + } + } + return null; + } + + @Override + public int count() + throws Exception + { + String databaseName = "nyse"; + String userName = "java"; + String password = "java"; + String URL2 = "com.mysql.jdbc.Driver"; + PreparedStatement ps = null; + Connection con = null; + int rowCount = -1; + try + { + con = new UtilitiesDatabase().connection( + databaseName, userName, password, URL2); + if (con == null) + { + throw new RuntimeException("cannot connect to database"); + } + ResultSet rs = null; + String sqlStr = "SELECT count(*) " + " FROM " + "stock"; + ps = con.prepareStatement(sqlStr); + rs = ps.executeQuery(sqlStr); + if (rs.next() == true) + { + rowCount = rs.getInt(1); + } + } + catch (SQLException ex) + { + Logger.getLogger(StockDB.class.getName()).log(Level.SEVERE, null, ex); + ex.printStackTrace(); + throw ex; + } + finally + { + try + { + if (ps != null) + { + ps.close(); + } + } + catch (SQLException sqle) + { + Logger.getLogger(StockDB.class.getName()).log(Level.WARNING, null, sqle); + sqle.printStackTrace(); + throw sqle; + } + } + return rowCount; + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/utilities/UtilitiesDatabase.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/utilities/UtilitiesDatabase.java new file mode 100644 index 0000000..1220526 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/edu/slcc/ajax/utilities/UtilitiesDatabase.java @@ -0,0 +1,111 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package edu.slcc.ajax.utilities; + +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Iterator; + +public class UtilitiesDatabase +{ + public Connection connection( + String databaseName, + String userName, + String password, + String URL2 + ) throws SQLException, InstantiationException, + IllegalAccessException, ClassNotFoundException + { + Connection con; + try + {// Load Sun's jdbc driver + Class.forName(URL2).newInstance(); + System.out.println("JDBC Driver loaded!"); + } + catch (Exception e) // driver not found + { + System.err.println("Unable to load database driver"); + System.err.println("Details : " + e); + throw e; + } + String ip = "localhost"; //internet connection + String url = "jdbc:mysql://" + ip + ":3306/" + databaseName + "?allowPublicKeyRetrieval=true&useSSL=false"; + try + { + con = DriverManager.getConnection(url, userName, password); + con.setReadOnly(false); + } + catch (Exception e) + { + System.err.println(e.toString()); + throw e; + } + System.out.println("connection successfull"); + return con; + } + + public void closeDatabaseConnection(Connection con) + throws SQLException + { + try + { + if (con != null) + { + con.close(); + } + } + catch (SQLException e) + { + System.out.println(e); + e.printStackTrace(); + throw e; + } + } + + public static java.sql.Date stringDateToSqlDate(String sDate) + { + java.util.Date date = null; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + try + { + date = sdf.parse(sDate); + } + catch (ParseException e) + { + e.printStackTrace(); + } + return new java.sql.Date(date.getTime()); + } + + public static java.util.Date stringDateToJavaUtilitiesDate(String sDate) + { + java.sql.Date sqldate = stringDateToSqlDate(sDate); + return new java.util.Date(sqldate.getTime()); + } + + + public static void addMessage(FacesMessage.Severity severity, String summary, String detail) + { + FacesMessage msg = new FacesMessage(severity, summary, detail); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + public static void clearAllMessages() + { + FacesContext context = FacesContext.getCurrentInstance(); + Iterator it = context.getMessages(); + while (it.hasNext()) + { + it.next(); + it.remove(); + } + } + +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToMany.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToMany.java new file mode 100644 index 0000000..f451fc7 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToMany.java @@ -0,0 +1,68 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package factory_1_m; + +import java.util.Collection; +import java.util.Set; + +/** + * + * @author asdv5 + * @param + * @param + */ +public interface OneToMany +{ + /** + * Initialization of Ones. The method should be used first before any other + * methods + * + * @param one - the ones ( i.e, countries, or SelectItem or any Object) to + * use for initialization + * @return true if the initialization succeeded by using the method once, + * false when the method is used more than once. + */ + boolean initializeOne(One... one); + + /** + * Initialization of the many for a given one. The method can be used + * multiple times after the method initializeOne has succeeded. + * + * @param one - the one that has the many + * @param many - the many which belong to th eone + * @throws IllegalArgumentException when the one does not exist (i.e. user's + * typing error for the name of one) or when the initialization of the one + * has not occurred. + * + */ + void initializeMany(One one, Many... many) + throws IllegalArgumentException; + + + /** + * Gets the many of a specific one. + * + * @param one the one to get its many + * @return the many of the parameter one or null if the one does not exist. + */ + Collection getMany(One one); + + + + /** + * Given a value of the many it gets the one that the many belongs to. + * + * @param many one of the values of the many + * @return the one + */ + One getOne(Many many); + + /** + * Gets a set with all the ones + * + * @return the set of ones. + */ + Set getAllOnes(); +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToManyFactory.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToManyFactory.java new file mode 100644 index 0000000..61a5e1c --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/OneToManyFactory.java @@ -0,0 +1,204 @@ +package factory_1_m; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +public class OneToManyFactory +{ + /** + * Creates an object of type OneToMany + * + * @param a generic parameter can be any object that denotes a One. + * @param a generic parameter can be any object that denotes a city + * that belongs to the one generic type. + * @return a OneCity object. + */ + public static //generic types to be used in the method + OneToMany //rturn type + createOneToMany() + { + return new OneToMany() + { + private Map oneToMany = new HashMap(); + boolean oneInitialized = false; + boolean manyInitialized = false; + + @Override + public boolean initializeOne(One... one) + { + if (oneInitialized == false && manyInitialized == false) + { + for (int i = 0; i < one.length; ++i) + { + oneToMany.put(one[i], new Boolean(true)); + } + oneInitialized = true; + return true; + } + return false; + } + + @Override + public void initializeMany(One one, Many... many) + throws IllegalArgumentException + { + if (oneToMany.get(one) == null)//if the key of the one is null + {//the method initializekey has not been used + throw new IllegalArgumentException(one + " is not valid"); + } + oneToMany.put(one, new ArrayList(Arrays.asList(many))); + manyInitialized = true; + } + + @Override + public Collection getMany(One one) + throws IllegalArgumentException + { + if (oneInitialized == true && manyInitialized == true) + { + if (oneToMany.get(one) == null) + { + throw new IllegalArgumentException(one + " is not a valid One"); + } + Collection c1 = (Collection) oneToMany.get(one); + return c1; + } + return null; + } + + @Override + public One getOne(Many many) + { + Set< Entry> set = oneToMany.entrySet(); + for (Map.Entry entry : oneToMany.entrySet()) + { + One key = (One) entry.getKey(); + Collection value = (Collection) oneToMany.get(key); + if (value.contains(many)) + { + return key; + } + } + return null; + } + + @Override + public Set getAllOnes() + { + return (Set) oneToMany.keySet(); + } + }; + } + + public static void main(String[] args) + { + OneToMany cc = OneToManyFactory.createOneToMany(); + try + { + cc.initializeMany("France", "Paris"); + } + catch (Exception e) + { + System.err.println(e); + } + boolean b1 = cc.initializeOne("USA", "Greece"); + System.out.println(b1); + boolean b2 = cc.initializeOne("USA", "Greece"); + System.out.println(b2); + cc.initializeMany("USA", "Lafayette", "New Orleans"); + cc.initializeMany("Greece", "Athens", "Sparta"); + Collection cities1 = cc.getMany("USA"); + System.out.println(cities1); + Collection cities2 = cc.getMany("Greece"); + System.out.println(cities2); + System.out.println(cc.getOne("Athens")); + System.out.println(cc.getOne("Lafayette")); + System.out.println(cc.getOne("France")); + try + { + System.out.println(cc.getMany("Germany")); + } + catch (Exception e) + { + System.err.println(e); + } + System.out.println(cc.getAllOnes()); + System.out.println("--------------------------------------"); + OneToMany supplierParts = OneToManyFactory.createOneToMany(); + Supplier s1 = new Supplier("s1"); + Supplier s2 = new Supplier("s2"); + supplierParts.initializeOne(s1, s2); + + Part p1 = new Part("p1"); + Part p2 = new Part("p2"); + Part p3 = new Part("p3"); + Part p4 = new Part("p4"); + supplierParts.initializeMany(s1, p1,p2); + supplierParts.initializeMany(s2, p3,p4); + + System.out.println( supplierParts.getMany(s1)); + System.out.println( supplierParts.getMany(s2)); + System.out.println( supplierParts.getOne(p1) ); + + } +} + + class Supplier + { + private String name; + + public Supplier(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return "Supplier{" + "name=" + name + '}'; + } + } + + class Part + { + private String name; + + public Part(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return "Part{" + "name=" + name + '}'; + } + + + } + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/TestMap.java b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/TestMap.java new file mode 100644 index 0000000..9802678 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/java/factory_1_m/TestMap.java @@ -0,0 +1,39 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package factory_1_m; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; + +/** + * + * @author asdv5 + */ +public class TestMap +{ + public static void main(String[] args) + { + HashMap> map = new HashMap(); + ArrayList l1 = new ArrayList(); + l1.add("p1"); + l1.add("p2"); + map.put("e1", l1); + ArrayList l2 = new ArrayList(); + l2.add("p2"); + l2.add("p3"); + map.put("e2", l2); + System.out.println(map); + + + Collection> c = map.values(); + System.out.println(c); + for (ArrayList a : c ) + a.remove("p2"); + System.out.println(c); + System.out.println(map); + + } +} diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/resources/META-INF/persistence.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..7582bf1 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/beans.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000..9dfae34 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/faces-config.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..ebed21b --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/glassfish-web.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/glassfish-web.xml new file mode 100644 index 0000000..673cc06 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/glassfish-web.xml @@ -0,0 +1,25 @@ + + + + + + + + Keep a copy of the generated servlet class' java code. + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/web.xml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..1fba9e0 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,60 @@ + + + + jakarta.faces.PROJECT_STAGE + Development + + + Faces Servlet + jakarta.faces.webapp.FacesServlet + 1 + + + Faces Servlet + /faces/* + + + + 30 + + + + + + otf + font/opentype + + + + ttf + application/x-font-ttf + + + + woff + application/x-font-woff + + + + woff2 + application/x-font-woff2 + + + svg + image/svg+xml + + + eot + application/vnd.ms-fontobject + + + + + + faces/login.xhtml + + + + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/client-page.xhtml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/client-page.xhtml new file mode 100644 index 0000000..0c3df24 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/client-page.xhtml @@ -0,0 +1,97 @@ + + + + + Client + + + + + +

User Name: #{clientBean.fromCallerStockId}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + +
+ + + + +
+ + + + + + + + + + + +
+ + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/login.xhtml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/login.xhtml new file mode 100644 index 0000000..1745371 --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/login.xhtml @@ -0,0 +1,35 @@ + + + + + Login + + + + +

Login

+ + + + + + + + + +
+
+ + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/stock-prices.xhtml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/stock-prices.xhtml new file mode 100644 index 0000000..fb8ac4c --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/stock-prices.xhtml @@ -0,0 +1,79 @@ + + + + + MP1 Ajax + + + + + ${stockPricesBean.parametersFromJSF(id_parent)} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/test-page.xhtml b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/test-page.xhtml new file mode 100644 index 0000000..9f30b8b --- /dev/null +++ b/Semester 3/Assignments/StockBrokerAjaxThreads/src/main/webapp/test-page.xhtml @@ -0,0 +1,11 @@ + + + + + test + + + test + + diff --git a/Semester 3/Assignments/nyse-1.sql b/Semester 3/Assignments/nyse-1.sql new file mode 100644 index 0000000..08c9bcd --- /dev/null +++ b/Semester 3/Assignments/nyse-1.sql @@ -0,0 +1,109 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.0 +-- https://www.phpmyadmin.net/ +-- +-- Host: localhost:8889 +-- Generation Time: Mar 25, 2024 at 02:28 PM +-- Server version: 5.7.39 +-- PHP Version: 7.4.33 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `nyse` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `stock` +-- + +CREATE TABLE `stock` ( + `stock_id` varchar(4) NOT NULL, + `company_name` varchar(100) NOT NULL, + `price_current` double NOT NULL, + `price_closing` double NOT NULL, + `number_of_shares_available` bigint(20) NOT NULL, + `number_of_shares_sold` bigint(20) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `stock` +-- + +INSERT INTO `stock` (`stock_id`, `company_name`, `price_current`, `price_closing`, `number_of_shares_available`, `number_of_shares_sold`) VALUES +('AMZN', 'Amazon Inc.', 6, 188, 7779754, 1111), +('GOO', 'Google Inc.', 986, 399, 1000000, 1000000), +('PLCE', 'Children\'s Place, Inc.', 14.515, 13.515, 10000000, 5000000), +('TSLA', 'Tesla Inc.', 191.73, 202.98, 4000000, 1000000); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `stock_holder` +-- + +CREATE TABLE `stock_holder` ( + `stock_holder_id` int(11) NOT NULL, + `name` varchar(50) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `transactions` +-- + +CREATE TABLE `transactions` ( + `stock_holder_id` int(11) NOT NULL, + `stock_id` varchar(4) NOT NULL, + `qty` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `stock` +-- +ALTER TABLE `stock` + ADD PRIMARY KEY (`stock_id`); + +-- +-- Indexes for table `stock_holder` +-- +ALTER TABLE `stock_holder` + ADD PRIMARY KEY (`stock_holder_id`); + +-- +-- Indexes for table `transactions` +-- +ALTER TABLE `transactions` + ADD PRIMARY KEY (`stock_holder_id`,`stock_id`), + ADD KEY `stock_id` (`stock_id`); + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `transactions` +-- +ALTER TABLE `transactions` + ADD CONSTRAINT `transactions_ibfk_1` FOREIGN KEY (`stock_id`) REFERENCES `stock` (`stock_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `transactions_ibfk_2` FOREIGN KEY (`stock_holder_id`) REFERENCES `stock_holder` (`stock_holder_id`) ON DELETE CASCADE ON UPDATE CASCADE; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;