Author: agilliland
Date: Wed May 23 18:16:08 2007
New Revision: 541128

URL: http://svn.apache.org/viewvc?view=rev&rev=541128
Log:
adding some better validation for template editor and a few other little fixes.


Added:
    
roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit-validation.xml
Modified:
    roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit.java
    roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEditBean.java
    roller/trunk/web/WEB-INF/classes/struts.xml
    roller/trunk/web/WEB-INF/jsps/editor/TemplateEdit.jsp

Added: 
roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit-validation.xml
URL: 
http://svn.apache.org/viewvc/roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit-validation.xml?view=auto&rev=541128
==============================================================================
--- 
roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit-validation.xml
 (added)
+++ 
roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit-validation.xml
 Wed May 23 18:16:08 2007
@@ -0,0 +1,30 @@
+<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+       "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd";>
+<validators>
+    
+    <field name="bean.name">
+        <field-validator type="requiredstring">
+            <message key="TemplateEdit.error.nameNull">unspecified 
key</message>
+        </field-validator>
+        
+        <field-validator type="stringlength">
+            <param name="maxLength">255</param>
+            <message key="TemplateEdit.error.nameSize">unspecified 
key</message>
+        </field-validator>
+    </field>
+    
+    <field name="bean.link">
+        <field-validator type="stringlength">
+            <param name="maxLength">255</param>
+            <message key="TemplateEdit.error.linkSize">unspecified 
key</message>
+        </field-validator>
+    </field>
+    
+    <field name="bean.description">
+        <field-validator type="stringlength">
+            <param name="maxLength">255</param>
+            <message key="TemplateEdit.error.descriptionSize">unspecified 
key</message>
+        </field-validator>
+    </field>
+    
+</validators>
\ No newline at end of file

Modified: roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit.java?view=diff&rev=541128&r1=541127&r2=541128
==============================================================================
--- roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit.java 
(original)
+++ roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEdit.java Wed 
May 23 18:16:08 2007
@@ -29,14 +29,11 @@
 import org.apache.roller.business.UserManager;
 import org.apache.roller.config.RollerConfig;
 import org.apache.roller.pojos.PermissionsData;
-import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WeblogTemplate;
-import org.apache.roller.pojos.WebsiteData;
-import org.apache.roller.ui.core.util.menu.Menu;
-import org.apache.roller.ui.core.util.menu.MenuHelper;
 import org.apache.roller.ui.struts2.util.UIAction;
 import org.apache.roller.util.Utilities;
 import org.apache.roller.util.cache.CacheManager;
+import org.apache.struts2.interceptor.validation.SkipValidation;
 
 
 /**
@@ -79,6 +76,7 @@
     /**
      * Show template edit page.
      */
+    @SkipValidation
     public String execute() {
         
         if(getTemplate() == null) {
@@ -98,7 +96,7 @@
             getBean().setManualContentType(page.getOutputContentType());
         }
         
-        return SUCCESS;
+        return INPUT;
     }
     
     
@@ -118,28 +116,28 @@
         
         if(!hasActionErrors()) try {
             
-            WeblogTemplate page = getTemplate();
-            getBean().copyTo(page);
-            page.setLastModified(new Date());
+            WeblogTemplate template = getTemplate();
+            getBean().copyTo(template);
+            template.setLastModified(new Date());
             
             if (getBean().getAutoContentType() == null ||
                     !getBean().getAutoContentType().booleanValue()) {
-                page.setOutputContentType(getBean().getManualContentType());
+                
template.setOutputContentType(getBean().getManualContentType());
             } else {
-                // empty content-type indicates that page uses auto 
content-type detection
-                page.setOutputContentType(null);
+                // empty content-type indicates that template uses auto 
content-type detection
+                template.setOutputContentType(null);
             }
             
             // save template and flush
             UserManager mgr = RollerFactory.getRoller().getUserManager();
-            mgr.savePage(page);
+            mgr.savePage(template);
             RollerFactory.getRoller().flush();
             
             // notify caches
-            CacheManager.invalidate(page);
+            CacheManager.invalidate(template);
             
             // success message
-            addMessage("pageForm.save.success", page.getName());
+            addMessage("pageForm.save.success", template.getName());
             
         } catch (RollerException ex) {
             log.error("Error updating page - "+getBean().getId(), ex);
@@ -147,7 +145,7 @@
             addError("Error saving template");
         }
         
