[LIB-13] Add common scanner functional
[chesshog-scanner.git] / src / main / java / org / hedgecode / chess / scanner / portal / AbstractRequestScanner.java
diff --git a/src/main/java/org/hedgecode/chess/scanner/portal/AbstractRequestScanner.java b/src/main/java/org/hedgecode/chess/scanner/portal/AbstractRequestScanner.java
new file mode 100644 (file)
index 0000000..fd72e6e
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2019-2020. Developed by Hedgecode.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.hedgecode.chess.scanner.portal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+
+import org.hedgecode.chess.scanner.ChessHogScannerConstants;
+import org.hedgecode.chess.scanner.ChessHogScannerException;
+import org.hedgecode.chess.scanner.Scanner;
+import org.hedgecode.chess.scanner.regex.RegexMatcher;
+import org.hedgecode.chess.scanner.regex.RegexMatcherResult;
+import org.hedgecode.chess.scanner.regex.RegexResult;
+
+/**
+ * AbstractRequestScanner
+ *
+ * @author Dmitry Samoshin aka gotty
+ */
+public abstract class AbstractRequestScanner implements Scanner {
+
+    protected String request(String url) throws ChessHogScannerException {
+        HttpGet request = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        StringBuilder sb = new StringBuilder();
+        try {
+            response = getClient().execute(request);
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(
+                            response.getEntity().getContent(),
+                            ChessHogScannerConstants.CHARSET
+                    )
+            )) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    sb.append(
+                            line
+                    ).append(
+                            ChessHogScannerConstants.CRLF
+                    );
+                }
+            }
+        } catch (IOException cause) {
+            throw new ChessHogScannerException(
+                    String.format("Error occurred for requesting URL: %s", url), cause
+            );
+        } finally {
+            if (response != null) {
+                try {
+                    response.close();
+                } catch (IOException ignored) {}
+            }
+        }
+        return sb.toString();
+    }
+
+    protected String matchRequest(String url, String match)
+            throws ChessHogScannerException
+    {
+        List<String> result = matchRequest(url, match, true);
+        return result.isEmpty() ? null : result.get(0);
+    }
+
+    protected List<String> matchRequest(String url, String match, boolean isFirst)
+            throws ChessHogScannerException
+    {
+        RegexResult result = matchRequest(
+                url,
+                new RegexMatcherResult(
+                        match,
+                        isFirst,
+                        false
+                )
+        );
+        return result.resultList();
+    }
+
+    protected String matchRequest(String url, String startMatch, String endMatch)
+            throws ChessHogScannerException
+    {
+        return matchRequest(url, startMatch, endMatch, true);
+    }
+
+    protected String matchRequest(String url, String startMatch, String endMatch, boolean isFirst)
+            throws ChessHogScannerException
+    {
+        RegexResult result = matchRequest(
+                url,
+                new RegexMatcherResult(
+                        startMatch,
+                        endMatch,
+                        isFirst,
+                        false
+                )
+        );
+        return result.isEmpty() ? null : result.resultList().get(0);
+    }
+
+/*
+    protected String matchRequest(String url, String match)
+            throws ChessHogScannerException
+    {
+        List<String> result = matchRequest(url, match, true);
+        return result.isEmpty() ? null : result.get(0);
+    }
+
+    protected List<String> matchRequest(String url, String match, boolean isFirst)
+            throws ChessHogScannerException
+    {
+        HttpGet request = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        List<String> result = new ArrayList<>();
+        try {
+            response = getClient().execute(request);
+            Pattern pattern = Pattern.compile(match);
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(
+                            response.getEntity().getContent(),
+                            ChessHogScannerConstants.CHARSET
+                    )
+            )) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    Matcher matcher = pattern.matcher(line);
+                    if (matcher.find()) {
+                        result.add(
+                                matcher.group(1)
+                        );
+                        if (isFirst) {
+                            break;
+                        }
+                    }
+                }
+            }
+        } catch (IOException cause) {
+            throw new ChessHogScannerException(
+                    String.format("Error occurred for requesting URL: %s", url), cause
+            );
+        } finally {
+            if (response != null) {
+                try {
+                    response.close();
+                } catch (IOException ignored) {}
+            }
+        }
+        return result;
+    }
+
+    protected String matchRequest(String url, String startMatch, String endMatch)
+            throws ChessHogScannerException
+    {
+        return matchRequest(url, startMatch, endMatch, true);
+    }
+
+    protected String matchRequest(String url, String startMatch, String endMatch, boolean isFirst)
+            throws ChessHogScannerException
+    {
+        HttpGet request = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        StringBuilder sb = new StringBuilder();
+        try {
+            response = getClient().execute(request);
+            Pattern startPattern = Pattern.compile(startMatch);
+            Pattern endPattern = Pattern.compile(endMatch);
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(
+                            response.getEntity().getContent(),
+                            ChessHogScannerConstants.CHARSET
+                    )
+            )) {
+                String line;
+                boolean isMatch = false;
+                while ((line = br.readLine()) != null) {
+                    Matcher matcher = isMatch
+                            ? endPattern.matcher(line)
+                            : startPattern.matcher(line);
+                    if (matcher.find()) {
+                        sb.append(line);
+                        if (isMatch && isFirst) {
+                            break;
+                        }
+                        isMatch = !isMatch;
+                    } else {
+                        if (isMatch) {
+                            sb.append(line);
+                        }
+                    }
+                }
+            }
+        } catch (IOException cause) {
+            throw new ChessHogScannerException(
+                    String.format("Error occurred for requesting URL: %s", url), cause
+            );
+        } finally {
+            if (response != null) {
+                try {
+                    response.close();
+                } catch (IOException ignored) {}
+            }
+        }
+        return sb.length() > 0 ? sb.toString() : null;
+    }
+*/
+
+    protected RegexResult matchRequest(String url, RegexMatcher matcher) throws ChessHogScannerException {
+        HttpGet request = new HttpGet(url);
+        CloseableHttpResponse response = null;
+        try {
+            response = getClient().execute(request);
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(
+                            response.getEntity().getContent(),
+                            ChessHogScannerConstants.CHARSET
+                    )
+            )) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    matcher.match(line);
+                    if (matcher.isBreak()) {
+                        break;
+                    }
+                }
+            }
+        } catch (IOException cause) {
+            throw new ChessHogScannerException(
+                    String.format("Error occurred for requesting URL: %s", url), cause
+            );
+        } finally {
+            if (response != null) {
+                try {
+                    response.close();
+                } catch (IOException ignored) {}
+            }
+        }
+        return matcher.result();
+    }
+
+/*
+    protected String urlEncode(String query) throws ChessHogScannerException {
+        String encodeQuery;
+        try {
+            encodeQuery = URLEncoder.encode(
+                    query, ChessHogScannerConstants.CHARSET.name()
+            );
+        } catch (UnsupportedEncodingException cause) {
+            throw new ChessHogScannerException(
+                    String.format("Unsupported encoding: %s", ChessHogScannerConstants.CHARSET.name()),
+                    cause
+            );
+        }
+        return encodeQuery;
+    }
+*/
+
+    private CloseableHttpClient getClient() {
+        return HttpClients.createMinimal();
+    }
+
+}