/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.replacement.smiley; import java.util.*; import net.java.sip.communicator.service.replacement.*; import net.java.sip.communicator.service.replacement.smilies.*; import net.java.sip.communicator.util.*; /** * Implements the {@link ReplacementService} to provide smiley as replacement * source. * * @author Yana Stamcheva * @author Purvesh Sahoo * @author Adam Netocny */ public class ReplacementServiceSmileyImpl implements SmiliesReplacementService { /** * The <tt>Logger</tt> used by the <tt>ReplacementServiceSmileyImpl</tt> * class and its instances for logging output. */ private static final Logger logger = Logger.getLogger(ReplacementServiceSmileyImpl.class); /** * The <tt>List</tt> of smiley strings which are matched by * {@link #smileyRegex}. */ private static final List<String> smileyStrings = new ArrayList<String>(); /** * Configuration label shown in the config form. */ public static final String SMILEY_SOURCE = "SMILEY"; /** * The regex used to match the smilies in the message. */ public static String smileyRegex; /** * Replaces the smiley strings with their corresponding smiley image. * * @param sourceString the original smiley string. * @return the smiley image replaced for the smiley string; the original * smiley string in case of no match. */ public String getReplacement(final String sourceString) { try { Smiley smiley = Resources.getSmiley(sourceString.trim()); if (smiley != null) return smiley.getImagePath(); } catch (Exception e) { logger.error( "Failed to get smiley replacement for " + sourceString, e); } return sourceString; } /** * Gets a regex string which matches the smiley strings of the specified * <tt>Collection</tt> of <tt>Smiley</tt>s. * * @param smileys the <tt>Collection</tt> of <tt>Smiley</tt>s for which to * get a compiled <tt>Pattern</tt> which matches its smiley * strings * @return a regex string which matches the smiley strings of the specified * <tt>Collection</tt> of <tt>Smiley</tt>s */ private static String getSmileyPattern(Collection<Smiley> smileys) { synchronized (smileyStrings) { boolean smileyStringsIsEqual; if (smileyRegex == null) smileyStringsIsEqual = false; else { smileyStringsIsEqual = true; int smileyStringIndex = 0; int smileyStringCount = smileyStrings.size(); smileyLoop: for (Smiley smiley : smileys) for (String smileyString : smiley.getSmileyStrings()) if ((smileyStringIndex < smileyStringCount) && smileyString.equals(smileyStrings .get(smileyStringIndex))) smileyStringIndex++; else { smileyStringsIsEqual = false; break smileyLoop; } if (smileyStringsIsEqual && (smileyStringIndex != smileyStringCount)) smileyStringsIsEqual = false; } if (!smileyStringsIsEqual) { smileyStrings.clear(); StringBuffer regex = new StringBuffer(); regex.append("(?<!(alt='|alt=\"))("); for (Smiley smiley : smileys) for (String smileyString : smiley.getSmileyStrings()) { smileyStrings.add(smileyString); regex.append( GuiUtils.replaceSpecialRegExpChars(smileyString)) .append("|"); } regex = regex.deleteCharAt(regex.length() - 1); regex.append(')'); smileyRegex = regex.toString(); } return smileyRegex; } } /** * Returns the source name * * @return the source name */ public String getSourceName() { return SMILEY_SOURCE; } /** * Returns the pattern of the source * * @return the source pattern */ public String getPattern() { Collection<Smiley> smileys = Resources.getDefaultSmileyPack(); return getSmileyPattern(smileys); } /** * Returns the smileys pack to use in the user interface. * * @return a collection of all smileys available */ public Collection<Smiley> getSmiliesPack() { return Resources.getDefaultSmileyPack(); } /** * Reloads all smilies. */ public void reloadSmiliesPack() { Resources.reloadResources(); } }