-        return SUCCESS;
+        return INPUT;
     }
     
     
@@ -158,17 +156,30 @@
     
     private void myValidate() {
         
-        // make sure that we have an appropriate name value
-        
-        // make sure that we have an appropriate action value
-        
-        // first off, check if template already exists
-//        WeblogTemplate existingPage = mgr.getPageByName(website, 
getNewTmplName());
-//        if(existingPage != null) {
-//            addError("pagesForm.error.alreadyExists", getNewTmplName());
-//            return INPUT;
-//        }
+        // if name changed make sure there isn't a conflict
+        if(!getTemplate().getName().equals(getBean().getName())) {
+            try {
+                UserManager umgr = RollerFactory.getRoller().getUserManager();
+                if(umgr.getPageByName(getActionWeblog(), getBean().getName()) 
!= null) {
+                    addError("pagesForm.error.alreadyExists", 
getBean().getName());
+                }
+            } catch (RollerException ex) {
+                log.error("Error checking page name uniqueness", ex);
+            }
+        }
         
+        // if link changed make sure there isn't a conflict
+        if(!StringUtils.isEmpty(getBean().getLink()) &&
+                !getBean().getLink().equals(getTemplate().getLink())) {
+            try {
+                UserManager umgr = RollerFactory.getRoller().getUserManager();
+                if(umgr.getPageByLink(getActionWeblog(), getBean().getLink()) 
!= null) {
+                    addError("pagesForm.error.alreadyExists", 
getBean().getLink());
+                }
+            } catch (RollerException ex) {
+                log.error("Error checking page link uniqueness", ex);
+            }
+        }
     }
     
     

Modified: 
roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEditBean.java
URL: 
http://svn.apache.org/viewvc/roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEditBean.java?view=diff&rev=541128&r1=541127&r2=541128
==============================================================================
--- roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEditBean.java 
(original)
+++ roller/trunk/src/org/apache/roller/ui/struts2/editor/TemplateEditBean.java 
Wed May 23 18:16:08 2007
@@ -28,17 +28,14 @@
  */
 public class TemplateEditBean {
     
-    private String id;
-    private String action;
-    private String name;
-    private String description;
-    private String link;
-    private String contents;
-    private String templateLanguage;
-    private boolean navbar;
-    private boolean hidden;
-    private String outputContentType;
-    
+    private String id = null;
+    private String name = null;
+    private String description = null;
+    private String link = null;
+    private String contents = null;
+    private String templateLanguage = null;
+    private boolean navbar= false;
+    private boolean hidden = false;
     private Boolean autoContentType = Boolean.TRUE;
     private String manualContentType = null;
     
@@ -51,14 +48,6 @@
         this.id = id;
     }
     
-    public String getAction() {
-        return this.action;
-    }
-    
-    public void setAction( String action ) {
-        this.action = action;
-    }
-    
     public String getName() {
         return this.name;
     }
@@ -115,14 +104,6 @@
         this.hidden = hidden;
     }
     
-    public String getOutputContentType() {
-        return this.outputContentType;
-    }
-    
-    public void setOutputContentType( String outputContentType ) {
-        this.outputContentType = outputContentType;
-    }
-    
     public Boolean getAutoContentType() {
         return autoContentType;
     }
@@ -142,33 +123,36 @@
     
     public void copyTo(WeblogTemplate dataHolder) {
         
-        // only custom templates get to modify name, description, and link
-        if(WeblogTemplate.ACTION_CUSTOM.equals(dataHolder.getAction())) {
-            dataHolder.setName(this.name);
-            dataHolder.setDescription(this.description);
-            dataHolder.setLink(this.link);
-        }
+        dataHolder.setContents(getContents());
         
-        dataHolder.setContents(this.contents);
-        dataHolder.setTemplateLanguage(this.templateLanguage);
-        dataHolder.setNavbar(this.navbar);
-        dataHolder.setHidden(this.hidden);
-        dataHolder.setOutputContentType(this.outputContentType);
+        // the rest of the template properties can only be modified when
+        // dealing with a CUSTOM weblog template
+        if(dataHolder.isCustom()) {
+            dataHolder.setName(getName());
+            dataHolder.setDescription(getDescription());
+            dataHolder.setLink(getLink());
+            dataHolder.setNavbar(isNavbar());
+            dataHolder.setHidden(isHidden());
+            dataHolder.setTemplateLanguage(getTemplateLanguage());
+        }
     }
     
     
     public void copyFrom(WeblogTemplate dataHolder) {
         
         this.id = dataHolder.getId();
-        this.action = dataHolder.getAction();
         this.name = dataHolder.getName();
         this.description = dataHolder.getDescription();
         this.link = dataHolder.getLink();
         this.contents = dataHolder.getContents();
-        this.templateLanguage = dataHolder.getTemplateLanguage();
         this.navbar = dataHolder.isNavbar();
         this.hidden = dataHolder.isHidden();
-        this.outputContentType = dataHolder.getOutputContentType();
+        this.templateLanguage = dataHolder.getTemplateLanguage();
+        
+        setManualContentType(dataHolder.getOutputContentType());
+        if(getManualContentType() != null) {
+            setAutoContentType(Boolean.FALSE);
+        }
     }
     
 }

