regex search
[jalview.git] / forester / java / src / org / forester / phylogeny / PhylogenyMethods.java
index cc2a6b2..f7aa56d 100644 (file)
@@ -40,6 +40,7 @@ import java.util.Map;
 import java.util.Set;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
+import java.util.regex.PatternSyntaxException;\r
 \r
 import org.forester.io.parsers.FastaParser;\r
 import org.forester.io.parsers.PhylogenyParser;\r
@@ -939,6 +940,7 @@ public class PhylogenyMethods {
                                                   final Phylogeny phy,\r
                                                   final boolean case_sensitive,\r
                                                   final boolean partial,\r
+                                                  final boolean regex,\r
                                                   final boolean search_domains ) {\r
         final List<PhylogenyNode> nodes = new ArrayList<PhylogenyNode>();\r
         if ( phy.isEmpty() || ( query == null ) ) {\r
@@ -950,19 +952,23 @@ public class PhylogenyMethods {
         for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {\r
             final PhylogenyNode node = iter.next();\r
             boolean match = false;\r
-            if ( match( node.getName(), query, case_sensitive, partial ) ) {\r
+            if ( match( node.getName(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             else if ( node.getNodeData().isHasTaxonomy()\r
-                    && match( node.getNodeData().getTaxonomy().getTaxonomyCode(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getTaxonomy().getTaxonomyCode(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             else if ( node.getNodeData().isHasTaxonomy()\r
-                    && match( node.getNodeData().getTaxonomy().getCommonName(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getTaxonomy().getCommonName(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             else if ( node.getNodeData().isHasTaxonomy()\r
-                    && match( node.getNodeData().getTaxonomy().getScientificName(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getTaxonomy().getScientificName(),\r
+                              query,\r
+                              case_sensitive,\r
+                              partial,\r
+                              regex ) ) {\r
                 match = true;\r
             }\r
             else if ( node.getNodeData().isHasTaxonomy()\r
@@ -970,28 +976,29 @@ public class PhylogenyMethods {
                     && match( node.getNodeData().getTaxonomy().getIdentifier().getValue(),\r
                               query,\r
                               case_sensitive,\r
-                              partial ) ) {\r
+                              partial,\r
+                              regex ) ) {\r
                 match = true;\r
             }\r
             else if ( node.getNodeData().isHasTaxonomy() && !node.getNodeData().getTaxonomy().getSynonyms().isEmpty() ) {\r
                 final List<String> syns = node.getNodeData().getTaxonomy().getSynonyms();\r
                 I: for( final String syn : syns ) {\r
-                    if ( match( syn, query, case_sensitive, partial ) ) {\r
+                    if ( match( syn, query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break I;\r
                     }\r
                 }\r
             }\r
             if ( !match && node.getNodeData().isHasSequence()\r
-                    && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             if ( !match && node.getNodeData().isHasSequence()\r
-                    && match( node.getNodeData().getSequence().getGeneName(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getSequence().getGeneName(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             if ( !match && node.getNodeData().isHasSequence()\r
-                    && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial ) ) {\r
+                    && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial, regex ) ) {\r
                 match = true;\r
             }\r
             if ( !match\r
@@ -1000,28 +1007,28 @@ public class PhylogenyMethods {
                     && match( node.getNodeData().getSequence().getAccession().getValue(),\r
                               query,\r
                               case_sensitive,\r
-                              partial ) ) {\r
+                              partial,\r
+                              regex ) ) {\r
                 match = true;\r
             }\r
             if ( search_domains && !match && node.getNodeData().isHasSequence()\r
                     && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {\r
                 final DomainArchitecture da = node.getNodeData().getSequence().getDomainArchitecture();\r
                 I: for( int i = 0; i < da.getNumberOfDomains(); ++i ) {\r
-                    if ( match( da.getDomain( i ).getName(), query, case_sensitive, partial ) ) {\r
+                    if ( match( da.getDomain( i ).getName(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break I;\r
                     }\r
                 }\r
             }\r
-            //\r
             if ( !match && node.getNodeData().isHasSequence()\r
                     && ( node.getNodeData().getSequence().getAnnotations() != null ) ) {\r
                 for( final Annotation ann : node.getNodeData().getSequence().getAnnotations() ) {\r
-                    if ( match( ann.getDesc(), query, case_sensitive, partial ) ) {\r
+                    if ( match( ann.getDesc(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break;\r
                     }\r
-                    if ( match( ann.getRef(), query, case_sensitive, partial ) ) {\r
+                    if ( match( ann.getRef(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break;\r
                     }\r
@@ -1030,15 +1037,15 @@ public class PhylogenyMethods {
             if ( !match && node.getNodeData().isHasSequence()\r
                     && ( node.getNodeData().getSequence().getCrossReferences() != null ) ) {\r
                 for( final Accession x : node.getNodeData().getSequence().getCrossReferences() ) {\r
-                    if ( match( x.getComment(), query, case_sensitive, partial ) ) {\r
+                    if ( match( x.getComment(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break;\r
                     }\r
-                    if ( match( x.getSource(), query, case_sensitive, partial ) ) {\r
+                    if ( match( x.getSource(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break;\r
                     }\r
-                    if ( match( x.getValue(), query, case_sensitive, partial ) ) {\r
+                    if ( match( x.getValue(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break;\r
                     }\r
@@ -1048,14 +1055,14 @@ public class PhylogenyMethods {
             if ( !match && ( node.getNodeData().getBinaryCharacters() != null ) ) {\r
                 Iterator<String> it = node.getNodeData().getBinaryCharacters().getPresentCharacters().iterator();\r
                 I: while ( it.hasNext() ) {\r
-                    if ( match( it.next(), query, case_sensitive, partial ) ) {\r
+                    if ( match( it.next(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break I;\r
                     }\r
                 }\r
                 it = node.getNodeData().getBinaryCharacters().getGainedCharacters().iterator();\r
                 I: while ( it.hasNext() ) {\r
-                    if ( match( it.next(), query, case_sensitive, partial ) ) {\r
+                    if ( match( it.next(), query, case_sensitive, partial, regex ) ) {\r
                         match = true;\r
                         break I;\r
                     }\r
@@ -1085,19 +1092,31 @@ public class PhylogenyMethods {
                 if ( ForesterUtil.isEmpty( query ) ) {\r
                     continue;\r
                 }\r
-                if ( match( node.getName(), query, case_sensitive, partial ) ) {\r
+                if ( match( node.getName(), query, case_sensitive, partial, false ) ) {\r
                     match = true;\r
                 }\r
                 else if ( node.getNodeData().isHasTaxonomy()\r
-                        && match( node.getNodeData().getTaxonomy().getTaxonomyCode(), query, case_sensitive, partial ) ) {\r
+                        && match( node.getNodeData().getTaxonomy().getTaxonomyCode(),\r
+                                  query,\r
+                                  case_sensitive,\r
+                                  partial,\r
+                                  false ) ) {\r
                     match = true;\r
                 }\r
                 else if ( node.getNodeData().isHasTaxonomy()\r
-                        && match( node.getNodeData().getTaxonomy().getCommonName(), query, case_sensitive, partial ) ) {\r
+                        && match( node.getNodeData().getTaxonomy().getCommonName(),\r
+                                  query,\r
+                                  case_sensitive,\r
+                                  partial,\r
+                                  false ) ) {\r
                     match = true;\r
                 }\r
                 else if ( node.getNodeData().isHasTaxonomy()\r
-                        && match( node.getNodeData().getTaxonomy().getScientificName(), query, case_sensitive, partial ) ) {\r
+                        && match( node.getNodeData().getTaxonomy().getScientificName(),\r
+                                  query,\r
+                                  case_sensitive,\r
+                                  partial,\r
+                                  false ) ) {\r
                     match = true;\r
                 }\r
                 else if ( node.getNodeData().isHasTaxonomy()\r
@@ -1105,29 +1124,31 @@ public class PhylogenyMethods {
                         && match( node.getNodeData().getTaxonomy().getIdentifier().getValue(),\r
                                   query,\r
                                   case_sensitive,\r
-                                  partial ) ) {\r
+                                  partial,\r
+                                  false ) ) {\r
                     match = true;\r
                 }\r
                 else if ( node.getNodeData().isHasTaxonomy()\r
                         && !node.getNodeData().getTaxonomy().getSynonyms().isEmpty() ) {\r
                     final List<String> syns = node.getNodeData().getTaxonomy().getSynonyms();\r
                     I: for( final String syn : syns ) {\r
-                        if ( match( syn, query, case_sensitive, partial ) ) {\r
+                        if ( match( syn, query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break I;\r
                         }\r
                     }\r
                 }\r
                 if ( !match && node.getNodeData().isHasSequence()\r
-                        && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial ) ) {\r
+                        && match( node.getNodeData().getSequence().getName(), query, case_sensitive, partial, false ) ) {\r
                     match = true;\r
                 }\r
-                if ( !match && node.getNodeData().isHasSequence()\r
-                        && match( node.getNodeData().getSequence().getGeneName(), query, case_sensitive, partial ) ) {\r
+                if ( !match\r
+                        && node.getNodeData().isHasSequence()\r
+                        && match( node.getNodeData().getSequence().getGeneName(), query, case_sensitive, partial, false ) ) {\r
                     match = true;\r
                 }\r
                 if ( !match && node.getNodeData().isHasSequence()\r
-                        && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial ) ) {\r
+                        && match( node.getNodeData().getSequence().getSymbol(), query, case_sensitive, partial, false ) ) {\r
                     match = true;\r
                 }\r
                 if ( !match\r
@@ -1136,14 +1157,15 @@ public class PhylogenyMethods {
                         && match( node.getNodeData().getSequence().getAccession().getValue(),\r
                                   query,\r
                                   case_sensitive,\r
-                                  partial ) ) {\r
+                                  partial,\r
+                                  false ) ) {\r
                     match = true;\r
                 }\r
                 if ( search_domains && !match && node.getNodeData().isHasSequence()\r
                         && ( node.getNodeData().getSequence().getDomainArchitecture() != null ) ) {\r
                     final DomainArchitecture da = node.getNodeData().getSequence().getDomainArchitecture();\r
                     I: for( int i = 0; i < da.getNumberOfDomains(); ++i ) {\r
-                        if ( match( da.getDomain( i ).getName(), query, case_sensitive, partial ) ) {\r
+                        if ( match( da.getDomain( i ).getName(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break I;\r
                         }\r
@@ -1153,11 +1175,11 @@ public class PhylogenyMethods {
                 if ( !match && node.getNodeData().isHasSequence()\r
                         && ( node.getNodeData().getSequence().getAnnotations() != null ) ) {\r
                     for( final Annotation ann : node.getNodeData().getSequence().getAnnotations() ) {\r
-                        if ( match( ann.getDesc(), query, case_sensitive, partial ) ) {\r
+                        if ( match( ann.getDesc(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break;\r
                         }\r
-                        if ( match( ann.getRef(), query, case_sensitive, partial ) ) {\r
+                        if ( match( ann.getRef(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break;\r
                         }\r
@@ -1166,15 +1188,15 @@ public class PhylogenyMethods {
                 if ( !match && node.getNodeData().isHasSequence()\r
                         && ( node.getNodeData().getSequence().getCrossReferences() != null ) ) {\r
                     for( final Accession x : node.getNodeData().getSequence().getCrossReferences() ) {\r
-                        if ( match( x.getComment(), query, case_sensitive, partial ) ) {\r
+                        if ( match( x.getComment(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break;\r
                         }\r
-                        if ( match( x.getSource(), query, case_sensitive, partial ) ) {\r
+                        if ( match( x.getSource(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break;\r
                         }\r
-                        if ( match( x.getValue(), query, case_sensitive, partial ) ) {\r
+                        if ( match( x.getValue(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break;\r
                         }\r
@@ -1184,14 +1206,14 @@ public class PhylogenyMethods {
                 if ( !match && ( node.getNodeData().getBinaryCharacters() != null ) ) {\r
                     Iterator<String> it = node.getNodeData().getBinaryCharacters().getPresentCharacters().iterator();\r
                     I: while ( it.hasNext() ) {\r
-                        if ( match( it.next(), query, case_sensitive, partial ) ) {\r
+                        if ( match( it.next(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break I;\r
                         }\r
                     }\r
                     it = node.getNodeData().getBinaryCharacters().getGainedCharacters().iterator();\r
                     I: while ( it.hasNext() ) {\r
-                        if ( match( it.next(), query, case_sensitive, partial ) ) {\r
+                        if ( match( it.next(), query, case_sensitive, partial, false ) ) {\r
                             match = true;\r
                             break I;\r
                         }\r
@@ -1615,17 +1637,38 @@ public class PhylogenyMethods {
     private static boolean match( final String s,\r
                                   final String query,\r
                                   final boolean case_sensitive,\r
-                                  final boolean partial ) {\r
+                                  final boolean partial,\r
+                                  final boolean regex ) {\r
         if ( ForesterUtil.isEmpty( s ) || ForesterUtil.isEmpty( query ) ) {\r
             return false;\r
         }\r
         String my_s = s.trim();\r
         String my_query = query.trim();\r
-        if ( !case_sensitive ) {\r
+        if ( !case_sensitive && !regex ) {\r
             my_s = my_s.toLowerCase();\r
             my_query = my_query.toLowerCase();\r
         }\r
-        if ( partial ) {\r
+        if ( regex ) {\r
+            Pattern p = null;\r
+            try {\r
+                if ( case_sensitive ) {\r
+                    p = Pattern.compile( my_query );\r
+                }\r
+                else {\r
+                    p = Pattern.compile( my_query, Pattern.CASE_INSENSITIVE );\r
+                }\r
+            }\r
+            catch ( final PatternSyntaxException e ) {\r
+                return false;\r
+            }\r
+            if ( p != null ) {\r
+                return p.matcher( my_s ).find();\r
+            }\r
+            else {\r
+                return false;\r
+            }\r
+        }\r
+        else if ( partial ) {\r
             return my_s.indexOf( my_query ) >= 0;\r
         }\r
         else {\r