// Path: src/main/java/acromusashi/stream/ml/anomaly/lof/entity/LofDataSet.java
// public class LofDataSet implements Serializable
// {
//     /** serialVersionUID */
//     private static final long     serialVersionUID = 7589332742661081169L;
// 
//     /** 保持するデータIDのリスト */
//     private List<String>          dataIdList       = new ArrayList<>();
// 
//     /** 保持するデータID>データ値のマッピング */
//     private Map<String, LofPoint> dataMap          = new HashMap<>();
// 
//     /**
//      * パラメータを指定せずにインスタンスを生成する。
//      */
//     public LofDataSet()
//     {}
// 
//     /**
//      * 保持するデータIDのリスト/データマッピングに値を追加する。
//      * 
//      * @param addedPoint 追加対象点
//      */
//     public void addData(LofPoint addedPoint)
//     {
//         this.dataIdList.add(addedPoint.getDataId());
//         this.dataMap.put(addedPoint.getDataId(), addedPoint);
//     }
// 
//     /**
//      * 保持するデータIDのリスト/データマッピングに値を追加する。
//      * 
//      * @param deleteDataId 追加対象点
//      */
//     public void deleteData(String deleteDataId)
//     {
//         this.dataIdList.remove(deleteDataId);
//         this.dataMap.remove(deleteDataId);
//     }
// 
//     /**
//      * 対象エンティティのDeepCopyを作成する。
//      * 
//      * @return 対象エンティティのDeepCopy
//      */
//     public LofDataSet deepCopy()
//     {
//         LofDataSet result = new LofDataSet();
//         result.getDataIdList().addAll(this.dataIdList);
//         Collection<LofPoint> pointList = this.dataMap.values();
//         for (LofPoint targetPoint : pointList)
//         {
//             result.getDataMap().put(targetPoint.getDataId(), targetPoint.deepCopy());
//         }
// 
//         return result;
//     }
// 
//     /**
//      * @return the dataIdList
//      */
//     public List<String> getDataIdList()
//     {
//         return this.dataIdList;
//     }
// 
//     /**
//      * @param dataIdList the dataIdList to set
//      */
//     public void setDataIdList(List<String> dataIdList)
//     {
//         this.dataIdList = dataIdList;
//     }
// 
//     /**
//      * @return the dataMap
//      */
//     public Map<String, LofPoint> getDataMap()
//     {
//         return this.dataMap;
//     }
// 
//     /**
//      * @param dataMap the dataMap to set
//      */
//     public void setDataMap(Map<String, LofPoint> dataMap)
//     {
//         this.dataMap = dataMap;
//     }
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String toString()
//     {
//         String result = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
//         return result;
//     }
// }


import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.commons.marshall.Marshaller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import acromusashi.stream.ml.anomaly.lof.entity.LofDataSet;
import com.google.common.base.Joiner;
/**
* Copyright (c) Acroquest Technology Co, Ltd. All Rights Reserved.
* Please read the associated COPYRIGHTS file for more details.
*
* THE SOFTWARE IS PROVIDED BY Acroquest Technolog Co., Ltd.,
* 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 HOLDER BE LIABLE FOR ANY
* CLAIM, DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package acromusashi.stream.ml.anomaly.lof.state;





/**
 * LOF分散用MapStateの保存先にInfinispanを用いたクラス<br>
 * 設定された「parallelismHint」の数だけ存在する。
 * 
 * @author kimura
 */
public class InfinispanLofState extends LofState
{
    /** キャッシュ上のデータ生存期間のデフォルト値 */
    private static final int                            DEFAULT_LIFESPAN = 600;

    /** logger */
    private static final Logger                         logger           = LoggerFactory.getLogger(InfinispanLofState.class);

    /** キャッシュ上のデータ生存期間(単位：秒) */
    protected int                                       lifespan         = DEFAULT_LIFESPAN;

    /** 投入先のサーバ情報 */
    protected String                                    targetServer;

    /** 投入先キャッシュ名称 */
    protected String                                    cacheName;

    /** 状態を保存するベースキー */
    protected String                                    baseKey;

    /** Remoteキャッシュマネージャ */
    protected transient RemoteCacheManager              clientManager;

