
com.threatconnect.sdk.client.response.IterableResponse Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of java-sdk Show documentation
Show all versions of java-sdk Show documentation
The ThreatConnect Java SDK. Used to communicate with teh ThreatConnect Threat Intelligence Platform
The newest version!
package com.threatconnect.sdk.client.response;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.threatconnect.sdk.conn.AbstractRequestExecutor;
import com.threatconnect.sdk.exception.FailedResponseException;
import com.threatconnect.sdk.server.response.entity.ApiEntityListResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by dtineo on 6/14/15.
*/
public class IterableResponse implements Iterator, Iterable
{
protected final Logger logger = Logger.getLogger(getClass().getSimpleName());
private AbstractRequestExecutor executor;
private String path;
private Class responseType;
private Class responseItem;
private int resultLimit = 500;
private int index = 0;
private ApiEntityListResponse currentResponse = null;
private final ObjectMapper mapper = new ObjectMapper();
private Integer resultCount;
private V nextItem;
private String filters;
private boolean orParams = false;
public IterableResponse(AbstractRequestExecutor executor, Class responseType, Class responseItem, String path, int resultLimit, String filters, boolean orParams)
{
this.executor = executor;
this.responseType = responseType;
this.responseItem = responseItem;
this.path = path;
if ( resultLimit <= 0 )
{
throw new IllegalArgumentException("Result Limit must be > 0");
}
this.resultLimit = resultLimit;
this.index = -1;
this.filters = filters;
this.orParams = orParams;
}
@Override
public Iterator iterator()
{
return this;
}
@Override
public boolean hasNext()
{
index++;
if (index%resultLimit == 0 )
{
currentResponse = getNextResponse();
}
prepareResultCount();
return prepareNext();
}
private boolean prepareNext()
{
boolean hasNext = currentResponse != null && index%resultLimit < resultCount;
if ( hasNext )
{
int nextIndex = index%resultLimit;
List dataList = currentResponse.getData().getData();
if ( dataList == null || nextIndex >= dataList.size() )
{
hasNext = false;
}
else
{
nextItem = responseItem.cast(dataList.get(index % resultLimit));
}
}
return hasNext;
}
private void prepareResultCount()
{
if ( resultCount == null )
{
resultCount = currentResponse.getData().getResultCount();
if (resultCount == null)
{
resultCount = currentResponse.getData().getData().size();
}
}
}
@Override
public V next()
{
return nextItem;
}
@Override
public void remove()
{
throw new UnsupportedOperationException();
}
private ApiEntityListResponse getNextResponse()
{
String url = String.format("%s&resultStart=%d&resultLimit=%d", this.path, this.index, this.resultLimit);
if (this.filters != null)
{
try
{
url = String.format("%s&filters=%s", url, URLEncoder.encode(this.filters, "UTF-8"));
if (this.orParams)
{
url = String.format("%s&orParams=true", url);
}
} catch (UnsupportedEncodingException e)
{
logger.warning("Unknown encoding escaping filter string.");
}
}
try
{
String content = executor.execute(AbstractRequestExecutor.HttpMethod.GET, url);
logger.log(Level.FINEST, "returning content=" + content);
ApiEntityListResponse result = (ApiEntityListResponse) mapper.readValue(content, this.responseType);
if (!result.isSuccess()) {
throw new FailedResponseException(result.getMessage());
}
return result;
} catch (IOException e)
{
throw new RuntimeException(e);
}
}
public Integer getResultCount()
{
return resultCount;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy