/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.xsl;

import org.xml.sax.SAXException;
import se.unlogic.standardutils.settings.XMLSettingNode;

import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class XSLUtils {

   private static Pattern XSL_VARIABLE_PATTERN = Pattern.compile("(?<=\\$)[\\w\\.]*(?=($|[\\W]))");

   /**
    * Scans XSL documents for references to XSL variables such as {@literal <}xsl:value-of select="$foo"/{@literal>} and {@literal <}a href="{$foo}"/{@literal >}. Returns the variable names.
    *
    * @param file Input XSL file
    * @return
    * @throws SAXException
    * @throws IOException
    * @throws ParserConfigurationException
    */
   public static Set<String> getVariableReferenses(File file) throws SAXException, IOException, ParserConfigurationException {

      XMLSettingNode settingNode = new XMLSettingNode(file);

      List<String> tags = settingNode.getStrings("//@*[contains(.,'$')]");

      if(tags == null){

         return null;
      }

      LinkedHashSet<String> stringSet = new LinkedHashSet<String>();

      for (String tag : tags) {

         Matcher matcher = XSL_VARIABLE_PATTERN.matcher(tag);

         while (matcher.find()) {

            stringSet.add(matcher.group());
         }
      }

      return stringSet;
   }

   /**
    * Scans XSL documents for declared XSL variables such as {@literal <}xsl:variable name="myvariable"/{@literal>}
    *
    * @param file Input XSL file
    * @return
    * @throws SAXException
    * @throws IOException
    * @throws ParserConfigurationException
    */
   public static List<String> getDeclaredVariables(File file) throws SAXException, IOException, ParserConfigurationException {

      XMLSettingNode settingNode = new XMLSettingNode(file);

      return settingNode.getStrings("//variable/@name");
   }
}
