All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.service.AbstractClient Maven / Gradle / Ivy

/*

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/
/*
 * Created on Mar 24, 2008
 */

package com.bigdata.service;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;

import org.apache.log4j.Logger;

import com.bigdata.Banner;

/**
 * Abstract base class for {@link IBigdataClient} implementations.
 * 
 * @author Bryan Thompson
 * @version $Id$
 */
abstract public class AbstractClient implements IBigdataClient {
    
    protected static final Logger log = Logger.getLogger(IBigdataClient.class);

    /**
     * The properties specified to the ctor.
     */
    private final Properties properties;
    
    public Properties getProperties() {
        
        return new Properties( properties );
        
    }

    private final int defaultRangeQueryCapacity;
    private final boolean batchApiOnly;
    private final int threadPoolSize;
    private final int maxStaleLocatorRetries; 
    private final int maxParallelTasksPerRequest;
    private final long taskTimeout;
    private final int locatorCacheCapacity;
    private final long locatorCacheTimeout;
    private final int indexCacheCapacity;
    private final long indexCacheTimeout;
    private final boolean readConsistent;    
//    private final long tempStoreMaxExtent;
    
    /*
     * IBigdataClient API.
     */

    public int getThreadPoolSize() {
        
        return threadPoolSize;
        
    }
    
    public int getDefaultRangeQueryCapacity() {
        
        return defaultRangeQueryCapacity;
        
    }
    
    public boolean getBatchApiOnly() {
        
        return batchApiOnly;
        
    }
    
    public int getMaxStaleLocatorRetries() {
        
        return maxStaleLocatorRetries;
        
    }
    
    public int getMaxParallelTasksPerRequest() {
        
        return maxParallelTasksPerRequest;
        
    }
    
    public boolean isReadConsistent() {
        
        return readConsistent;
        
    }
    
    public long getTaskTimeout() {
        
        return taskTimeout;
        
    }
    
    public int getLocatorCacheCapacity() {
        
        return locatorCacheCapacity;
        
    }
    
    public long getLocatorCacheTimeout() {
        
        return locatorCacheTimeout;
        
    }
    
    public int getIndexCacheCapacity() {
        
        return indexCacheCapacity;
        
    }
    
    public long getIndexCacheTimeout() {
        
        return indexCacheTimeout;
        
    }
    
//    public long getTempStoreMaxExtent() {
//        
//        return tempStoreMaxExtent;
//        
//    }
    
    /**
     * 
     * @param properties
     *            See {@link IBigdataClient.Options}
     */
    protected AbstractClient(final Properties properties) {
        
        // show the copyright banner during statup.
        Banner.banner();

        if (properties == null)
            throw new IllegalArgumentException();

        this.properties = properties;

        // client thread pool setup.
        {
         
            threadPoolSize = Integer.parseInt(properties.getProperty(
                    Options.CLIENT_THREAD_POOL_SIZE,
                    Options.DEFAULT_CLIENT_THREAD_POOL_SIZE));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_THREAD_POOL_SIZE + "="
                                + threadPoolSize);

        }

        // maxStaleLocatorRetries
        {
            
            maxStaleLocatorRetries = Integer.parseInt(properties.getProperty(
                    Options.CLIENT_MAX_STALE_LOCATOR_RETRIES,
                    Options.DEFAULT_CLIENT_MAX_STALE_LOCATOR_RETRIES));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_MAX_STALE_LOCATOR_RETRIES + "="
                        + maxStaleLocatorRetries);

