private void getMetaDataPathDetail( TMetaDataPathDetail metaDataPathDetail, long offset, long count, boolean longFormat) throws SRMException, URISyntaxException { List<FileMetaData> directoryList; // // simplify things for the most common case when people perform // ls on directory w/o specifying recursionDepth // URI surl = new URI(null, null, metaDataPathDetail.getPath(), null); directoryList = getStorage().listDirectory(getUser(), surl, longFormat, (int) offset, (int) count); getContainerRequest().setCounter(offset); List<TMetaDataPathDetail> metadataPathDetailList = new LinkedList<>(); for (FileMetaData md : directoryList) { URI subpath = new URI(null, null, md.SURL, null); TMetaDataPathDetail dirMetaDataPathDetail = convertFileMetaDataToTMetaDataPathDetail(subpath, md, longFormat); if (!getContainerRequest().shouldSkipThisRecord()) { metadataPathDetailList.add(dirMetaDataPathDetail); try { if (!getContainerRequest().increaseResultsNumAndContinue()) { break; } } catch (SRMTooManyResultsException e) { metaDataPathDetail.setStatus(new TReturnStatus(TStatusCode.SRM_FAILURE, e.getMessage())); break; } } // // increment global entries counter // getContainerRequest().incrementGlobalEntryCounter(); } metaDataPathDetail.setArrayOfSubPaths( new ArrayOfTMetaDataPathDetail( metadataPathDetailList.toArray( new TMetaDataPathDetail[metadataPathDetailList.size()]))); }
private void getRecursiveMetaDataPathDetail( TMetaDataPathDetail metaDataPathDetail, FileMetaData fmd, int depth, long offset, long count, int recursionDepth, boolean longFormat) throws SRMException, URISyntaxException { if (!fmd.isDirectory || depth >= recursionDepth) { return; } List<FileMetaData> directoryList; URI surl = new URI(null, null, metaDataPathDetail.getPath(), null); // // cannot use offset or count in this case since // we are trying to flatten tree structure. // rely on our own counting if (offset == 0) { // // if offset=0, trivial case, just grab information w/ verbosity level // provided by the user // directoryList = getStorage().listDirectory(getUser(), surl, longFormat, 0, (int) count); } else { // // if offset!=0, we loop over direntries in non-verbose mode until // we hit offset, then start getting information with verbosity // level specified by the user by calling getStorage().getFileMetaData on // each entry // directoryList = getStorage().listDirectory(getUser(), surl, false, 0, Integer.MAX_VALUE); } // // sort list such that directories are at the end of the list after // sorting. The intent is to leave the recursion calls at the // end of the tree, so we have less chance to even get there // Collections.sort(directoryList, DIRECTORY_LAST_ORDER); List<TMetaDataPathDetail> metadataPathDetailList = new LinkedList<>(); for (FileMetaData md : directoryList) { URI subpath = new URI(null, null, md.SURL, null); TMetaDataPathDetail dirMetaDataPathDetail; if (offset == 0) { dirMetaDataPathDetail = convertFileMetaDataToTMetaDataPathDetail(subpath, md, longFormat); } else { FileMetaData fileMetaData = md; if (!getContainerRequest().shouldSkipThisRecord()) { if (longFormat) { fileMetaData = getStorage().getFileMetaData(getUser(), subpath, false); } dirMetaDataPathDetail = convertFileMetaDataToTMetaDataPathDetail(subpath, fileMetaData, longFormat); } else { // // skip this record - meaning count it, and request only minimal details, do not store it // dirMetaDataPathDetail = convertFileMetaDataToTMetaDataPathDetail(subpath, fileMetaData, false); } } if (!getContainerRequest().shouldSkipThisRecord()) { metadataPathDetailList.add(dirMetaDataPathDetail); try { if (!getContainerRequest().increaseResultsNumAndContinue()) { break; } } catch (SRMTooManyResultsException e) { metaDataPathDetail.setStatus(new TReturnStatus(TStatusCode.SRM_FAILURE, e.getMessage())); break; } } // // increment global entries counter // getContainerRequest().incrementGlobalEntryCounter(); if (md.isDirectory) { try { getRecursiveMetaDataPathDetail( dirMetaDataPathDetail, md, depth + 1, offset, count, recursionDepth, longFormat); } catch (SRMException e) { String msg = e.getMessage(); if (e instanceof SRMAuthorizationException) { dirMetaDataPathDetail.setStatus( new TReturnStatus(TStatusCode.SRM_AUTHORIZATION_FAILURE, msg)); } else if (e instanceof SRMInvalidPathException) { dirMetaDataPathDetail.setStatus(new TReturnStatus(TStatusCode.SRM_INVALID_PATH, msg)); } else { dirMetaDataPathDetail.setStatus(new TReturnStatus(TStatusCode.SRM_FAILURE, msg)); } } } } metaDataPathDetail.setArrayOfSubPaths( new ArrayOfTMetaDataPathDetail( metadataPathDetailList.toArray( new TMetaDataPathDetail[metadataPathDetailList.size()]))); }