Modified: roller/trunk/web/WEB-INF/classes/struts.xml
URL: 
http://svn.apache.org/viewvc/roller/trunk/web/WEB-INF/classes/struts.xml?view=diff&rev=541128&r1=541127&r2=541128
==============================================================================
--- roller/trunk/web/WEB-INF/classes/struts.xml (original)
+++ roller/trunk/web/WEB-INF/classes/struts.xml Wed May 23 18:16:08 2007
@@ -347,7 +347,7 @@
         <action name="templateEdit!*" method="{1}"
                 class="org.apache.roller.ui.struts2.editor.TemplateEdit">
             <result name="list" type="chain">templates</result>
-            <result name="success" type="tiles">.TemplateEdit</result>
+            <result name="input" type="tiles">.TemplateEdit</result>
             <result name="cancel" type="redirect-action">templates</result>
         </action>
         

Modified: roller/trunk/web/WEB-INF/jsps/editor/TemplateEdit.jsp
URL: 
http://svn.apache.org/viewvc/roller/trunk/web/WEB-INF/jsps/editor/TemplateEdit.jsp?view=diff&rev=541128&r1=541127&r2=541128
==============================================================================
--- roller/trunk/web/WEB-INF/jsps/editor/TemplateEdit.jsp (original)
+++ roller/trunk/web/WEB-INF/jsps/editor/TemplateEdit.jsp Wed May 23 18:16:08 
2007
@@ -34,7 +34,6 @@
 <s:form action="templateEdit!save" id="template">
     <s:hidden name="weblog" />
     <s:hidden name="bean.id"/>
-    <s:hidden name="bean.action" />
     
     <%-- ================================================================== 
--%>
     <%-- Name, link and desription: disabled when page is a required page --%>
