<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>MtasTokenCollection.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">MTAS</a> > <a href="index.source.html" class="el_package">mtas.analysis.token</a> > <span class="el_source">MtasTokenCollection.java</span></div><h1>MtasTokenCollection.java</h1><pre class="source lang-java linenums">package mtas.analysis.token; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.apache.lucene.analysis.payloads.PayloadHelper; import org.apache.lucene.util.BytesRef; import mtas.analysis.util.MtasParserException; /** * The Class MtasTokenCollection. */ public class MtasTokenCollection { /** The token collection. */ <span class="fc" id="L23"> private HashMap<Integer, MtasToken> tokenCollection = new HashMap<>();</span> /** The token collection index. */ <span class="fc" id="L26"> private ArrayList<Integer> tokenCollectionIndex = new ArrayList<>();</span> /** * Instantiates a new mtas token collection. */ <span class="fc" id="L31"> public MtasTokenCollection() {</span> <span class="fc" id="L32"> clear();</span> <span class="fc" id="L33"> }</span> /** * Adds the. * * @param token the token * @return the integer */ public Integer add(MtasToken token) { <span class="fc" id="L42"> Integer id = token.getId();</span> <span class="fc" id="L43"> tokenCollection.put(id, token);</span> <span class="fc" id="L44"> return id;</span> } /** * Gets the. * * @param id the id * @return the mtas token */ public MtasToken get(Integer id) { <span class="fc" id="L54"> return tokenCollection.get(id);</span> } /** * Iterator. * * @return the iterator * @throws MtasParserException the mtas parser exception */ public Iterator<MtasToken> iterator() throws MtasParserException { <span class="fc" id="L64"> checkTokenCollectionIndex();</span> <span class="fc" id="L65"> return new Iterator<MtasToken>() {</span> <span class="fc" id="L67"> private Iterator<Integer> indexIterator = tokenCollectionIndex.iterator();</span> @Override public boolean hasNext() { <span class="fc" id="L71"> return indexIterator.hasNext();</span> } @Override public MtasToken next() { <span class="fc" id="L76"> return tokenCollection.get(indexIterator.next());</span> } @Override public void remove() { <span class="nc" id="L81"> throw new UnsupportedOperationException();</span> } }; } /** * Prints the. * * @throws MtasParserException the mtas parser exception */ public void print() throws MtasParserException { <span class="nc" id="L92"> Iterator<MtasToken> it = this.iterator();</span> <span class="nc bnc" id="L93" title="All 2 branches missed."> while (it.hasNext()) {</span> <span class="nc" id="L94"> MtasToken token = it.next();</span> <span class="nc" id="L95"> System.out.println(token);</span> <span class="nc" id="L96"> }</span> <span class="nc" id="L97"> }</span> /** * Gets the list. * * @return the list * @throws MtasParserException the mtas parser exception */ public String[][] getList() throws MtasParserException { <span class="nc" id="L106"> String[][] result = new String[(tokenCollection.size() + 1)][];</span> <span class="nc" id="L107"> result[0] = new String[] { "id", "start real offset", "end real offset",</span> "provide real offset", "start offset", "end offset", "provide offset", "start position", "end position", "multiple positions", "parent", "provide parent", "payload", "prefix", "postfix" }; <span class="nc" id="L111"> int number = 1;</span> <span class="nc" id="L112"> Iterator<MtasToken> it = this.iterator();</span> <span class="nc bnc" id="L113" title="All 2 branches missed."> while (it.hasNext()) {</span> <span class="nc" id="L114"> MtasToken token = it.next();</span> <span class="nc" id="L115"> String[] row = new String[15];</span> <span class="nc" id="L116"> row[0] = token.getId().toString();</span> <span class="nc bnc" id="L117" title="All 2 branches missed."> if (token.getRealOffsetStart() != null) {</span> <span class="nc" id="L118"> row[1] = token.getRealOffsetStart().toString();</span> <span class="nc" id="L119"> row[2] = token.getRealOffsetEnd().toString();</span> <span class="nc bnc" id="L120" title="All 2 branches missed."> row[3] = token.getProvideRealOffset() ? "1" : null;</span> } <span class="nc bnc" id="L122" title="All 2 branches missed."> if (token.getOffsetStart() != null) {</span> <span class="nc" id="L123"> row[4] = token.getOffsetStart().toString();</span> <span class="nc" id="L124"> row[5] = token.getOffsetEnd().toString();</span> <span class="nc bnc" id="L125" title="All 2 branches missed."> row[6] = token.getProvideOffset() ? "1" : null;</span> } <span class="nc bnc" id="L127" title="All 2 branches missed."> if (token.getPositionLength() != null) {</span> <span class="nc bnc" id="L128" title="All 2 branches missed."> if (token.getPositionStart().equals(token.getPositionEnd())) {</span> <span class="nc" id="L129"> row[7] = token.getPositionStart().toString();</span> <span class="nc" id="L130"> row[8] = token.getPositionEnd().toString();</span> <span class="nc" id="L131"> row[9] = null;</span> <span class="nc bnc" id="L132" title="All 2 branches missed."> } else if ((token.getPositions() == null)</span> <span class="nc" id="L133"> || (token.getPositions().length == (1 + token.getPositionEnd()</span> <span class="nc bnc" id="L134" title="All 2 branches missed."> - token.getPositionStart()))) {</span> <span class="nc" id="L135"> row[7] = token.getPositionStart().toString();</span> <span class="nc" id="L136"> row[8] = token.getPositionEnd().toString();</span> <span class="nc" id="L137"> row[9] = null;</span> } else { <span class="nc" id="L139"> row[7] = null;</span> <span class="nc" id="L140"> row[8] = null;</span> <span class="nc" id="L141"> row[9] = Arrays.toString(token.getPositions());</span> } } <span class="nc bnc" id="L144" title="All 2 branches missed."> if (token.getParentId() != null) {</span> <span class="nc" id="L145"> row[10] = token.getParentId().toString();</span> <span class="nc bnc" id="L146" title="All 2 branches missed."> row[11] = token.getProvideParentId() ? "1" : null;</span> } <span class="nc bnc" id="L148" title="All 2 branches missed."> if (token.getPayload() != null) {</span> <span class="nc" id="L149"> BytesRef payload = token.getPayload();</span> <span class="nc" id="L150"> row[12] = Float.toString(PayloadHelper.decodeFloat(Arrays.copyOfRange(</span> payload.bytes, payload.offset, (payload.offset + payload.length)))); } <span class="nc" id="L153"> row[13] = token.getPrefix();</span> <span class="nc" id="L154"> row[14] = token.getPostfix();</span> <span class="nc" id="L155"> result[number] = row;</span> <span class="nc" id="L156"> number++;</span> <span class="nc" id="L157"> }</span> <span class="nc" id="L158"> return result;</span> } /** * Check. * * @param autoRepair the auto repair * @param makeUnique the make unique * @throws MtasParserException the mtas parser exception */ public void check(Boolean autoRepair, Boolean makeUnique) throws MtasParserException { <span class="pc bpc" id="L170" title="1 of 2 branches missed."> if (autoRepair) {</span> <span class="fc" id="L171"> autoRepair();</span> } <span class="pc bpc" id="L173" title="1 of 2 branches missed."> if (makeUnique) {</span> <span class="fc" id="L174"> makeUnique();</span> } <span class="fc" id="L176"> checkTokenCollectionIndex();</span> <span class="fc bfc" id="L177" title="All 2 branches covered."> for (Integer i : tokenCollectionIndex) {</span> // minimal properties <span class="pc bpc" id="L179" title="1 of 2 branches missed."> if (tokenCollection.get(i).getId() == null</span> <span class="pc bpc" id="L180" title="1 of 2 branches missed."> || tokenCollection.get(i).getPositionStart() == null</span> <span class="pc bpc" id="L181" title="1 of 2 branches missed."> || tokenCollection.get(i).getPositionEnd() == null</span> <span class="pc bpc" id="L182" title="1 of 2 branches missed."> || tokenCollection.get(i).getValue() == null) {</span> <span class="nc" id="L183"> clear();</span> <span class="nc" id="L184"> break;</span> } <span class="fc" id="L186"> }</span> <span class="fc" id="L187"> }</span> /** * Make unique. */ private void makeUnique() { <span class="fc" id="L193"> HashMap<String, ArrayList<MtasToken>> currentPositionTokens = new HashMap<>();</span> ArrayList<MtasToken> currentValueTokens; <span class="fc" id="L195"> int currentStartPosition = -1;</span> <span class="fc" id="L196"> MtasToken currentToken = null;</span> <span class="fc bfc" id="L197" title="All 2 branches covered."> for (Entry<Integer, MtasToken> entry : tokenCollection.entrySet()) {</span> <span class="fc" id="L198"> currentToken = entry.getValue();</span> <span class="fc bfc" id="L199" title="All 2 branches covered."> if (currentToken.getPositionStart() > currentStartPosition) {</span> <span class="fc" id="L200"> currentPositionTokens.clear();</span> <span class="fc" id="L201"> currentStartPosition = currentToken.getPositionStart();</span> } else { <span class="fc bfc" id="L203" title="All 2 branches covered."> if (currentPositionTokens.containsKey(currentToken.getValue())) {</span> <span class="fc" id="L204"> currentValueTokens = currentPositionTokens</span> <span class="fc" id="L205"> .get(currentToken.getValue());</span> } else { <span class="fc" id="L208"> currentValueTokens = new ArrayList<>();</span> <span class="fc" id="L209"> currentPositionTokens.put(currentToken.getValue(),</span> currentValueTokens); } <span class="fc" id="L212"> currentValueTokens.add(currentToken);</span> } <span class="fc" id="L214"> }</span> <span class="fc" id="L215"> }</span> /** * Auto repair. */ private void autoRepair() { <span class="fc" id="L221"> ArrayList<Integer> trash = new ArrayList<>();</span> <span class="fc" id="L222"> HashMap<Integer, Integer> translation = new HashMap<>();</span> <span class="fc" id="L223"> HashMap<Integer, MtasToken> newTokenCollection = new HashMap<>();</span> Integer parentId; <span class="fc" id="L225"> Integer maxId = null;</span> <span class="fc" id="L226"> Integer minId = null;</span> MtasToken token; // check id, position and value <span class="fc bfc" id="L229" title="All 2 branches covered."> for (Entry<Integer, MtasToken> entry : tokenCollection.entrySet()) {</span> <span class="fc" id="L230"> token = entry.getValue();</span> boolean putInTrash; <span class="pc bpc" id="L232" title="1 of 2 branches missed."> putInTrash = token.getId() == null;</span> <span class="pc bpc" id="L233" title="1 of 2 branches missed."> putInTrash |= (token.getPositionStart() == null)</span> <span class="pc bpc" id="L234" title="1 of 2 branches missed."> || (token.getPositionEnd() == null);</span> <span class="pc bpc" id="L235" title="2 of 4 branches missed."> putInTrash |= token.getValue() == null || (token.getValue().isEmpty());</span> <span class="pc bpc" id="L236" title="2 of 4 branches missed."> putInTrash |= token.getPrefix() == null || (token.getPrefix().isEmpty());</span> <span class="pc bpc" id="L237" title="1 of 2 branches missed."> if (putInTrash) {</span> <span class="nc" id="L238"> trash.add(entry.getKey());</span> } <span class="fc" id="L240"> }</span> // check parentId <span class="fc bfc" id="L242" title="All 2 branches covered."> for (Entry<Integer, MtasToken> entry : tokenCollection.entrySet()) {</span> <span class="fc" id="L243"> token = entry.getValue();</span> <span class="fc" id="L244"> parentId = token.getParentId();</span> <span class="pc bpc" id="L245" title="1 of 4 branches missed."> if (parentId != null && (!tokenCollection.containsKey(parentId)</span> <span class="pc bpc" id="L246" title="1 of 2 branches missed."> || trash.contains(parentId))) {</span> <span class="nc" id="L247"> token.setParentId(null);</span> } <span class="fc" id="L249"> }</span> // empty bin <span class="pc bpc" id="L251" title="1 of 2 branches missed."> if (!trash.isEmpty()) {</span> <span class="nc bnc" id="L252" title="All 2 branches missed."> for (Integer i : trash) {</span> <span class="nc" id="L253"> tokenCollection.remove(i);</span> <span class="nc" id="L254"> }</span> } // always check ids <span class="pc bpc" id="L257" title="1 of 2 branches missed."> if (tokenCollection.size() > 0) {</span> <span class="fc bfc" id="L258" title="All 2 branches covered."> for (Integer i : tokenCollection.keySet()) {</span> <span class="fc bfc" id="L259" title="All 2 branches covered."> maxId = ((maxId == null) ? i : Math.max(maxId, i));</span> <span class="fc bfc" id="L260" title="All 2 branches covered."> minId = ((minId == null) ? i : Math.min(minId, i));</span> <span class="fc" id="L261"> }</span> // check <span class="pc bpc" id="L263" title="2 of 4 branches missed."> if ((minId > 0) || ((1 + maxId - minId) != tokenCollection.size())) {</span> <span class="nc" id="L264"> int newId = 0;</span> // create translation <span class="nc bnc" id="L266" title="All 2 branches missed."> for (Integer i : tokenCollection.keySet()) {</span> <span class="nc" id="L267"> translation.put(i, newId);</span> <span class="nc" id="L268"> newId++;</span> <span class="nc" id="L269"> }</span> // translate objects <span class="nc bnc" id="L271" title="All 2 branches missed."> for (Entry<Integer, MtasToken> entry : tokenCollection.entrySet()) {</span> <span class="nc" id="L272"> token = entry.getValue();</span> <span class="nc" id="L273"> parentId = token.getParentId();</span> <span class="nc" id="L274"> token.setId(translation.get(entry.getKey()));</span> <span class="nc bnc" id="L275" title="All 2 branches missed."> if (parentId != null) {</span> <span class="nc" id="L276"> token.setParentId(translation.get(parentId));</span> } <span class="nc" id="L278"> }</span> // new tokenCollection <span class="nc" id="L280"> Iterator<Map.Entry<Integer, MtasToken>> iter = tokenCollection</span> <span class="nc" id="L281"> .entrySet().iterator();</span> <span class="nc bnc" id="L282" title="All 2 branches missed."> while (iter.hasNext()) {</span> <span class="nc" id="L283"> Map.Entry<Integer, MtasToken> entry = iter.next();</span> <span class="nc" id="L284"> newTokenCollection.put(translation.get(entry.getKey()),</span> <span class="nc" id="L285"> entry.getValue());</span> <span class="nc" id="L286"> iter.remove();</span> <span class="nc" id="L287"> }</span> <span class="nc" id="L288"> tokenCollection = newTokenCollection;</span> } } <span class="fc" id="L291"> }</span> /** * Check token collection index. * * @throws MtasParserException the mtas parser exception */ private void checkTokenCollectionIndex() throws MtasParserException { <span class="fc bfc" id="L299" title="All 2 branches covered."> if (tokenCollectionIndex.size() != tokenCollection.size()) {</span> MtasToken token; <span class="fc" id="L301"> Integer maxId = null;</span> <span class="fc" id="L302"> Integer minId = null;</span> <span class="fc" id="L303"> tokenCollectionIndex.clear();</span> <span class="fc bfc" id="L304" title="All 2 branches covered."> for (Entry<Integer, MtasToken> entry : tokenCollection.entrySet()) {</span> <span class="fc" id="L305"> token = entry.getValue();</span> <span class="fc bfc" id="L306" title="All 2 branches covered."> maxId = ((maxId == null) ? entry.getKey()</span> <span class="fc" id="L307"> : Math.max(maxId, entry.getKey()));</span> <span class="fc bfc" id="L308" title="All 2 branches covered."> minId = ((minId == null) ? entry.getKey()</span> <span class="fc" id="L309"> : Math.min(minId, entry.getKey()));</span> <span class="pc bpc" id="L310" title="1 of 2 branches missed."> if (token.getId() == null) {</span> <span class="nc" id="L311"> throw new MtasParserException(</span> <span class="nc" id="L312"> "no id for token (" + token.getValue() + ")");</span> <span class="pc bpc" id="L313" title="1 of 2 branches missed."> } else if ((token.getPositionStart() == null)</span> <span class="pc bpc" id="L314" title="1 of 2 branches missed."> || (token.getPositionEnd() == null)) {</span> <span class="nc" id="L315"> throw new MtasParserException("no position for token with id "</span> <span class="nc" id="L316"> + token.getId() + " (" + token.getValue() + ")");</span> <span class="pc bpc" id="L317" title="2 of 4 branches missed."> } else if (token.getValue() == null || (token.getValue().equals(""))) {</span> <span class="nc" id="L318"> throw new MtasParserException(</span> <span class="nc" id="L319"> "no value for token with id " + token.getId());</span> <span class="pc bpc" id="L320" title="1 of 2 branches missed."> } else if (token.getPrefix() == null</span> <span class="pc bpc" id="L321" title="1 of 2 branches missed."> || (token.getPrefix().equals(""))) {</span> <span class="nc" id="L322"> throw new MtasParserException(</span> <span class="nc" id="L323"> "no prefix for token with id " + token.getId());</span> <span class="fc bfc" id="L324" title="All 2 branches covered."> } else if ((token.getParentId() != null)</span> <span class="pc bpc" id="L325" title="1 of 2 branches missed."> && !tokenCollection.containsKey(token.getParentId())) {</span> <span class="nc" id="L326"> throw new MtasParserException(</span> <span class="nc" id="L327"> "missing parentId for token with id " + token.getId());</span> <span class="pc bpc" id="L328" title="1 of 2 branches missed."> } else if ((token.getOffsetStart() == null)</span> <span class="pc bpc" id="L329" title="1 of 2 branches missed."> || (token.getOffsetEnd() == null)) {</span> <span class="nc" id="L330"> throw new MtasParserException("missing offset for token with id "</span> <span class="nc" id="L331"> + token.getId() + " (" + token.getValue() + ")");</span> } <span class="fc" id="L333"> tokenCollectionIndex.add(entry.getKey());</span> <span class="fc" id="L334"> }</span> <span class="pc bpc" id="L335" title="1 of 2 branches missed."> if ((tokenCollection.size() > 0)</span> <span class="pc bpc" id="L336" title="2 of 4 branches missed."> && ((minId > 0) || ((1 + maxId - minId) != tokenCollection.size()))) {</span> <span class="nc" id="L337"> throw new MtasParserException("missing ids");</span> } <span class="fc" id="L339"> Collections.sort(tokenCollectionIndex, getCompByName());</span> } <span class="fc" id="L341"> }</span> /** * Gets the comp by name. * * @return the comp by name */ public Comparator<Integer> getCompByName() { <span class="pc bpc" id="L349" title="1 of 2 branches missed."> return new Comparator<Integer>() {</span> @Override public int compare(Integer t1, Integer t2) { <span class="fc" id="L352"> Integer p1 = tokenCollection.get(t1).getPositionStart();</span> <span class="fc" id="L353"> Integer p2 = tokenCollection.get(t2).getPositionStart();</span> <span class="pc bpc" id="L354" title="2 of 4 branches missed."> assert p1 != null : "no position for " + tokenCollection.get(t1);</span> <span class="pc bpc" id="L355" title="2 of 4 branches missed."> assert p2 != null : "no position for " + tokenCollection.get(t2);</span> <span class="fc bfc" id="L356" title="All 2 branches covered."> if (p1.equals(p2)) {</span> <span class="fc" id="L357"> Integer o1 = tokenCollection.get(t1).getOffsetStart();</span> <span class="fc" id="L358"> Integer o2 = tokenCollection.get(t2).getOffsetStart();</span> <span class="pc bpc" id="L359" title="2 of 4 branches missed."> if (o1 != null && o2 != null) {</span> <span class="pc bpc" id="L360" title="1 of 2 branches missed."> if (o1.equals(o2)) {</span> <span class="fc" id="L361"> return tokenCollection.get(t1).getValue()</span> <span class="fc" id="L362"> .compareTo(tokenCollection.get(t2).getValue());</span> } else { <span class="nc" id="L364"> return o1.compareTo(o2);</span> } } else { <span class="nc" id="L367"> return tokenCollection.get(t1).getValue()</span> <span class="nc" id="L368"> .compareTo(tokenCollection.get(t2).getValue());</span> } } <span class="fc" id="L371"> return p1.compareTo(p2);</span> } }; } /** * Clear. */ private void clear() { <span class="fc" id="L380"> tokenCollectionIndex.clear();</span> <span class="fc" id="L381"> tokenCollection.clear();</span> <span class="fc" id="L382"> }</span> } </pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>