/******************************************************************************* * Copyright (c) 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse *******************************************************************************/ package org.eclipse.linuxtools.systemtap.structures; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.linuxtools.internal.systemtap.structures.Localization; import org.eclipse.linuxtools.profiling.launch.IRemoteFileProxy; import org.eclipse.linuxtools.profiling.launch.RemoteProxyManager; public class KernelSourceTree { public TreeNode getTree() { return kernelTree; } /** * Builds the kernel tree from file parameter direct and stores the excluded string array. * * @param direct The file to include into the tree. * @param excluded The string array to store as excluded. */ public void buildKernelTree(String direct, String[] excluded) { if (direct == null || direct.isEmpty()){ kernelTree = null; return; } try { URI locationURI = new URI(direct); IRemoteFileProxy proxy = RemoteProxyManager.getInstance().getFileProxy(locationURI); this.buildKernelTree(locationURI, excluded, proxy, null); } catch (URISyntaxException e) { kernelTree = null; } catch (CoreException e) { kernelTree = null; } } /** * Builds the kernel tree from file parameter direct and stores the excluded string array. * * @param locationURI The URI to include into the tree. * @param excluded The string array to store as excluded. * @param proxy The proxy to be used to get the remote files * @param monitor a progress monitor for this operation. Can be null. * @throws CoreException If traversing the tree fails. * * @since 1.1 */ public void buildKernelTree(URI locationURI, String[] excluded, IRemoteFileProxy proxy, IProgressMonitor monitor) throws CoreException { if (excluded != null){ this.excluded = Arrays.copyOf(excluded, excluded.length); } IFileStore fs = proxy.getResource(locationURI.getPath()); if (fs == null) { kernelTree = null; } else { kernelTree = new TreeNode(fs, fs.getName(), false); addLevel(kernelTree, monitor); } } /** * Adds a level to the kernel source tree. * * @param top The top of the tree to add a level to. * @throws CoreException */ private void addLevel(TreeNode top, IProgressMonitor monitor) throws CoreException { boolean add; TreeNode current; IFileStore fs = (IFileStore)top.getData(); IFileStore[] fsList = null; fsList = fs.childStores(EFS.NONE, new NullProgressMonitor()); if (monitor != null) { monitor.beginTask(Localization.getString("ReadingKernelSourceTree"), 100); //$NON-NLS-1$ } CCodeFileFilter filter = new CCodeFileFilter(); for (IFileStore fsChildren : fsList) { add = true; boolean isDir = fsChildren.fetchInfo().isDirectory(); if (!filter.accept(fsChildren.getName(), isDir)) { continue; } for(int j=0; j<excluded.length; j++) { if(fsChildren.getName().equals(excluded[j].substring(0, excluded[j].length()-1)) && isDir) { add = false; break; } } if(add) { current = new TreeNode(fsChildren, fsChildren.getName(), !isDir); top.add(current); if(isDir) { addLevel(top.getChildAt(top.getChildCount()-1), null); if(0 == current.getChildCount()) { top.remove(top.getChildCount()-1); } } } if (monitor != null) { monitor.worked(1); } } top.sortLevel(); } public void dispose() { kernelTree = null; } private TreeNode kernelTree; private String[] excluded = new String[0]; }