<commit_before>/*
 * Copyright (c) 2006-2012 DMDirc Developers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.parser.common;

import com.dmdirc.parser.interfaces.callbacks.CallbackInterface;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

/**
 * Implements common base functionality for parsers.<p>
 * Implementations of this class must be annotated with
 * {@link ChildImplementations} to define the implementations to use for
 * instances of {@link ClientInfo}, {@link ChannelInfo}, etc.
 */
public abstract class BaseParser extends ThreadedParser {

    /** The URI that this parser was constructed for. */
    private final URI uri;

    /** The ignore list for this parser. */
    private IgnoreList ignoreList;

    /** The ping timer interval for this parser. */
    private long pingTimerInterval;

    /** The ping timer fraction for this parser. */
    private int pingTimerFraction;

    /** The cached name of the server this parser is connected to. */
    private String serverName;

    /** The IP that this parser should bind to. */
    private String bindIp;

    /** The URI of the proxy to use when connecting, if any. */
    private URI proxy;

    /** The callback manager to use for this parser. */
    private final CallbackManager callbackManager;

    /** A map for callers to use to store things for no sane reason. */
    private final Map<Object, Object> map = new HashMap<Object, Object>();

    /**
     * Creates a new base parser for the specified URI.
     *
     * @param uri The URI this parser will connect to.
     */
    public BaseParser(final URI uri) {
        this.uri = uri;

        final Map<Class<?>, Class<?>> implementations
                = new HashMap<Class<?>, Class<?>>();

        for (Class<?> child : this.getClass().getAnnotation(ChildImplementations.class).value()) {
            for (Class<?> iface : child.getInterfaces()) {
                implementations.put(iface, child);
            }
        }

        this.callbackManager = new CallbackManager(this, implementations);
    }

    /** {@inheritDoc} */
    @Override
    public URI getURI() {
        return uri;
    }

    /** {@inheritDoc} */
    @Override
    public URI getProxy() {
        return proxy;
    }

    /** {@inheritDoc} */
    @Override
    public void setProxy(final URI proxy) {
        this.proxy = proxy;
    }

    /** {@inheritDoc} */
    @Override
    public IgnoreList getIgnoreList() {
        return ignoreList;
    }

    /** {@inheritDoc} */
    @Override
    public void setIgnoreList(final IgnoreList ignoreList) {
        this.ignoreList = ignoreList;
    }

    /** {@inheritDoc} */
    @Override
    public long getPingTimerInterval() {
        return pingTimerInterval;
    }

    /** {@inheritDoc} */
    @Override
    public void setPingTimerInterval(final long newValue) {
        pingTimerInterval = newValue;<commit_msg>Make BaseParser ask ProxySelector for the proxy to use.<commit_after>/*
 * Copyright (c) 2006-2012 DMDirc Developers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.parser.common;

import com.dmdirc.parser.interfaces.callbacks.CallbackInterface;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Implements common base functionality for parsers.<p>
 * Implementations of this class must be annotated with
 * {@link ChildImplementations} to define the implementations to use for
 * instances of {@link ClientInfo}, {@link ChannelInfo}, etc.
 */
public abstract class BaseParser extends ThreadedParser {

    /** The URI that this parser was constructed for. */
    private final URI uri;

    /** The ignore list for this parser. */
    private IgnoreList ignoreList;

    /** The ping timer interval for this parser. */
    private long pingTimerInterval;

    /** The ping timer fraction for this parser. */
    private int pingTimerFraction;

    /** The cached name of the server this parser is connected to. */
    private String serverName;

    /** The IP that this parser should bind to. */
    private String bindIp;

    /** The URI of the proxy to use when connecting, if any. */
    private URI proxy;

    /** The callback manager to use for this parser. */
    private final CallbackManager callbackManager;

    /** A map for callers to use to store things for no sane reason. */
    private final Map<Object, Object> map = new HashMap<Object, Object>();

    /**
     * Creates a new base parser for the specified URI.
     *
     * @param uri The URI this parser will connect to.
     */
    public BaseParser(final URI uri) {
        this.uri = uri;

        final Map<Class<?>, Class<?>> implementations
                = new HashMap<Class<?>, Class<?>>();

        for (Class<?> child : this.getClass().getAnnotation(ChildImplementations.class).value()) {
            for (Class<?> iface : child.getInterfaces()) {
                implementations.put(iface, child);
            }
        }

        this.callbackManager = new CallbackManager(this, implementations);
    }

    /** {@inheritDoc} */
    @Override
    public URI getURI() {
        return uri;
    }

    /** {@inheritDoc} */
    @Override
    public URI getProxy() {
        if (proxy == null && ProxySelector.getDefault() != null) {
            final List<Proxy> proxies = ProxySelector.getDefault().select(getURI());
            if (!proxies.isEmpty()) {
                final SocketAddress sock = proxies.get(0).address();
                if (sock instanceof InetSocketAddress) {
                    final InetSocketAddress isa = (InetSocketAddress)sock;
                    try {
                        return new URI("proxy://", "", isa.getAddress().getHostAddress(), isa.getPort(), "", "", "");
                    } catch (final URISyntaxException use) { /* Oh well... */ }
                }
            }
        } else {
            return proxy;
        }

        return null;
    }

    /** {@inheritDoc} */
    @Override
    public void setProxy(final URI proxy) {
        this.proxy = proxy;
    }

    /** {@inheritDoc} */
    @Override
    public IgnoreList getIgnoreList() {
        return ignoreList;
    }

    /** {@inheritDoc} */
    @Override
    public void setIgnoreList(final IgnoreList ignoreList) {
        this.ignoreList = ignoreList;
    }

    /** {@inheritDoc} */
    @Override
    public long getPingTimerInterval() {
        return pingTimerInterval;
    }

    /** {@inheritDoc} */
    @Override
    public void setPingTimerInterval(final long newValue) {
        pingTimerInterval = newValue;
{'fraction_non_alphanumeric': 0.09488720099761931, 'fraction_numerical': 0.0019272191361523637, 'mean_word_length': 2.771697306541257, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2969810', 'n_tokens_mistral': 2349, 'n_tokens_neox': 2235, 'n_words': 911}