    /** 状態保存用キャッシュ */
// Path: src/main/java/acromusashi/stream/ml/anomaly/lof/entity/LofDataSet.java
// public class LofDataSet implements Serializable
// {
//     /** serialVersionUID */
//     private static final long     serialVersionUID = 7589332742661081169L;
// 
//     /** 保持するデータIDのリスト */
//     private List<String>          dataIdList       = new ArrayList<>();
// 
//     /** 保持するデータID>データ値のマッピング */
//     private Map<String, LofPoint> dataMap          = new HashMap<>();
// 
//     /**
//      * パラメータを指定せずにインスタンスを生成する。
//      */
//     public LofDataSet()
//     {}
// 
//     /**
//      * 保持するデータIDのリスト/データマッピングに値を追加する。
//      * 
//      * @param addedPoint 追加対象点
//      */
//     public void addData(LofPoint addedPoint)
//     {
//         this.dataIdList.add(addedPoint.getDataId());
//         this.dataMap.put(addedPoint.getDataId(), addedPoint);
//     }
// 
//     /**
//      * 保持するデータIDのリスト/データマッピングに値を追加する。
//      * 
//      * @param deleteDataId 追加対象点
//      */
//     public void deleteData(String deleteDataId)
//     {
//         this.dataIdList.remove(deleteDataId);
//         this.dataMap.remove(deleteDataId);
//     }
// 
//     /**
//      * 対象エンティティのDeepCopyを作成する。
//      * 
//      * @return 対象エンティティのDeepCopy
//      */
//     public LofDataSet deepCopy()
//     {
//         LofDataSet result = new LofDataSet();
//         result.getDataIdList().addAll(this.dataIdList);
//         Collection<LofPoint> pointList = this.dataMap.values();
//         for (LofPoint targetPoint : pointList)
//         {
//             result.getDataMap().put(targetPoint.getDataId(), targetPoint.deepCopy());
//         }
// 
//         return result;
//     }
// 
//     /**
//      * @return the dataIdList
//      */
//     public List<String> getDataIdList()
//     {
//         return this.dataIdList;
//     }
// 
//     /**
//      * @param dataIdList the dataIdList to set
//      */
//     public void setDataIdList(List<String> dataIdList)
//     {
//         this.dataIdList = dataIdList;
//     }
// 
//     /**
//      * @return the dataMap
//      */
//     public Map<String, LofPoint> getDataMap()
//     {
//         return this.dataMap;
//     }
// 
//     /**
//      * @param dataMap the dataMap to set
//      */
//     public void setDataMap(Map<String, LofPoint> dataMap)
//     {
//         this.dataMap = dataMap;
//     }
// 
//     /**
//      * {@inheritDoc}
//      */
//     @Override
//     public String toString()
//     {
//         String result = ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
//         return result;
//     }
// }


// Path: src/main/java/acromusashi/stream/ml/anomaly/lof/state/InfinispanLofState.java
import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.commons.marshall.Marshaller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import acromusashi.stream.ml.anomaly.lof.entity.LofDataSet;
import com.google.common.base.Joiner;

/**
* Copyright (c) Acroquest Technology Co, Ltd. All Rights Reserved.
* Please read the associated COPYRIGHTS file for more details.
*
* THE SOFTWARE IS PROVIDED BY Acroquest Technolog Co., Ltd.,
* 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 HOLDER BE LIABLE FOR ANY
* CLAIM, DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package acromusashi.stream.ml.anomaly.lof.state;





/**
 * LOF分散用MapStateの保存先にInfinispanを用いたクラス<br>
 * 設定された「parallelismHint」の数だけ存在する。
 * 
 * @author kimura
 */
public class InfinispanLofState extends LofState
{
    /** キャッシュ上のデータ生存期間のデフォルト値 */
    private static final int                            DEFAULT_LIFESPAN = 600;

    /** logger */
    private static final Logger                         logger           = LoggerFactory.getLogger(InfinispanLofState.class);

    /** キャッシュ上のデータ生存期間(単位：秒) */
    protected int                                       lifespan         = DEFAULT_LIFESPAN;

    /** 投入先のサーバ情報 */
    protected String                                    targetServer;

    /** 投入先キャッシュ名称 */
    protected String                                    cacheName;

    /** 状態を保存するベースキー */
    protected String                                    baseKey;

    /** Remoteキャッシュマネージャ */
    protected transient RemoteCacheManager              clientManager;

    /** 状態保存用キャッシュ */
    protected transient RemoteCache<String, LofDataSet> stateCache;