AnalyticsHelper.java

package sk.iway.iwcm.analytics;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.utils.Pair;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 *
 */
public class AnalyticsHelper {
    /**
     * Vyparsuje konfiguraciu
     * @param config String jeden alebo viac parov url:Trieda oddelenych ';' kde url je zaciatok vyhovujucej url a Trieda je cela cesta k triede implementujucej sk.iway.iwcm.analytics.Tracker, napr. '/files/filearchiv/:sk.iway.iwcm.components.file_archiv.FileArchivTracker'
     * @return vrati rozparsovanu konfiguraciu List<Pair<String, String>> alebo null
     */
    public static List<Pair<String, String>> parseConfig(String config) {
        if(Tools.isNotEmpty(config)) {
            List<Pair<String, String>> result = new ArrayList<>();
            String[] list = config.split(";");
            for(int i = 0; i < list.length; i++) {
                String[] pair = list[i].split(":");
                if(pair.length == 2) {
                    result.add(new Pair<>(pair[0], pair[1]));
                }
            }
            return result;
        }
        return null;
    }

    /**
     * Na zaklade konfiguracie vykona trackovanie
     * @param path absolutna cestna, napr. /files/sth/file.pdf
     * @param request HttpServletRequest
     */
    public static void track(String path, HttpServletRequest request) {
        String analyticsConf = Constants.getString("analyticsTrackerConf");
        if(Tools.isNotEmpty(analyticsConf)) {

            // load configuration
            List<Pair<String, String>> conf = AnalyticsHelper.parseConfig(analyticsConf);
            if(conf != null) {

                for(Pair<String, String> item : conf) {

                    String urlPattern = item.first;
                    String className = item.second;

                    // track for every type of url
                    if(path.startsWith(urlPattern)) {
                        try {
                            @SuppressWarnings("rawtypes")
                            Class c = Class.forName(className);
                            @SuppressWarnings("unchecked")
                            Tracker tracker = (Tracker)c.getDeclaredConstructor().newInstance();
                            tracker.track(path, request);
                        }
                        catch (Throwable e) {
                            try {
                                Logger.error(Class.forName(className), e.getMessage(), e);
                            } catch(ClassNotFoundException ex) {
                                Logger.error(Tracker.class,  className + ": " + e.getMessage(), e);
                            }
                        }
                    }
                }
            }
        }
    }
}