Author: vbriand Date: 2011-01-07 12:19:18 +0100 (Fri, 07 Jan 2011) New Revision: 166 Url: http://chorem.org/repositories/revision/bow/166 Log: The bookmarks import works with Struts2. Modified: trunk/src/main/java/org/chorem/bow/BowBookmark.java trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java trunk/src/main/java/org/chorem/bow/action/PreferencesAction.java trunk/src/main/resources/struts.xml trunk/src/main/webapp/jsp/preferences.jsp Modified: trunk/src/main/java/org/chorem/bow/BowBookmark.java =================================================================== --- trunk/src/main/java/org/chorem/bow/BowBookmark.java 2011-01-06 17:33:35 UTC (rev 165) +++ trunk/src/main/java/org/chorem/bow/BowBookmark.java 2011-01-07 11:19:18 UTC (rev 166) @@ -9,6 +9,8 @@ import org.nuiton.wikitty.Criteria; import org.nuiton.wikitty.FacetTopic; import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; import org.nuiton.wikitty.search.Search; public class BowBookmark { @@ -48,4 +50,13 @@ bookmarkActions.createTagCloud(topics); return bookmarkActions; } + + static public List<FacetTopic> getBookmarksByImportDate(HttpServletRequest request, User user) { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Import.EXT_IMPORT).eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()).criteria(). + addFacetField(Import.FQ_FIELD_DATE); + List<FacetTopic> bookmarksImportDate = proxy.findAllByCriteria(Import.class, criteria).getTopic(Import.FQ_FIELD_DATE); + request.setAttribute("bookmarksImportDate", bookmarksImportDate); + return bookmarksImportDate; + } } Modified: trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-01-06 17:33:35 UTC (rev 165) +++ trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2011-01-07 11:19:18 UTC (rev 166) @@ -1,5 +1,6 @@ package org.chorem.bow.action; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Date; @@ -9,10 +10,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; -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.io.FileUtils; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.SessionAware; import org.chorem.bow.Bookmark; @@ -33,9 +31,54 @@ public class ImportBookmarksAction extends BowBaseAction implements SessionAware, ServletRequestAware { private static final long serialVersionUID = -5962680416570797028L; + protected File upfile; + protected String upfileContentType; + protected String upfileFileName; protected Map<String, Object> session; protected HttpServletRequest request; + /** + * @return the upfile + */ + public File getUpfile() { + return upfile; + } + + /** + * @param upfile the upfile to set + */ + public void setUpfile(File upfile) { + this.upfile = upfile; + } + + /** + * @return the upfileContentType + */ + public String getUpfileContentType() { + return upfileContentType; + } + + /** + * @param upfileContentType the upfileContentType to set + */ + public void setUpfileContentType(String upfileContentType) { + this.upfileContentType = upfileContentType; + } + + /** + * @return the upfileFileName + */ + public String getUpfileFileName() { + return upfileFileName; + } + + /** + * @param upfileFileName the upfileFileName to set + */ + public void setUpfileFileName(String upfileFileName) { + this.upfileFileName = upfileFileName; + } + @Override public void setSession(Map<String, Object> session) { this.session = session; @@ -106,64 +149,55 @@ } public String execute() { - // Check that we have a file upload request - boolean isMultipart = ServletFileUpload.isMultipartContent(request); - - if (isMultipart) { - // 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<?> items; + User user = (User)session.get("user"); + + if (user != null) { try { - items = upload.parseRequest(request); - } catch (FileUploadException e2) { - // TODO Auto-generated catch block - e2.printStackTrace(); - return ERROR; - } - for (Object obj : items) { - FileItem item = (FileItem) obj; - if (!item.isFormField()) { - WikittyProxy proxy = BowProxy.getInstance(); - String content = item.getString(); - User user = (User)session.get("user"); + List<?> lines; - try { - Parser parser = new Parser(content); - NodeList list = parser.parse(null); - List<Bookmark> bookmarks = new ArrayList<Bookmark>(); - parseHtmlToBookmarks(list, user, bookmarks, new ArrayList<String>()); - bookmarks = proxy.store(bookmarks); - createImportExtension(bookmarks); + lines = FileUtils.readLines(upfile); + String content = ""; + + for (Object line : lines) { + content += (String)line; + } + WikittyProxy proxy = BowProxy.getInstance(); + + try { + Parser parser = new Parser(content); + NodeList list = parser.parse(null); + List<Bookmark> bookmarks = new ArrayList<Bookmark>(); + parseHtmlToBookmarks(list, user, bookmarks, new ArrayList<String>()); + bookmarks = proxy.store(bookmarks); + createImportExtension(bookmarks); + BowInit.initHomePage(request, user); + return SUCCESS; + } catch (ParserException e) { + request.setAttribute("errorMsgUser", getText(n_("bow.bookmark.badFileFormat"))); + request.setAttribute("errorMsgTech", e.getMessage()); + + if (request.getParameter("searchLine") == null) { BowInit.initHomePage(request, user); return SUCCESS; - } - catch (ParserException e) { - request.setAttribute("errorMsgUser", getText(n_("bow.bookmark.badFileFormat"))); - request.setAttribute("errorMsgTech", e.getMessage()); - - if (request.getParameter("searchLine") == null) { - BowInit.initHomePage(request, user); - return "home"; - } else { - try { - BowSearch.search(request, user); - } catch (IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (ServletException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - return "search"; - } - } + } else { + try { + BowSearch.search(request, user); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (ServletException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + return "search"; + } } + } catch (IOException e2) { + // TODO Auto-generated catch block + e2.printStackTrace(); } + return ERROR; } - return ERROR; + return LOGIN; } } \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/PreferencesAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-01-06 17:33:35 UTC (rev 165) +++ trunk/src/main/java/org/chorem/bow/action/PreferencesAction.java 2011-01-07 11:19:18 UTC (rev 166) @@ -1,16 +1,22 @@ package org.chorem.bow.action; import java.security.NoSuchAlgorithmException; +import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletRequest; + +import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.BowBookmark; import org.chorem.bow.BowProxy; import org.chorem.bow.Preference; import org.chorem.bow.User; import org.nuiton.util.StringUtil; +import org.nuiton.wikitty.FacetTopic; import org.nuiton.wikitty.WikittyProxy; -public class PreferencesAction extends BowBaseAction implements SessionAware { +public class PreferencesAction extends BowBaseAction implements SessionAware, ServletRequestAware { private static final long serialVersionUID = -58341106356599721L; protected String colors; protected String tagsNb; @@ -22,8 +28,11 @@ protected String currentPassword; protected String confirmNewPassword; protected String update; + protected List<FacetTopic> bookmarksImportDate; protected Map<String, Object> session; + protected HttpServletRequest request; + /** * @return the colors */ @@ -164,11 +173,30 @@ this.update = update; } + /** + * @return the bookmarksImportDate + */ + public List<FacetTopic> getBookmarksImportDate() { + return bookmarksImportDate; + } + + /** + * @param bookmarksImportDate the bookmarksImportDate to set + */ + public void setBookmarksImportDate(List<FacetTopic> bookmarksImportDate) { + this.bookmarksImportDate = bookmarksImportDate; + } + @Override public void setSession(Map<String, Object> session) { this.session = session; } + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + protected Preference changePreference() { Preference preference = (Preference)session.get("preference"); @@ -203,14 +231,18 @@ } public String execute() { - if ((User)session.get("user") != null) { + User user = (User)session.get("user"); + + if (user != null) { + setBookmarksImportDate(BowBookmark.getBookmarksByImportDate(request, user)); + if (update != null) { WikittyProxy proxy = BowProxy.getInstance(); Preference preference = changePreference(); proxy.store(preference); - User newUser = proxy.restore(User.class, ((User)session.get("user")).getWikittyId()); - + User newUser = proxy.restore(User.class, (user).getWikittyId()); + try { newUser = changeUser(newUser); } catch (NoSuchAlgorithmException e) { @@ -225,11 +257,8 @@ return "update"; } else { Preference preference = (Preference)session.get("preference"); - User user = (User)session.get("user"); - - if (user != null) { - setEmail(user.getEmail()); - } + + setEmail(user.getEmail()); if (preference != null) { setColors(preference.getColors()); setTagsNb(String.valueOf(preference.getTags())); Modified: trunk/src/main/resources/struts.xml =================================================================== --- trunk/src/main/resources/struts.xml 2011-01-06 17:33:35 UTC (rev 165) +++ trunk/src/main/resources/struts.xml 2011-01-07 11:19:18 UTC (rev 166) @@ -36,11 +36,15 @@ </package> <package name="bookmark" extends="struts-default"> - <!-- import, export --> - <action name="*Bookmarks" method="{1}" class="org.chorem.bow.action.BookmarksAction"> - <result name="search">/jsp/search.jsp</result> - <result>/jsp/home.jsp</result> + <action name="importBookmarks" class="org.chorem.bow.action.ImportBookmarksAction"> + <result name="search" type="redirectAction">search</result> + <result name="error" type="redirectAction">error</result> + <result name="login" type="redirectAction">home</result> + <result type="redirectAction">home</result> </action> + <action name="exportBookmarks" class="org.chorem.bow.action.ExportBookmarksAction"> + <result type="redirectAction">home</result> + </action> <action name="modifyBookmark" class="org.chorem.bow.action.ModifyBookmarkAction"> <result name="home">/jsp/home.jsp</result> <result name="search">/jsp/search.jsp</result> @@ -89,7 +93,6 @@ <result>/jsp/suggestions.jsp</result> </action> <action name="preferences" class="org.chorem.bow.action.PreferencesAction"> - <!-- Cas du getBookmarksByImportDate qu'il faudrait caler quelque part --> <result name="login" type="redirectAction">login_input</result> <result name="update" type="redirectAction">preferences</result> <result>/jsp/preferences.jsp</result> Modified: trunk/src/main/webapp/jsp/preferences.jsp =================================================================== --- trunk/src/main/webapp/jsp/preferences.jsp 2011-01-06 17:33:35 UTC (rev 165) +++ trunk/src/main/webapp/jsp/preferences.jsp 2011-01-07 11:19:18 UTC (rev 166) @@ -24,131 +24,105 @@ --> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> -<%@page import="org.chorem.bow.Preference"%> -<%@page import="org.chorem.bow.User"%> -<%@page import="org.chorem.bow.TokenActions"%> -<%@page import="org.chorem.bow.BookmarkActions"%> -<%@page import="org.chorem.bow.Bookmark" %> <%@page import="org.chorem.bow.Import" %> <%@page import="org.nuiton.wikitty.FacetTopic" %> <%@page import="java.util.List" %> -<%@page import="java.util.Date" %> -<% -User user = (User) session.getAttribute("user"); -Preference preference = (Preference) session.getAttribute("preference"); -TokenActions tokenActions = (TokenActions) session.getAttribute("tokenActions"); -//Boolean admin = (Boolean) session.getAttribute("admin"); -//if (admin == null) { -// admin = false; -//} -int nbTags = 100; -if (user != null && preference != null && tokenActions != null){ - int tags = preference.getTags(); - if (tags > 0) { - nbTags = tags; - } - request.setAttribute("nbTags", nbTags); -// String url = (String) request.getAttribute("bowUrl"); -// String version = (String) request.getAttribute("version"); -// String temporaryToken = tokenActions.getTemporaryToken(); -// String permanentToken = tokenActions.getPermanentToken(); - String check = preference.getColors(); - if (check == null) { - preference.setColors(""); - } - check = preference.getSearchEngineUrlResults(); - if (check == null) { - preference.setSearchEngineUrlResults(""); - } - check = preference.getSearchEngineUrlSuggestions(); - if (check == null) { - preference.setSearchEngineUrlSuggestions(""); - } - %> - [[[[[<%=preference.getTags() %>]]]]] - <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" - xmlns:jsp="http://java.sun.com/JSP/Page" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <head> - <title><s:text name="bow.preferences.title" /></title> - <s:url id="css" value="/css/bookmark.css" /> - <link href="${css}" rel="stylesheet" type="text/css" /> - <s:head /> - </head> - <body> - <div id="content"> - <div class="menu clearfix"> - <h2><s:text name="bow.preferences.title" /></h2> - </div> - <s:url id="changePreferences" action="preferences"> - <s:param name="update">1</s:param> - </s:url> - <s:form action="%{changePreferences}"> - <div class="formFrame"> - <h3><s:text name="bow.preferences.userInfo" /></h3> - <p> - <s:textfield key="bow.login.email" name="email" /><br /><br /><!-- value="<%=user.getEmail()%>" --> - <s:password key="bow.preferences.currentPassword" name="currentPassword" /> - <s:password key="bow.preferences.newPassword" name="newPassword" /> - <s:password key="bow.preferences.confirmNewPassword" name="confirmNewPassword" /> - <s:url id="generateToken" action="generateToken" /> - <s:a href="%{generateToken}" id="regenPermToken"><s:text name="bow.preferences.regenPermToken" /></s:a> - </p> - </div> - <div class="formFrame"> - <h3><s:text name="bow.preferences.siteLook" /></h3> - <p> - <s:textfield key="bow.preferences.colors" name="colors" /><br /> <!-- value="<%=preference.getColors()%>" --> - <s:textfield key="bow.preferences.tagsNb" name="tagsNb" /><br /> - <s:textfield key="bow.preferences.bookmarksHomePage" name="bookmarksHomePage" /><br /> - <s:textfield key="bow.preferences.searchEngineUrlSuggestions" name="searchEngineUrlSuggestions" /><br /> - <s:textfield key="bow.preferences.searchEngineUrlResults" name="searchEngineUrlResults" /> - <s:submit key="bow.preferences.submit" /> - <br /><br /> - <s:url id="home" action="home" /> - <s:a href="%{home}" id="homePage"><s:text name="bow.home.title" /></s:a> - </p> - </div> - </s:form> - <div class="menu clearfix"> - <h2><s:text name="bow.preferences.importedBookmarks" /></h2> - </div> - <% - List<FacetTopic> bookmarkImportList = (List<FacetTopic>)request.getAttribute("bookmarksImportDate"); - - if (bookmarkImportList != null) { - if (bookmarkImportList.size() > 0) { - String bgColors[] = {"Pink", "White"}; - int i = 0; - int colorsNb = bgColors.length; - - for (FacetTopic bookmarkImport : bookmarkImportList) { - String date = bookmarkImport.getTopicName(); - String dateSave = date; - - date = date.replaceAll("[^0-9:-]+", " ").trim(); - date = date.substring(0, date.lastIndexOf(' ')); - %> - <div class="deleteImport deleteImport<%=bgColors[i % colorsNb]%>"> - <span><%= date + " (" + bookmarkImport.getCount() + " bookmarks)" %></span> - <a class="deleteImportButton" href="" onclick="deleteConfirmation('/bow/deleteImport.action&date=<%=dateSave%>',<%=bookmarkImport.getCount()%>,'<%=date%>'); return(false);"></a> - </div> - <% - i++; - } - } else { - %> - <div class="deleteImport deleteImportWhite"> - <span><s:text name="bow.preferences.noImportedBookmarks" /></span> - </div> - <% - } - } - %> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" + xmlns:jsp="http://java.sun.com/JSP/Page" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <head> + <title><s:text name="bow.preferences.title" /></title> + <s:url id="css" value="/css/bookmark.css" /> + <link href="${css}" rel="stylesheet" type="text/css" /> + <s:head /> + </head> + <body> + <s:property value="#session.put" /> + <div id="content"> + <div class="menu clearfix"> + <h2><s:text name="bow.preferences.title" /></h2> </div> - <jsp:include page="inc/rightMenu.jsp" flush="true" /> - </body> - </html> -<% } %> \ No newline at end of file + <s:url id="changePreferences" action="preferences"> + <s:param name="update">1</s:param> + </s:url> + <s:form action="%{changePreferences}"> + <div class="formFrame"> + <h3><s:text name="bow.preferences.userInfo" /></h3> + <p> + <s:textfield key="bow.login.email" name="email" /><br /><br /> + <s:password key="bow.preferences.currentPassword" name="currentPassword" /> + <s:password key="bow.preferences.newPassword" name="newPassword" /> + <s:password key="bow.preferences.confirmNewPassword" name="confirmNewPassword" /> + <s:url id="generateToken" action="generateToken" /> + <s:a href="%{generateToken}" id="regenPermToken"><s:text name="bow.preferences.regenPermToken" /></s:a> + </p> + </div> + <div class="formFrame"> + <h3><s:text name="bow.preferences.siteLook" /></h3> + <p> + <s:textfield key="bow.preferences.colors" name="colors" /><br /> + <s:textfield key="bow.preferences.tagsNb" name="tagsNb" /><br /> + <s:textfield key="bow.preferences.bookmarksHomePage" name="bookmarksHomePage" /><br /> + <s:textfield key="bow.preferences.searchEngineUrlSuggestions" name="searchEngineUrlSuggestions" /><br /> + <s:textfield key="bow.preferences.searchEngineUrlResults" name="searchEngineUrlResults" /> + <s:submit key="bow.preferences.submit" /> + <br /><br /> + <s:url id="home" action="home" /> + <s:a href="%{home}" id="homePage"><s:text name="bow.home.title" /></s:a> + </p> + </div> + </s:form> + <div class="menu clearfix"> + <h2><s:text name="bow.preferences.importedBookmarks" /></h2> + </div> + <% + List<FacetTopic> bookmarkImportList = (List<FacetTopic>)request.getAttribute("bookmarksImportDate"); + + if (bookmarkImportList != null) { + if (bookmarkImportList.size() > 0) { + String bgColors[] = {"Pink", "White"}; + int i = 0; + int colorsNb = bgColors.length; + + for (FacetTopic bookmarkImport : bookmarkImportList) { + String date = bookmarkImport.getTopicName(); + String dateSave = date; + + date = date.replaceAll("[^0-9:-]+", " ").trim(); + date = date.substring(0, date.lastIndexOf(' ')); + %> + <div class="deleteImport deleteImport<%=bgColors[i % colorsNb]%>"> + <span><%= date + " (" + bookmarkImport.getCount() + " bookmarks)" %></span> + <a class="deleteImportButton" href="" onclick="deleteConfirmation('/bow/deleteImport.action&date=<%=dateSave%>',<%=bookmarkImport.getCount()%>,'<%=date%>'); return(false);"></a> + </div> + <% + i++; + } + } else { + %> + <div class="deleteImport deleteImportWhite"> + <span><s:text name="bow.preferences.noImportedBookmarks" /></span> + </div> + <% + } + } + %> + <s:if test="%{#bookmarksImportDate != null && #bookmarksImportDate.size() > 0}"> + <s:iterator value="bookmarksImportDate"> + <div class="deleteImport"> + <span>(<s:property value="topicName" /> bookmarks)</span> + <a class="deleteImportButton" href="" onclick="deleteConfirmation('/bow/deleteImport.action&date=',,''); return(false);"></a> + </div> + </s:iterator> + </s:if> + <s:else> + <div class="deleteImport deleteImportWhite"> + <span><s:text name="bow.preferences.noImportedBookmarks" /></span> + </div> + </s:else> + </div> + <jsp:include page="inc/rightMenu.jsp" flush="true" /> + </body> +</html> \ No newline at end of file