r35 - in trunk: . src/main/java/org/chorem/bow src/main/webapp
Author: bbrossaud Date: 2010-05-27 14:29:26 +0200 (Thu, 27 May 2010) New Revision: 35 Url: http://chorem.org/repositories/revision/bow/35 Log: bookmarks importation and exportation works in html format Modified: trunk/pom.xml trunk/src/main/java/org/chorem/bow/BookmarkActions.java trunk/src/main/java/org/chorem/bow/ControllerServlet.java trunk/src/main/webapp/home.jsp trunk/src/main/webapp/register.jsp trunk/src/main/webapp/search.jsp Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/pom.xml 2010-05-27 12:29:26 UTC (rev 35) @@ -83,9 +83,20 @@ <version>1.2.2</version> </dependency> + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + <version>1.2.1</version> + </dependency> + + <dependency> + <groupId>org.htmlparser</groupId> + <artifactId>htmlparser</artifactId> + <version>1.6</version> + </dependency> + </dependencies> - <scm> <connection>scm:svn:http://svn.chorem.org/svn/bow/trunk</connection> <developerConnection>scm:svn:http://svn.chorem.org/svn/bow/trunk</developerConnection> Modified: trunk/src/main/java/org/chorem/bow/BookmarkActions.java =================================================================== --- trunk/src/main/java/org/chorem/bow/BookmarkActions.java 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/src/main/java/org/chorem/bow/BookmarkActions.java 2010-05-27 12:29:26 UTC (rev 35) @@ -12,6 +12,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.nuiton.util.StringUtil; /** @@ -23,15 +25,59 @@ protected List<Bookmark> bookmarks = new ArrayList<Bookmark>(); // bookmarks which contain the search tags protected List<Bookmark> lastBookmarks = new ArrayList<Bookmark>(); protected Map<String, Integer> tagCloud = new HashMap<String, Integer>(); // associate a tag with its frequency - // among all bookmarks + // among all bookmarks protected List<String> tagsSearch = new ArrayList<String>(); // contains the tags taped in the search field protected int tmax = -1; protected int tmin = -1; + public static String getExportHtmlBookmark(List<Bookmark> bookmarks) { + String export = ""; + export = "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" + + "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n" + + "<DL><p>\n"; + if (bookmarks != null) { + for (Bookmark bookmark : bookmarks) { + export += "<DT><A HREF=\""; + export += bookmark.getLink() + "\" "; + export += "LAST_CHARSET=\"UTF-8\" "; + Set<String> tags = bookmark.getTags(); + if (tags != null && !tags.isEmpty()) { + export += "SHORTCUTURL=\"" + getBookmarkTagsString(bookmark) + "\""; + } + export += ">" + bookmark.getDescription() + "</A>\n"; + } + } + export += "</DL><p>"; + return export; + } + public static String getUrlFromHtml(String html) { + String url = ""; + if (html != null) { + Pattern p = Pattern.compile("A HREF=\"([^\"]*)\""); + Matcher m = p.matcher(html); + if (m.find()) { + url = m.group(1); + } + } + return url; + } + + public static String getTagsFromHtml(String html) { + String tags = ""; + if (html != null) { + Pattern p = Pattern.compile("SHORTCUTURL=\"([^\"]*)\""); + Matcher m = p.matcher(html); + if (m.find()) { + tags = m.group(1); + } + } + return tags; + } + /* @param url String which contains the bookmark url * @param nameAndTags String which contains the name and the tags of the - bookmark separated by '|' ==> name|tag1 tag2... + bookmark separated by '|' ==> name|tag1 tag2... * @param user bookmark user * @return null if all fields are not correctly filled * @return Bookmark the website bookmark @@ -44,23 +90,23 @@ if (nameIndex > 0) { String name = nameAndTags.substring(0, nameIndex); // get the website name if (!name.isEmpty()) { - name = name.trim(); - bookmark.setDescription(name); // set the description (website name) + name = name.trim(); + bookmark.setDescription(name); // set the description (website name) } } - String tags = nameAndTags; if (nameIndex >= 0) { tags = nameAndTags.substring(nameIndex + 1); // get tags, +1 because of '|' } - tags = tags.trim(); - String[] tagsTab = tags.split("\\s+"); // put the tags in an array - for (int i = 0; i < tagsTab.length; ++i) { - if (!tagsTab[i].isEmpty()) { - bookmark.addTags(tagsTab[i]); // Added tag for each rank (one tag by rank) - } - } + addTagsToBookmark(tags, bookmark); + addUrlToBookmark(url, bookmark); + bookmark.setClick(0); + bookmark.setEmail(user.getEmail()); // set the email (user name) + bookmark.setDate(new Date()); // set the date + return bookmark; + } + public static void addUrlToBookmark(String url, Bookmark bookmark) { if (url != null && !url.isEmpty()) { String link = url.trim(); if (!link.contains("http://")) { @@ -68,19 +114,26 @@ } bookmark.setLink(link); } - bookmark.setClick(0); - bookmark.setEmail(user.getEmail()); // set the email (user name) - bookmark.setDate(new Date()); // set the date - return bookmark; } + public static void addTagsToBookmark(String tags, Bookmark bookmark) { + if (tags != null) { + tags = tags.trim(); + String[] tagsTab = tags.split("\\s+"); // put the tags in an array + for (int i = 0; i < tagsTab.length; ++i) { + if (!tagsTab[i].isEmpty()) { + bookmark.addTags(tagsTab[i]); // Added tag for each rank (one tag by rank) + } + } + } + } + public static Bookmark createBookmark(String url, String name, String tags, User user) { Bookmark bookmark = (Bookmark) new BookmarkImpl(); if (name != null) { name = name.trim(); bookmark.setDescription(name); - } - else { + } else { bookmark.setDescription(""); } if (tags != null && !tags.isEmpty()) { @@ -142,7 +195,7 @@ defineTValues(); } - public void deleteBookmarkBySearch() { + public void deleteBookmarkBySearch() { List<Bookmark> bookmarksList = new ArrayList<Bookmark>(bookmarks); for (Bookmark bookmark : bookmarksList) { Iterator it = tagsSearch.iterator(); @@ -197,7 +250,7 @@ while (it.hasNext()) { value = (Integer) it.next(); if (tmax < value) { // search the most tag frequancy - tmax = value; + tmax = value; } if (tmin == -1) { tmin = value; @@ -250,7 +303,7 @@ bookmarks = newList; } - public void setLastBookmarks(List<Bookmark> bookmarksList) { + public void setLastBookmarks(List<Bookmark> bookmarksList) { List<Bookmark> newList = new ArrayList(bookmarksList); lastBookmarks = newList; } @@ -264,8 +317,9 @@ if (tmax > tmin) { font = (50 * (ti - tmin)) / (tmax - tmin); // get the font size for a tag frequency } - if (font < 10) + if (font < 10) { font = 10; + } return font; } Modified: trunk/src/main/java/org/chorem/bow/ControllerServlet.java =================================================================== --- trunk/src/main/java/org/chorem/bow/ControllerServlet.java 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/src/main/java/org/chorem/bow/ControllerServlet.java 2010-05-27 12:29:26 UTC (rev 35) @@ -12,14 +12,28 @@ import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; +import java.util.Iterator; import java.util.List; +import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.htmlparser.Node; +import org.htmlparser.Parser; +import org.htmlparser.filters.TagNameFilter; +import org.htmlparser.util.NodeList; +import org.htmlparser.util.ParserException; +import org.htmlparser.util.SimpleNodeIterator; import org.nuiton.wikitty.Criteria; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.search.Search; @@ -87,6 +101,16 @@ log.debug("Going to actionAddUrl"); } this.actionAddUrl(request, response, user); + } else if (action.equals("importBookmarks") && user != null) { + if (log.isDebugEnabled()) { + log.debug("Going to actionImportBookmarks"); + } + this.actionImportBookmarks(request, response, user); + } else if (action.equals("exportBookmarks") && user != null) { + if (log.isDebugEnabled()) { + log.debug("Going to actionExportBookmarks"); + } + this.actionExportBookmarks(request, response, user); } else if (action.equals("search") && user != null) { if (log.isDebugEnabled()) { log.debug("Going to actionSearch"); @@ -288,8 +312,8 @@ addSortDescending(Bookmark.FQ_FIELD_CLICK); bookList = proxy.findAllByCriteria(Bookmark.class, criteria).getAll(); } - BookmarkActions bookmarkActions = createBookmarkActions(request, bookList); - request.setAttribute("bookmarkActions", bookmarkActions); + BookmarkActions bookmarkActions = createBookmarkActions(request, bookList); + request.setAttribute("bookmarkActions", bookmarkActions); } } @@ -606,4 +630,76 @@ } request.setAttribute("bookmarkActions", bookmarkActions); } + + private void actionImportBookmarks(HttpServletRequest request, HttpServletResponse response, User user) + throws IOException, FileUploadException, ParserException { + // Check that we have a file upload request + boolean isMultipart = ServletFileUpload.isMultipartContent(request); + if (isMultipart == true) { + // Create a factory for disk-based file items + DiskFileItemFactory factory = new DiskFileItemFactory(); + // Create a new file upload handler + ServletFileUpload upload = new ServletFileUpload(factory); + // Process the uploaded items + // Parse the request + List<FileItem> items = upload.parseRequest(request); + Iterator iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = (FileItem) iter.next(); + if (!item.isFormField()) { + String fieldName = item.getFieldName(); + log.debug("fieldname={" + fieldName + "}"); + String fileName = item.getName(); + log.debug("fileName={" + fileName + "}"); + String content = item.getString(); + Parser parser = new Parser(content); + NodeList list = parser.parse(null); + parseHtmlToBookmarks(list, user); + } + } + } + response.sendRedirect("bow?action=home"); + } + + private void parseHtmlToBookmarks(NodeList list, User user) + throws ParserException { + if (list != null) { + SimpleNodeIterator it = list.elements(); + WikittyProxy proxy = model.getProxy(); + while (it.hasMoreNodes()) { + Node node = it.nextNode(); + String plainText = node.toPlainTextString(); + String text = node.getText(); + if (text != null && text.contains("A HREF")) { + String url = BookmarkActions.getUrlFromHtml(text); + String tags = BookmarkActions.getTagsFromHtml(text); + Bookmark bookmark = BookmarkActions.createBookmark(url, plainText, tags, user); + if (bookmark != null) { + proxy.store(bookmark); + } + } + NodeList children = node.getChildren(); + if (children != null) { + parseHtmlToBookmarks(children, user); + } + } + } + } + + private void actionExportBookmarks(HttpServletRequest request, HttpServletResponse response, User user) + throws IOException { + WikittyProxy proxy = model.getProxy(); + Criteria criteria = Search.query().eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()).criteria(); + List<Bookmark> bookmarks = proxy.findAllByCriteria(Bookmark.class, criteria).getAll(); + String export = BookmarkActions.getExportHtmlBookmark(bookmarks); + byte[] buff = export.getBytes(); + ServletOutputStream op = response.getOutputStream(); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=\"bookmarks.html\""); + log.debug("export=["+export+"]"); + response.setContentLength(buff.length); + op.write(buff, 0, buff.length); + op.flush(); + op.close(); + } } Modified: trunk/src/main/webapp/home.jsp =================================================================== --- trunk/src/main/webapp/home.jsp 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/src/main/webapp/home.jsp 2010-05-27 12:29:26 UTC (rev 35) @@ -182,11 +182,20 @@ } %> <form method="POST" action="bow?action=search" style="text-align: center;margin-left: 20px;"> - <input style="float: left" type="text" name="searchLine" size="20" value="<%=searchLine%>" /> + <input style="float: left" type="text" name="searchLine" size="15" value="<%=searchLine%>" /> <input style="float: left;" type="submit" value="Find" /> </form> </div> </div> + <div class="menu"> + <form method="post" action="bow?action=importBookmarks" enctype="multipart/form-data"> + Import Bookmarks + <input type="file" name="upfile" /> + <input type="submit" value="Import"/> + </form> + <br /> + <a href="bow?action=exportBookmarks">Export bookmarks</a> + </div> </div> </body> </html> \ No newline at end of file Modified: trunk/src/main/webapp/register.jsp =================================================================== --- trunk/src/main/webapp/register.jsp 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/src/main/webapp/register.jsp 2010-05-27 12:29:26 UTC (rev 35) @@ -13,6 +13,6 @@ <%if (error != null && error.isEmpty() == false) {%> <br/><font color="red"><%=error%></font> <%}%> - <a href="bow?action=home">Return to the login page</a> + <a href="bow?action=login">Return to the login page</a> </body> </html> \ No newline at end of file Modified: trunk/src/main/webapp/search.jsp =================================================================== --- trunk/src/main/webapp/search.jsp 2010-05-25 14:21:33 UTC (rev 34) +++ trunk/src/main/webapp/search.jsp 2010-05-27 12:29:26 UTC (rev 35) @@ -161,7 +161,7 @@ } %> <form method="POST" action="bow?action=search" style="text-align: center;margin-left: 20px;"> - <input style="float: left" type="text" name="searchLine" size="20" value="<%=searchLine%>" /> + <input style="float: left" type="text" name="searchLine" size="15" value="<%=searchLine%>" /> <input style="float: left" type="submit" value="Find" /> </form> </div>
participants (1)
-
bbrossaudï¼ users.chorem.org