@@ -61,9 +60,9 @@
         
         // Update page URL when user changes link
         function updatePageURLDisplay() {
-            var previewSpan = document.getElementById("handlePreview");
+            var previewSpan = document.getElementById('linkPreview');
             var n1 = previewSpan.firstChild;
-            var n2 = 
document.createTextNode(document.weblogTemplateFormEx.link.value);
+            var n2 = 
document.createTextNode(document.getElementById('template_bean_link').value);
             if (n1 == null) {
                 previewSpan.appendChild(n2);
             } else {
@@ -72,25 +71,16 @@
         }
         // Don't launch page if user has changed link, it'll be a 404
         function launchPage() {
-            if (originalLink != document.weblogTemplateFormEx.link.value) {
+            if (originalLink != 
document.getElementById('template_bean_link').value) {
                 window.alert("Link changed, not launching page");
             } else {
                 window.open(weblogURL + '/page/' + originalLink, '_blank');
             }
         }
-        // Only highlight launch link user hasn't changed link
-        function highlightLaunchLink() {
-            if (originalLink == document.weblogTemplateFormEx.link.value) {
-                document.getElementById('launchLink').style.textDecoration = 
'underline';
-            }
-        }
-        function unhighlightLaunchLink() {
-                document.getElementById('launchLink').style.textDecoration = 
'none';
-        }
         -->
         </script>
         
-        <s:if test="!template.required">
+        <s:if test="!template.required && template.custom">
             <tr>
                 <td class="label" valign="top"><s:text name="pageForm.link" 
/>&nbsp;</td>
                 <td class="field">
@@ -102,9 +92,8 @@
                         <s:textfield name="bean.link" size="50" 
onkeyup="updatePageURLDisplay()" />
                     </s:else>
                     <br />
-                    <s:property value="actionWeblog.absoluteURL" />/page/<span 
id="handlePreview" style="color:red"><s:property value="bean.link" /></span>
-                    [<span id="launchLink" class="fakelink" 
-                           onClick="launchPage()" 
onMouseOver="highlightLaunchLink()" 
onMouseOut="unhighlightLaunchLink()"><s:text name="pageForm.launch" /></span>]
+                    <s:property value="actionWeblog.absoluteURL" />/page/<span 
id="linkPreview" style="color:red"><s:property value="bean.link" /></span>
+                    <s:if test="template.link != null">[<a id="launchLink" 
onClick="launchPage()"><s:text name="pageForm.launch" /></a>]</s:if>
                 </td>
                 <td class="description"></td>
             </tr>
@@ -171,123 +160,86 @@
     <%-- ================================================================== 
--%>
     <%-- Advanced settings inside a control toggle --%>
     
-    <br />
-    <br />
-    <div id="advancedControlToggle" class="controlToggle">
-        <span id="iadvancedControl">+</span>
-        <a class="controlToggle" 
onclick="javascript:toggleControl('advancedControlToggle','advancedControl')">
-        <s:text name="pageForm.advancedSettings" /></a>
-    </div>
-    <div id="advancedControl" class="advancedControl" style="display:none">
+    <s:if test="template.custom">
+        <br />
+        <div id="advancedControlToggle" class="controlToggle">
+            <span id="iadvancedControl">+</span>
+            <a class="controlToggle" 
onclick="javascript:toggleControl('advancedControlToggle','advancedControl')">
+            <s:text name="pageForm.advancedSettings" /></a>
+        </div>
         
-        <table cellspacing="0">
+        <div id="advancedControl" class="advancedControl" style="display:none">
             
-            <tr>
-                <script type="text/javascript"><!--
-                    function showContentTypeField() {
-                        if 
(document.getElementById('template_bean_autoContentType1').checked) {
-                            
document.getElementById('template_bean_manualContentType').readOnly = true;
-                            
document.getElementById('template_bean_manualContentType').style.background = 
'#e5e5e5';
-                        } else {
-                            
document.getElementById('template_bean_manualContentType').readOnly = false;
-                            
document.getElementById('template_bean_manualContentType').style.background = 
'#ffffff';
+            <table cellspacing="6">
+                <tr>
+                    <td class="label" valign="top"><s:text 
name="pageForm.outputContentType" />&nbsp;</td>
+                    <td class="field">
+                        <script type="text/javascript"><!--
+                        function showContentTypeField() {
+                            if 
(document.getElementById('template_bean_autoContentType1').checked) {
+                                
document.getElementById('template_bean_manualContentType').readOnly = true;
+                                
document.getElementById('template_bean_manualContentType').style.background = 
'#e5e5e5';
+                            } else {
+                                
document.getElementById('template_bean_manualContentType').readOnly = false;
+                                
document.getElementById('template_bean_manualContentType').style.background = 
'#ffffff';
+                            }
                         }
-                    }
-                // --></script> 
-                <td class="field">                
-                    <tr>
-                        <td class="label" valign="top"><s:text 
name="pageForm.outputContentType" />&nbsp;</td>
-                        <td class="field">
-                            <s:if test="bean.autoContentType">
-                                <input type="radio" 
name="bean.autoContentType" value="true" checked="true" 
onchange="showContentTypeField()" id="template_bean_autoContentType1"/> 
-                                <s:text name="pageForm.useAutoContentType" 
/><br />
-                                
-                                <input type="radio" 
name="bean.autoContentType" value="false" onchange="showContentTypeField()" 
id="template_bean_autoContentType2"/>
-                                <s:text name="pageForm.useManualContentType" />
-                                <s:textfield name="bean.manualContentType" />
-                            </s:if>
-                            <s:else>
-                                <input type="radio" 
name="bean.autoContentType" value="true" onchange="showContentTypeField()" 
id="template_bean_autoContentType1"/> 
-                                <s:text name="pageForm.useAutoContentType" 
/><br />
-                                
-                                <input type="radio" 
name="bean.autoContentType" value="false" checked="true" 
onchange="showContentTypeField()" id="template_bean_autoContentType2"/>
-                                <s:text name="pageForm.useManualContentType" />
-                                <s:textfield name="bean.manualContentType" />
-                            </s:else>
+                        // --></script>
+                        <s:if test="bean.autoContentType">
+                            <input type="radio" name="bean.autoContentType" 
value="true" checked="true" onchange="showContentTypeField()" 
id="template_bean_autoContentType1"/> 
+                            <s:text name="pageForm.useAutoContentType" /><br />
                             
-                            <br />
-                            <br />
-                                               
-                        </td>
-                        <td class="description"></td>
-                    </tr>
-                </td>
-                <td class="description"></td>
-                <script type="text/javascript"><!--
-                    showContentTypeField();
-                // --></script> 
-            </tr>
-            
-            <tr>
-                <td class="field">                
-                    <s:if test="template.required">
-                        <s:hidden name="bean.navbar" />
-                    </s:if>
-                    <s:else>
-                        <tr>
-                            <td class="label"><s:text name="pageForm.navbar" 
/>&nbsp;</td>
-                            <td class="field"><s:checkbox name="bean.navbar" 
/> 
-                                <s:text name="pageForm.navbar.tip" />
-                            </td>
-                            <td class="description"></td>
-                        </tr>
-                    </s:else>
-                </td>
-                <td class="description"></td>
-            </tr>
-            
-            <td class="field">                
-                <s:if test="template.required">
-                    <s:hidden name="bean.hidden" />
-                </s:if>
-                <s:else>
-                    <tr>
-                        <td class="label"><s:text name="pageForm.hidden" 
/>&nbsp;</td>
-                        <td class="field"><s:checkbox name="bean.hidden" />
-                            <s:text name="pageForm.hidden.tip" />
-                        </td>
-                        <td class="description"></td>                          
  
-                    </tr>
-                </s:else>
-                <br />
-                <br />
-
-            </td>
-            <td class="description"></td> 
-            </tr>
+                            <input type="radio" name="bean.autoContentType" 
value="false" onchange="showContentTypeField()" 
id="template_bean_autoContentType2"/>
+                            <s:text name="pageForm.useManualContentType" />
+                            <s:textfield name="bean.manualContentType" />
+                        </s:if>
+                        <s:else>
+                            <input type="radio" name="bean.autoContentType" 
value="true" onchange="showContentTypeField()" 
id="template_bean_autoContentType1"/> 
+                            <s:text name="pageForm.useAutoContentType" /><br />
+                            
+                            <input type="radio" name="bean.autoContentType" 
value="false" checked="true" onchange="showContentTypeField()" 
id="template_bean_autoContentType2"/>
+                            <s:text name="pageForm.useManualContentType" />
+                            <s:textfield name="bean.manualContentType" />
+                        </s:else>
                         
-            <tr>
-                <td class="field">                
-                    <s:if test="template.required || !userIsAdmin}">
-                        <s:hidden name="bean.templateLanguage" />
-                    </s:if>
-                    <s:else>
-                        <tr>
-                            <td class="label"><s:text 
name="pageForm.templateLanguage" />&nbsp;</td>
-                            <td class="field">
-                                <s:select name="bean.templateLanguage" 
list="templateLanguages" size="1" />
-                            </td>
-                            <td class="description"></td>
-                        </tr>
-                    </s:else>
-                </td>
-                <td class="description"></td>
-            </tr>
+                        <br />
+                        <br />
                         
-        </table>
-        <br />
-        
-    </div>
-    <br />
+                        <script type="text/javascript"><!--
+                            showContentTypeField();
+                        // --></script> 
+                        
+                    </td>
+                    <td class="description"></td>
+                </tr>
+                
+                <tr>
+                    <td class="label"><s:text name="pageForm.navbar" 
/>&nbsp;</td>
+                    <td class="field"><s:checkbox name="bean.navbar" /> 
+                        <s:text name="pageForm.navbar.tip" />
+                    </td>
+                    <td class="description"></td>
+                </tr>
+                
+                <tr>
+                    <td class="label"><s:text name="pageForm.hidden" 
/>&nbsp;</td>
+                    <td class="field"><s:checkbox name="bean.hidden" />
+                        <s:text name="pageForm.hidden.tip" />
+                    </td>
+                    <td class="description"></td>                            
+                </tr>
+                
+                <tr>
+                    <td class="label"><s:text name="pageForm.templateLanguage" 
/>&nbsp;</td>
+                    <td class="field">
+                        <s:select name="bean.templateLanguage" 
list="templateLanguages" size="1" />
+                    </td>
+                    <td class="description"></td>
+                </tr>
+                
+            </table>
+            
+        </div>
+    </s:if>
     
 </s:form>


Reply via email to