diff --git a/pom.xml b/pom.xml index 188835c..b4bb633 100644 --- a/pom.xml +++ b/pom.xml @@ -261,11 +261,18 @@ 13.0 compile + + com.google.code.gson gson 2.8.0 + + org.json + json + 20180813 + org.mariadb.jdbc diff --git a/src/main/java/de/hsel/itech/config/Configuration.java b/src/main/java/de/hsel/itech/config/Configuration.java index 3412c35..c9aee3f 100644 --- a/src/main/java/de/hsel/itech/config/Configuration.java +++ b/src/main/java/de/hsel/itech/config/Configuration.java @@ -25,6 +25,8 @@ public class Configuration { @Getter private Database database; + @Getter + private Unsplash unsplash; /** diff --git a/src/main/java/de/hsel/itech/config/Unsplash.java b/src/main/java/de/hsel/itech/config/Unsplash.java new file mode 100644 index 0000000..3d77a1a --- /dev/null +++ b/src/main/java/de/hsel/itech/config/Unsplash.java @@ -0,0 +1,20 @@ +package de.hsel.itech.config; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +/** + * @author Johannes Theiner + * @version 0.1 + * @since 0.1 + **/ + +@Getter +@ToString +@EqualsAndHashCode +public class Unsplash { + + private String accessKey; + private String secretKey; +} \ No newline at end of file diff --git a/src/main/java/de/hsel/itech/db/Database.java b/src/main/java/de/hsel/itech/db/Database.java index 2e4e927..1cf745f 100644 --- a/src/main/java/de/hsel/itech/db/Database.java +++ b/src/main/java/de/hsel/itech/db/Database.java @@ -7,12 +7,12 @@ import de.hsel.itech.db.pojo.Category; import de.hsel.itech.db.pojo.Publisher; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.json.JSONObject; import org.mariadb.jdbc.MariaDbPoolDataSource; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; +import java.io.*; import java.net.URL; +import java.nio.charset.Charset; import java.sql.*; import java.time.Year; import java.util.AbstractMap; @@ -105,7 +105,7 @@ public class Database { */ @Nullable public Author getAuthor(long id) { - Map.Entry entry = getResultSet(id, author); + Map.Entry entry = getResultSetById(author, id); assert entry != null; ResultSet rs = entry.getKey(); @@ -126,15 +126,15 @@ public class Database { * @return {@link de.hsel.itech.db.pojo.Author} */ @Nullable - public Author getAuthor(String name) { - Map.Entry entry = getResultSets(author, "name", name); + public Author getAuthor(@NotNull String name) { + Map.Entry entry = getResultSetsByValue(author, "name", name); assert entry != null; assert entry.getKey() != null; Author author = null; ResultSet rs = entry.getKey(); try { - if(rs.next()) + if (rs.next()) author = new Author(rs.getLong("id"), rs.getString("name")); entry.getValue().close(); } catch (SQLException e) { @@ -152,7 +152,7 @@ public class Database { */ @Nullable public Category getCategory(long id) { - Map.Entry entry = getResultSet(id, category); + Map.Entry entry = getResultSetById(category, id); assert entry != null; ResultSet rs = entry.getKey(); @@ -171,28 +171,49 @@ public class Database { * @return {@link de.hsel.itech.db.pojo.Category} */ @Nullable - public Category getCategory(String name) { - Map.Entry entry = getResultSets(category, "name", name); + public Category getCategory(@NotNull String name) { + Map.Entry entry = getResultSetsByValue(category, "name", name); assert entry != null; return getCategory(entry); } + /** + * get Category from database entry. + * @param entry entry + * @return Category + */ @Nullable private Category getCategory(@NotNull Map.Entry entry) { ResultSet rs = entry.getKey(); Category category = null; - try{ - while(rs.next()) { + try { + while (rs.next()) { category = new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image")); } entry.getValue().close(); - }catch (SQLException ex) { + } catch (SQLException ex) { ex.printStackTrace(); } return category; } + /** + * get all categories. + * + * @return list of categories + */ + @Nullable + public List getCategories() { + List ids = getIds(category); + List categories = new ArrayList<>(); + for (long id : ids) { + categories.add(getCategory(id)); + } + return categories; + } + + /** * gets publisher by id. * @@ -201,7 +222,7 @@ public class Database { */ @Nullable public Publisher getPublisher(long id) { - Map.Entry entry = getResultSet(id, publisher); + Map.Entry entry = getResultSetById(publisher, id); assert entry != null; ResultSet rs = entry.getKey(); @@ -222,15 +243,15 @@ public class Database { * @return {@link de.hsel.itech.db.pojo.Publisher} */ @Nullable - public Publisher getPublisher(String name) { - Map.Entry entry = getResultSets(publisher, "name", name); + public Publisher getPublisher(@NotNull String name) { + Map.Entry entry = getResultSetsByValue(publisher, "name", name); assert entry != null; assert entry.getKey() != null; Publisher publisher = null; ResultSet rs = entry.getKey(); try { - while(rs.next()) { + while (rs.next()) { publisher = new Publisher(rs.getLong("id"), rs.getString("name")); } entry.getValue().close(); @@ -249,7 +270,7 @@ public class Database { */ @Nullable private List getAuthors(long id) { - Map.Entry entry = getResultSets(id, authorBook, book); + Map.Entry entry = getResultSetsById(authorBook, book, id); assert entry != null; try { List list = new ArrayList<>(); @@ -273,16 +294,26 @@ public class Database { */ @Nullable public Book getBook(long id) { - Map.Entry entry = getResultSet(id, book); + Map.Entry entry = getResultSetById(book, id); assert entry != null; + return buildBook(entry); + } + /** + * builds book from entry. + * + * @param entry Map.Entry + * @return Book + */ + @Nullable + private Book buildBook(@NotNull Map.Entry entry) { - ResultSet rs = entry.getKey(); Book book = null; + ResultSet rs = entry.getKey(); try { Category category = getCategory(rs.getLong(this.category)); Publisher publisher = getPublisher(rs.getLong(this.publisher)); - List authorIds = getAuthors(id); + List authorIds = getAuthors(rs.getLong("id")); assert category != null; assert publisher != null; assert authorIds != null; @@ -296,6 +327,7 @@ public class Database { book = new Book(rs.getLong("id"), rs.getLong("isbn"), authors, publisher, category, rs.getString("title"), Year.of(rs.getInt("year")), rs.getInt("price"), rs.getString("description"), rs.getString("image")); + entry.getValue().close(); } catch (SQLException e) { e.printStackTrace(); @@ -310,19 +342,7 @@ public class Database { */ @Nullable public List getBooks() { - Map.Entry entry = getResultSets(book, "id"); - assert entry != null; - - List ids = new ArrayList<>(); - try { - ResultSet rs = entry.getKey(); - while (rs.next()) { - ids.add(rs.getLong("id")); - } - entry.getValue().close(); - } catch (SQLException ex) { - ex.printStackTrace(); - } + List ids = getIds(book); List books = new ArrayList<>(); for (long id : ids) { books.add(getBook(id)); @@ -370,6 +390,25 @@ public class Database { return getBooks(category.getId()); } + /** + * exists book with isbn ? + * + * @param isbn isbn + * @return true if book with isbn exists + */ + public boolean existsBook(long isbn) { + Map.Entry entry = getResultSetByValue(book, "isbn", isbn); + try { + if (entry != null && entry.getKey() != null) { + entry.getValue().close(); + return true; + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + return false; + } + /** * Inserts book into database. @@ -394,36 +433,37 @@ public class Database { dbAuthor = getAuthor(author.getName()); } authors.add(dbAuthor); - }else authors.add(author); + } else authors.add(author); } //publisher exists ? Publisher publisher; - if(book.getPublisher().getId() == 0) { + if (book.getPublisher().getId() == 0) { Publisher dbPublisher = getPublisher(book.getPublisher().getName()); - if(dbPublisher != null) + if (dbPublisher != null) publisher = dbPublisher; else { insertCount += insert(new Publisher(book.getPublisher().getName())); publisher = getPublisher(book.getPublisher().getName()); } - }else publisher = book.getPublisher(); + } else publisher = book.getPublisher(); //category exists ? Category category; - if(book.getCategory().getId() == 0) { + if (book.getCategory().getId() == 0) { Category dbCategory = getCategory(book.getCategory().getName()); - if(dbCategory != null) + if (dbCategory != null) category = dbCategory; else { - insertCount += insert(new Category(book.getCategory().getName(), book.getCategory().getImage())); + insertCount += insert(new Category(book.getCategory().getName(), getRandomImage())); category = getCategory(book.getCategory().getName()); } - }else category = book.getCategory(); + } else category = book.getCategory(); assert publisher != null; assert category != null; + //insert book try { PreparedStatement statement = connection.prepareStatement("INSERT INTO book(isbn, title, description, " + "price, year, publisher, category, image) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); @@ -438,10 +478,11 @@ public class Database { insertCount += statement.executeUpdate(); ResultSet resultSet = statement.getGeneratedKeys(); long lastId = -1; - while(resultSet.next()) { + while (resultSet.next()) { lastId = resultSet.getLong("id"); } + //add book to author for (Author author : authors) { PreparedStatement authorStatement = connection.prepareStatement("INSERT INTO " + authorBook + " (author, book) VALUES (?, ?);"); authorStatement.setLong(1, author.getId()); @@ -594,7 +635,7 @@ public class Database { * @param table table name * @return deletion count */ - private int delete(long id, String table) { + private int delete(long id, @NotNull String table) { Connection connection = getConnection(); assert connection != null; @@ -611,21 +652,50 @@ public class Database { return deleteCount; } + /** + * get all ids from specified table. + * + * @param table table + * @return list of ids + */ + private List getIds(@NotNull String table) { + Map.Entry entry = getColumnsFromResultSet(table, "id"); + assert entry != null; + + + List ids = new ArrayList<>(); + try { + ResultSet rs = entry.getKey(); + while (rs.next()) { + ids.add(rs.getLong("id")); + } + entry.getValue().close(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + return ids; + } + /** * gets specific entry from database. * - * @param id id from database * @param table table name + * @param id id from database * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry getResultSet(long id, String table) { + private Map.Entry getResultSetById(@NotNull String table, long id) { + return getResultSetByValue(table, "id", id); + } + + @Nullable + private Map.Entry getResultSetByValue(@NotNull String table, @NotNull String column, long value) { Connection connection = getConnection(); try { assert connection != null; - PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE id = ?"); - statement.setLong(1, id); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE " + column + " = ?"); + statement.setLong(1, value); ResultSet resultSet = statement.executeQuery(); if (resultSet.next()) { return new AbstractMap.SimpleEntry<>(resultSet, connection); @@ -641,20 +711,20 @@ public class Database { /** * gets specific entries from table. * - * @param id id all entries should reference * @param table table name * @param column column to match + * @param id id all entries should reference * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry getResultSets(long id, @NotNull String table, @NotNull String column) { + private Map.Entry getResultSetsById(@NotNull String table, @NotNull String column, long id) { Connection connection = getConnection(); try { assert connection != null; PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE " + column + " = ?"); statement.setLong(1, id); - return getAllEntries(connection, statement); + return getAllEntriesFromResultSet(connection, statement); } catch (SQLException ex) { ex.printStackTrace(); } @@ -669,14 +739,14 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry getResultSets(@NotNull String table, @NotNull String column, @NotNull String value) { + private Map.Entry getResultSetsByValue(@NotNull String table, @NotNull String column, @NotNull String value) { Connection connection = getConnection(); try { assert connection != null; PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + table + " WHERE " + column + " = ?"); statement.setString(1, value); - return getAllEntries(connection, statement); + return getAllEntriesFromResultSet(connection, statement); } catch (SQLException ex) { ex.printStackTrace(); } @@ -691,13 +761,13 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry getResultSets(@NotNull String table, @NotNull String... columns) { + private Map.Entry getColumnsFromResultSet(@NotNull String table, @NotNull String... columns) { Connection connection = getConnection(); try { assert connection != null; PreparedStatement statement = connection.prepareStatement("SELECT (" + String.join(",", columns) + ") FROM " + table); - return getAllEntries(connection, statement); + return getAllEntriesFromResultSet(connection, statement); } catch (SQLException ex) { ex.printStackTrace(); } @@ -712,7 +782,7 @@ public class Database { * @return {@link java.util.Map.Entry} */ @Nullable - private Map.Entry getAllEntries(@NotNull Connection connection, @NotNull PreparedStatement statement) { + private Map.Entry getAllEntriesFromResultSet(@NotNull Connection connection, @NotNull PreparedStatement statement) { try { ResultSet resultSet = statement.executeQuery(); return new AbstractMap.SimpleEntry<>(resultSet, connection); @@ -721,4 +791,28 @@ public class Database { } return null; } + + @Nullable + private String getRandomImage() { + try { + InputStream is = new URL("https://api.unsplash.com/photos/random?client_id=" + Configuration.get().getUnsplash().getAccessKey()).openStream(); + try { + BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); + StringBuilder sb = new StringBuilder(); + int cp; + while ((cp = rd.read()) != -1) { + sb.append((char) cp); + } + JSONObject json = new JSONObject(sb.toString()); + return json.getString("id"); + } finally { + is.close(); + } + + + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } } \ No newline at end of file diff --git a/src/main/java/de/hsel/itech/servlet/AddBook.java b/src/main/java/de/hsel/itech/servlet/AddBook.java index 32f8e36..77798b5 100644 --- a/src/main/java/de/hsel/itech/servlet/AddBook.java +++ b/src/main/java/de/hsel/itech/servlet/AddBook.java @@ -1,5 +1,7 @@ package de.hsel.itech.servlet; +import org.jetbrains.annotations.NotNull; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -10,7 +12,6 @@ import java.io.PrintWriter; /** * Servlet: form to add a book to the database * - * * @author Julian Hinxlage * @version 0.1 * @since 0.1 @@ -20,7 +21,7 @@ import java.io.PrintWriter; public class AddBook extends HttpServlet { - protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) + protected void doGet(@NotNull final HttpServletRequest req, @NotNull final HttpServletResponse resp) throws IOException { resp.setCharacterEncoding("utf-8"); @@ -30,19 +31,19 @@ public class AddBook extends HttpServlet { out.println("
"); Utillity.addValidationInput(out, "ISBN", "isbn", "text", "0", "[0-9]*"); - Utillity.addInput(out,"Titel", "title"); - Utillity.addInput(out,"Author", "author"); - Utillity.addValidationInput(out,"Preis", "price", "text", "0", "[0-9]*(,[0-9]{1,2})?"); - Utillity.addValidationInput(out,"Jahr", "year", "text", "2019", "[0-9]*"); - Utillity.addInput(out,"Beschreibung", "description"); - Utillity.addInput(out,"Verlag", "publisher"); - Utillity.addInput(out,"Kategorie", "category"); - Utillity.addInput(out,"Bild", "image", "DxAzOKSiPoE"); + Utillity.addInput(out, "Titel", "title"); + Utillity.addInput(out, "Author", "author"); + Utillity.addValidationInput(out, "Preis", "price", "text", "0", "[0-9]*(,[0-9]{1,2})?"); + Utillity.addValidationInput(out, "Jahr", "year", "text", "2019", "[0-9]*"); + Utillity.addInput(out, "Beschreibung", "description"); + Utillity.addInput(out, "Verlag", "publisher"); + Utillity.addInput(out, "Kategorie", "category"); + Utillity.addInput(out, "Bild", "image"); Utillity.addSubmitButton(out, "Hinzufügen"); out.println("
"); - Utillity.addButton(out,"Zurück zur Buchliste", "booklist"); + Utillity.addButton(out, "Zurück zur Buchliste", "booklist"); Utillity.insertFile(out, "template_footer.html"); } diff --git a/src/main/java/de/hsel/itech/servlet/BookList.java b/src/main/java/de/hsel/itech/servlet/BookList.java index 2e94022..b2f2ddc 100644 --- a/src/main/java/de/hsel/itech/servlet/BookList.java +++ b/src/main/java/de/hsel/itech/servlet/BookList.java @@ -5,6 +5,7 @@ import de.hsel.itech.db.pojo.Author; import de.hsel.itech.db.pojo.Book; import de.hsel.itech.db.pojo.Category; import de.hsel.itech.db.pojo.Publisher; +import org.jetbrains.annotations.NotNull; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -20,7 +21,6 @@ import java.util.List; /** * Servlet: list of all books and remove function * - * * @author Julian Hinxlage * @version 0.1 * @since 0.1 @@ -29,14 +29,19 @@ import java.util.List; @WebServlet("/booklist") public class BookList extends HttpServlet { - protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) - throws IOException { + @Override + protected void doGet(@NotNull HttpServletRequest req, @NotNull HttpServletResponse resp) throws IOException { + doPost(req, resp); + } + + @Override + protected void doPost(@NotNull final HttpServletRequest req, @NotNull final HttpServletResponse resp) throws IOException { req.setCharacterEncoding(StandardCharsets.UTF_8.name()); //get database object Database db = Database.getInstance(); - resp.setCharacterEncoding("utf-8"); + resp.setCharacterEncoding(StandardCharsets.UTF_8.name()); PrintWriter out = resp.getWriter(); //header template @@ -74,20 +79,9 @@ public class BookList extends HttpServlet { String image = req.getParameter("image"); //check isbn - List books = db.getBooks(); - boolean found = false; - if (books != null) { - for(Book b : books){ - if(b.getIsbn() == isbn){ - found = true; - break; - } - } - } - - if (found) { + if (db.existsBook(isbn)) { out.println(""); } else { ArrayList authors = new ArrayList<>(); @@ -105,8 +99,7 @@ public class BookList extends HttpServlet { db.insert(book); resp.sendRedirect("booklist"); } - } - catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); out.println("