diff --git a/.gitignore b/.gitignore
index 14c6ed9..5c9e4cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,26 @@
TODO
-# IDE
+# IDE - idea
.idea
*.ipr
*.iml
*.iws
out
+# IDE - eclipse
+.classpath
+.project
+.settings
+bin
# gradle
.gradle
.gradle-docker
build
+#maven
+target
+
# other
log
@@ -22,3 +30,4 @@ log
.LSOverride
classes
+/bin/
diff --git a/README.md b/README.md
deleted file mode 100644
index f02ba58..0000000
--- a/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# java-fp-example
-
-## Road to a more functional Java with Javaslang - example refactoring
-
-This is a source code described in our blog post
-[Road to a more functional Java with Javaslang - example refactoring](https://softwaremill.com/road-to-more-functional-java-with-javaslang/)
-showing how Javaslang library could be used to make even a small logic more readable and written in a more functional way.
-
-
-## Show your Java refactoring and win a ticket to the GeeCON conference
-
-This is also a place to send your Pull Request to **win a GeeCON ticket** as described in
-[Show your Java refactoring and win a ticket to the GeeCON conference](http://softwaremill.com/show-your-java-refactoring-win-geecon-ticket).
-
-#### Important note
-
-Tests requires [Java Cryptography Extension (JCE) Unlimited Strength](http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html) installed.
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 23c6e1d..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-group 'com.softwaremill'
-version '1.0-SNAPSHOT'
-
-apply plugin: 'idea'
-apply plugin: 'java'
-apply plugin: 'groovy'
-
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
-
-repositories {
- mavenCentral()
-}
-
-dependencies {
- compile 'io.javaslang:javaslang:2.0.2'
- compile 'org.jsoup:jsoup:1.10.2'
-
- compile 'org.slf4j:slf4j-api:1.6.4'
- compile 'ch.qos.logback:logback-classic:1.0.1'
- compile 'ch.qos.logback:logback-core:1.0.1'
-
- compileOnly "org.projectlombok:lombok:1.16.10"
-
- testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
- testCompile 'org.codehaus.groovy:groovy:2.4.7'
- testCompile 'cglib:cglib:3.2.2'
-
-}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 6ffa237..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index e490051..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Mar 03 23:12:26 CET 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip
diff --git a/gradlew b/gradlew
deleted file mode 100755
index 9aa616c..0000000
--- a/gradlew
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
- cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index f955316..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d8d5101
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,20 @@
+
+ 4.0.0
+ com.softwaremill
+ java-fp-example
+ 0.0.1-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+ 1.8
+ 1.8
+
+
+
+
+
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 63adbb1..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1,2 +0,0 @@
-rootProject.name = 'java-fp-example'
-
diff --git a/src/main/java/com/softwaremill/java_fp_example/DefaultImage.java b/src/main/java/com/softwaremill/java_fp_example/DefaultImage.java
deleted file mode 100644
index 573056c..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/DefaultImage.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.softwaremill.java_fp_example;
-
-public class DefaultImage {
-
- public static final String DEFAULT_IMAGE = "https://softwaremill.com/images/logo-vertical.023d8496.png";
-
-}
diff --git a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion0.java b/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion0.java
deleted file mode 100644
index f75d54d..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion0.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.softwaremill.java_fp_example;
-
-import javaslang.collection.List;
-import lombok.extern.slf4j.Slf4j;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
-import java.io.IOException;
-import java.net.URL;
-
-import static com.softwaremill.java_fp_example.DefaultImage.DEFAULT_IMAGE;
-
-@Slf4j
-public class FacebookImageVersion0 {
-
- private final static String FACEBOOK_IMAGE_TAG = "og:image";
- private final static int TEN_SECONDS = 10_000;
-
- public static String extractImageAddressFrom(String pageUrl) {
- Document document;
- try {
- document = Jsoup.parse(new URL(pageUrl), TEN_SECONDS);
- } catch (IOException e) {
- log.error("Unable to extract og:image from url {}. Problem: {}", pageUrl, e.getMessage());
- return DEFAULT_IMAGE;
- }
- List ogImages = List
- .ofAll(document.head().getElementsByTag("meta"))
- .filter(e -> FACEBOOK_IMAGE_TAG.equals(e.attr("property")));
- if (ogImages.isEmpty()) {
- log.warn("No {} found for blog post {}", FACEBOOK_IMAGE_TAG, pageUrl);
- return DEFAULT_IMAGE;
- }
- return ogImages.get(0).attr("content");
- }
-
-}
diff --git a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion1MoreObjectOriented.java b/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion1MoreObjectOriented.java
deleted file mode 100644
index 87e28e6..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion1MoreObjectOriented.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.softwaremill.java_fp_example;
-
-import javaslang.collection.List;
-import lombok.extern.slf4j.Slf4j;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
-import java.io.IOException;
-import java.net.URL;
-
-import static com.softwaremill.java_fp_example.DefaultImage.DEFAULT_IMAGE;
-
-@Slf4j
-public class FacebookImageVersion1MoreObjectOriented {
-
- private final static String FACEBOOK_IMAGE_TAG = "og:image";
- private final static int TEN_SECONDS = 10_000;
-
- private final String url;
-
- public FacebookImageVersion1MoreObjectOriented(String pageUrl) {
- Document document;
- try {
- document = Jsoup.parse(new URL(pageUrl), TEN_SECONDS);
- } catch (IOException e) {
- log.error("Unable to extract og:image from url {}. Problem: {}", pageUrl, e.getMessage());
- url = DEFAULT_IMAGE;
- return;
- }
- List ogImages = List
- .ofAll(document.head().getElementsByTag("meta"))
- .filter(e -> FACEBOOK_IMAGE_TAG.equals(e.attr("property")));
- if (ogImages.isEmpty()) {
- log.warn("No {} found for blog post {}", FACEBOOK_IMAGE_TAG, pageUrl);
- url = DEFAULT_IMAGE;
- } else {
- url = ogImages.get(0).attr("content");
- }
-
- }
-
- public String getUrl() {
- return url;
- }
-
-}
diff --git a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion2Javaslang.java b/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion2Javaslang.java
deleted file mode 100644
index 84b6de8..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion2Javaslang.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.softwaremill.java_fp_example;
-
-import javaslang.collection.List;
-import javaslang.control.Try;
-import lombok.extern.slf4j.Slf4j;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
-import java.net.URL;
-
-import static com.softwaremill.java_fp_example.DefaultImage.DEFAULT_IMAGE;
-
-@Slf4j
-public class FacebookImageVersion2Javaslang {
-
- private final static String FACEBOOK_IMAGE_TAG = "og:image";
- private final static int TEN_SECONDS = 10_000;
-
- private final String url;
-
- public FacebookImageVersion2Javaslang(String pageUrl) {
- Try imageTry = Try.of(() -> {
- Document document = Jsoup.parse(new URL(pageUrl), TEN_SECONDS);
- List ogImages = List.ofAll(document.head().getElementsByTag("meta"))
- .filter(e -> FACEBOOK_IMAGE_TAG.equals(e.attr("property")));
- if (ogImages.isEmpty()) {
- log.warn("No {} found for blog post {}", FACEBOOK_IMAGE_TAG, pageUrl);
- return DEFAULT_IMAGE;
- } else {
- return ogImages.get(0).attr("content");
- }
- });
-
- url = imageTry
- .onFailure(error -> log.error("Unable to extract og:image from url {}. Problem: {}", pageUrl, error.getMessage()))
- .getOrElse(DEFAULT_IMAGE);
- }
-
- public String getUrl() {
- return url;
- }
-
-}
diff --git a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion3BetterJavaslang.java b/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion3BetterJavaslang.java
deleted file mode 100644
index b620102..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/FacebookImageVersion3BetterJavaslang.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.softwaremill.java_fp_example;
-
-import javaslang.collection.List;
-import javaslang.control.Try;
-import javaslang.control.Try.CheckedFunction;
-import javaslang.control.Try.CheckedSupplier;
-import lombok.extern.slf4j.Slf4j;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
-import java.net.URL;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-import static com.softwaremill.java_fp_example.DefaultImage.DEFAULT_IMAGE;
-
-@Slf4j
-public class FacebookImageVersion3BetterJavaslang {
-
- private final static String FACEBOOK_IMAGE_TAG = "og:image";
- private final static int TEN_SECONDS = 10_000;
-
- private final String url;
-
- public FacebookImageVersion3BetterJavaslang(String pageUrl) {
-
- CheckedSupplier parseDocument = () -> Jsoup.parse(new URL(pageUrl), TEN_SECONDS);
- CheckedFunction> findElementsWithPropertyTag =
- document -> List.ofAll(document.head().getElementsByTag("meta"));
- CheckedFunction, List> findElementsWithFacebookImageProperty =
- elements -> elements.filter(e -> FACEBOOK_IMAGE_TAG.equals(e.attr("property")));
- Consumer> warnIfEmpty = elements -> {
- if (elements.isEmpty()) {
- log.warn("No {} found for blog post {}", FACEBOOK_IMAGE_TAG, pageUrl);
- }
- };
- CheckedFunction, Element> findFirst = elements -> elements.get(0);
- Function content = getContentValue -> getContentValue.attr("content");
-
- url = Try.of(parseDocument)
- .mapTry(findElementsWithPropertyTag)
- .mapTry(findElementsWithFacebookImageProperty)
- .peek(warnIfEmpty)
- .mapTry(findFirst)
- .toOption()
- .map(content)
- .getOrElse(DEFAULT_IMAGE);
- }
-
- public String getUrl() {
- return url;
- }
-
-}
diff --git a/src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageVersion.java b/src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageVersion.java
new file mode 100644
index 0000000..d2501d1
--- /dev/null
+++ b/src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageVersion.java
@@ -0,0 +1,53 @@
+package com.softwaremill.java_fp_example.contest.oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Scanner;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.GZIPInputStream;
+
+public class FacebookImageVersion {
+
+ public static final String DEFAULT_IMAGE = "https://softwaremill.com/images/logo-vertical.023d8496.png";
+ private static final Pattern FACEBOOK_IMAGE_PATTERN = Pattern.compile(".*?(]*?property=\"og:image\".*?\\/?>).*?<\\/head>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final Pattern TAG_CONTENT_PATTERN = Pattern.compile("content=\"(.+?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE);
+ private static final int TEN_SECONDS = 10_000;
+ private static final Logger log = Logger.getLogger(FacebookImageVersion.class.getName());
+
+ public static String extractImageAddressFrom(String pageUrl) {
+ HttpURLConnection c = null;
+ try {
+ c = (HttpURLConnection) new URL(pageUrl).openConnection();
+ } catch (IOException e) {
+ log.severe("Cannot open connection to " + pageUrl + " - reason: " + e.toString());
+ return DEFAULT_IMAGE;
+ }
+ c.setConnectTimeout(TEN_SECONDS);
+ c.setReadTimeout(TEN_SECONDS);
+ String contentEncoding = c.getHeaderField("Content-Encoding");
+ String html = null;
+ try (InputStream is = contentEncoding != null && contentEncoding.contains("gzip") ? new GZIPInputStream(c.getInputStream()) : c.getInputStream();
+ Scanner s = new Scanner(is, StandardCharsets.UTF_8.name())) {
+ html = s.useDelimiter("\\A").next();
+ } catch (IOException e) {
+ log.severe("Cannot read from " + pageUrl + " - reason: " + e.toString());
+ return DEFAULT_IMAGE;
+ }
+ try {
+ Matcher tagMatch = FACEBOOK_IMAGE_PATTERN.matcher(html);
+ tagMatch.find();
+ Matcher contentMatch = TAG_CONTENT_PATTERN.matcher(tagMatch.group(1));
+ contentMatch.find();
+ return contentMatch.group(1);
+ } catch (Exception e) {
+ log.warning("No og:image found for blog post " + pageUrl);
+ return DEFAULT_IMAGE;
+ }
+ }
+
+}
diff --git a/LICENSE.txt b/src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/LICENSE.txt
similarity index 94%
rename from LICENSE.txt
rename to src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/LICENSE.txt
index 50cf5db..b34db23 100644
--- a/LICENSE.txt
+++ b/src/main/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/LICENSE.txt
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2017 SoftwareMill
+Copyright (c) 2017 oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/LICENSE-template.txt b/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/LICENSE-template.txt
deleted file mode 100644
index df01d55..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/LICENSE-template.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/Readme.txt b/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/Readme.txt
deleted file mode 100644
index cb42b52..0000000
--- a/src/main/java/com/softwaremill/java_fp_example/contest/your_github_login/Readme.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-Przykładowy pakiet z rozwiązaniem
-
-
-
-### WAŻNE ###
-
-Poprosimy o wykonanie następujących kroków:
-1. Skopiuj plik LICENSE-template do swojego pakietu
-2. Zmień mu nazwę na LICENSE
-3. Zapoznaj się z licencją (używamy MIT License) oraz "podpisz" ją zamieniając w zawartości ""
- na swój login na GitHubie.
-4. Tak zmodyfikowany plik LICENSE załącz w swoim Pull Requeście.
\ No newline at end of file
diff --git a/src/test/groovy/com/softwaremill/java_fp_example/FacebookImageSpec.groovy b/src/test/groovy/com/softwaremill/java_fp_example/FacebookImageSpec.groovy
deleted file mode 100644
index 8e8be37..0000000
--- a/src/test/groovy/com/softwaremill/java_fp_example/FacebookImageSpec.groovy
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.softwaremill.java_fp_example
-
-import spock.lang.Specification
-import spock.lang.Unroll
-
-import static com.softwaremill.java_fp_example.DefaultImage.DEFAULT_IMAGE
-
-
-class FacebookImageSpec extends Specification {
-
- @Unroll
- def "should test Initial Version with address #postAddress"() {
- given:
- FacebookImageVersion0 facebookImage = new FacebookImageVersion0()
-
- when:
- String imageAddress = facebookImage.extractImageAddressFrom(postAddress)
-
- then:
- imageAddress == expectedImageUrl
-
- where:
- postAddress || expectedImageUrl
- "https://softwaremill.com/the-wrong-abstraction-recap/" || "https://softwaremill.com/images/uploads/2017/02/street-shoe-chewing-gum.0526d557.jpg"
- "https://softwaremill.com/using-kafka-as-a-message-queue/" || "https://softwaremill.com/images/uploads/2017/02/kmq.93f842cf.png"
- "https://twitter.com/softwaremill" || DEFAULT_IMAGE
- "http://i-do-not-exist.pl" || DEFAULT_IMAGE
- }
-
- @Unroll
- def "should test More Object Oriented version with address #postAddress"() {
- when:
- FacebookImageVersion1MoreObjectOriented facebookImage = new FacebookImageVersion1MoreObjectOriented(postAddress)
-
- then:
- facebookImage.getUrl() == expectedImageUrl
-
- where:
- postAddress || expectedImageUrl
- "https://softwaremill.com/the-wrong-abstraction-recap/" || "https://softwaremill.com/images/uploads/2017/02/street-shoe-chewing-gum.0526d557.jpg"
- "https://softwaremill.com/using-kafka-as-a-message-queue/" || "https://softwaremill.com/images/uploads/2017/02/kmq.93f842cf.png"
- "https://twitter.com/softwaremill" || DEFAULT_IMAGE
- "http://i-do-not-exist.pl" || DEFAULT_IMAGE
- }
-
- @Unroll
- def "should test Javaslang version with address #postAddress"() {
- when:
- FacebookImageVersion2Javaslang facebookImage = new FacebookImageVersion2Javaslang(postAddress)
-
- then:
- facebookImage.getUrl() == expectedImageUrl
-
- where:
- postAddress || expectedImageUrl
- "https://softwaremill.com/the-wrong-abstraction-recap/" || "https://softwaremill.com/images/uploads/2017/02/street-shoe-chewing-gum.0526d557.jpg"
- "https://softwaremill.com/using-kafka-as-a-message-queue/" || "https://softwaremill.com/images/uploads/2017/02/kmq.93f842cf.png"
- "https://twitter.com/softwaremill" || DEFAULT_IMAGE
- "http://i-do-not-exist.pl" || DEFAULT_IMAGE
- }
-
- @Unroll
- def "should test Better Javaslang version with address #postAddress"() {
- when:
- FacebookImageVersion2Javaslang facebookImage = new FacebookImageVersion2Javaslang(postAddress)
-
- then:
- facebookImage.getUrl() == expectedImageUrl
-
- where:
- postAddress || expectedImageUrl
- "https://softwaremill.com/the-wrong-abstraction-recap/" || "https://softwaremill.com/images/uploads/2017/02/street-shoe-chewing-gum.0526d557.jpg"
- "https://softwaremill.com/using-kafka-as-a-message-queue/" || "https://softwaremill.com/images/uploads/2017/02/kmq.93f842cf.png"
- "https://twitter.com/softwaremill" || DEFAULT_IMAGE
- "http://i-do-not-exist.pl" || DEFAULT_IMAGE
- }
-
-}
diff --git a/src/test/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageTest.java b/src/test/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageTest.java
new file mode 100644
index 0000000..6a2780e
--- /dev/null
+++ b/src/test/java/com/softwaremill/java_fp_example/contest/oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo/FacebookImageTest.java
@@ -0,0 +1,12 @@
+package com.softwaremill.java_fp_example.contest.oxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxoxo;
+
+public class FacebookImageTest {
+
+ public void testMinimalisticVersion() {
+ assert FacebookImageVersion.extractImageAddressFrom("https://softwaremill.com/the-wrong-abstraction-recap/").equals("https://softwaremill.com/images/uploads/2017/02/street-shoe-chewing-gum.0526d557.jpg");
+ assert FacebookImageVersion.extractImageAddressFrom("https://softwaremill.com/using-kafka-as-a-message-queue/").equals("https://softwaremill.com/images/uploads/2017/02/kmq.93f842cf.png");
+ assert FacebookImageVersion.extractImageAddressFrom("https://twitter.com/softwaremill").equals(FacebookImageVersion.DEFAULT_IMAGE);
+ assert FacebookImageVersion.extractImageAddressFrom("http://i-do-not-exist.pl").equals(FacebookImageVersion.DEFAULT_IMAGE);
+ }
+
+}