docs: public Set<Artifact> getArtifacts( final String groupId, final String artifactId, final String version )
      {
          Entry parentEntry = backing.get( groupId.replace( '.', '/' ) + "/" + artifactId + "/" + version );
          if ( !( parentEntry instanceof DirectoryEntry ) )
          {
              return Collections.emptySet();
          }
          DirectoryEntry parentDir = (DirectoryEntry) parentEntry;
          Entry[] entries = backing.listEntries( parentDir );
          final Pattern rule;
  
          abstract class ArtifactFactory
          {
              abstract Artifact get( Entry entry );
          }
  
          final ArtifactFactory factory;
          if ( version.endsWith( "-SNAPSHOT" ) )
          {
              rule = Pattern.compile( "\\Q" + artifactId + "\\E-(?:\\Q" + StringUtils.removeEnd( version, "-SNAPSHOT" )
                                          + "\\E-(SNAPSHOT|(\\d{4})(\\d{2})(\\d{2})\\.(\\d{2})(\\d{2})(\\d{2})-(\\d+)))(?:-([^.]+))?\\.([^/]*)" );
              factory = new ArtifactFactory()
              {
                  public Artifact get( Entry entry )
                  {
                      Matcher matcher = rule.matcher( entry.getName() );
                      if ( !matcher.matches() )
                      {
                          return null;
                      }
                      if ( matcher.group( 1 ).equals( "SNAPSHOT" ) )
                      {
                          return new Artifact( groupId, artifactId, version, matcher.group( 9 ), matcher.group( 10 ) );
                      }
                      try
                      {
                          Calendar cal = new GregorianCalendar();
                          cal.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
                          cal.set( Calendar.YEAR, Integer.parseInt( matcher.group( 2 ) ) );
                          cal.set( Calendar.MONTH, Integer.parseInt( matcher.group( 3 ) ) - 1 );
                          cal.set( Calendar.DAY_OF_MONTH, Integer.parseInt( matcher.group( 4 ) ) );
                          cal.set( Calendar.HOUR_OF_DAY, Integer.parseInt( matcher.group( 5 ) ) );
                          cal.set( Calendar.MINUTE, Integer.parseInt( matcher.group( 6 ) ) );
                          cal.set( Calendar.SECOND, Integer.parseInt( matcher.group( 7 ) ) );
                          long timestamp = cal.getTimeInMillis();
                          int buildNumber = Integer.parseInt( matcher.group( 8 ) );
                          return new Artifact( groupId, artifactId, version, matcher.group( 9 ), matcher.group( 10 ),
                                               timestamp, buildNumber );
                      }
                      catch ( NullPointerException e )
                      {
                          return null;
                      }
                  }
              };
          }
          else
          {
              rule = Pattern.compile( "\\Q" + artifactId + "\\E-\\Q" + version + "\\E(?:-([^.]+))?\\.(.+)" );
              factory = new ArtifactFactory()
              {
                  public Artifact get( Entry entry )
                  {
                      Matcher matcher = rule.matcher( entry.getName() );
                      if ( !matcher.matches() )
                      {
                          return null;
                      }
                      return new Artifact( groupId, artifactId, version, matcher.group( 1 ), matcher.group( 2 ) );
                  }
              };
          }
          Set<Artifact> result = new HashSet<Artifact>( entries.length );
          for ( int i = 0; i < entries.length; i++ )
          {
              if ( !( entries[i] instanceof FileEntry ) || !rule.matcher( entries[i].getName() ).matches() )
              {
                  continue;
              }
              Artifact artifact = factory.get( entries[i] );
              if ( artifact != null )
              {
                  result.add( artifact );
              }
          }
          return result;
      }