            if (maxStaleLocatorRetries < 0) {

                throw new RuntimeException(Options.CLIENT_MAX_STALE_LOCATOR_RETRIES
                        + " must be non-negative");

            }
            
        }

        // readConsistent
        {

            readConsistent = Boolean.valueOf(properties.getProperty(
                    Options.CLIENT_READ_CONSISTENT,
                    Options.DEFAULT_CLIENT_READ_CONSISTENT));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_READ_CONSISTENT + "=" + readConsistent);

        }

        // maxParallelTasksPerRequest
        {
            
            maxParallelTasksPerRequest = Integer
                    .parseInt(properties
                            .getProperty(
                                    Options.CLIENT_MAX_PARALLEL_TASKS_PER_REQUEST,
                                    Options.DEFAULT_CLIENT_MAX_PARALLEL_TASKS_PER_REQUEST));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_MAX_PARALLEL_TASKS_PER_REQUEST + "="
                        + maxParallelTasksPerRequest);

            if (maxParallelTasksPerRequest <= 0) {

                throw new RuntimeException(
                        Options.CLIENT_MAX_PARALLEL_TASKS_PER_REQUEST
                                + " must be positive");

            }
            
        }

        // task timeout
        {
         
            taskTimeout = Long.parseLong(properties.getProperty(
                    Options.CLIENT_TASK_TIMEOUT,
                    Options.DEFAULT_CLIENT_TASK_TIMEOUT));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_TASK_TIMEOUT + "=" + taskTimeout);

        }

        // defaultRangeQueryCapacity
        {
         
            defaultRangeQueryCapacity = Integer.parseInt(properties
                    .getProperty(Options.CLIENT_RANGE_QUERY_CAPACITY,
                            Options.DEFAULT_CLIENT_RANGE_QUERY_CAPACITY));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_RANGE_QUERY_CAPACITY + "="
                        + defaultRangeQueryCapacity);
            
        }

        // batchApiOnly
        {
            
            batchApiOnly = Boolean.valueOf(properties.getProperty(
                    Options.CLIENT_BATCH_API_ONLY,
                    Options.DEFAULT_CLIENT_BATCH_API_ONLY));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_BATCH_API_ONLY + "=" + batchApiOnly);
            
        }
        
        // locator cache
        {
            
            locatorCacheCapacity = Integer.parseInt(properties
                    .getProperty(Options.CLIENT_LOCATOR_CACHE_CAPACITY,
                            Options.DEFAULT_CLIENT_LOCATOR_CACHE_CAPACITY));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_LOCATOR_CACHE_CAPACITY + "="
                        + locatorCacheCapacity);

            locatorCacheTimeout = Long.parseLong(properties
                    .getProperty(Options.CLIENT_LOCATOR_CACHE_TIMEOUT,
                            Options.DEFAULT_CLIENT_LOCATOR_CACHE_TIMEOUT));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_LOCATOR_CACHE_TIMEOUT + "="
                        + locatorCacheTimeout);
        }

        // indexCacheCapacity
        {

            indexCacheCapacity = Integer.parseInt(properties.getProperty(
                    Options.CLIENT_INDEX_CACHE_CAPACITY,
                    Options.DEFAULT_CLIENT_INDEX_CACHE_CAPACITY));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_INDEX_CACHE_CAPACITY + "="
                        + indexCacheCapacity);

            if (indexCacheCapacity <= 0)
                throw new RuntimeException(Options.CLIENT_INDEX_CACHE_CAPACITY
                        + " must be positive");

        }

        // index cache timeout
        {
            
            indexCacheTimeout = Long.parseLong(properties
                    .getProperty(Options.CLIENT_INDEX_CACHE_TIMEOUT,
                            Options.DEFAULT_CLIENT_INDEX_CACHE_TIMEOUT));

            if (log.isInfoEnabled())
                log.info(Options.CLIENT_INDEX_CACHE_TIMEOUT + "="
                        + indexCacheTimeout);

            if (indexCacheTimeout < 0)
                throw new RuntimeException(Options.CLIENT_INDEX_CACHE_TIMEOUT
                        + " must be non-negative");
        
        }
        
//        // tempStoreMaxExtent
//        {
//
//            tempStoreMaxExtent = Long.parseLong(properties.getProperty(
//                    Options.TEMP_STORE_MAXIMUM_EXTENT,
//                    Options.DEFAULT_TEMP_STORE_MAXIMUM_EXTENT));
//
//            if (log.isInfoEnabled())
//                log.info(Options.TEMP_STORE_MAXIMUM_EXTENT + "="
//                        + tempStoreMaxExtent);
//
//            if (tempStoreMaxExtent < 0)
//                throw new RuntimeException(Options.TEMP_STORE_MAXIMUM_EXTENT
//                        + " must be non-negative");
//
//        }

    }
    
    private final AtomicReference> delegate = new AtomicReference>();

    /**
     * The delegate for the federation.
     */
    public final IFederationDelegate getDelegate() {
        
        return delegate.get();
        
    }

    /**
     * Set the delegate for the federation.
     * 
     * @param delegate
     *            The delegate.
     * @throws IllegalArgumentException
     *             if the argument is null.
     * @throws IllegalStateException
     *             if the property has already been set to a different value.
     * @throws IllegalStateException
     *             if the client is already connected.
     */
    public final 
//    synchronized 
    void setDelegate(final IFederationDelegate delegate) {
        
        if (delegate == null) {

            throw new IllegalArgumentException();
            
        }
        
        if(isConnected()) {
            
            throw new IllegalStateException();

        }

        // Try to set, expecting current value is [null]
        if (!this.delegate
                .compareAndSet(null/* expect */, delegate/* update */)) {
            
            // Try to set, expecting current value is [delegate].
            if (!this.delegate
                    .compareAndSet(delegate/* expect */, delegate/* update */)) {

                // Current value is not [null] and is not [delegate].
                throw new IllegalStateException();
                
            }
            
        }

//        if (this.delegate.get() != null && this.delegate.get() != delegate) {
//
//            throw new IllegalStateException();
//            
//        }
//        
//        this.delegate.set(delegate);
        
    }

    /**
     * Extended to {@link IBigdataClient#disconnect(boolean)} if the client is
     * still connected when it is finalized.
     */
    protected void finalize() throws Throwable {

        if (isConnected()) {

            log.warn("Disconnecting client or service");
            
            disconnect(true/* immediateShutdown */);

        }
        
        super.finalize();
        
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy