Author: vbriand Date: 2010-12-30 15:45:38 +0100 (Thu, 30 Dec 2010) New Revision: 153 Url: http://chorem.org/repositories/revision/bow/153 Log: Toutes les actions de ControllerServlet ont ?\195?\169t?\195?\169 d?\195?\169plac?\195?\169es vers des classes d'action mais il reste encore quelques d?\195?\169tails du ControllerServlet ?\195?\160 impl?\195?\169menter en Struts2. Les classes d'action ne sont par contre pas du tout finalis?\195?\169es, que ce soit au niveau de la gestion d'erreurs, des commentaires, du logging ou des redirections (et du fonctionnement...). Added: trunk/src/main/java/org/chorem/bow/BowMail.java trunk/src/main/java/org/chorem/bow/BowSearch.java trunk/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java trunk/src/main/webapp/jsp/forgotPassword.jsp Removed: trunk/src/main/java/org/chorem/bow/action/RightMenuAction.java trunk/src/main/java/org/chorem/bow/action/SendPasswordAction.java Modified: trunk/src/main/java/org/chorem/bow/action/AddAliasAction.java trunk/src/main/java/org/chorem/bow/action/AddClickAction.java trunk/src/main/java/org/chorem/bow/action/AddUrlAction.java trunk/src/main/java/org/chorem/bow/action/ChangePreferencesAction.java trunk/src/main/java/org/chorem/bow/action/DeleteImportAction.java trunk/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java trunk/src/main/java/org/chorem/bow/action/DeleteTagAction.java trunk/src/main/java/org/chorem/bow/action/EditBookmarkAction.java trunk/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java trunk/src/main/java/org/chorem/bow/action/GenerateTokenAction.java trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java trunk/src/main/java/org/chorem/bow/action/ModifyBookmarkAction.java trunk/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java trunk/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java trunk/src/main/java/org/chorem/bow/action/OrderAction.java trunk/src/main/java/org/chorem/bow/action/ReIndexationAction.java trunk/src/main/java/org/chorem/bow/action/RegisterAction.java trunk/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java trunk/src/main/java/org/chorem/bow/action/SearchAction.java trunk/src/main/resources/struts.xml trunk/src/main/webapp/jsp/login.jsp trunk/src/main/webapp/jsp/register.jsp Added: trunk/src/main/java/org/chorem/bow/BowMail.java =================================================================== --- trunk/src/main/java/org/chorem/bow/BowMail.java (rev 0) +++ trunk/src/main/java/org/chorem/bow/BowMail.java 2010-12-30 14:45:38 UTC (rev 153) @@ -0,0 +1,31 @@ +package org.chorem.bow; + +import java.util.Properties; + +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +public class BowMail { + static public void sendMail(String sendToEmail, String mailSubject, String mailContent) throws AddressException, MessagingException { + BowConfig config = BowConfig.getInstance(); + String smtpServer = config.getSmtpServer(); + Properties properties = new Properties(); + properties.put("mail.smtp.host", smtpServer); + + Session session = Session.getDefaultInstance(properties, null); + session.setDebug(true); + + Message msg = new MimeMessage(session); + + msg.addRecipient(Message.RecipientType.TO, new InternetAddress(sendToEmail)); + msg.setFrom(new InternetAddress(config.getAddressFrom())); + msg.setSubject(mailSubject); + msg.setContent(mailContent, "text/plain"); + Transport.send(msg); + } +} Property changes on: trunk/src/main/java/org/chorem/bow/BowMail.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/src/main/java/org/chorem/bow/BowSearch.java =================================================================== --- trunk/src/main/java/org/chorem/bow/BowSearch.java (rev 0) +++ trunk/src/main/java/org/chorem/bow/BowSearch.java 2010-12-30 14:45:38 UTC (rev 153) @@ -0,0 +1,66 @@ +package org.chorem.bow; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + +public class BowSearch { + static public void search(HttpServletRequest request, User user) + throws IOException, ServletException { + String searchLine = request.getParameter("searchLine"); + + if (searchLine == null) { + searchLine = ""; + } + String fulltext = request.getParameter("fullTextLine"); + + if (fulltext != null && !fulltext.isEmpty() && searchLine.isEmpty()) { + fullText(request, user); + } else { + String tag = request.getParameter("addTag"); + + if (tag != null && !tag.isEmpty()) { + if (searchLine.isEmpty()) { + searchLine = tag; + } else { + searchLine += " " + tag; + } + } + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = BowBookmark.getBookmarkListCriteriaByUser(user, searchLine); + criteria = criteria.addSortDescending(Bookmark.FQ_FIELD_CLICK); + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); //Selects all bookmarks by user + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, searchLine); + request.setAttribute("bookmarkActions", bookmarkActions); + } + } + + static public void fullText(HttpServletRequest request, User user) throws IOException, ServletException { + String fullText = request.getParameter("fullTextLine"); + + if (fullText == null || fullText.isEmpty()) { + search(request, user); + } else { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria; + + if (!fullText.isEmpty()) { + criteria = Search.query().keyword(fullText). + eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()).criteria(). + addFacetField(Bookmark.FQ_FIELD_TAGS); + + } else { + criteria = BowBookmark.getBookmarkListCriteriaByUser(user, null); + } + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, null); + request.setAttribute("bookmarkActions", bookmarkActions); + } + } +} Property changes on: trunk/src/main/java/org/chorem/bow/BowSearch.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/src/main/java/org/chorem/bow/action/AddAliasAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/AddAliasAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/AddAliasAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,64 @@ package org.chorem.bow.action; +import java.util.List; + +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class AddAliasAction extends ActionSupport{ +public class AddAliasAction extends ActionSupport { private static final long serialVersionUID = 2565840071468031758L; + protected String alias; + protected String bookmarkId; -} + /** + * @return the alias + */ + public String getAlias() { + return alias; + } + + /** + * @param alias the alias to set + */ + public void setAlias(String alias) { + this.alias = alias; + } + + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + + @Override + public String execute() { + if (alias != null && !alias.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = Search.query().eq(Bookmark.FQ_FIELD_ALIAS, alias).criteria(); + List<Bookmark> bookmarks = proxy.findAllByCriteria(Bookmark.class, criteria).getAll(); + if (bookmarks == null || bookmarks.isEmpty()) { + if (bookmarkId != null && !bookmarkId.isEmpty()) { + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + if (bookmark != null) { + bookmark.setAlias(alias); + proxy.store(bookmark); + } + } + } + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/AddClickAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/AddClickAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/AddClickAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,39 @@ package org.chorem.bow.action; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class AddClickAction extends ActionSupport{ +public class AddClickAction extends ActionSupport { private static final long serialVersionUID = 8579081104294143087L; + protected String bookmarkId; -} + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + + @Override + public String execute() { + if (bookmarkId != null && !bookmarkId.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + if (bookmark != null) { + bookmark.setClick(bookmark.getClick() + 1); + proxy.store(bookmark); + return SUCCESS; + } + } + return ERROR; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/AddUrlAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/AddUrlAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/AddUrlAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,124 @@ package org.chorem.bow.action; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowProxy; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class AddUrlAction extends ActionSupport{ +public class AddUrlAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = 3389170166034184139L; + protected String link; + protected String name; + protected String alias; + protected String tags; + protected String nameAndTags; + protected Map<String, Object> session; + + /** + * @return the link + */ + public String getLink() { + return link; + } -} + /** + * @param link the link to set + */ + public void setLink(String link) { + this.link = link; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the alias + */ + public String getAlias() { + return alias; + } + + /** + * @param alias the alias to set + */ + public void setAlias(String alias) { + this.alias = alias; + } + + /** + * @return the tags + */ + public String getTags() { + return tags; + } + + /** + * @param tags the tags to set + */ + public void setTags(String tags) { + this.tags = tags; + } + + /** + * @return the nameAndTags + */ + public String getNameAndTags() { + return nameAndTags; + } + + /** + * @param nameAndTags the nameAndTags to set + */ + public void setNameAndTags(String nameAndTags) { + this.nameAndTags = nameAndTags; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public String execute() { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = null; + + if (name != null) { + if (alias != null && !alias.isEmpty()) { + Criteria criteria = Search.query().eq(Bookmark.FQ_FIELD_ALIAS, alias).criteria(); + + if (proxy.findByCriteria(Bookmark.class, criteria) != null) { + alias = ""; + } + } + bookmark = BookmarkActions.createBookmark(link, name, tags, (User)session.get("user"), alias, null); + } else { //This part is for the bookmark addition by script + if (nameAndTags != null) { + bookmark = BookmarkActions.createBookmark(link, nameAndTags, (User)session.get("user")); + } + } + if (bookmark != null && !bookmark.getDescription().isEmpty() && !bookmark.getEmail().isEmpty()) { + proxy.store(bookmark); //Stores the bookmark if everything is ok + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/ChangePreferencesAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ChangePreferencesAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/ChangePreferencesAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,210 @@ package org.chorem.bow.action; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.BowProxy; +import org.chorem.bow.Preference; +import org.chorem.bow.User; +import org.nuiton.util.StringUtil; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class ChangePreferencesAction extends ActionSupport{ +public class ChangePreferencesAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = -1923646256914239581L; + protected String colors; + protected String tagsNb; + protected String bookmarks; + protected String searchEngineUrlSuggestions; + protected String searchEngineUrlResults; + protected String email; + protected String newPassword; + protected String currentPassword; + protected String confirmNewPassword; + protected Map<String, Object> session; -} + /** + * @return the colors + */ + public String getColors() { + return colors; + } + + /** + * @param colors the colors to set + */ + public void setColors(String colors) { + this.colors = colors; + } + + /** + * @return the tagsNb + */ + public String getTagsNb() { + return tagsNb; + } + + /** + * @param tagsNb the tagsNb to set + */ + public void setTagsNb(String tagsNb) { + this.tagsNb = tagsNb; + } + + /** + * @return the bookmarks + */ + public String getBookmarks() { + return bookmarks; + } + + /** + * @param bookmarks the bookmarks to set + */ + public void setBookmarks(String bookmarks) { + this.bookmarks = bookmarks; + } + + /** + * @return the searchEngineUrlSuggestions + */ + public String getSearchEngineUrlSuggestions() { + return searchEngineUrlSuggestions; + } + + /** + * @param searchEngineUrlSuggestions the searchEngineUrlSuggestions to set + */ + public void setSearchEngineUrlSuggestions(String searchEngineUrlSuggestions) { + this.searchEngineUrlSuggestions = searchEngineUrlSuggestions; + } + + /** + * @return the searchEngineUrlResults + */ + public String getSearchEngineUrlResults() { + return searchEngineUrlResults; + } + + /** + * @param searchEngineUrlResults the searchEngineUrlResults to set + */ + public void setSearchEngineUrlResults(String searchEngineUrlResults) { + this.searchEngineUrlResults = searchEngineUrlResults; + } + + /** + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * @param email the email to set + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * @return the newPassword + */ + public String getNewPassword() { + return newPassword; + } + + /** + * @param newPassword the newPassword to set + */ + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + /** + * @return the currentPassword + */ + public String getCurrentPassword() { + return currentPassword; + } + + /** + * @param currentPassword the currentPassword to set + */ + public void setCurrentPassword(String currentPassword) { + this.currentPassword = currentPassword; + } + + /** + * @return the confirmNewPassword + */ + public String getConfirmNewPassword() { + return confirmNewPassword; + } + + /** + * @param confirmNewPassword the confirmNewPassword to set + */ + public void setConfirmNewPassword(String confirmNewPassword) { + this.confirmNewPassword = confirmNewPassword; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + protected Preference changePreference() { + Preference preference = (Preference)session.get("preference"); + + preference.setColors(colors); + preference.setTags(Integer.valueOf(tagsNb)); + preference.setBookmarks(Integer.valueOf(bookmarks)); + preference.setSearchEngineUrlSuggestions(searchEngineUrlSuggestions); + preference.setSearchEngineUrlResults(searchEngineUrlResults); + + return preference; + } + + protected User changeUser(User newUser) + throws NoSuchAlgorithmException { + if (email != null && !email.isEmpty()) { + newUser.setEmail(email); + } + if (newPassword != null && confirmNewPassword != null && currentPassword != null) { + if (!newPassword.isEmpty() && !confirmNewPassword.isEmpty() && !currentPassword.isEmpty()) { + if (newPassword.equals(confirmNewPassword)) { + currentPassword = StringUtil.encodeMD5(currentPassword); + if (currentPassword.equals(newUser.getPassword())) { + String md5 = StringUtil.encodeMD5(newPassword); + newUser.setPassword(md5); + } + } + } + } + return newUser; + } + + @Override + public String execute() { + WikittyProxy proxy = BowProxy.getInstance(); + Preference preference = changePreference(); + proxy.store(preference); + + User newUser = proxy.restore(User.class, ((User)session.get("user")).getWikittyId()); + try { + newUser = changeUser(newUser); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + newUser = proxy.store(newUser); + session.put("user", newUser); + + preference = proxy.restore(Preference.class, newUser.getWikittyId()); + session.put("preference", preference); + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/DeleteImportAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/DeleteImportAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,61 @@ package org.chorem.bow.action; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowProxy; +import org.chorem.bow.Import; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Element; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class DeleteImportAction extends ActionSupport{ +public class DeleteImportAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = 8714394293884265516L; - -} + protected String date; + protected Map<String, Object> session; + + /** + * @return the date + */ + public String getDate() { + return date; + } + /** + * @param date the date to set + */ + public void setDate(String date) { + this.date = date; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public String execute() { + if (date != null) { + WikittyProxy proxy = BowProxy.getInstance(); + + if (date.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{1,3}Z")) { + Criteria criteria = Search.query().eq(Element.ELT_EXTENSION, Import.EXT_IMPORT).eq(Bookmark.FQ_FIELD_EMAIL, ((User)session.get("user")).getEmail()). + eq(Import.FQ_FIELD_DATE, date).criteria(); + List<Import> bookmarks = proxy.findAllByCriteria(Import.class, criteria).getAll(); + List<String> ids = new ArrayList<String>(); + + for (Import bookmark : bookmarks) { + ids.add(bookmark.getWikittyId()); + } + proxy.delete(ids); + } + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/DeleteSearchResultsAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,81 @@ package org.chorem.bow.action; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowBookmark; +import org.chorem.bow.BowProxy; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class DeleteSearchResultsAction extends ActionSupport{ +public class DeleteSearchResultsAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = -3903724044644625507L; + protected String searchLine; + protected String fullTextLine; + protected Map<String, Object> session; -} + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + /** + * @return the fullTextLine + */ + public String getFullTextLine() { + return fullTextLine; + } + + /** + * @param fullTextLine the fullTextLine to set + */ + public void setFullTextLine(String fullTextLine) { + this.fullTextLine = fullTextLine; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public String execute() { + if (searchLine != null && fullTextLine != null) { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria; + + if (fullTextLine.isEmpty()) { + criteria = BowBookmark.getBookmarkListCriteriaByUser((User)session.get("user"), searchLine); + } else { + criteria = Search.query().keyword(fullTextLine).eq(Bookmark.FQ_FIELD_EMAIL, ((User)session.get("user")).getEmail()).criteria().addFacetField(Bookmark.FQ_FIELD_TAGS); + } + List<Bookmark> bookmarks = proxy.findAllByCriteria(Bookmark.class, criteria).getAll(); + List<String> ids = new ArrayList<String>(); + + for (Bookmark bookmark : bookmarks) { + if (searchLine.isEmpty() && bookmark.getTags() == null || !searchLine.isEmpty() || + fullTextLine.isEmpty() && bookmark.getTags() == null || !fullTextLine.isEmpty()) { + ids.add(bookmark.getWikittyId()); + } + } + proxy.delete(ids); + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/DeleteTagAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/DeleteTagAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/DeleteTagAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,54 @@ package org.chorem.bow.action; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class DeleteTagAction extends ActionSupport{ +public class DeleteTagAction extends ActionSupport { private static final long serialVersionUID = -6174966873862161966L; + protected String bookmarkId; + protected String deleteTag; -} + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + /** + * @return the deleteTag + */ + public String getDeleteTag() { + return deleteTag; + } + /** + * @param deleteTag the deleteTag to set + */ + public void setDeleteTag(String deleteTag) { + this.deleteTag = deleteTag; + } + + @Override + public String execute() { + if (deleteTag != null && bookmarkId != null) { + if (!bookmarkId.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + + if (bookmark != null) { + bookmark.removeTags(deleteTag); + proxy.store(bookmark); + } + } + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/EditBookmarkAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/EditBookmarkAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,97 @@ package org.chorem.bow.action; +import java.io.IOException; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowInit; +import org.chorem.bow.BowProxy; +import org.chorem.bow.BowSearch; +import org.chorem.bow.User; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class EditBookmarkAction extends ActionSupport{ +public class EditBookmarkAction extends ActionSupport implements SessionAware, ServletRequestAware { private static final long serialVersionUID = 2706590901233864637L; + protected String bookmarkId; + protected String searchLine; + protected Map<String, Object> session; + protected HttpServletRequest request; -} + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public String execute() { + if (bookmarkId != null && !bookmarkId.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + + if (bookmark != null) { + request.setAttribute("link", bookmark.getLink()); + request.setAttribute("name", bookmark.getDescription()); + request.setAttribute("alias", bookmark.getAlias()); + request.setAttribute("tags", BookmarkActions.getBookmarkTagsString(bookmark)); + request.setAttribute("action", "bow?action=modifyBookmark"); + request.setAttribute("bookmarkId", bookmarkId); + } + } + if (searchLine == null) { + BowInit.initHomePage(request, (User)session.get("user")); + return NONE; + } else { + try { + BowSearch.search(request, (User)session.get("user")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ServletException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return SUCCESS; + } + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/ExportBookmarksAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,60 @@ package org.chorem.bow.action; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts2.interceptor.ServletResponseAware; +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowProxy; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class ExportBookmarksAction extends ActionSupport{ +public class ExportBookmarksAction extends ActionSupport implements SessionAware, ServletResponseAware { private static final long serialVersionUID = 45880214686011946L; + protected Map<String, Object> session; + protected HttpServletResponse response; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public void setServletResponse(HttpServletResponse response) { + this.response = response; + } + + @Override + public String execute() { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = Search.query().eq(Bookmark.FQ_FIELD_EMAIL, ((User)session.get("user")).getEmail()).criteria(); + List<Bookmark> bookmarks = proxy.findAllByCriteria(Bookmark.class, criteria).getAll(); + String export = BookmarkActions.getExportHtmlBookmark(bookmarks); + byte[] buff = export.getBytes(); + ServletOutputStream op; + + try { + op = response.getOutputStream(); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=\"bookmarks.html\""); + response.setContentLength(buff.length); + op.write(buff, 0, buff.length); + op.flush(); + op.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return SUCCESS; + } +} \ No newline at end of file Copied: trunk/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java (from rev 152, trunk/src/main/java/org/chorem/bow/action/SendPasswordAction.java) =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java (rev 0) +++ trunk/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -0,0 +1,86 @@ +package org.chorem.bow.action; + +import java.util.List; + +import javax.mail.MessagingException; +import javax.mail.internet.AddressException; + +import org.apache.commons.lang.RandomStringUtils; +import org.chorem.bow.BowMail; +import org.chorem.bow.BowProxy; +import org.chorem.bow.User; +import org.nuiton.util.StringUtil; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + +import com.opensymphony.xwork2.ActionSupport; + +public class ForgotPasswordAction extends ActionSupport{ + private static final long serialVersionUID = -8207951465957204954L; + protected String email; + + /** + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * @param email the email to set + */ + public void setEmail(String email) { + this.email = email; + } + + protected boolean passwordExists(String password) { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = Search.query().eq(User.FQ_FIELD_PASSWORD, password).criteria(); + List<User> users = proxy.findAllByCriteria(User.class, criteria).getAll(); + if (users != null && users.size() > 0) { + return true; + } + return false; + } + + public String execute() { + if (email != null) { + email = email.trim(); + if (!email.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = Search.query().eq(User.FQ_FIELD_EMAIL, email).criteria(); + User user = proxy.findByCriteria(User.class, criteria); + if (user != null) { + boolean bool = true; + String password = ""; + String md5 = ""; + + while (bool) { + password = RandomStringUtils.randomAlphanumeric(20); + md5 = StringUtil.encodeMD5(password); + bool = passwordExists(md5); + } + String mailContent; + + mailContent = getText("mailHi") + "\n\n" + getText("mailPwd") + password + "\n\n" + getText("mailEmail") + email + "\n\n"; + try { + BowMail.sendMail(email, getText("mailSubject"), mailContent); //TODO: modifier les noms et peut-être la manière de faire car c'est pas très beau + } catch (AddressException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (MessagingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + user.setPassword(md5); + proxy.store(user); + return SUCCESS; + } else { + addFieldError("email", getText("emailDoesntExist")); + } + } + } + return INPUT; + } +} \ No newline at end of file Property changes on: trunk/src/main/java/org/chorem/bow/action/ForgotPasswordAction.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/src/main/java/org/chorem/bow/action/GenerateTokenAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/GenerateTokenAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,62 @@ package org.chorem.bow.action; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.BowProxy; +import org.chorem.bow.Token; +import org.chorem.bow.TokenActions; +import org.chorem.bow.TokenImpl; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class GenerateTokenAction extends ActionSupport{ +public class GenerateTokenAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = 1141019772989666309L; + protected Map<String, Object> session; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public String execute() { + WikittyProxy proxy = BowProxy.getInstance(); + User user = (User)session.get("user"); + Criteria criteria = Search.query().eq(Token.FQ_FIELD_EMAIL, user.getEmail()).criteria(); + Token currentToken = proxy.findByCriteria(Token.class, criteria); + if (currentToken != null) { + String id = currentToken.getWikittyId(); + proxy.delete(id); + } + TokenActions tokenActions = (TokenActions)session.get("tokenActions"); + + if (tokenActions != null) { + String token; + try { + token = tokenActions.generateToken(); //Generates an encoding MD5 token + criteria = Search.query().eq(Token.FQ_FIELD_TOKEN, token).criteria(); + Token oldToken = proxy.findByCriteria(Token.class, criteria); + + if (oldToken == null) { //Checks if the token already exists + TokenImpl newToken = new TokenImpl(); + newToken.setToken(token); + newToken.setEmail(user.getEmail()); + proxy.store((Token) newToken); //If the token doesn't exist, it is stored + tokenActions.setPermanentToken(token); + } else { + tokenActions.setPermanentToken(""); + } + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/ImportBookmarksAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,171 @@ package org.chorem.bow.action; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +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.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowInit; +import org.chorem.bow.BowProxy; +import org.chorem.bow.BowSearch; +import org.chorem.bow.Import; +import org.chorem.bow.User; +import org.htmlparser.Node; +import org.htmlparser.Parser; +import org.htmlparser.util.NodeList; +import org.htmlparser.util.ParserException; +import org.htmlparser.util.SimpleNodeIterator; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class ImportBookmarksAction extends ActionSupport{ +public class ImportBookmarksAction extends ActionSupport implements SessionAware, ServletRequestAware { private static final long serialVersionUID = -5962680416570797028L; + protected Map<String, Object> session; + protected HttpServletRequest request; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + protected void createImportExtension(List<Bookmark> bookmarks) { + if (bookmarks != null && !bookmarks.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + List<String> ids = new ArrayList<String>(); + + for (Bookmark bookmark : bookmarks) { + String id = bookmark.getWikittyId(); + ids.add(id); + } + Date date = new Date(); + List<Import> imports = proxy.restore(Import.class, ids); + + for (Import imp : imports) { + imp.setDate(date); + } + proxy.store(imports); + } + } + + protected void parseHtmlToBookmarks(NodeList list, User user, List<Bookmark> bookmarks, List<String> tagList) + throws ParserException { + if (list != null) { + boolean isFolder = false; + SimpleNodeIterator it = list.elements(); + + while (it.hasMoreNodes()) { + Node node = it.nextNode(); + String plainText = node.toPlainTextString(); //The text between two heads ==> <toto>plainText</toto> + String text = node.getText(); //The text in the head ==> <text></toto> + + if (text != null && text.startsWith("H3")) { // H3 = folder + if (plainText != null && !plainText.isEmpty()) { + tagList.add(plainText); //Adds the folder name to the tagList + isFolder = true; + } + } else if (text != null && text.startsWith("A HREF")) { // HREF = new bookmarks + Bookmark bookmark = BookmarkActions.createBookmarkFromHtml(text, plainText, user); + BookmarkActions.addTagsToBookmark(tagList, bookmark); + + if (bookmark != null) { + bookmarks.add(bookmark); + } + } + NodeList children = node.getChildren(); + + if (children != null) { + parseHtmlToBookmarks(children, user, bookmarks, tagList); //If there is an under node = recursion + } + } + if (isFolder) { //If we find a folder, we have to remove it + int index = tagList.size() - 1; + + if (index > -1) { + tagList.remove(index); + } + } + } + } + + @Override + 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; + 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"); + + 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", "Bad bookmarks file format, expected Netscape-like bookmarks file"); + request.setAttribute("errorMsgTech", e.getMessage()); + + String searchLine = request.getParameter("searchLine"); + if (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"; + } + } + } + } + } + return ERROR; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/ModifyBookmarkAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ModifyBookmarkAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/ModifyBookmarkAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,108 @@ package org.chorem.bow.action; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class ModifyBookmarkAction extends ActionSupport{ +public class ModifyBookmarkAction extends ActionSupport { private static final long serialVersionUID = 8197008295267924063L; + protected String url; + protected String name; + protected String alias; + protected String tags; + protected String bookmarkId; -} + /** + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * @param url the url to set + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the alias + */ + public String getAlias() { + return alias; + } + + /** + * @param alias the alias to set + */ + public void setAlias(String alias) { + this.alias = alias; + } + + /** + * @return the tags + */ + public String getTags() { + return tags; + } + + /** + * @param tags the tags to set + */ + public void setTags(String tags) { + this.tags = tags; + } + + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + + @Override + public String execute() { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + + if (bookmark != null) { + if (alias != null && !alias.isEmpty()) { + Criteria criteria = Search.query().eq(Bookmark.FQ_FIELD_ALIAS, alias).criteria(); + + if (proxy.findByCriteria(Bookmark.class, criteria) != null) { + alias = bookmark.getAlias(); + } + } + BookmarkActions.updateBookmark(bookmark, name, url, tags, alias); + proxy.store(bookmark); + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/OpenSearchResultAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,154 @@ package org.chorem.bow.action; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.ServletResponseAware; +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowBookmark; +import org.chorem.bow.BowConfig; +import org.chorem.bow.BowInit; +import org.chorem.bow.BowProxy; +import org.chorem.bow.Preference; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Search; + import com.opensymphony.xwork2.ActionSupport; -public class OpenSearchResultAction extends ActionSupport{ +public class OpenSearchResultAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { private static final long serialVersionUID = -1691325797986483856L; + protected String searchLine; + protected String token; + protected Map<String, Object> session; + protected HttpServletRequest request; + protected HttpServletResponse response; -} + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + /** + * @return the token + */ + public String getToken() { + return token; + } + + /** + * @param token the token to set + */ + public void setToken(String token) { + this.token = token; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public void setServletResponse(HttpServletResponse response) { + this.response = response; + } + + //TODO : gérer toutes les redirections comme il faut avec Struts2 + @Override + public String execute() { + User user = (User)session.get("user"); + + if (searchLine != null && searchLine.matches("^http://[^ ]*")) { + //response.sendRedirect(searchLine); + } else if (searchLine != null + && (searchLine.startsWith(":") || searchLine.startsWith("t:")) ) { + //On fait une recherche sur les tags + + int index = searchLine.indexOf(":"); + searchLine = searchLine.substring(index+1); //Suppresses first ":" + + session.put("user", user); + try { + BowInit.initializeToken(session, user); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = BowBookmark.getBookmarkListCriteriaByUser(user, searchLine); + criteria = criteria.addSortDescending(Bookmark.FQ_FIELD_CLICK); + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); //Retrieves bookmarks by search + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, searchLine); + request.setAttribute("bookmarkActions", bookmarkActions); + request.setAttribute("token", token); + //request.getRequestDispatcher("search.jsp").forward(request, response); + } else if (searchLine != null && searchLine.startsWith("f:")) { + // recherche fulltext dans bow + String fullText = searchLine.substring(2); + + session.put("user", user); + try { + BowInit.initializeToken(session, user); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria; + if (!fullText.isEmpty()) { + criteria = Search.query().keyword(fullText). + eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()).criteria(). + addFacetField(Bookmark.FQ_FIELD_TAGS); + + } else { + criteria = BowBookmark.getBookmarkListCriteriaByUser(user, null); + } + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, null); + request.setAttribute("bookmarkActions", bookmarkActions); + request.setAttribute("token", token); + //request.getRequestDispatcher("search.jsp").forward(request, response); + } else if (searchLine != null && searchLine.startsWith("a:")) { + // on redirige vers l'alias demande + searchLine = searchLine.substring(2); + //response.sendRedirect(BowConfig.getInstance().getAliasUrl() + searchLine); + } else { + // on fait une recherche sur le moteur de recherche configure + WikittyProxy proxy = BowProxy.getInstance(); + Preference pref = proxy.restore(Preference.class, user.getWikittyId()); + + String searchEngineURL = pref.getSearchEngineUrlResults(); + if (searchEngineURL == null || "".equals(searchEngineURL)) { + BowConfig config = BowConfig.getInstance(); + searchEngineURL = config.getSearchEngine(); + } + searchEngineURL = searchEngineURL.replace("{searchTerms}", searchLine); + searchEngineURL = response.encodeRedirectURL(searchEngineURL); + + //response.sendRedirect(searchEngineURL); + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/OpenSearchSuggestionAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,91 @@ package org.chorem.bow.action; +import java.util.ArrayList; +import java.util.Arrays; +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.Bookmark; +import org.chorem.bow.BowProxy; +import org.chorem.bow.OpenSearchActions; +import org.chorem.bow.User; +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.Search; + import com.opensymphony.xwork2.ActionSupport; -public class OpenSearchSuggestionAction extends ActionSupport{ +public class OpenSearchSuggestionAction extends ActionSupport implements SessionAware, ServletRequestAware { private static final long serialVersionUID = 3973618635494129146L; + protected Map<String, Object> session; + protected String searchLine; + protected HttpServletRequest request; -} + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public String execute() { + User user = (User)session.get("user"); + + if (user != null) { + if (searchLine != null) { + OpenSearchActions openSearchActions = new OpenSearchActions(); + WikittyProxy proxy = BowProxy.getInstance(); + String[] words = searchLine.split("\\s+"); + List<String> searchLineList = new ArrayList<String>(Arrays.asList(words)); + + if (searchLine.charAt(searchLine.length() - 1) == ' ') { + searchLineList.add(""); //If the user doesn't type anything, we have to propose suggestions + } + Criteria criteria; + + if (searchLineList.size() > 1) { + List<String> cpy = new ArrayList<String>(searchLineList); + cpy.remove(cpy.size() - 1); + criteria = Search.query().eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()). + eq(Bookmark.FQ_FIELD_TAGS, cpy).criteria().addFacetField(Bookmark.FQ_FIELD_TAGS); + } else { + criteria = Search.query().eq(Bookmark.FQ_FIELD_EMAIL, user.getEmail()). + criteria().addFacetField(Bookmark.FQ_FIELD_TAGS); + } + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); + List<Bookmark> bookList = result.getAll(); + List<FacetTopic> topics = result.getTopic(Bookmark.FQ_FIELD_TAGS); + + openSearchActions.setBookmarkList(bookList); + openSearchActions.setSuggestionList(topics); + openSearchActions.findSuggestions(searchLineList); + request.setAttribute("openSearchAction", openSearchActions); + } + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/OrderAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/OrderAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/OrderAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,97 @@ package org.chorem.bow.action; +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.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowBookmark; +import org.chorem.bow.BowProxy; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class OrderAction extends ActionSupport{ +public class OrderAction extends ActionSupport implements SessionAware, ServletRequestAware { private static final long serialVersionUID = 203690999710176818L; + protected Map<String, Object> session; + protected String type; + protected String searchLine; + protected HttpServletRequest request; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + /** + * @return the type + */ + public String getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public String execute() { + Criteria baseCriteria = BowBookmark.getBookmarkListCriteriaByUser((User)session.get("user"), searchLine); + + if (type != null && baseCriteria != null && !type.isEmpty()) { + WikittyProxy proxy = BowProxy.getInstance(); + PagedResult<Bookmark> result = null; + + if (type.equals("ascName")) { + Criteria criteria = baseCriteria.addSortAscending(Bookmark.FQ_FIELD_DESCRIPTION); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } else if (type.equals("ascDate")) { + Criteria criteria = baseCriteria.addSortAscending(Bookmark.FQ_FIELD_DATE); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } else if (type.equals("ascClick")) { + Criteria criteria = baseCriteria.addSortAscending(Bookmark.FQ_FIELD_CLICK); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } else if (type.equals("descName")) { + Criteria criteria = baseCriteria.addSortDescending(Bookmark.FQ_FIELD_DESCRIPTION); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } else if (type.equals("descDate")) { + Criteria criteria = baseCriteria.addSortDescending(Bookmark.FQ_FIELD_DATE); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } else if (type.equals("descClick")) { + Criteria criteria = baseCriteria.addSortDescending(Bookmark.FQ_FIELD_CLICK); + result = proxy.findAllByCriteria(Bookmark.class, criteria); + } + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, searchLine); + request.setAttribute("bookmarkActions", bookmarkActions); + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/ReIndexationAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/ReIndexationAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,29 @@ package org.chorem.bow.action; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class ReIndexationAction extends ActionSupport{ +public class ReIndexationAction extends ActionSupport implements SessionAware { private static final long serialVersionUID = 6226574522402739559L; + protected Map<String, Object> session; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + @Override + public String execute() { + if ((Boolean)session.get("admin")) { //If is admin + WikittyProxy proxy = BowProxy.getInstance(); + + proxy.getWikittyService().syncEngin(proxy.getSecurityToken()); + } + return SUCCESS; + } +} \ No newline at end of file Modified: trunk/src/main/java/org/chorem/bow/action/RegisterAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/RegisterAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/RegisterAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -2,20 +2,13 @@ import java.security.NoSuchAlgorithmException; import java.util.Map; -import java.util.Properties; - -import javax.mail.Message; import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.Transport; import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.SessionAware; -import org.chorem.bow.BowConfig; +import org.chorem.bow.BowMail; import org.chorem.bow.BowProxy; import org.chorem.bow.User; import org.chorem.bow.UserImpl; @@ -106,29 +99,6 @@ return true; } - protected void sendMail() throws AddressException, MessagingException { - BowConfig config = BowConfig.getInstance(); - String smtpServer = config.getSmtpServer(); - Properties properties = new Properties(); - properties.put("mail.smtp.host", smtpServer); - - Session session = Session.getDefaultInstance(properties, null); - session.setDebug(true); - - Message msg = new MimeMessage(session); - - msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email)); - msg.setFrom(new InternetAddress(config.getAddressFrom())); - msg.setSubject(getText("mailSubject")); - - String messageBody = getText("mailHi") + "\n\n" + - getText("mailPwd") + password + "\n" + - getText("mailEmail") + email + "\n\n"; - msg.setContent(messageBody, "text/plain"); - - Transport.send(msg); - } - public String execute() { if (email != null) { email = email.trim(); @@ -154,7 +124,10 @@ } BowInit.initHomePage(request, login); try { - sendMail(); + String mailContent; + + mailContent = getText("mailHi") + "\n\n" + getText("mailPwd") + password + "\n\n" + getText("mailEmail") + email + "\n\n"; + BowMail.sendMail(email, getText("mailSubject"), mailContent); //TODO: modifier les noms et peut-être la manière de faire car c'est pas très beau } catch (AddressException e) { // TODO Auto-generated catch block e.printStackTrace(); Modified: trunk/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/RemoveBookmarkAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,45 @@ package org.chorem.bow.action; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BowProxy; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class RemoveBookmarkAction extends ActionSupport{ +public class RemoveBookmarkAction extends ActionSupport { private static final long serialVersionUID = 820566716695285561L; + protected String bookmarkId; -} + /** + * @return the bookmarkId + */ + public String getBookmarkId() { + return bookmarkId; + } + + /** + * @param bookmarkId the bookmarkId to set + */ + public void setBookmarkId(String bookmarkId) { + this.bookmarkId = bookmarkId; + } + + @Override + public String execute() { + if (bookmarkId != null && !bookmarkId.isEmpty()) { + try { + WikittyProxy proxy = BowProxy.getInstance(); + Bookmark bookmark = proxy.restore(Bookmark.class, bookmarkId); + + if (bookmark != null) { + proxy.delete(bookmarkId); + } + } catch (Exception eee) { + //TODO: log + //log.error("Can't do action", eee); + } + } +// redirectToTheGoodPage(request, response); + return SUCCESS; + } +} \ No newline at end of file Deleted: trunk/src/main/java/org/chorem/bow/action/RightMenuAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/RightMenuAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/RightMenuAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,11 +0,0 @@ -package org.chorem.bow.action; - -import com.opensymphony.xwork2.ActionSupport; - -public class RightMenuAction extends ActionSupport { - private static final long serialVersionUID = -1167431751227151402L; - - public String execute() { - return SUCCESS; - } -} Modified: trunk/src/main/java/org/chorem/bow/action/SearchAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/SearchAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/SearchAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +1,117 @@ package org.chorem.bow.action; +import java.io.IOException; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.SessionAware; +import org.chorem.bow.Bookmark; +import org.chorem.bow.BookmarkActions; +import org.chorem.bow.BowBookmark; +import org.chorem.bow.BowProxy; +import org.chorem.bow.BowSearch; +import org.chorem.bow.User; +import org.nuiton.wikitty.Criteria; +import org.nuiton.wikitty.PagedResult; +import org.nuiton.wikitty.WikittyProxy; + import com.opensymphony.xwork2.ActionSupport; -public class SearchAction extends ActionSupport{ +public class SearchAction extends ActionSupport implements SessionAware, ServletRequestAware { private static final long serialVersionUID = -2161661766242362907L; + protected Map<String, Object> session; + protected String searchLine; + protected String fullTextLine; + protected String addTag; + protected HttpServletRequest request; -} + @Override + public void setSession(Map<String, Object> session) { + this.session = session; + } + + /** + * @return the searchLine + */ + public String getSearchLine() { + return searchLine; + } + + /** + * @param searchLine the searchLine to set + */ + public void setSearchLine(String searchLine) { + this.searchLine = searchLine; + } + + /** + * @return the fullTextLine + */ + public String getFullTextLine() { + return fullTextLine; + } + + /** + * @param fullTextLine the fullTextLine to set + */ + public void setFullTextLine(String fullTextLine) { + this.fullTextLine = fullTextLine; + } + + /** + * @return the addTag + */ + public String getAddTag() { + return addTag; + } + + /** + * @param addTag the addTag to set + */ + public void setAddTag(String addTag) { + this.addTag = addTag; + } + + @Override + public void setServletRequest(HttpServletRequest request) { + this.request = request; + } + + @Override + public String execute() { + User user = (User)session.get("user"); + + if (searchLine == null) { + searchLine = ""; + } + if (fullTextLine != null && !fullTextLine.isEmpty() && searchLine.isEmpty()) { + try { + BowSearch.fullText(request, user); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ServletException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else { + if (addTag != null && !addTag.isEmpty()) { + if (searchLine.isEmpty()) { + searchLine = addTag; + } else { + searchLine += " " + addTag; + } + } + WikittyProxy proxy = BowProxy.getInstance(); + Criteria criteria = BowBookmark.getBookmarkListCriteriaByUser(user, searchLine); + criteria = criteria.addSortDescending(Bookmark.FQ_FIELD_CLICK); + PagedResult<Bookmark> result = proxy.findAllByCriteria(Bookmark.class, criteria); //Selects all bookmarks by user + BookmarkActions bookmarkActions = BowBookmark.createBookmarkActions(request, result, searchLine); + request.setAttribute("bookmarkActions", bookmarkActions); + } + return SUCCESS; + } +} \ No newline at end of file Deleted: trunk/src/main/java/org/chorem/bow/action/SendPasswordAction.java =================================================================== --- trunk/src/main/java/org/chorem/bow/action/SendPasswordAction.java 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/java/org/chorem/bow/action/SendPasswordAction.java 2010-12-30 14:45:38 UTC (rev 153) @@ -1,8 +0,0 @@ -package org.chorem.bow.action; - -import com.opensymphony.xwork2.ActionSupport; - -public class SendPasswordAction extends ActionSupport{ - private static final long serialVersionUID = -8207951465957204954L; - -} Modified: trunk/src/main/resources/struts.xml =================================================================== --- trunk/src/main/resources/struts.xml 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/resources/struts.xml 2010-12-30 14:45:38 UTC (rev 153) @@ -8,14 +8,12 @@ <package name="myPackage" extends="struts-default"> <action name="register_*" method="{1}" class="org.chorem.bow.action.RegisterAction"> <result name="input">/jsp/register.jsp</result> - <result type="redirect">/jsp/home.jsp</result> + <result type="redirect">/home.action</result> </action> - <action name="registration"> - <result>/jsp/register.jsp</result> + <action name="forgotPassword_*" method="{1}" class="org.chorem.bow.action.ForgotPasswordAction"> + <result name="input">/jsp/forgotPassword.jsp</result> + <result>/home.action</result> </action> - <action name="forgotPassword"> - <result>/jsp/forgotPassword.jsp</result> - </action> <action name="locale" class="org.chorem.bow.action.LocaleAction"> <result type="redirect">/jsp/login.jsp</result> @@ -25,7 +23,7 @@ <result type="redirect">/home.action</result> </action> <action name="logout" class="org.chorem.bow.action.LogoutAction"> - <result type="redirect">/jsp/login.jsp</result> + <result type="redirect">/login_input.action</result> </action> <action name="home" class="org.chorem.bow.action.HomeAction"> <result name="login" type="redirect">/login_input.action</result> @@ -34,10 +32,6 @@ <action name="addUrl" class="org.chorem.bow.action.AddUrlAction"> <!-- La redirection change selon le type de page sur laquelle on est, donc je ne vois pas trop comment faire ça pour le moment--> </action> - <action name="sendPassword" class="org.chorem.bow.action.SendPasswordAction"> - <result name="input">/jsp/forgotPassword.jsp</result> - <result>/jsp/login.jsp</result> - </action> </package> <package name="bookmark" extends="struts-default"> @@ -72,6 +66,7 @@ <result>/jsp/search.jsp</result> </action> <action name="addClick" class="org.chorem.bow.action.AddClickAction"> + <result name="error" type="redirect">/home.action</result> <result type="redirect">${link}<!--???--></result> </action> <!-- temporary, permanent --> Added: trunk/src/main/webapp/jsp/forgotPassword.jsp =================================================================== --- trunk/src/main/webapp/jsp/forgotPassword.jsp (rev 0) +++ trunk/src/main/webapp/jsp/forgotPassword.jsp 2010-12-30 14:45:38 UTC (rev 153) @@ -0,0 +1,45 @@ +<!-- + #%L + bow + + $Id: forgotPassword.jsp 144 2010-12-23 10:24:48Z bpoussin $ + $HeadURL: http://svn.chorem.org/svn/bow/trunk/src/main/webapp/forgotPassword.jsp $ + %% + Copyright (C) 2010 CodeLutin + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + #L% + --> +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@taglib prefix="s" uri="/struts-tags" %> +<html> + <head> + <link href="<s:url value='/css/connexion.css'/>" rel="stylesheet" type="text/css" /> + <s:head /> + </head> + <body> + <div id="content"> + <div id="formFrame"> + <h1><s:property value="%{getText('forgotPwd')}" /></h1> + <s:form action="/bow/forgotPassword.action"> + <p> + <s:textfield key="email" name="email" label="%{getText('email')}" /> + <s:submit value="%{getText('submit')}" /> + </p> + </s:form> + <a href="<%= request.getContextPath() %>" class="register"><s:property value="%{getText('loginPage')}" /></a> + </div> + </div> + </body> +</html> Property changes on: trunk/src/main/webapp/jsp/forgotPassword.jsp ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/src/main/webapp/jsp/login.jsp =================================================================== --- trunk/src/main/webapp/jsp/login.jsp 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/webapp/jsp/login.jsp 2010-12-30 14:45:38 UTC (rev 153) @@ -28,7 +28,7 @@ <s:a href="%{localeEN}">English</s:a><br /> <s:a href="%{localeFR}">French</s:a><br /> - <a href="<%= request.getContextPath() %>/registration.action" id="register"><s:property value="%{getText('register')}" /></a> + <a href="<%= request.getContextPath() %>/register_input.action" id="register"><s:property value="%{getText('register')}" /></a> <a href="<%= request.getContextPath() %>/forgotPassword.action" id="forgotPwd"><s:property value="%{getText('forgotpwd')}" /></a> </div> </div> Modified: trunk/src/main/webapp/jsp/register.jsp =================================================================== --- trunk/src/main/webapp/jsp/register.jsp 2010-12-28 09:40:42 UTC (rev 152) +++ trunk/src/main/webapp/jsp/register.jsp 2010-12-30 14:45:38 UTC (rev 153) @@ -32,14 +32,14 @@ <div id="content"> <div id="formFrame"> <h1><s:property value="%{getText('register')}" /></h1> - <form method="post" action="/bow/register.action"> + <s:form action="/bow/register.action"> <p> <s:textfield key="email" name="email" label="%{getText('email')}" /> <s:password key="password" name="password" label="%{getText('password')}" /> <s:password key="repeatPassword" name="repeatPassword" label="%{getText('repeatPassword')}" /> <s:submit value="%{getText('register')}" /> </p> - </form> + </s:form> <a href="<%= request.getContextPath() %>" id="register"><s:property value="%{getText('loginPage')}" /></a> </div> </div>