/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tradefed.device; import com.android.ddmlib.FileListingService; import com.android.ddmlib.FileListingService.FileEntry; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Implementation of a {@link IFileEntry}. */ class FileEntryWrapper implements IFileEntry { private final TestDevice mTestDevice; private final FileListingService.FileEntry mFileEntry; private Map<String, IFileEntry> mChildMap = null; /** * Creates a {@link FileEntryWrapper}. * * @param testDevice the {@link TestDevice} to use * @param entry the corresponding {@link FileEntry} to wrap */ FileEntryWrapper(TestDevice testDevice, FileEntry entry) { mTestDevice = testDevice; mFileEntry = entry; } /** * {@inheritDoc} */ @Override public String getFullEscapedPath() { return mFileEntry.getFullEscapedPath(); } /** * {@inheritDoc} */ @Override public String getFullPath() { return mFileEntry.getFullPath(); } /** * {@inheritDoc} */ @Override public IFileEntry findChild(String name) throws DeviceNotAvailableException { if (mChildMap == null || !mChildMap.containsKey(name)) { mChildMap = buildChildrenMap(); } return mChildMap.get(name); } /** * {@inheritDoc} */ @Override public boolean isDirectory() { return mFileEntry.isDirectory(); } /** * {@inheritDoc} */ @Override public boolean isAppFileName() { return mFileEntry.isAppFileName(); } /** * {@inheritDoc} */ @Override public String getName() { return mFileEntry.getName(); } /** * {@inheritDoc} */ @Override public Collection<IFileEntry> getChildren(boolean useCache) throws DeviceNotAvailableException { if (!useCache || mChildMap == null) { mChildMap = buildChildrenMap(); } return mChildMap.values(); } private Map<String, IFileEntry> buildChildrenMap() throws DeviceNotAvailableException { FileEntry[] childEntrys = mTestDevice.getFileChildren(mFileEntry); Map<String, IFileEntry> childMap = new HashMap<String, IFileEntry>(childEntrys.length); for (FileEntry entry : childEntrys) { childMap.put(entry.getName(), new FileEntryWrapper(mTestDevice, entry)); } return childMap; } /** * Helper method that tries to a find the descendant of a {@link IFileEntry} * * @param fileEntry the starting point * @param childSegments the relative path of the {@link IFileEntry} to find * @return the {@link IFileEntry}, or <code>null</code> if it cannot be found * @throws DeviceNotAvailableException */ static IFileEntry getDescendant(IFileEntry fileEntry, List<String> childSegments) throws DeviceNotAvailableException { IFileEntry child = fileEntry; for (String childName: childSegments) { if (childName.length() > 0) { child = child.findChild(childName); if (child == null) { return null; } } } return child; } /** * {@inheritDoc} */ @Override public FileEntry getFileEntry() { return mFileEntry; } /** * {@inheritDoc} */ @Override public String getTime() { return mFileEntry.getTime(); } /** * {@inheritDoc} */ @Override public String getDate() { return mFileEntry.getDate(); } /** * {@inheritDoc} */ @Override public String getPermissions() { return mFileEntry.getPermissions(); } }