xlawrence    2005/06/28 11:54:25 CEST

  Modified files:
    core/src/java/org/jahia/data/fields JahiaBigTextField.java 
  Log:
  some fixes and improvements regarding urlkeys
  
  Revision  Changes    Path
  1.15      +124 -29   
jahia/core/src/java/org/jahia/data/fields/JahiaBigTextField.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/data/fields/JahiaBigTextField.java.diff?r1=1.14&r2=1.15&f=h
  
  
  
  Index: JahiaBigTextField.java
  ===================================================================
  RCS file: 
/home/cvs/repository/jahia/core/src/java/org/jahia/data/fields/JahiaBigTextField.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- JahiaBigTextField.java    27 Jun 2005 15:55:29 -0000      1.14
  +++ JahiaBigTextField.java    28 Jun 2005 09:54:25 -0000      1.15
  @@ -29,6 +29,8 @@
   import java.util.StringTokenizer;
   
   import javax.servlet.http.HttpServletRequest;
  +import org.jahia.services.pages.ContentPage;
  +import org.jahia.services.pages.JahiaPage;
   
   public class JahiaBigTextField extends JahiaField implements
           JahiaAllowApplyChangeToAllLangField {
  @@ -187,7 +189,7 @@
               return true;
           }
           
  -        final String[] values = cleanUpHardCodedLinks(getValue(), 
jParams.getRequest(), 
  +        final String[] values = cleanUpHardCodedLinks(getValue(), 
jParams.getRequest(),
                   jParams.getLocale().toString());
           setRawValue(values[0]);
           setValue(values[1]);
  @@ -269,7 +271,7 @@
           return "bigtext_on";
       }
       
  -    public JahiaField cloneField(final int newctnid, final int newPageID, 
  +    public JahiaField cloneField(final int newctnid, final int newPageID,
               final int clonedAclID, final boolean childrenCloned) throws 
JahiaException {
           final JahiaField clonedField = ServicesRegistry.getInstance().
                   getJahiaFieldService().
  @@ -370,7 +372,7 @@
        * @param content The content of the BigText
        * @return a String with valid and usable URLs.
        */
  -    public static String rewriteURLs(final String content, final ParamBean 
jParams) {
  +    public static String rewriteURLs(String content, final ParamBean 
jParams) {
           logger.debug("rewriteURLs...");
           
           if (content == null || content.length() == 0) {
  @@ -379,14 +381,31 @@
           
           if (content.indexOf(URL_MARKER) < 0) { // nothing to rewrite...
               return content;
  -        } 
  +        }
           
           final StringBuffer buff = new StringBuffer();
           
  -        buff.append(jParams.getRequest().getContextPath()).
  -                append(SERVLET_PATH);
  +        final String path = 
buff.append(jParams.getRequest().getContextPath()).
  +                append(SERVLET_PATH).toString();
  +        buff.delete(0, buff.length());
           
           final String mode = jParams.getOperationMode();
  +        
  +        final StringTokenizer tokenizer = new StringTokenizer(content, " ");
  +        while (tokenizer.hasMoreTokens()) {
  +            final String token = tokenizer.nextToken();
  +            
  +            if (token.indexOf("/pid/") < 0) {
  +                continue;
  +            }
  +            
  +            final String res;
  +            if ((res = getURLwithURLKey(path, token, mode)) != null) {
  +                content = StringUtils.replace(content, token, res);
  +            }
  +        }
  +        
  +        buff.append(path);
           if (! ParamBean.NORMAL.equals(mode)) {
               buff.append("/op/").append(mode);
           }
  @@ -415,7 +434,7 @@
        * @return an Array of String. Position[0] contains the RawValue and 
position[1] the
        *         value that should be used when displaying the data
        */
  -    public String[] cleanUpHardCodedLinks( final String content, final 
HttpServletRequest req, 
  +    public String[] cleanUpHardCodedLinks( final String content, final 
HttpServletRequest req,
               final String code) {
           logger.debug("cleanUpHardCodedLinks...");
           internalLinks.clear();
  @@ -452,12 +471,12 @@
                       token = StringUtils.replaceOnce(rawToken, "/op/compare", 
"");
                       
                   } else {
  -                    token = StringUtils.replaceOnce(rawToken, "/op/preview", 
"");    
  +                    token = StringUtils.replaceOnce(rawToken, "/op/preview", 
"");
                   }
                   
               } else {
                   token = rawToken;
  -            }          
  +            }
               
               if (token.toLowerCase().startsWith("href") ) {
                   
  @@ -485,7 +504,8 @@
                   
                   // Check if the URL is a Jahia URL...
                   int pid = -1;
  -                if ( !(link.indexOf("pid") > -1 || hasOnlyDigits(link) || 
  +                String urlKey = null;
  +                if ( !(link.indexOf("pid") > -1 || hasOnlyDigits(link) ||
                           (pid = getPidFromUrlKey(link, 
contextAndServletPath)) > 0) ) {
                       logger.debug("Not a Jahia Link: "+ link);
                       rawResult.append(token);
  @@ -496,8 +516,11 @@
                   }
                   
                   if (pid > 0) {
  +                    // we got an URL key
  +                    urlKey = link.substring(link.lastIndexOf('/') + 1);
                       link = buff.append("/pid/").append(pid).toString();
                       buff.delete(0, buff.length());
  +                    logger.debug("urlKey: "+urlKey);
                   }
                   
                   logger.debug("\n\nFound a Jahia HardCoded link: " + token);
  @@ -518,8 +541,8 @@
                       buff.delete(0, buff.length());
                   }
                   
  -                // Get rid of the context and servlet path                
  -                if (link.indexOf(contextAndServletPath) > -1) {
  +                // Get rid of the context and servlet path
  +                if (link.startsWith(contextAndServletPath)) {
                       link = StringUtils.replaceOnce(link,
                               contextAndServletPath, "");
                   }
  @@ -550,27 +573,42 @@
                           rawResult.append(URL_MARKER);
                       }
                       
  -                    final Integer pageID = new 
Integer(Integer.parseInt(getPID(link)));
  +                    final Integer pageID;
  +                    if ( pid > 0) {
  +                        pageID = new Integer(pid);
  +                        displayResult.append('/');
  +                        displayResult.append(urlKey);
  +                    } else {
  +                        pageID = new Integer(Integer.parseInt(getPID(link)));
  +                    }
  +                    
                       if (! internalLinks.contains(pageID)) {
                           internalLinks.add(pageID);
                       }
                       
  -                    // If no language is present in the link, put the 
current language
  +                    // If no language is present in the link, 
  +                    // put the current language, except for url keys
                       if (link.indexOf("lang/") < 0) {
                           rawResult.append("/lang/");
                           rawResult.append(code);
  -                        displayResult.append("/lang/");
  -                        displayResult.append(code);
  +                        if (pid == -1) {
  +                            displayResult.append("/lang/");
  +                            displayResult.append(code);
  +                        }
                       }
                       
                       // All links should have a pid
                       if (link.indexOf("pid/") < 0) {
                           rawResult.append("/pid");
  -                        displayResult.append("/pid");
  +                        if ( pid == -1) {
  +                            displayResult.append("/pid");
  +                        }
                       }
                   }
                   
  -                displayResult.append(link);
  +                if (pid == -1) {
  +                    displayResult.append(link);
  +                }
                   displayResult.append("\"");
                   rawResult.append(link);
                   rawResult.append("\"");
  @@ -602,20 +640,20 @@
       /**
        * Tries to find a matching pid value from a possible URL key contained
        * in the given link.
  -     * 
  +     *
        * @return The pid value or -1 if not found or something went wrong
        */
  -    protected int getPidFromUrlKey(String link, final String context) { 
  +    protected int getPidFromUrlKey(String link, final String context) {
           logger.debug("getPidFromUrlKey: " + link);
           if (link == null || link.length() == 0 ||
                   link.indexOf(context) < 0) { return -1; }
           
  -        final String urlKey = link.substring(link.lastIndexOf('/') + 1);
  +        final String urlKey = new 
String(link.substring(link.lastIndexOf('/') + 1));
  +        logger.debug("urlKey: "+urlKey);
           
           try {
               final List pageProperties = ServicesRegistry.getInstance().
                       getJahiaPageService().getPagePropertiesByValue(urlKey);
  -            logger.debug("pageProperties.size(): "+pageProperties.size());
               if (pageProperties.size() == 1) {
                   final PageProperty pageProperty = (PageProperty) 
pageProperties.get(0);
                   if 
(pageProperty.getName().equals(PageProperty.PAGE_URL_KEY_PROPNAME)) {
  @@ -633,20 +671,56 @@
       }
       
       /**
  +     *
  +     */
  +    protected static String getURLKeyFromPID(int pid) throws JahiaException {
  +        final ContentPage page;
  +        try {
  +            page = ContentPage.getPage(pid);
  +        } catch (Exception e) { return null; }
  +        
  +        if (page == null) { return null; }
  +        
  +        final PageProperty prop = page.getPageLocalProperty(
  +                PageProperty.PAGE_URL_KEY_PROPNAME);
  +        
  +        if (prop != null) {
  +            return prop.getValue();
  +            
  +        } else {
  +            return null;
  +            
  +        }
  +    }
  +    
  +    /**
        * Returns true if the given String object only contains numbers
        */
  -    protected boolean hasOnlyDigits(final String s) {
  +    protected static boolean hasOnlyDigits(final String s) {
           for (int i=0; i<s.length(); i++) {
               if (! Character.isDigit(s.charAt(i))) { return false; }
           }
           return true;
       }
  -      
  +    
       /**
        *
        */
  -    protected String getPID(final String s) { 
  -        final String value = s.substring(s.lastIndexOf('/') + 1);
  +    protected static String getPID(final String s) {
  +        logger.debug("Getting PID from: "+s);
  +        System.out.println(s);
  +        final StringBuffer buff = new StringBuffer();
  +        final String value;
  +        final int index;
  +        if ( (index = s.indexOf("/pid/")) > -1 ) {
  +            value = s.substring(index + 5);
  +            
  +        } else if (s.startsWith("/")) {
  +            value = s.substring(1);
  +            
  +        } else {
  +            value = s;
  +        }
           
           if (hasOnlyDigits(value)) {
               return value;
  @@ -661,9 +735,30 @@
               }
           }
           
  -        final String res = buff.toString();
  -        buff.delete(0, buff.length());
  -        return res;
  +        return buff.toString();
  +    }
  +    
  +    /**
  +     */
  +    protected static String getURLwithURLKey(String path, String rawURL, 
String mode) {
  +        final StringBuffer buff = new StringBuffer();
  +        final String pid = rawURL.substring(rawURL.indexOf("/pid/"));
  +        
  +        final String urlKey;
  +        try {
  +            urlKey = getURLKeyFromPID(Integer.parseInt(getPID(pid)));
  +        } catch (JahiaException e) { return null; }
  +        
  +        if (urlKey == null) { return null; }
  +        
  +        buff.append("href=\"").append(path).append('/').append(urlKey);
  +        
  +        if (! ParamBean.NORMAL.equals(mode)) {
  +            buff.append("/op/").append(mode);
  +        }
  +        
  +        buff.append(rawURL.substring(rawURL.indexOf(">") - 1));
  +        return buff.toString();
       }
       
       /**
  

Reply via email to