1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.tradefed.device;
17 
18 import com.android.ddmlib.FileListingService;
19 import com.android.ddmlib.FileListingService.FileEntry;
20 
21 import java.util.Collection;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25 
26 /**
27  * Implementation of a {@link IFileEntry}.
28  */
29 class FileEntryWrapper implements IFileEntry {
30 
31     private final NativeDevice mTestDevice;
32     private final FileListingService.FileEntry mFileEntry;
33     private Map<String, IFileEntry> mChildMap = null;
34 
35     /**
36      * Creates a {@link FileEntryWrapper}.
37      *
38      * @param testDevice the {@link TestDevice} to use
39      * @param entry the corresponding {@link FileEntry} to wrap
40      */
FileEntryWrapper(NativeDevice testDevice, FileEntry entry)41     FileEntryWrapper(NativeDevice testDevice, FileEntry entry) {
42         mTestDevice = testDevice;
43         mFileEntry = entry;
44     }
45 
46     /**
47      * {@inheritDoc}
48      */
49     @Override
getFullEscapedPath()50     public String getFullEscapedPath() {
51         return mFileEntry.getFullEscapedPath();
52     }
53 
54     /**
55      * {@inheritDoc}
56      */
57     @Override
getFullPath()58     public String getFullPath() {
59         return mFileEntry.getFullPath();
60     }
61 
62     /**
63      * {@inheritDoc}
64      */
65     @Override
findChild(String name)66     public IFileEntry findChild(String name) throws DeviceNotAvailableException {
67         if (mChildMap == null || !mChildMap.containsKey(name)) {
68             mChildMap = buildChildrenMap();
69         }
70         return mChildMap.get(name);
71     }
72 
73     /**
74      * {@inheritDoc}
75      */
76     @Override
isDirectory()77     public boolean isDirectory() {
78         return mFileEntry.isDirectory();
79     }
80 
81     /**
82      * {@inheritDoc}
83      */
84     @Override
isAppFileName()85     public boolean isAppFileName() {
86         return mFileEntry.isAppFileName();
87     }
88 
89     /**
90      * {@inheritDoc}
91      */
92     @Override
getName()93     public String getName() {
94         return mFileEntry.getName();
95     }
96 
97     /**
98      * {@inheritDoc}
99      */
100     @Override
getChildren(boolean useCache)101     public Collection<IFileEntry> getChildren(boolean useCache) throws DeviceNotAvailableException {
102         if (!useCache || mChildMap == null) {
103             mChildMap = buildChildrenMap();
104         }
105         return mChildMap.values();
106     }
107 
buildChildrenMap()108     private Map<String, IFileEntry> buildChildrenMap() throws DeviceNotAvailableException {
109         FileEntry[] childEntrys = mTestDevice.getFileChildren(mFileEntry);
110         Map<String, IFileEntry> childMap = new HashMap<String, IFileEntry>(childEntrys.length);
111         for (FileEntry entry : childEntrys) {
112             childMap.put(entry.getName(), new FileEntryWrapper(mTestDevice, entry));
113         }
114         return childMap;
115     }
116 
117     /**
118      * Helper method that tries to a find the descendant of a {@link IFileEntry}
119      *
120      * @param fileEntry the starting point
121      * @param childSegments the relative path of the {@link IFileEntry} to find
122      * @return the {@link IFileEntry}, or <code>null</code> if it cannot be found
123      * @throws DeviceNotAvailableException
124      */
getDescendant(IFileEntry fileEntry, List<String> childSegments)125     static IFileEntry getDescendant(IFileEntry fileEntry, List<String> childSegments)
126             throws DeviceNotAvailableException {
127         IFileEntry child = fileEntry;
128         for (String childName: childSegments) {
129             if (childName.length() > 0) {
130                 child = child.findChild(childName);
131                 if (child == null) {
132                     return null;
133                 }
134             }
135         }
136         return child;
137     }
138 
139     /**
140      * {@inheritDoc}
141      */
142     @Override
getFileEntry()143     public FileEntry getFileEntry() {
144         return mFileEntry;
145     }
146 
147     /**
148      * {@inheritDoc}
149      */
150     @Override
getTime()151     public String getTime() {
152         return mFileEntry.getTime();
153     }
154 
155     /**
156      * {@inheritDoc}
157      */
158     @Override
getDate()159     public String getDate() {
160         return mFileEntry.getDate();
161     }
162 
163     /**
164      * {@inheritDoc}
165      */
166     @Override
getPermissions()167     public String getPermissions() {
168         return mFileEntry.getPermissions();
169     }
170 }
171