Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.40 KB | None | 0 0
  1. package com.dominik.main;
  2.  
  3. import javax.swing.SwingUtilities;
  4.  
  5. public class NbpCurrencyMainWindow {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. SwingUtilities.invokeLater(() -> {
  10. new WindowCreator();
  11. });
  12.  
  13. }
  14.  
  15. }
  16.  
  17. package com.dominik.main;
  18.  
  19. import java.awt.BorderLayout;
  20. import java.awt.Dimension;
  21. import java.awt.Toolkit;
  22. import java.awt.event.ActionEvent;
  23. import java.awt.event.ActionListener;
  24. import java.util.Date;
  25. import java.util.List;
  26.  
  27. import javax.swing.DefaultListModel;
  28. import javax.swing.JButton;
  29. import javax.swing.JFrame;
  30. import javax.swing.JLabel;
  31. import javax.swing.JList;
  32. import javax.swing.JOptionPane;
  33. import javax.swing.JPanel;
  34. import javax.swing.JScrollPane;
  35. import javax.swing.JSeparator;
  36. import javax.swing.JTabbedPane;
  37. import javax.swing.JTextField;
  38. import javax.swing.ListSelectionModel;
  39. import javax.swing.SwingConstants;
  40.  
  41. import com.dominik.database.entity.domain.NbpDocument;
  42.  
  43. public class WindowCreator {
  44. private JFrame frame;
  45. private JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
  46. private JPanel actualCurrencyListTab;
  47. private List<NbpDocument> documentList = new TableCreator().getAllNbpDocuments();
  48.  
  49. final String FRAME_TITLE = "NBP Currency app";
  50.  
  51. public WindowCreator() {
  52. createWindow();
  53. }
  54.  
  55. public void createWindow() {
  56.  
  57. frame = new JFrame(FRAME_TITLE);
  58.  
  59. TableCreator tableCreator = new TableCreator();
  60. JPanel currentCurrencyWindow = tableCreator.getCurrencyWindow();
  61. JPanel currencyCurrencyChart = tableCreator.getChartPanel();
  62.  
  63. tabbedPane.add(currentCurrencyWindow);
  64. tabbedPane.add(currencyCurrencyChart);
  65.  
  66. actualCurrencyListTab = getButtonPanel();
  67. tabbedPane.add(actualCurrencyListTab);
  68.  
  69. // setting the size and content of frame
  70. frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
  71. frame.setVisible(true);
  72. frame.setSize(500, 600);
  73. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  74.  
  75. // centering the Jframe
  76. Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
  77. frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2);
  78.  
  79. frame.setVisible(true);
  80. }
  81.  
  82. private JPanel getButtonPanel() {
  83. actualCurrencyListTab = new JPanel();
  84. actualCurrencyListTab.setName("Przeglądaj kursy");
  85.  
  86. // pobieranie daty
  87. JButton button = new JButton("Pobierz datę");
  88. JLabel namelabel = new JLabel("Data w formacie yyyy-MM-dd: ", JLabel.LEFT);
  89. final JTextField userText = new JTextField(6);
  90. button.addActionListener((e) -> {
  91. String data = userText.getText();
  92.  
  93. // if the data is validate update currencies list tab
  94. // else just show info
  95. if (replaceCurrencyTab(data)) {
  96. replaceCurrenciesListTab();
  97. tabbedPane.setSelectedIndex(0);
  98. }
  99. });
  100.  
  101. actualCurrencyListTab.add(namelabel);
  102. actualCurrencyListTab.add(userText);
  103. actualCurrencyListTab.add(button, BorderLayout.CENTER);
  104.  
  105. // Currencies that are in the db
  106. JButton showButton = new JButton("Pokaż dla wybranej daty");
  107.  
  108. final DefaultListModel<Date> currencyDateList = new DefaultListModel<Date>();
  109.  
  110. for (NbpDocument item : documentList) {
  111. currencyDateList.addElement(item.getNBP_CURRENCY_DATE());
  112. }
  113.  
  114. final JList<Date> currencyList = new JList<Date>(currencyDateList);
  115. JScrollPane currencyListScrollPane = new JScrollPane(currencyList);
  116.  
  117. currencyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  118. currencyList.setSelectedIndex(0);
  119. currencyList.setVisibleRowCount(6);
  120. // setter for field width
  121. // currencyList.setFixedCellWidth(350);
  122.  
  123. showButton.addActionListener(new ActionListener() {
  124. public void actionPerformed(ActionEvent e) {
  125. Date data = (Date) currencyList.getSelectedValue();
  126.  
  127. replaceCurrencyTab(data.toString());
  128. tabbedPane.setSelectedIndex(0);
  129. }
  130. });
  131.  
  132. JSeparator horizonalLine = new JSeparator(SwingConstants.HORIZONTAL);
  133. horizonalLine.setPreferredSize(new Dimension(500, 3));
  134.  
  135. actualCurrencyListTab.add(horizonalLine);
  136. actualCurrencyListTab.add(currencyListScrollPane);
  137. actualCurrencyListTab.add(showButton);
  138.  
  139. return actualCurrencyListTab;
  140.  
  141. }
  142.  
  143.  
  144.  
  145. /*
  146. * dowloading currency and replacing first tab (Table of currency values)
  147. */
  148. private boolean replaceCurrencyTab(String date) {
  149.  
  150. boolean isExist = TableCreator.checkIfDocExists(date);
  151. if (isExist) {
  152. TableCreator tableCreator = new TableCreator(date);
  153.  
  154. JPanel currentCurrencyWindow = tableCreator.getCurrencyWindow();
  155. tabbedPane.remove(0);
  156. tabbedPane.insertTab(currentCurrencyWindow.getName(), null, currentCurrencyWindow, null, 0);
  157.  
  158.  
  159. JPanel currentCharWindow = tableCreator.getChartPanel();
  160. tabbedPane.remove(1);
  161. tabbedPane.insertTab(currentCharWindow.getName(), null, currentCharWindow, null, 1);
  162.  
  163. } else {
  164. JOptionPane.showMessageDialog(frame, "Nie znaleziono kursu na podaną datę!");
  165. }
  166. return isExist;
  167. }
  168.  
  169. /*
  170. * re-drawing currencies list tab
  171. */
  172. private void replaceCurrenciesListTab() {
  173. tabbedPane.remove(2);
  174. actualCurrencyListTab = getButtonPanel();
  175. tabbedPane.insertTab(actualCurrencyListTab.getName(), null, actualCurrencyListTab, null, 2);
  176. }
  177. }
  178.  
  179. package com.dominik.main;
  180.  
  181. import java.awt.BorderLayout;
  182. import java.io.BufferedReader;
  183. import java.io.InputStreamReader;
  184. import java.io.StringReader;
  185. import java.math.BigDecimal;
  186. import java.net.URL;
  187. import java.net.URLConnection;
  188. import java.nio.charset.StandardCharsets;
  189. import java.text.ParseException;
  190. import java.text.SimpleDateFormat;
  191. import java.util.ArrayList;
  192. import java.util.Date;
  193. import java.util.List;
  194.  
  195. import javax.persistence.EntityManager;
  196. import javax.persistence.EntityManagerFactory;
  197. import javax.persistence.Persistence;
  198. import javax.persistence.TypedQuery;
  199. import javax.swing.JPanel;
  200. import javax.swing.JScrollPane;
  201. import javax.swing.JTable;
  202. import javax.swing.table.DefaultTableModel;
  203. import javax.xml.parsers.DocumentBuilderFactory;
  204.  
  205. import org.w3c.dom.Document;
  206. import org.xml.sax.InputSource;
  207.  
  208. import com.dominik.database.entity.domain.NbpDocument;
  209. import com.dominik.database.entity.domain.NbpDocumentItem;
  210.  
  211. /**
  212. * Creates the Jtable and fills with the input data
  213. *
  214. * @author Dominik
  215. */
  216. public class TableCreator {
  217. private Object[][] data;
  218. private String currencyDate;
  219. private Document doc;
  220. private static EntityManagerFactory entityManagerFactory;
  221. private static EntityManager entityManager;
  222. private JPanel panel;
  223.  
  224. public TableCreator() {
  225. this.currencyDate = lastCurrencyDay();
  226. List<NbpDocumentItem> items = new ArrayList<NbpDocumentItem>();
  227. items = getDocForSelectedDatainDatabase();
  228. if (items == null) {
  229. this.doc = init(this.currencyDate);
  230. parseXml();
  231. } else {
  232. getItemsFromDatabaseToDataModel(items);
  233. }
  234. }
  235.  
  236. public TableCreator(String selectedCurrencyDate) {
  237.  
  238. this.currencyDate = selectedCurrencyDate;
  239.  
  240. // if doesnt exist download the currency of selected date
  241. List<NbpDocumentItem> items = new ArrayList<NbpDocumentItem>();
  242. items = getDocForSelectedDatainDatabase();
  243. if (items == null) {
  244. this.doc = init(selectedCurrencyDate);
  245. parseXml();
  246. } else {
  247. getItemsFromDatabaseToDataModel(items);
  248. }
  249. }
  250.  
  251. private List<NbpDocumentItem> getDocForSelectedDatainDatabase() {
  252. List<NbpDocument> resultList = new ArrayList<NbpDocument>();
  253. entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
  254. entityManager = entityManagerFactory.createEntityManager();
  255.  
  256. entityManager.getTransaction().begin();
  257.  
  258. TypedQuery<NbpDocument> query = entityManager.createQuery(
  259. "select n from NbpDocument n where n.NBP_CURRENCY_DATE = :currencyDate", NbpDocument.class);
  260.  
  261. Date date = parseDateFromString(this.currencyDate);
  262. query.setParameter("currencyDate", date);
  263. resultList = query.getResultList();
  264.  
  265. entityManager.getTransaction().commit();
  266. entityManager.close();
  267. entityManagerFactory.close();
  268.  
  269. if (resultList.isEmpty()) {
  270. return null;
  271. } else {
  272. NbpDocument document = resultList.get(0);
  273. List<NbpDocumentItem> items = document.getNbpDocumentItems();
  274. return items;
  275. }
  276. }
  277.  
  278. public List<NbpDocument> getAllNbpDocuments() {
  279. List<NbpDocument> tempArray = new ArrayList<NbpDocument>();
  280. entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
  281. entityManager = entityManagerFactory.createEntityManager();
  282.  
  283. entityManager.getTransaction().begin();
  284. TypedQuery<NbpDocument> query = entityManager.createQuery("select n from NbpDocument n", NbpDocument.class);
  285.  
  286. tempArray = query.getResultList();
  287. entityManager.getTransaction().commit();
  288.  
  289. entityManager.close();
  290. entityManagerFactory.close();
  291.  
  292. return tempArray;
  293. }
  294.  
  295. private String lastCurrencyDay() {
  296. String nbpCurrencyUrl = "http://api.nbp.pl/api/exchangerates/tables/a/?format=xml";
  297.  
  298. String currencyXml = getURLContent(nbpCurrencyUrl);
  299. Document tempDoc = null;
  300. try {
  301. tempDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
  302. .parse(new InputSource(new StringReader(currencyXml)));
  303. } catch (Exception e) {
  304. e.printStackTrace();
  305. }
  306. String currencyDate = tempDoc.getElementsByTagName("EffectiveDate").item(0).getTextContent();
  307.  
  308. return currencyDate;
  309. }
  310.  
  311. private Document init(String selectedCurrencyDate) {
  312. String nbpCurrencyUrl = "http://api.nbp.pl/api/exchangerates/tables/a/" + selectedCurrencyDate + "/?format=xml";
  313. String currencyXml = getURLContent(nbpCurrencyUrl);
  314. Document doc = null;
  315.  
  316. try {
  317. doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
  318. .parse(new InputSource(new StringReader(currencyXml)));
  319.  
  320. } catch (Exception e) {
  321. e.printStackTrace();
  322.  
  323. }
  324.  
  325. return doc;
  326. }
  327.  
  328. public static boolean checkIfDocExists(String date) {
  329. return getURLContent("http://api.nbp.pl/api/exchangerates/tables/a/" + date + "/?format=xml") == null ? false
  330. : true;
  331. }
  332.  
  333. private static String getURLContent(String p_sURL) {
  334. URL oURL;
  335. URLConnection oConnection;
  336. BufferedReader oReader;
  337. String sLine;
  338. StringBuilder sbResponse;
  339. String sResponse = null;
  340.  
  341. try {
  342. oURL = new URL(p_sURL);
  343. oConnection = oURL.openConnection();
  344. oReader = new BufferedReader(new InputStreamReader(oConnection.getInputStream(), StandardCharsets.UTF_8));
  345. sbResponse = new StringBuilder();
  346.  
  347. while ((sLine = oReader.readLine()) != null) {
  348. sbResponse.append(sLine);
  349. }
  350.  
  351. sResponse = sbResponse.toString();
  352. } catch (Exception e) {
  353. e.printStackTrace();
  354. }
  355.  
  356. return sResponse;
  357. }
  358.  
  359. public void parseXml() {
  360.  
  361. int currencyLength = this.doc.getElementsByTagName("Currency").getLength();
  362. this.data = new Object[currencyLength][3];
  363. for (int index = 0; index < currencyLength; index++) {
  364. this.data[index][0] = doc.getElementsByTagName("Currency").item(index).getTextContent();
  365. this.data[index][1] = doc.getElementsByTagName("Code").item(index).getTextContent();
  366. this.data[index][2] = doc.getElementsByTagName("Mid").item(index).getTextContent();
  367. }
  368. addItemstoDatabase();
  369. }
  370.  
  371. public void getItemsFromDatabaseToDataModel(List<NbpDocumentItem> items) {
  372.  
  373. int length = items.size();
  374.  
  375. this.data = new Object[length][3];
  376. for (int index = 0; index < length; index++) {
  377. this.data[index][0] = items.get(index).getCurrencyName();
  378. this.data[index][1] = items.get(index).getCurrencyCode();
  379. this.data[index][2] = items.get(index).getCurrencyValue();
  380. }
  381.  
  382. }
  383.  
  384. private void addItemstoDatabase() {
  385. List<NbpDocumentItem> itemData = new ArrayList<NbpDocumentItem>();
  386.  
  387. Date currencyDate = parseDateFromString(this.currencyDate);
  388.  
  389. entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
  390. entityManager = entityManagerFactory.createEntityManager();
  391. NbpDocument nbpDocument = new NbpDocument();
  392. nbpDocument.setNBP_CURRENCY_DATE(currencyDate);
  393.  
  394. itemData = getItemList();
  395. nbpDocument.setNbpDocumentItems(itemData);
  396.  
  397. entityManager.getTransaction().begin();
  398. entityManager.persist(nbpDocument);
  399. entityManager.getTransaction().commit();
  400.  
  401. entityManager.close();
  402. entityManagerFactory.close();
  403. }
  404.  
  405. private ArrayList<NbpDocumentItem> getItemList() {
  406. ArrayList<NbpDocumentItem> ids = new ArrayList<NbpDocumentItem>();
  407.  
  408. int currencyLength = doc.getElementsByTagName("Currency").getLength();
  409. for (int index = 0; index < currencyLength; index++) {
  410. String nazwaWaluty = doc.getElementsByTagName("Currency").item(index).getTextContent();
  411. String kodWaluty = doc.getElementsByTagName("Code").item(index).getTextContent();
  412. BigDecimal kurs = new BigDecimal(
  413. doc.getElementsByTagName("Mid").item(index).getTextContent().replaceAll(",", "."));
  414.  
  415. NbpDocumentItem nbpDocumentItem = new NbpDocumentItem();
  416. nbpDocumentItem.setCurrencyCode(kodWaluty);
  417. nbpDocumentItem.setCurrencyName(nazwaWaluty);
  418. nbpDocumentItem.setCurrencyValue(kurs);
  419.  
  420. ids.add(nbpDocumentItem);
  421. }
  422.  
  423. return ids;
  424. }
  425.  
  426. public JPanel getCurrencyWindow() {
  427. if (data.equals(null)) {
  428. return null;
  429. }
  430.  
  431. panel = new JPanel();
  432. panel.setName("<html>Kurs walut<br> " + currencyDate + "</html>");
  433. panel.setLayout(new BorderLayout());
  434.  
  435. String[] columns = new String[] { "Waluta", "Kod waluty", "Kurs" };
  436.  
  437. DefaultTableModel model = new DefaultTableModel(data, columns) {
  438. private static final long serialVersionUID = 2731697622531071294L;
  439.  
  440. // Currency data shouldn't be editable
  441. @Override
  442. public boolean isCellEditable(int row, int column) {
  443. return false;
  444. }
  445. };
  446.  
  447. JTable table = new JTable(model);
  448. JScrollPane tableContainer = new JScrollPane(table);
  449.  
  450. panel.add(tableContainer, BorderLayout.CENTER);
  451.  
  452. return panel;
  453. }
  454.  
  455. private Date parseDateFromString(String date) {
  456. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  457. Date convertedCurrentDate = null;
  458. try {
  459. convertedCurrentDate = sdf.parse(date);
  460. } catch (ParseException e) {
  461. e.printStackTrace();
  462. }
  463.  
  464. return convertedCurrentDate;
  465. }
  466.  
  467. public String getCurrencyDate() {
  468. return currencyDate;
  469. }
  470.  
  471. public JPanel getChartPanel() {
  472. return new ChartPanelCreator(data).getChartPanel();
  473. }
  474.  
  475. }
  476.  
  477. package com.dominik.main;
  478.  
  479. import java.awt.BorderLayout;
  480. import java.awt.Font;
  481. import java.math.BigDecimal;
  482.  
  483. import javax.swing.JPanel;
  484.  
  485. import org.jfree.chart.ChartFactory;
  486. import org.jfree.chart.ChartPanel;
  487. import org.jfree.chart.JFreeChart;
  488. import org.jfree.chart.plot.PlotOrientation;
  489. import org.jfree.data.category.DefaultCategoryDataset;
  490.  
  491. public class ChartPanelCreator {
  492.  
  493. /**
  494. *
  495. */
  496. private String CHART_TITLE = "Wykres waluty";
  497. private Font font3 = new Font("Dialog", Font.PLAIN, 65);
  498.  
  499. private Object[][] data;
  500.  
  501. public ChartPanelCreator(Object[][] data) {
  502. this.data = data;
  503. }
  504.  
  505. public JPanel getChartPanel() {
  506. JFreeChart lineChart = ChartFactory.createLineChart(CHART_TITLE, "Wartość", "Kod waluty", createDataset(),
  507. PlotOrientation.VERTICAL, true, true, false);
  508.  
  509. ChartPanel chartPanel = new ChartPanel(lineChart);
  510. chartPanel.setName(CHART_TITLE);
  511. chartPanel.setFont(font3);
  512. chartPanel.setMouseZoomable(true);
  513. chartPanel.setLayout(new BorderLayout());
  514.  
  515. // avioding axis label and legend scaling
  516. // http://www.jfree.org/forum/viewtopic.php?f=3&t=117097
  517. chartPanel.setMinimumDrawHeight(50);
  518. chartPanel.setMaximumDrawHeight(5000);
  519.  
  520. chartPanel.setMinimumDrawWidth(50);
  521. chartPanel.setMaximumDrawWidth(5000);
  522.  
  523. return chartPanel;
  524. }
  525.  
  526. private DefaultCategoryDataset createDataset() {
  527. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  528. BigDecimal value = new BigDecimal(0);
  529. String code = null;
  530. Object objValue = null;
  531.  
  532. for (Object[] item : data) {
  533. code = ((String) item[1]).toLowerCase();
  534.  
  535. objValue = item[2];
  536. if (objValue instanceof BigDecimal) {
  537. value = (BigDecimal) item[2];
  538. } else {
  539. value = new BigDecimal((String) item[2]);
  540. }
  541.  
  542. dataset.addValue(value.doubleValue(), "wartość", code);
  543. }
  544.  
  545. return dataset;
  546. }
  547.  
  548. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement