MtasSolrBaseList.java
- package mtas.solr.handler.util;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Objects;
- import java.util.stream.Collectors;
- import org.apache.solr.common.util.SimpleOrderedMap;
- /**
- * The Class MtasSolrBaseList.
- */
- public abstract class MtasSolrBaseList {
- /** The list. */
- protected List<MtasSolrStatus> list;
- /** The index. */
- protected Map<String, MtasSolrStatus> index;
- /** The enabled. */
- private boolean enabled = true;
- /** The Constant NAME_ENABLED. */
- private final static String NAME_ENABLED = "enabled";
- /** The Constant NAME_LIST. */
- private final static String NAME_LIST = "list";
- /** The Constant NAME_SIZE_TOTAL. */
- private final static String NAME_SIZE_TOTAL = "sizeTotal";
- /** The Constant NAME_SIZE_NORMAL. */
- private final static String NAME_SIZE_NORMAL = "sizeNormal";
- /** The Constant NAME_SIZE_SHARDREQUESTS. */
- private final static String NAME_SIZE_SHARDREQUESTS = "sizeShardRequests";
- /**
- * Instantiates a new mtas solr base list.
- */
- public MtasSolrBaseList() {
- list = Collections.synchronizedList(new ArrayList<MtasSolrStatus>());
- index = Collections.synchronizedMap(new HashMap<>());
- }
- /**
- * Gets the.
- *
- * @param key the key
- * @return the mtas solr status
- * @throws IOException Signals that an I/O exception has occurred.
- */
- public final MtasSolrStatus get(String key) throws IOException {
- return index.get(Objects.requireNonNull(key, "no key provided"));
- }
- /**
- * Adds the.
- *
- * @param status the status
- * @throws IOException Signals that an I/O exception has occurred.
- */
- public void add(MtasSolrStatus status) throws IOException {
- Objects.requireNonNull(status);
- if (enabled) {
- list.add(status);
- if (!index.containsKey(status.key())) {
- index.put(status.key(), status);
- garbageCollect();
- } else {
- garbageCollect();
- // retry
- MtasSolrStatus oldStatus = index.get(status.key());
- if (oldStatus == null) {
- index.put(status.key(), status);
- } else if(oldStatus.finished()) {
- remove(oldStatus);
- index.put(status.key(), status);
- } else {
- throw new IOException("key " + status.key() + " already exists");
- }
- }
- }
- }
- /**
- * Removes the.
- *
- * @param status the status
- */
- public final void remove(MtasSolrStatus status) {
- Objects.requireNonNull(status);
- list.remove(status);
- index.remove(status.key());
- }
- /**
- * Garbage collect.
- */
- public abstract void garbageCollect();
- /**
- * Reset.
- */
- public final void reset() {
- list.clear();
- index.clear();
- }
- /**
- * Update key.
- *
- * @param key the key
- * @throws IOException Signals that an I/O exception has occurred.
- */
- public final void updateKey(String key) throws IOException {
- Objects.requireNonNull(key, "old key required");
- if (index.containsKey(key)) {
- MtasSolrStatus status = index.get(key);
- index.remove(key);
- if (!index.containsKey(status.key())) {
- index.put(status.key(), status);
- } else {
- throw new IOException("key already exists");
- }
- }
- }
- /**
- * Sets the enabled.
- *
- * @param flag the new enabled
- */
- public final void setEnabled(boolean flag) {
- if (enabled != flag) {
- reset();
- enabled = flag;
- }
- }
- /**
- * Enabled.
- *
- * @return true, if successful
- */
- public final boolean enabled() {
- return enabled;
- }
- /**
- * Creates the list output.
- *
- * @param shardRequests the shard requests
- * @return the simple ordered map
- */
- public SimpleOrderedMap<Object> createListOutput(boolean shardRequests) {
- garbageCollect();
- SimpleOrderedMap<Object> output = new SimpleOrderedMap<>();
- output.add(NAME_ENABLED, enabled());
- output.add(NAME_ENABLED, true);
- int numberTotal = list.size();
- ListData listData = new ListData();
- if (numberTotal > 0) {
- // create list
- list.stream()
- .collect(Collectors.collectingAndThen(Collectors.toList(), lst -> {
- Collections.reverse(lst);
- return lst.stream();
- })).forEach((item) -> {
- if (item.shardRequest()) {
- listData.addShardRequest();
- if (shardRequests) {
- listData.outputList.add(item.createItemOutput());
- }
- } else {
- listData.addNormal();
- listData.outputList.add(item.createItemOutput());
- }
- });
- }
- output.add(NAME_SIZE_TOTAL, numberTotal);
- output.add(NAME_SIZE_NORMAL, listData.numberNormal);
- output.add(NAME_SIZE_SHARDREQUESTS, listData.numberShardRequests);
- output.add(NAME_LIST, listData.outputList);
- return output;
- }
- /**
- * The Class ListData.
- */
- static class ListData {
-
- /** The output list. */
- private List<SimpleOrderedMap<Object>> outputList;
-
- /** The number normal. */
- private int numberNormal;
-
- /** The number shard requests. */
- private int numberShardRequests;
- /**
- * Instantiates a new list data.
- */
- public ListData() {
- outputList = new ArrayList<>();
- numberNormal = 0;
- numberShardRequests = 0;
- }
- /**
- * Adds the normal.
- */
- public void addNormal() {
- numberNormal++;
- }
- /**
- * Adds the shard request.
- */
- public void addShardRequest() {
- numberShardRequests++;
- }
- }
- }