@Override
    public PathAttributes find(final Path file, final ListProgressListener listener) throws BackgroundException {
        try {
            final EueApiClient client = new EueApiClient(session);
            final UiFsModel response;
            final String resourceId = fileid.getFileId(file);
            switch(resourceId) {
                case EueResourceIdProvider.ROOT:
                case EueResourceIdProvider.TRASH:
                    response = new ListResourceAliasApi(client).resourceAliasAliasGet(resourceId,
                            null, file.attributes().getETag(), null, null, null, null,
                            Collections.singletonList(OPTION_WIN_32_PROPS), null);
                    break;
                default:
                    response = new ListResourceApi(client).resourceResourceIdGet(resourceId,
                            null, file.attributes().getETag(), null, null, null, null,
                            Collections.singletonList(OPTION_WIN_32_PROPS), null);
                    break;
            }
            switch(response.getUifs().getResourceType()) {
                case "aliascontainer":
                case "container":
                    if(file.isFile()) {
                        throw new NotfoundException(file.getAbsolute());
                    }
                    break;
                default:
                    if(file.isDirectory()) {
                        throw new NotfoundException(file.getAbsolute());
                    }
                    break;
            }
            final PathAttributes attr = this.toAttributes(response.getUifs(), response.getUiwin32(),
                    EueShareFeature.findShareForResource(session.userShares(), resourceId));
            if(client.getResponseHeaders().containsKey(HttpHeaders.ETAG)) {
                attr.setETag(StringUtils.remove(client.getResponseHeaders().get(HttpHeaders.ETAG).stream().findFirst().orElse(null), '"'));
            }
            return attr;
        }
        catch(ApiException e) {
            switch(e.getCode()) {
                case HttpStatus.SC_NOT_MODIFIED:
                    if(log.isDebugEnabled()) {
                        log.debug(String.format("No changes for file %s with ETag %s", file, file.attributes().getETag()));
                    }
                    return file.attributes();
            }
            throw new EueExceptionMappingService().map("Failure to read attributes of {0}", e, file);
        }
    }
@Test
    public void testFindFeatureForSharedFolder() throws Exception {
        final EueResourceIdProvider fileid = new EueResourceIdProvider(session);
        final Path folder = new EueDirectoryFeature(session, fileid).mkdir(new Path(new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory)), new TransferStatus());
        final ShareCreationResponseEntry shareCreationResponseEntry = createShare(fileid, folder);
        final String shareName = shareCreationResponseEntry.getEntity().getName();
        final EueAttributesFinderFeature feature = new EueAttributesFinderFeature(session, fileid);
        final PathAttributes attr = feature.find(folder, new DisabledListProgressListener());
        assertNotNull(attr.getLink());
        assertEquals(attr.getLink(), new EueShareUrlProvider(session.getHost(), session.userShares()).toUrl(folder).find(DescriptiveUrl.Type.signed));
        new EueDeleteFeature(session, fileid).delete(Collections.singletonList(folder), new DisabledPasswordCallback(), new Delete.DisabledCallback());
    }