From 240c7e2304cc333ade314f1afdcb1d4557d72ac2 Mon Sep 17 00:00:00 2001 From: oleksii Date: Mon, 24 Dec 2018 00:30:03 +0200 Subject: [PATCH 1/4] first phase frame implement --- src/webcrawler/ApplicationRunner.java | 7 +++-- src/webcrawler/WebCrawler.java | 42 ++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/webcrawler/ApplicationRunner.java b/src/webcrawler/ApplicationRunner.java index e2a4260..c69dd22 100644 --- a/src/webcrawler/ApplicationRunner.java +++ b/src/webcrawler/ApplicationRunner.java @@ -1,7 +1,8 @@ package webcrawler; public class ApplicationRunner { - public static void main(String[] args) { - new WebCrawler(); - } + + public static void main(String[] args) { + new WebCrawler(); + } } diff --git a/src/webcrawler/WebCrawler.java b/src/webcrawler/WebCrawler.java index 737f85a..47b9a55 100644 --- a/src/webcrawler/WebCrawler.java +++ b/src/webcrawler/WebCrawler.java @@ -1,12 +1,40 @@ package webcrawler; -import javax.swing.*; +import java.awt.BorderLayout; +import java.awt.Dimension; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; public class WebCrawler extends JFrame { - public WebCrawler() { - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(300, 300); - setVisible(true); - setLayout(null); - } + + private final JTextArea textArea; + + public WebCrawler() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(300, 300); + setVisible(true); + + this.textArea = new JTextArea(); + initLayout(); + } + + private void initLayout() { + var rootPanel = getContentPane(); + + textArea.setText("HTML code?"); + var scrollPane = new JScrollPane(textArea); + scrollPane.setPreferredSize(new Dimension(200, 200)); + + var areaPanel = new JPanel(); + areaPanel.setLayout(new BoxLayout(areaPanel, BoxLayout.PAGE_AXIS)); + areaPanel.setBorder(BorderFactory.createEmptyBorder(40, 40, 40, 40)); + areaPanel.add(scrollPane); + + rootPanel.add(areaPanel, BorderLayout.CENTER); + pack(); + } } \ No newline at end of file From fcc75f5c955d22ae144288141f1a4fda9f2a338f Mon Sep 17 00:00:00 2001 From: oleksii Date: Mon, 24 Dec 2018 01:11:44 +0200 Subject: [PATCH 2/4] second phase frame implement --- src/webcrawler/ApplicationRunner.java | 2 +- src/webcrawler/WebCrawler.java | 40 ------------- src/webcrawler/WebCrawlerWindow.java | 81 +++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 41 deletions(-) delete mode 100644 src/webcrawler/WebCrawler.java create mode 100644 src/webcrawler/WebCrawlerWindow.java diff --git a/src/webcrawler/ApplicationRunner.java b/src/webcrawler/ApplicationRunner.java index c69dd22..a37a6d9 100644 --- a/src/webcrawler/ApplicationRunner.java +++ b/src/webcrawler/ApplicationRunner.java @@ -3,6 +3,6 @@ public class ApplicationRunner { public static void main(String[] args) { - new WebCrawler(); + new WebCrawlerWindow(); } } diff --git a/src/webcrawler/WebCrawler.java b/src/webcrawler/WebCrawler.java deleted file mode 100644 index 47b9a55..0000000 --- a/src/webcrawler/WebCrawler.java +++ /dev/null @@ -1,40 +0,0 @@ -package webcrawler; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public class WebCrawler extends JFrame { - - private final JTextArea textArea; - - public WebCrawler() { - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(300, 300); - setVisible(true); - - this.textArea = new JTextArea(); - initLayout(); - } - - private void initLayout() { - var rootPanel = getContentPane(); - - textArea.setText("HTML code?"); - var scrollPane = new JScrollPane(textArea); - scrollPane.setPreferredSize(new Dimension(200, 200)); - - var areaPanel = new JPanel(); - areaPanel.setLayout(new BoxLayout(areaPanel, BoxLayout.PAGE_AXIS)); - areaPanel.setBorder(BorderFactory.createEmptyBorder(40, 40, 40, 40)); - areaPanel.add(scrollPane); - - rootPanel.add(areaPanel, BorderLayout.CENTER); - pack(); - } -} \ No newline at end of file diff --git a/src/webcrawler/WebCrawlerWindow.java b/src/webcrawler/WebCrawlerWindow.java new file mode 100644 index 0000000..471bf50 --- /dev/null +++ b/src/webcrawler/WebCrawlerWindow.java @@ -0,0 +1,81 @@ +package webcrawler; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +public class WebCrawlerWindow extends JFrame { + + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + private final JTextArea textArea; + private final JTextField location; + private final JButton goButton; + + public WebCrawlerWindow() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 600); + + this.location = new JTextField("http://example.com"); + this.goButton = new JButton("Get text!"); + this.textArea = new JTextArea(); + initLayout(); + initActions(); + setVisible(true); + } + + private void initActions() { + goButton.addActionListener(e -> { + String url = location.getText(); + try ( + InputStream inputStream = new URL(url).openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)) + ) { + final StringBuilder stringBuilder = new StringBuilder(); + String nextLine; + while ((nextLine = reader.readLine()) != null) { + stringBuilder.append(nextLine); + stringBuilder.append(LINE_SEPARATOR); + } + final String siteText = stringBuilder.toString(); + textArea.setText(siteText); + } catch (IOException e1) { + e1.printStackTrace(); + } + }); + } + + private void initLayout() { + var rootPanel = getContentPane(); + + var locationPanel = new JPanel(); + locationPanel.setLayout(new BoxLayout(locationPanel, BoxLayout.LINE_AXIS)); + locationPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + locationPanel.add(location); + locationPanel.add(goButton); + + var scrollPane = new JScrollPane(textArea); + scrollPane.setPreferredSize(new Dimension(400, 400)); + + var areaPanel = new JPanel(); + areaPanel.setLayout(new BoxLayout(areaPanel, BoxLayout.PAGE_AXIS)); + areaPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + areaPanel.add(scrollPane); + + rootPanel.add(locationPanel, BorderLayout.PAGE_START); + rootPanel.add(areaPanel, BorderLayout.CENTER); + + + } +} \ No newline at end of file From 4072d7d2cced9650feaecfcff5bfd631ec0fe01d Mon Sep 17 00:00:00 2001 From: oleksii Date: Mon, 24 Dec 2018 15:22:18 +0200 Subject: [PATCH 3/4] third phase frame implementation --- src/webcrawler/ApplicationRunner.java | 5 +- src/webcrawler/WebCrawlerWindow.java | 67 ++++++++++++++++-------- src/webcrawler/crawl/Html.java | 14 +++++ src/webcrawler/crawl/HtmlPageParser.java | 19 +++++++ 4 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 src/webcrawler/crawl/Html.java create mode 100644 src/webcrawler/crawl/HtmlPageParser.java diff --git a/src/webcrawler/ApplicationRunner.java b/src/webcrawler/ApplicationRunner.java index a37a6d9..7a51cac 100644 --- a/src/webcrawler/ApplicationRunner.java +++ b/src/webcrawler/ApplicationRunner.java @@ -1,8 +1,11 @@ package webcrawler; +import webcrawler.crawl.HtmlPageParser; + public class ApplicationRunner { public static void main(String[] args) { - new WebCrawlerWindow(); + HtmlPageParser pageParser = new HtmlPageParser(); + new WebCrawlerWindow(pageParser); } } diff --git a/src/webcrawler/WebCrawlerWindow.java b/src/webcrawler/WebCrawlerWindow.java index 471bf50..b758cc2 100644 --- a/src/webcrawler/WebCrawlerWindow.java +++ b/src/webcrawler/WebCrawlerWindow.java @@ -1,6 +1,5 @@ package webcrawler; -import java.awt.BorderLayout; import java.awt.Dimension; import java.io.BufferedReader; import java.io.IOException; @@ -11,10 +10,14 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import webcrawler.crawl.Html; +import webcrawler.crawl.HtmlPageParser; public class WebCrawlerWindow extends JFrame { @@ -22,38 +25,48 @@ public class WebCrawlerWindow extends JFrame { private final JTextArea textArea; private final JTextField location; private final JButton goButton; + private final JLabel titleLabelInfo; + private final JLabel titleLabel; - public WebCrawlerWindow() { + private final HtmlPageParser pageParser; + + public WebCrawlerWindow(HtmlPageParser pageParser) { + this.pageParser = pageParser; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 600); this.location = new JTextField("http://example.com"); this.goButton = new JButton("Get text!"); this.textArea = new JTextArea(); + this.titleLabelInfo = new JLabel("Title: "); + this.titleLabel = new JLabel(); initLayout(); initActions(); setVisible(true); } private void initActions() { - goButton.addActionListener(e -> { - String url = location.getText(); - try ( - InputStream inputStream = new URL(url).openStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)) - ) { - final StringBuilder stringBuilder = new StringBuilder(); - String nextLine; - while ((nextLine = reader.readLine()) != null) { - stringBuilder.append(nextLine); - stringBuilder.append(LINE_SEPARATOR); - } - final String siteText = stringBuilder.toString(); - textArea.setText(siteText); - } catch (IOException e1) { - e1.printStackTrace(); - } - }); + goButton.addActionListener(e -> + SwingUtilities.invokeLater(() -> { + String url = location.getText(); + try ( + InputStream inputStream = new URL(url).openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)) + ) { + final StringBuilder stringBuilder = new StringBuilder(); + String nextLine; + while ((nextLine = reader.readLine()) != null) { + stringBuilder.append(nextLine); + stringBuilder.append(LINE_SEPARATOR); + } + final String siteText = stringBuilder.toString(); + Html html = pageParser.parse(siteText); + textArea.setText(siteText); + titleLabel.setText(html.getTitle()); + } catch (IOException e1) { + textArea.setText("No content"); + } + })); } private void initLayout() { @@ -65,6 +78,12 @@ private void initLayout() { locationPanel.add(location); locationPanel.add(goButton); + var titlePanel = new JPanel(); + titlePanel.setLayout(new BoxLayout(titlePanel, BoxLayout.LINE_AXIS)); + titlePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + titlePanel.add(titleLabelInfo); + titlePanel.add(titleLabel); + var scrollPane = new JScrollPane(textArea); scrollPane.setPreferredSize(new Dimension(400, 400)); @@ -73,9 +92,11 @@ private void initLayout() { areaPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); areaPanel.add(scrollPane); - rootPanel.add(locationPanel, BorderLayout.PAGE_START); - rootPanel.add(areaPanel, BorderLayout.CENTER); - + rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.PAGE_AXIS)); + rootPanel.add(locationPanel); + rootPanel.add(titlePanel); + rootPanel.add(areaPanel); + pack(); } } \ No newline at end of file diff --git a/src/webcrawler/crawl/Html.java b/src/webcrawler/crawl/Html.java new file mode 100644 index 0000000..341bba0 --- /dev/null +++ b/src/webcrawler/crawl/Html.java @@ -0,0 +1,14 @@ +package webcrawler.crawl; + +public class Html { + + private String title; + + public Html(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } +} diff --git a/src/webcrawler/crawl/HtmlPageParser.java b/src/webcrawler/crawl/HtmlPageParser.java new file mode 100644 index 0000000..bacc88e --- /dev/null +++ b/src/webcrawler/crawl/HtmlPageParser.java @@ -0,0 +1,19 @@ +package webcrawler.crawl; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class HtmlPageParser { + + private Pattern titlePattern; + + public HtmlPageParser() { + this.titlePattern = Pattern.compile("(.*)"); + } + + public Html parse(String siteText) { + Matcher matcher = titlePattern.matcher(siteText); + boolean found = matcher.find(); + return found ? new Html(matcher.group(1)) : new Html("No title"); + } +} From 56308c555f6e1e556e65c08be7b59072c4f6beda Mon Sep 17 00:00:00 2001 From: oleksii Date: Tue, 25 Dec 2018 00:12:55 +0200 Subject: [PATCH 4/4] third phase frame implementation --- src/webcrawler/WebCrawlerWindow.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/webcrawler/WebCrawlerWindow.java b/src/webcrawler/WebCrawlerWindow.java index b758cc2..bee359e 100644 --- a/src/webcrawler/WebCrawlerWindow.java +++ b/src/webcrawler/WebCrawlerWindow.java @@ -1,6 +1,8 @@ package webcrawler; +import java.awt.ComponentOrientation; import java.awt.Dimension; +import java.awt.FlowLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -74,13 +76,14 @@ private void initLayout() { var locationPanel = new JPanel(); locationPanel.setLayout(new BoxLayout(locationPanel, BoxLayout.LINE_AXIS)); - locationPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + locationPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); locationPanel.add(location); locationPanel.add(goButton); var titlePanel = new JPanel(); - titlePanel.setLayout(new BoxLayout(titlePanel, BoxLayout.LINE_AXIS)); - titlePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + titlePanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + titlePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); + titlePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); titlePanel.add(titleLabelInfo); titlePanel.add(titleLabel);