@@ -0,0 +1,85 @@ | |||
*.db | |||
############################## | |||
## Java | |||
############################## | |||
.mtj.tmp/ | |||
*.class | |||
*.jar | |||
*.war | |||
*.ear | |||
*.nar | |||
hs_err_pid* | |||
############################## | |||
## Maven | |||
############################## | |||
target/ | |||
pom.xml.tag | |||
pom.xml.releaseBackup | |||
pom.xml.versionsBackup | |||
pom.xml.next | |||
pom.xml.bak | |||
release.properties | |||
dependency-reduced-pom.xml | |||
buildNumber.properties | |||
.mvn/timing.properties | |||
.mvn/wrapper/maven-wrapper.jar | |||
############################## | |||
## Gradle | |||
############################## | |||
bin/ | |||
build/ | |||
.gradle | |||
.gradletasknamecache | |||
gradle-app.setting | |||
!gradle-wrapper.jar | |||
############################## | |||
## IntelliJ | |||
############################## | |||
out/ | |||
.idea/ | |||
.idea_modules/ | |||
*.iml | |||
*.ipr | |||
*.iws | |||
############################## | |||
## Eclipse | |||
############################## | |||
.settings/ | |||
bin/ | |||
tmp/ | |||
.metadata | |||
.classpath | |||
.project | |||
*.tmp | |||
*.bak | |||
*.swp | |||
*~.nib | |||
local.properties | |||
.loadpath | |||
.factorypath | |||
############################## | |||
## NetBeans | |||
############################## | |||
nbproject/private/ | |||
build/ | |||
nbbuild/ | |||
dist/ | |||
nbdist/ | |||
nbactions.xml | |||
nb-configuration.xml | |||
############################## | |||
## Visual Studio Code | |||
############################## | |||
.vscode/ | |||
.code-workspace | |||
############################## | |||
## OS X | |||
############################## | |||
.DS_Store |
@@ -0,0 +1,50 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<groupId>be.syntra</groupId> | |||
<artifactId>jordiquote-spring-xml</artifactId> | |||
<version>1.0-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<maven.compiler.source>11</maven.compiler.source> | |||
<maven.compiler.target>11</maven.compiler.target> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.junit.jupiter</groupId> | |||
<artifactId>junit-jupiter</artifactId> | |||
<version>5.7.1</version> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<!-- https://github.com/ricksbrown/cowsay --> | |||
<groupId>com.github.ricksbrown</groupId> | |||
<artifactId>cowsay</artifactId> | |||
<version>1.1.0</version> | |||
<!-- The "lib" classifier is optional, but it gives you a MUCH smaller jar which is all you need as a Java library --> | |||
<classifier>lib</classifier> | |||
</dependency> | |||
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
<version>8.0.24</version> | |||
</dependency> | |||
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> | |||
<!-- https://projectlombok.org/--> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<version>1.18.20</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -0,0 +1,36 @@ | |||
package be.syntra; | |||
import be.syntra.cowsay.*; | |||
import java.util.Scanner; | |||
public class App { | |||
public static void main(String[] args) { | |||
/** | |||
* Dependency Injection is a technique of creating software in which objects do not create their dependencies on itself. | |||
* instead objects declare dependencies that they need and it an external object or framework to provide | |||
* concrete dependencies to objects | |||
*/ | |||
CowSay cowSay = new DragonCowSay(); | |||
QuoteDao quoteDao = new QuoteDaoMysql(); | |||
cowSay.setQuoteDao(quoteDao); | |||
cowSay.showQuote(); | |||
Scanner in = new Scanner(System.in); | |||
System.out.println("Did you like this quote ? (y/n)"); | |||
while(true) { | |||
String line = in.nextLine(); | |||
if (line.equalsIgnoreCase("y")) { | |||
cowSay.voteDown(); | |||
break; | |||
} else if(line.equalsIgnoreCase("n")) { | |||
cowSay.voteUp(); | |||
break; | |||
} else { | |||
System.out.println("Please enter y/n"); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
package be.syntra.cowsay; | |||
public interface CowSay { | |||
void showQuote(); | |||
void voteUp(); | |||
void voteDown(); | |||
void setQuoteDao(QuoteDao quoteDao); | |||
} | |||
@@ -0,0 +1,30 @@ | |||
package be.syntra.cowsay; | |||
import com.github.ricksbrown.cowsay.Cowsay; | |||
public class DragonCowSay implements CowSay { | |||
QuoteDao quoteDao; | |||
Quote quote; | |||
public void setQuoteDao(QuoteDao quoteDao) { | |||
this.quoteDao = quoteDao; | |||
} | |||
@Override | |||
public void showQuote() { | |||
quote = quoteDao.getRandomQuote(); | |||
String cow = "dragon"; | |||
String[] cowArgs = new String[]{"-f", cow, quote.getAuthor() +" Says: " + quote.getQuote()}; | |||
String result = Cowsay.say(cowArgs); | |||
System.out.println(result); | |||
} | |||
@Override | |||
public void voteUp() { | |||
quoteDao.likeQuote(quote); | |||
} | |||
@Override | |||
public void voteDown() { | |||
quoteDao.dislikeQuote(quote); | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
package be.syntra.cowsay; | |||
import com.github.ricksbrown.cowsay.Cowsay; | |||
public class OriginalCowSay implements CowSay { | |||
QuoteDao quoteDao; | |||
Quote quote; | |||
public void setQuoteDao(QuoteDao quoteDao) { | |||
this.quoteDao = quoteDao; | |||
} | |||
@Override | |||
public void showQuote() { | |||
quote = quoteDao.getRandomQuote(); | |||
String cow = "dragon"; | |||
String[] cowArgs = new String[]{quote.getAuthor() +" Says: " + quote.getQuote()}; | |||
String result = Cowsay.say(cowArgs); | |||
System.out.println(result); | |||
} | |||
@Override | |||
public void voteUp() { | |||
quoteDao.likeQuote(quote); | |||
} | |||
@Override | |||
public void voteDown() { | |||
quoteDao.dislikeQuote(quote); | |||
} | |||
} |
@@ -0,0 +1,13 @@ | |||
package be.syntra.cowsay; | |||
import lombok.Data; | |||
@Data | |||
public class Quote { | |||
private int id; | |||
private String author; | |||
private String quote; | |||
private int likes; | |||
private int dislikes; | |||
} |
@@ -0,0 +1,8 @@ | |||
package be.syntra.cowsay; | |||
public interface QuoteDao { | |||
Quote getRandomQuote(); | |||
void likeQuote(Quote quote); | |||
void dislikeQuote(Quote quote); | |||
} |
@@ -0,0 +1,25 @@ | |||
package be.syntra.cowsay; | |||
public class QuoteDaoDummy implements QuoteDao { | |||
@Override | |||
public Quote getRandomQuote() { | |||
Quote quote = new Quote(); | |||
quote.setId(0); | |||
quote.setAuthor("dummy author"); | |||
quote.setQuote("dummy quote"); | |||
quote.setLikes(0); | |||
quote.setDislikes(0); | |||
return quote; | |||
} | |||
@Override | |||
public void likeQuote(Quote quote) { | |||
} | |||
@Override | |||
public void dislikeQuote(Quote quote) { | |||
} | |||
} |
@@ -0,0 +1,73 @@ | |||
package be.syntra.cowsay; | |||
import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.sql.*; | |||
import java.util.Properties; | |||
public class QuoteDaoMysql implements QuoteDao { | |||
private static String url; | |||
private static String usr; | |||
private static String pass; | |||
static { | |||
try (InputStream in = QuoteDaoMysql.class.getResourceAsStream("/app.properties")) { | |||
Properties properties = new Properties(); | |||
properties.load(in); | |||
url = properties.getProperty("url"); | |||
usr = properties.getProperty("usr"); | |||
pass = properties.getProperty("pass"); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
@Override | |||
public Quote getRandomQuote() { | |||
String sql = "SELECT * FROM jordiquotes ORDER BY RAND() LIMIT 1"; | |||
try (Connection con = DriverManager.getConnection(url, usr, pass); | |||
PreparedStatement ps = con.prepareStatement(sql)) { | |||
try (ResultSet rs = ps.executeQuery()) { | |||
if (rs.next()) { | |||
Quote quote = new Quote(); | |||
quote.setId(rs.getInt("id")); | |||
quote.setAuthor(rs.getString("author")); | |||
quote.setQuote(rs.getString("quote")); | |||
quote.setLikes(rs.getInt("likes")); | |||
quote.setDislikes(rs.getInt("dislikes")); | |||
return quote; | |||
} | |||
} catch (SQLException throwables) { | |||
throwables.printStackTrace(); | |||
} | |||
} catch (SQLException throwables) { | |||
throwables.printStackTrace(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public void likeQuote(Quote quote) { | |||
String sql = "UPDATE jordiquotes SET likes = likes + 1 WHERE ID = ?"; | |||
try (Connection con = DriverManager.getConnection(url,usr,pass); | |||
PreparedStatement ps = con.prepareStatement(sql)){ | |||
ps.setInt(1, quote.getId()); | |||
ps.executeUpdate(); | |||
} catch (SQLException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
@Override | |||
public void dislikeQuote(Quote quote) { | |||
String sql = "UPDATE jordiquotes SET dislikes = dislikes + 1 WHERE ID = ?"; | |||
try (Connection con = DriverManager.getConnection(url,usr,pass); | |||
PreparedStatement ps = con.prepareStatement(sql)){ | |||
ps.setInt(1, quote.getId()); | |||
ps.executeUpdate(); | |||
} catch (SQLException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,3 @@ | |||
url=jdbc:mysql://ID109462_crud.db.webhosting.be:3306/ID109462_crud | |||
usr=ID109462_crud | |||
pass=code4croissants |
@@ -0,0 +1,21 @@ | |||
package be.syntra; | |||
import static org.junit.jupiter.api.Assertions.assertTrue; | |||
import org.junit.jupiter.api.Test; | |||
/** | |||
* Unit test for simple App. | |||
*/ | |||
public class AppTest | |||
{ | |||
/** | |||
* Rigorous Test :-) | |||
*/ | |||
@Test | |||
public void shouldAnswerWithTrue() | |||
{ | |||
assertTrue( true ); | |||
} | |||
} |