001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2012 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.duplications.detector.suffixtree; 021 022 public final class Suffix { 023 024 private Node originNode; 025 private int beginIndex; 026 private int endIndex; 027 028 public Suffix(Node originNode, int beginIndex, int endIndex) { 029 this.originNode = originNode; 030 this.beginIndex = beginIndex; 031 this.endIndex = endIndex; 032 } 033 034 public boolean isExplicit() { 035 return beginIndex > endIndex; 036 } 037 038 public boolean isImplicit() { 039 return !isExplicit(); 040 } 041 042 public void canonize() { 043 if (isImplicit()) { 044 Edge edge = originNode.findEdge(originNode.symbolAt(beginIndex)); 045 046 int edgeSpan = edge.getSpan(); 047 while (edgeSpan <= getSpan()) { 048 beginIndex += edgeSpan + 1; 049 originNode = edge.getEndNode(); 050 if (beginIndex <= endIndex) { 051 edge = edge.getEndNode().findEdge(originNode.symbolAt(beginIndex)); 052 edgeSpan = edge.getSpan(); 053 } 054 } 055 } 056 } 057 058 public int getSpan() { 059 return endIndex - beginIndex; 060 } 061 062 public Node getOriginNode() { 063 return originNode; 064 } 065 066 public int getBeginIndex() { 067 return beginIndex; 068 } 069 070 public void incBeginIndex() { 071 beginIndex++; 072 } 073 074 public void changeOriginNode() { 075 originNode = originNode.getSuffixNode(); 076 } 077 078 public int getEndIndex() { 079 return endIndex; 080 } 081 082 public void incEndIndex() { 083 endIndex++; 084 } 085 086 }