1 /* 2 * Copyright (c) 2002-2014, Mairie de Paris 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice 10 * and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice 13 * and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * License 1.0 33 */ 34 package fr.paris.lutece.plugins.sponsoredlinks.business; 35 36 import org.apache.commons.lang.StringUtils; 37 38 import java.util.regex.Matcher; 39 import java.util.regex.Pattern; 40 41 42 /** 43 * 44 * class SponsoredLink. 45 * Note: this class has a natural ordering that is inconsistent with equals. 46 * See {@link #compareTo(SponsoredLink) compareTo} 47 * 48 */ 49 public class SponsoredLink implements java.lang.Comparable<SponsoredLink> 50 { 51 // Number of the capturing group according to the regex 52 /** Key for the href attribute in the link */ 53 public static final int HREF = 1; 54 55 /** Key for the title attribute in the link */ 56 public static final int TITLE = 2; 57 58 /** Key for the alt attribute in the link */ 59 public static final int ALT = 3; 60 61 /** Key for the content in the link */ 62 public static final int CONTENT = 4; 63 64 //Regex used to validate a link and capture data from it 65 //^<a\b(?:href="([^>]*?)"|title="([^>]*?)"|alt="([^>]*?)"|[^>]*?)*>(.*?)</a>$ 66 private static final String SPONSORED_LINK_REGEX = "^<a\\b(?:" + //opening of <a> tag and start of a non-capturing group 67 "href=\"([^>]*?)\"|" + //href attribute with capturing group #1 68 "title=\"([^>]*?)\"|" + //title attribute with capturing group #2 69 "alt=\"([^>]*?)\"|" + //alt attribute with capturing group #3 70 "[^>]*?" + // any non-matching attribute 71 ")*>" + // end of the non-capturing group and closing of the <a> tag 72 "(.*?)" + // inner content with capturing group #4 73 "</a>$"; // closing tag 74 75 //Pre-compiled representation of the regex. 76 private static final Pattern _pattern = Pattern.compile( SPONSORED_LINK_REGEX, Pattern.CASE_INSENSITIVE ); 77 private int _nOrder; 78 private String _strLink; 79 80 /** 81 * 82 * @return the order of the SponsoredLink in the set 83 */ 84 public int getOrder( ) 85 { 86 return _nOrder; 87 } 88 89 /** 90 * Sets the order of the SponsoredLink in the set 91 * @param order The order in the set 92 */ 93 public void setOrder( int order ) 94 { 95 _nOrder = order; 96 } 97 98 /** 99 * 100 * @return the html link of this SponsoredLink 101 */ 102 public String getLink( ) 103 { 104 return _strLink; 105 } 106 107 /** 108 * Sets the html link of this SponsoredLink 109 * @param link The url 110 */ 111 public void setLink( String link ) 112 { 113 _strLink = link; 114 } 115 116 /** 117 * Defines the ordering of SponsoredLink object based on their {@link #getOrder() order} 118 * @param otherLink the SponsoredLink to be compared 119 * @return -1 if otherLink is greater, 0 if equal 1 otherwise 120 */ 121 public int compareTo( SponsoredLink otherLink ) 122 { 123 int otherOrder = otherLink.getOrder( ); 124 125 if ( otherOrder > _nOrder ) 126 { 127 return -1; 128 } 129 else 130 { 131 if ( otherOrder == _nOrder ) 132 { 133 return 0; 134 } 135 else 136 { 137 return 1; 138 } 139 } 140 } 141 142 /** 143 * Check if the link is a valid html link (as returned by an InsertService). 144 * The link must at least contain non-empty href attribute and content. 145 * Has to match the pattern <a (attr="[^>]*")*>.*</a> 146 * @return true if the link is valid html 147 */ 148 public boolean isValidLink( ) 149 { 150 if ( StringUtils.isBlank( _strLink ) ) 151 { 152 return false; 153 } 154 155 Matcher matcher = _pattern.matcher( _strLink ); 156 157 if ( !matcher.matches( ) ) 158 { 159 return false; 160 } 161 162 String strHref = matcher.group( HREF ); 163 String strContent = matcher.group( CONTENT ); 164 165 if ( StringUtils.isBlank( strHref ) || StringUtils.isBlank( strContent ) ) 166 { 167 return false; 168 } 169 170 return true; 171 } 172 173 /** 174 * Parses the link to find the specified attribute or the content. 175 * The link has to be valid html. 176 * @param nAttr the key for the attribute. Has to be in the set 177 * {ALT, HREF, TITLE, CONTENT} 178 * @return the attribute/content if exists. Returns null if the link is null 179 * and if the key or the link is not valid 180 */ 181 public String getLinkAttribute( int nAttr ) 182 { 183 if ( StringUtils.isBlank( _strLink ) || 184 ( ( nAttr != HREF ) && ( nAttr != ALT ) && ( nAttr != TITLE ) && ( nAttr != CONTENT ) ) ) 185 { 186 return null; 187 } 188 189 String strHrefAttr = null; 190 Matcher matcher = _pattern.matcher( _strLink ); 191 192 if ( matcher.matches( ) ) 193 { 194 strHrefAttr = matcher.group( nAttr ); 195 } 196 197 return strHrefAttr; 198 } 199 }