docs: public Entry get( String path )
      {
          Entry entry = backing.get( path );
          if ( entry == null )
          {
              if ( path.startsWith( "/" ) )
              {
                  path = path.substring( 1 );
              }
              if ( path.length() == 0 )
              {
                  return getRoot();
              }
              String[] parts = path.split( "/" );
              if ( parts.length == 0 )
              {
                  return getRoot();
              }
              DirectoryEntry parent = getRoot();
              for ( int i = 0; i < parts.length - 1; i++ )
              {
                  parent = new DefaultDirectoryEntry( this, parent, parts[i] );
              }
              String name = parts[parts.length - 1];
              for ( DigestFileEntryFactory factory : digestFactories.values() )
              {
                  if ( name.endsWith( factory.getType() ) )
                  {
                      Entry shadow =
                          backing.get( parent.toPath() + "/" + StringUtils.removeEnd( name, factory.getType() ) );
                      return factory.create( this, parent, (FileEntry) shadow );
                  }
              }
              return get( parent, name );
          }
          else
          {
              if ( path.startsWith( "/" ) )
              {
                  path = path.substring( 1 );
              }
              if ( path.length() == 0 )
              {
                  return getRoot();
              }
              String[] parts = path.split( "/" );
              if ( parts.length == 0 )
              {
                  return getRoot();
              }
              DirectoryEntry parent = getRoot();
              for ( int i = 0; i < parts.length - 1; i++ )
              {
                  parent = new DefaultDirectoryEntry( this, parent, parts[i] );
              }
              if ( entry instanceof FileEntry )
              {
                  // repair filesystems that lie to us because they are caching
                  for ( DigestFileEntryFactory factory : digestFactories.values() )
                  {
                      if ( entry.getName().endsWith( factory.getType() ) )
                      {
                          Entry shadow = backing.get(
                              parent.toPath() + "/" + StringUtils.removeEnd( entry.getName(), factory.getType() ) );
                          return new GenerateOnErrorFileEntry( this, parent, (FileEntry) entry,
                                                               factory.create( this, parent, (FileEntry) shadow ) );
                      }
                  }
                  return new LinkFileEntry( this, parent, (FileEntry) entry );
              }
              else if ( entry instanceof DirectoryEntry )
              {
                  for ( DigestFileEntryFactory factory : digestFactories.values() )
                  {
                      if ( entry.getName().endsWith( factory.getType() ) )
                      {
                          Entry shadow = backing.get(
                              parent.toPath() + "/" + StringUtils.removeEnd( entry.getName(), factory.getType() ) );
                          return factory.create( this, parent, (FileEntry) shadow );
                      }
                  }
                  return new DefaultDirectoryEntry( this, parent, entry.getName() );
              }
          }
          return null;
      }