Author: bpoussin Date: 2011-06-29 17:30:49 +0200 (Wed, 29 Jun 2011) New Revision: 107 Url: http://chorem.org/repositories/revision/vradi/107 Log: commit pour que sylvain reprenne la suite Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RawAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SeekPartnersAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SendInvitationAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/ShowInvitationAction.java trunk/vradi-web/src/main/webapp/WEB-INF/jsp/seekPartners.jsp trunk/vradi-web/src/main/webapp/WEB-INF/jsp/sendInvitation.jsp trunk/vradi-web/src/main/webapp/WEB-INF/jsp/showInvitation.jsp Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebConfig.java trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebHelper.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AttachmentAddAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RestoreUserAction.java trunk/vradi-web/src/main/resources/struts.xml trunk/vradi-web/src/main/webapp/WEB-INF/jsp/attachmentList.jsp trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userInfo.jsp trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userPreference.jsp Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebConfig.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebConfig.java 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebConfig.java 2011-06-29 15:30:49 UTC (rev 107) @@ -92,6 +92,10 @@ return getConfig().getOption(VradiWebOption.VRADI_VERSION.getKey()); } + public static String getVradiWebServerUrl() { + return getConfig().getOption(VradiWebOption.WEB_SERVER_URL.getKey()); + } + /** Vradi option enum. */ public enum VradiWebOption implements ApplicationConfig.OptionDef { @@ -122,6 +126,13 @@ Locale.FRANCE.toString(), Locale.class, false, false), + // l'url public pour acceder au serveur web vradi (ex: http://vradi.chorem.org/vradi-web) + // il est possible d'avoir le port d'indique (ex: https://vradi.chorem.org:443) + WEB_SERVER_URL( + "vradi.web.server.address", + _("vradi.config.web.server.address.description"), + "http://localhost:8080", String.class, false, false), + // achitecture client serveur REMOTE_ENDPOINT( "vradi.remote.endpoint", Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebHelper.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebHelper.java 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/VradiWebHelper.java 2011-06-29 15:30:49 UTC (rev 107) @@ -1,5 +1,17 @@ package org.chorem.vradi; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jrst.JRST; +import org.nuiton.util.GZUtil; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + /** * Utilities class * @@ -7,9 +19,86 @@ */ public class VradiWebHelper { + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(VradiWebHelper.class); + public static String escapeSciptBalises(String txt) { // (?s) activ dotall (http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DO...) - return txt.replaceAll("(?s)<script>.*</script>", ""); + return txt.replaceAll("(?s)<script.*?>.*</script>", ""); } + + /** + * Compresse en gzip la string passee en parametre, la passe en base64 + * et l'encode pour passer comme parametre d'une url + */ + public static String encode(String s) throws IOException { + String encType = "UTF-8"; + BASE64Encoder b64enc = new BASE64Encoder(); + + byte[] gz = GZUtil.stringToBytes(s); + String gzs = b64enc.encode(gz); + String result = URLEncoder.encode(gzs, encType); + + return result; + } + + /** + * Methode inverse de {@link #encode(java.lang.String). + * + * @param enc la chaine a decoder + * @return + * @throws UnsupportedEncodingException + * @throws IOException + */ + public static String decode(String enc) throws UnsupportedEncodingException, IOException { + String encType = "UTF-8"; + BASE64Decoder b64dec = new BASE64Decoder(); + + String gzs2 = URLDecoder.decode(enc, encType); + byte[] gz2 = b64dec.decodeBuffer(gzs2); + String result = GZUtil.bytesToString(gz2); + + return result; + } + + /** + * Envoi un mail a chaque recipient avec comme contenu du mail mailContent. + * Le senders est une adresse on les reponses ne sont pas possible + * (vradi-noresponse@vradi.chorem.org) + * + * @param recipient + * @param mailContent + */ + public static void sendEmail(Set<String> recipient, String mailContent) { + String sender = "vradi-noresponse@vradi.chorem.org"; + String subject = "Vradi invitation"; + for (String email : recipient) { + // FIXME poussin 20110601 implanter l'envoi d'email + } + } + + /** + * Converti le rst dans le format demande + * @param resultType + * @param rst + * @return + */ + public static String rstTo(String resultType, String rst) { + String result = rst; + try { + // si on arrive pas a faire la generation a partir du rst + // on renvoi le champs en brut + result = JRST.generate(resultType, rst); + } catch(Exception eee) { + log.info("Can't generate from RST", eee); + // on a pas reussi a genere le HTML, le texte doit donc etre mis + // dans un element <pre> pour une meilleur presentation + if (result == null) { + result = "Can't be generate from null string"; + } + result = "<pre>" + escapeSciptBalises(rst) + "</pre>"; + } + return result; + } } Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AttachmentAddAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AttachmentAddAction.java 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AttachmentAddAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -81,7 +81,7 @@ attachment.setName(name); } if (!StringUtils.isEmpty(description)) { - attachment.setName(description); + attachment.setDescription(description); } proxy.store(attachment); } Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -4,6 +4,7 @@ import java.io.StringBufferInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.VradiWebHelper; import org.nuiton.jrst.JRST; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.entities.Wikitty; @@ -85,36 +86,27 @@ @Override public String execute() throws Exception { // si on arrive pas a lire l'objet ou le champs on renvoie ca - try { - if (isAcceptable(field)) { - WikittyProxy proxy = getProxy(); - Wikitty w = proxy.restore(getId()); - String ext = WikittyExtension.extractExtensionName(field); - String fieldName = WikittyExtension.extractFieldName(field); + if (isAcceptable(field)) { + WikittyProxy proxy = getProxy(); + Wikitty w = proxy.restore(getId()); + String ext = WikittyExtension.extractExtensionName(field); + String fieldName = WikittyExtension.extractFieldName(field); - if (rst != null) { - // rst est renseigne, on commence par mettre a jour le champs - w.setField(ext, fieldName, rst); - proxy.store(w); - } - // on recupere la valeur du champs - rst = w.getFieldAsString(ext, fieldName); - - // si on arrive pas a faire la generation a partir du champs - // on renvoi le champs en brut - rst = JRST.generate(rstResultType, rst); - } else { - rst = "<pre>Not acceptable field</pre>"; + if (rst != null) { + // rst est renseigne, on commence par mettre a jour le champs + w.setField(ext, fieldName, rst); + proxy.store(w); } - } catch(Exception eee) { - log.info("Can't generate HTML from RST", eee); - // on a pas reussi a genere le HTML, le texte doit donc etre mis - // dans un element <pre> pour une meilleur presentation - if (rst == null) { - rst = "Can't be generate"; - } - rst = "<pre>" + rst + "</pre>"; + // on recupere la valeur du champs + rst = w.getFieldAsString(ext, fieldName); + + // si on arrive pas a faire la generation a partir du champs + // on renvoi le champs en brut + rst = VradiWebHelper.rstTo(rstResultType, rst); + } else { + rst = "<pre>Not acceptable field</pre>"; } + rstResult = new StringBufferInputStream(rst); return SUCCESS; } Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RawAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RawAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RawAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,103 @@ +package org.chorem.vradi.actions; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.entities.AttachmentHelper; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class RawAction extends AbstractEditAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(RawAction.class); + + protected String id; + protected String fqField; + protected String filename; + /** result stream */ + protected InputStream content; + /** rstResultType */ + protected String mimeType; + protected int contentLength; + + public void setId(String id) { + this.id = id; + } + + public void setFqField(String fqField) { + this.fqField = fqField; + } + + public String getFilename() { + return filename; + } + + public InputStream getContent() { + return content; + } + + public String getMimeType() { + return mimeType; + } + + public int getContentLength() { + return contentLength; + } + + @Override + public String execute() throws Exception { + String result = SUCCESS; + WikittyProxy proxy = getProxy(); + Wikitty w = proxy.restore(id); + if (w == null) { + log.error(String.format("Wikitty with id '%s' doesn't exist", id)); + } else { + try { + if (isAcceptable(fqField)) { + if (w.hasField(fqField)) { + String ext = WikittyExtension.extractExtensionName(fqField); + String field = WikittyExtension.extractFieldName(fqField); + byte[] b = w.getFieldAsBytes(ext, field); + content = new ByteArrayInputStream(b); + contentLength = b.length; + if (AttachmentHelper.hasExtension(w)) { + filename = AttachmentHelper.getName(w); + mimeType = AttachmentHelper.getMimetype(w); + } + + if (filename == null) { + filename = "vradi-file"; + } + + if (mimeType == null) { + // default value + mimeType = "application/octet-stream"; + } + } else { + log.error(String.format( + "field '%s' doesn't exist on this wikitty %s", + fqField, w)); + } + } + } catch(Exception eee) { + log.error("Can't return data", eee); + result = ERROR; + } + } + return result; + } + + + +} Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RestoreUserAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RestoreUserAction.java 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RestoreUserAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -6,6 +6,7 @@ import java.util.Collections; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.VradiWebHelper; import org.chorem.vradi.entities.VradiUser; import org.nuiton.jrst.JRST; import org.nuiton.wikitty.WikittyProxy; @@ -64,12 +65,7 @@ if (user.getInfo() == null) { infoHtml = "<pre>" + _("vradi.user.noinfo") + "</pre>"; } else { - try { - infoHtml = JRST.generate(JRST.TYPE_HTML_INNER_BODY, user.getInfo()); - } catch(Exception eee) { - log.info("Can't generate HTML from RST", eee); - infoHtml = "<pre>" + user.getInfo() + "</pre>"; - } + infoHtml = VradiWebHelper.rstTo(JRST.TYPE_HTML_INNER_BODY, user.getInfo()); } } Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SeekPartnersAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SeekPartnersAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SeekPartnersAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,80 @@ +package org.chorem.vradi.actions; + +import com.opensymphony.xwork2.ActionContext; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.entities.FormNote; +import org.chorem.vradi.entities.VradiUser; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Criteria; +import org.nuiton.wikitty.search.PagedResult; +import org.nuiton.wikitty.search.Search; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class SeekPartnersAction extends VradiBaseAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(SeekPartnersAction.class); + + static public SeekPartnersAction getAction() { + return (SeekPartnersAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY); + } + + protected String noteId; + protected FormNote note; + protected Set<VradiUser> partners; + + public String getNoteId() { + return noteId; + } + + public void setNoteId(String noteId) { + this.noteId = noteId; + } + + public FormNote getNote() { + return note; + } + + public Set<VradiUser> getPartners() { + return partners; + } + + @Override + public String execute() throws Exception { + String result = SUCCESS; + + WikittyProxy proxy = getProxy(); + note = proxy.restore(FormNote.class, noteId); + VradiUser user = getVradiSession().getUser(); + String userId = user.getWikittyId(); + + Criteria c = Search.query() + .eq(FormNote.FQ_FIELD_FORMNOTE_PARTNERS, userId) + .criteria(); + + PagedResult<FormNote> notes = proxy.findAllByCriteria(FormNote.class, c); + + Set<String> partnersId = new HashSet<String>(); + for (FormNote note : notes) { + partnersId.addAll(note.getPartners()); + } + + partners = proxy.restore(VradiUser.class, partnersId); + + return result; + } + + +} Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SendInvitationAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SendInvitationAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/SendInvitationAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,204 @@ +package org.chorem.vradi.actions; + +import com.opensymphony.xwork2.ActionContext; +import freemarker.template.utility.Collections12; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.VradiWebConfig; +import org.chorem.vradi.VradiWebHelper; +import org.chorem.vradi.entities.FormNote; +import org.chorem.vradi.entities.VradiUser; +import org.nuiton.util.CollectionUtil; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.search.Criteria; +import org.nuiton.wikitty.search.PagedResult; +import org.nuiton.wikitty.search.Search; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class SendInvitationAction extends VradiBaseAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(SendInvitationAction.class); + + static public SendInvitationAction getAction() { + return (SendInvitationAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY); + } + + protected String noteId; + protected boolean formReceiver; + protected boolean seeker; + protected boolean partners; + protected String[] userId; + protected boolean invite; + protected String inviteEmail; + protected String message; + + protected int sendCount; + + public void setNoteId(String noteId) { + this.noteId = noteId; + } + + public void setFormReceiver(boolean formReceiver) { + this.formReceiver = formReceiver; + } + + public void setSeeker(boolean seeker) { + this.seeker = seeker; + } + + public void setPartners(boolean partners) { + this.partners = partners; + } + + public void setUserId(String[] userId) { + this.userId = userId; + } + + public void setInvite(boolean invite) { + this.invite = invite; + } + + public void setInviteEmail(String inviteEmail) { + this.inviteEmail = inviteEmail; + } + + public void setMessage(String message) { + this.message = message; + } + + public int getSendCount() { + return sendCount; + } + + protected boolean acceptReceiver(VradiUser sender, VradiUser recipient) { + boolean result = !sender.getNoSend().contains(recipient.getWikittyId()); + result = result && !recipient.getNoReceived().contains(sender.getWikittyId()); + return result; + } + /** + * En recherche toutes les personnes a qui envoyer la demande de parteneriat + * Si cette personne souhaite plus recevoir de demande de votre part + * On que vous ne souhaiter plus lui en envoyer, elle ne sera pas + * selectionnee. Ce critere ne s'applique que sur la personne faisant + * l'action de recherche de partenaire et non pas a la liste complete + * des partenaires deja present sur la note. + * + * @return + * @throws Exception + */ + @Override + public String execute() throws Exception { + String result = SUCCESS; + + WikittyProxy proxy = getProxy(); + VradiUser sender = getVradiSession().getUser(); + FormNote note = proxy.restore(FormNote.class, noteId); + + Set<String> recipient = new HashSet<String>(); + + if (formReceiver) { + Criteria c = Search.query() + // FIXME ajouter le critere de recherche des personnes ayant recu ce formulaire + .criteria(); + + PagedResult<VradiUser> users = proxy.findAllByCriteria(VradiUser.class, c); + for (VradiUser user : users) { + if (acceptReceiver(sender, user)) { + String email = user.getEmail(); + recipient.add(email); + } + } + } + + if (seeker) { + Criteria c = Search.query() + // FIXME ajouter le critere de recherche des personnes ayant une note sur ce formulaire avec la case seekingPartners a true + .criteria(); + + PagedResult<FormNote> notes = proxy.findAllByCriteria(FormNote.class, c); + Set<String> userIds = new HashSet<String>(); + for (FormNote n : notes) { + userIds.addAll(n.getPartners()); + } + Set<VradiUser> users = proxy.restore(VradiUser.class, userIds); + for (VradiUser user : users) { + if (acceptReceiver(sender, user)) { + String email = user.getEmail(); + recipient.add(email); + } + } + } + + if (partners) { + List<VradiUser> users = proxy.restore(VradiUser.class, Arrays.asList(userId)); + for (VradiUser user : users) { + if (acceptReceiver(sender, user)) { + String email = user.getEmail(); + recipient.add(email); + } + } + } + + if (invite) { + String[] inviteEmails = inviteEmail.split(","); + for (String email : inviteEmails) { + email = StringUtils.trimToNull(email); + if (email != null) { + recipient.add(email); + } + } + } + + StringBuilder info = new StringBuilder(); + info.append(noteId); + info.append("\n"); + info.append(sender.getWikittyId()); + info.append("\n"); + info.append(StringUtils.join(note.getPartners(), ",")); + info.append("\n"); + info.append(message); + + String param = VradiWebHelper.encode(info.toString()); + String url = String.format("http://%s/showInvitation.action?p=%s", + VradiWebConfig.getVradiWebServerUrl(), param); + if (url.length() > 2000) { + log.error(String.format("Url forged for invitation is to long for some navigator '%s'", url)); + } + + StringBuilder mailContent = new StringBuilder(); + mailContent.append("Bonjour,\n"); + mailContent.append("\n"); + mailContent.append("Ceci est une invitation pour participer à la creation\n"); + mailContent.append("commune d'information sur un formulaire Vradi.\n"); + mailContent.append("\n"); + mailContent.append("Cette invitation provient de:\n"); + mailContent.append(sender.getInfo()); + mailContent.append("\n\n"); + mailContent.append("Avec le message:\n"); + mailContent.append(message); + mailContent.append("\n\n"); + mailContent.append("Pour répondre à cette demande veuillez aller sur la page:\n"); + mailContent.append(url); + mailContent.append("\n\n"); + mailContent.append("Cordialement,"); + + VradiWebHelper.sendEmail(recipient, mailContent.toString()); + + return result; + } + + +} Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/ShowInvitationAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/ShowInvitationAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/ShowInvitationAction.java 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,79 @@ +package org.chorem.vradi.actions; + +import com.opensymphony.xwork2.ActionContext; +import java.util.Arrays; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.VradiWebHelper; +import org.chorem.vradi.entities.VradiUser; +import org.nuiton.jrst.JRST; +import org.nuiton.wikitty.WikittyProxy; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class ShowInvitationAction extends VradiBaseAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(ShowInvitationAction.class); + + static public ShowInvitationAction getAction() { + return (ShowInvitationAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY); + } + + protected String p; + protected String noteId; + protected VradiUser sender; + protected String senderInfo; + protected List<VradiUser> partners; + protected String message; + + public void setP(String p) { + this.p = p; + } + + public String getNoteId() { + return noteId; + } + + public VradiUser getSender() { + return sender; + } + + public String getSenderInfo() { + return senderInfo; + } + + public List<VradiUser> getPartners() { + return partners; + } + + public String getMessage() { + return message; + } + + @Override + public String execute() throws Exception { + String result = SUCCESS; + + WikittyProxy proxy = getProxy(); + + String datas = VradiWebHelper.decode(p); + String[] info = datas.split("\n", 4); + + noteId = info[0]; + sender = proxy.restore(VradiUser.class, info[1]); + senderInfo = VradiWebHelper.rstTo(JRST.TYPE_HTML_INNER_BODY, sender.getInfo()); + String[] partnersTab = info[2].split(","); + partners = proxy.restore(VradiUser.class, Arrays.asList(partnersTab)); + message = VradiWebHelper.rstTo(JRST.TYPE_HTML_INNER_BODY, info[3]); + + return result; + } +} Modified: trunk/vradi-web/src/main/resources/struts.xml =================================================================== --- trunk/vradi-web/src/main/resources/struts.xml 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/resources/struts.xml 2011-06-29 15:30:49 UTC (rev 107) @@ -177,6 +177,25 @@ <param name="userId">{1}</param> <result>/WEB-INF/jsp/userPreference.jsp</result> </action> + <!-- + | Affiche la page de recherche de partenaire + +--> + <action name="seekPartners/*" class="org.chorem.vradi.actions.SeekPartnersAction"> + <param name="noteId">{1}</param> + <result>/WEB-INF/jsp/seekPartners.jsp</result> + </action> + <!-- + | Envoi la demande de parteneriat aux personnes selectionnees + +--> + <action name="sendInvitation" class="org.chorem.vradi.actions.SendInvitationAction"> + <result>/WEB-INF/jsp/sendInvitation.jsp</result> + </action> + <!-- + | Affiche l'invitation grace au information de l'url (param p) + +--> + <action name="showInvitation" class="org.chorem.vradi.actions.ShowInvitationAction"> + <result>/WEB-INF/jsp/showInvitation.jsp</result> + </action> </package> <!-- @@ -251,13 +270,30 @@ </package> + <!-- + | Package pour des actions pour des appels ajax qui ne retourne pas du HTML + +--> <package name="ajax" namespace="/ajax" extends="restrictedArea"> <!-- | Essai de generer du HTML a partir d'un champs d'un objet ou du | parametre 'rst' +--> + <action name="raw/*/*" class="org.chorem.vradi.actions.RawAction"> + <param name="id">{1}</param> + <param name="fqField">{2}</param> + <param name="includes">Attachment\.content</param> + <result type="stream"> + <param name="contentDisposition">filename="${filename}"</param> + <param name="contentType">${mimeType}</param> + <param name="inputName">content</param> + </result> + </action> + <!-- + | Essai de generer du HTML a partir d'un champs d'un objet ou du + | parametre 'rst' + +--> <action name="rst" class="org.chorem.vradi.actions.RSTAction"> - <param name="includes">FormNote\.summary,FormNote\.content</param> + <param name="includes">FormNote\.summary,FormNote\.content,VradiUser\.info</param> <result type="stream"> <param name="contentType">${mimeType}</param> <param name="inputName">rstResult</param> Modified: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/attachmentList.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/attachmentList.jsp 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/attachmentList.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -4,6 +4,7 @@ Author : poussin --%> +<%@page import="com.opensymphony.xwork2.ActionContext"%> <%@page import="org.chorem.vradi.entities.Attachment"%> <%@page import="org.chorem.vradi.actions.AttachmentListAction"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> @@ -15,12 +16,23 @@ AttachmentListAction action = AttachmentListAction.getAction(); %> +<div id="actionResult" style="display: none;"></div> + <ul> - <% for (Attachment a : action.getAttachments()) { %> - <li><%=a.getDate()%> <%=a.getName()%> - <s:a action="" label="vradi.attachment.update"></s:a> - <s:a action="" label="vradi.attachment.history"></s:a> - <s:a action="" label="vradi.attachment.delete"></s:a> + <% for (Attachment a : action.getAttachments()) { + ActionContext.getContext().put("localAttachmentId", a.getWikittyId()); + %> + + <li><%=a.getDate()%><a href="/ajax/raw/<%=a.getWikittyId()%>/Attachment.content.action"><%=a.getName()%></a> + + <s:a action="/ajax/raw/%{}/Attachment.content" key="vradi.attachment.update"></s:a> + <s:a action="" key="vradi.attachment.history"></s:a> + <sj:a id="deleteAttachment-%{localAttachmentId}" href="/ajax/delete/%{localAttachmentId}" + targets="actionResult" indicator="indicator-deleteAttachment-%{localAttachmentId}" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.attachment.delete"/> + </sj:a> + <img id="indicator-deleteAttachment-<%=a.getWikittyId()%>" src="/img/indicator.gif" alt="deleting..." style="display:none"/> </li> <% } %> </ul> Modified: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -71,7 +71,7 @@ <s:a action="seekPartners/%{localNoteId}"><s:text name="vradi.formNote.seekPartners" /></s:a> <s:checkbox label="seeking partners" name="formNote.seekingPartners" value="%{localSeekingPartner}" - onchange="var url='/ajax/edit/%{localNoteId}.action?%{localFieldSeekingPartner}='+this.checked; var xhr=new XMLHttpRequest(); xhr.open('GET', url, true);xhr.send(null); alert(url);"/> + onchange="var url='/ajax/edit/%{localNoteId}.action?%{localFieldSeekingPartner}='+this.checked; var xhr=new XMLHttpRequest(); xhr.open('GET', url, true);xhr.send(null);"/> </div> <div> Added: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/seekPartners.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/seekPartners.jsp (rev 0) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/seekPartners.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,58 @@ +<%-- + Document : seekPartners + Created on : 31 mai 2011, 19:33:28 + Author : poussin +--%> + +<%@page import="com.opensymphony.xwork2.ActionContext"%> +<%@page import="org.chorem.vradi.actions.SeekPartnersAction"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> + +<%@taglib prefix="s" uri="/struts-tags"%> +<%@taglib prefix="sj" uri="/struts-jquery-tags"%> + +<% +SeekPartnersAction action = SeekPartnersAction.getAction(); +ActionContext.getContext().put("localPartners", action.getPartners()); +ActionContext.getContext().put("localNoteId", action.getNoteId()); +ActionContext.getContext().put("localNoteSummary", action.getNote().getSummary()); + +%> + +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <title><s:text name="vradi.seekingPartners.title" /></title> + <s:head/> + <sj:head jquerytheme="sunny"/> + </head> + <body> + <h1><s:text name="vradi.seekingPartners.title" /></h1> + + <s:form id="seekingPartnersForm" action="/sendInvitation.action" method="POST"> + <s:hidden name="noteId" value="%{localNoteId}"/> + <s:checkbox name="formReceiver" key="vradi.seekingPartners.formReceiver"/> + <s:checkbox name="seeker" key="vradi.seekingPartners.seeker"/> + <s:checkbox name="partners" key="vradi.seekingPartners.partners"/> + <s:select size="5" multiple="true" name="userId" list="%{localPartners}" listKey="wikittyId" listValue="login"/> + <sj:submit + id="partnersShowSubmit" + href="/fragment/partnerInfo.action" + targets="partnersShowResult" + value="Show" + indicator="indicator-partnersShowResult" + button="true" + /> + <div id="partnersShowResult"> + <img id="indicator-partnersShowResult" src="/img/indicator.gif" alt="wait..." style="display:none"/> + </div> + <s:checkbox name="invite" key="vradi.seekingPartners.invite"/> + <s:textfield name="inviteEmail" key="vradi.seekingPartners.inviteEmail"/> + + <s:textarea name="message" + value="%{localNoteSummary}" key="vradi.userPreference.info"/> + + </s:form> + </body> +</html> Added: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/sendInvitation.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/sendInvitation.jsp (rev 0) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/sendInvitation.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,30 @@ +<%-- + Document : sendInvitation + Created on : 1 juin 2011, 00:09:23 + Author : poussin +--%> + +<%@page import="org.chorem.vradi.actions.SendInvitationAction"%> +<%@page import="com.opensymphony.xwork2.ActionContext"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> + +<%@taglib prefix="s" uri="/struts-tags"%> +<%@taglib prefix="sj" uri="/struts-jquery-tags"%> + +<% +SendInvitationAction action = SendInvitationAction.getAction(); +%> + +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <title><s:text name="vradi.sendInvitation.title" /></title> + <s:head/> + <sj:head jquerytheme="sunny"/> + </head> + <body> + <h1><s:text name="vradi.sendInvitation.title" /></h1> + <s:text name="vradi.sendInvitation.count" />: <%=action.getSendCount()%> + </body> +</html> Added: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/showInvitation.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/showInvitation.jsp (rev 0) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/showInvitation.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -0,0 +1,75 @@ +<%-- + Document : showInvitation + Created on : 1 juin 2011, 01:42:32 + Author : poussin +--%> + +<%@page import="com.opensymphony.xwork2.ActionContext"%> +<%@page import="org.chorem.vradi.actions.ShowInvitationAction"%> +<%@page contentType="text/html" pageEncoding="UTF-8"%> + +<%@taglib prefix="s" uri="/struts-tags"%> +<%@taglib prefix="sj" uri="/struts-jquery-tags"%> + +<% +ShowInvitationAction action = ShowInvitationAction.getAction(); +ActionContext.getContext().put("localNoteId", action.getNoteId()); +ActionContext.getContext().put("localSenderId", action.getSender().getWikittyId()); +%> + +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <title><s:text name="vradi.showInvitation.title" /></title> + <s:head/> + <sj:head jquerytheme="sunny"/> + </head> + <body> + <h1><s:text name="vradi.showInvitation.title" /></h1> + + <div>L'invitation provient de: <%=action.getSender()%> + <p> + <%=action.getSenderInfo()%> + </p> + </div> + + <div> + Les autres partenaires sur le projet sont: + + <form id="partnersForm" action="/fragment/userInfo.action"> + <s:select size="5" name="userId" list="partners" listKey="wikittyId" listValue="login"/> + <sj:submit id="partnersSubmit" + value="Show" + targets="partnersInfo" indicator="indicator-partnersInfo" + button="true" buttonIcon="ui-icon-gear"/> + </form> + <div id="partnersInfo"> + <img id="indicator-partnersInfo" src="/img/indicator.gif" alt="Loading..." style="display:none"/> + </div> + </div> + + + <div>Le message de l'invitation est: + <p><%=action.getMessage()%></p> + </div> + + <div> + <sj:a id="acceptButton" href="/acceptInvitation/%{localNoteId}.action" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.showInvitation.accept"/> + </sj:a> + + <sj:a id="rejectButton" href="/rejectInvitation/%{localNoteId}.action" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.showInvitation.accept"/> + </sj:a> + + <sj:a id="noReceivedButton" href="/noReceivedInvitation/%{localSenderId}.action" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.showInvitation.accept"/> + </sj:a> + + </div> + </body> +</html> Modified: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userInfo.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userInfo.jsp 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userInfo.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -14,15 +14,14 @@ <% RestoreUserAction action = RestoreUserAction.getAction(); VradiUser user = action.getUser(); +String email = "no email"; +String info = action.getInfoHtml(); if (user != null) { - ActionContext.getContext().put("localUserEmail", user.getLogin()); - ActionContext.getContext().put("localUserInfo", action.getInfoHtml()); + email = user.getLogin(); + info = action.getInfoHtml(); } %> -<%-- - % on utilise s:property pour supprimer automatiquement les scripts et les tags html - % ce qui pourrait etre dangereux si on a un utilisateur mal vayant - %--%> -<s:property value="localUserEmail" default="no email" escape="true"/> -<s:property value="localUserInfo" default="no information" escape="true"/></pre> \ No newline at end of file +<a href="mailto:<%=email%>"><%=email%></a> + +<div><%=info%></div> \ No newline at end of file Modified: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userPreference.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userPreference.jsp 2011-06-29 14:45:18 UTC (rev 106) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/userPreference.jsp 2011-06-29 15:30:49 UTC (rev 107) @@ -59,6 +59,7 @@ | Personnes a qui on n'envoie plus les demandes +--> <div> + <h2><s:text name="vradi.userPreference.nosend" /></h2> <s:form id="noSendForm" action="/ajax/edit/%{localUserId}.action" method="POST"> <s:select size="5" name="userId" list="%{localUserNoSend}" listKey="wikittyId" listValue="login"/> <sj:submit @@ -89,6 +90,7 @@ | Personnes dont on ne recoit plus de demande +--> <div> + <h2><s:text name="vradi.userPreference.noreceived" /></h2> <s:form id="noReceivedForm" action="/ajax/edit/%{localUserId}.action" method="POST"> <s:select size="5" name="userId" list="%{localUserNoReceived}" listKey="wikittyId" listValue="login"/> <sj:submit @@ -115,5 +117,53 @@ </div> </div> + <!-- + | Personnes avec qui on a des notes partagees + +--> + <div> + <h2><s:text name="vradi.userPreference.partners" /></h2> + <s:form id="partnersForm" action="/fragment/partners/%{localUserId}.action" method="POST"> + <s:select size="5" name="userId" list="%{localPartners}" listKey="wikittyId" listValue="login"/> + <sj:submit + id="partnersFormShowSubmit" + href="/fragment/partnerInfo.action" + targets="partnersFormResult" + value="Show" + indicator="indicator-partnersForm" + button="true" + /> + <sj:submit + id="partnersFormShowFormSubmit" + targets="partnersFormResult" + value="Form" + indicator="indicator-partnersForm" + button="true" + /> + + </s:form> + + <div id="partnersFormResult"> + <img id="indicator-partnersForm" src="/img/indicator.gif" alt="wait..." style="display:none"/> + </div> + </div> + + <!-- + | Les notes ouvertes + +--> + <div> + <h2><s:text name="vradi.userPreference.note.open" /></h2> + + TODO + </div> + + <!-- + | Les notes closes + +--> + <div> + <h2><s:text name="vradi.userPreference.note.close" /></h2> + + TODO + </div> + </body> </html>
Il faut absoluement éviter d'utiliser des classes venant du package sun.xxx Tu as du avoir des gros warning à la compilation :( On Wed, 29 Jun 2011 17:30:49 +0200 (CEST) bpoussin@users.chorem.org wrote:
+import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + /** * Utilities class * @@ -7,9 +19,86 @@ */ public class VradiWebHelper {
+ /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(VradiWebHelper.class); + public static String escapeSciptBalises(String txt) {
// (?s) activ dotall (http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#DO...) - return txt.replaceAll("(?s)<script>.*</script>", ""); + return txt.replaceAll("(?s)<script.*?>.*</script>", ""); } + + /** + * Compresse en gzip la string passee en parametre, la passe en base64 + * et l'encode pour passer comme parametre d'une url + */ + public static String encode(String s) throws IOException { + String encType = "UTF-8"; + BASE64Encoder b64enc = new BASE64Encoder(); +
-- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
participants (2)
-
bpoussin@users.chorem.org -
Tony Chemit