/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * 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 org.seasar.mayaa.impl.builder.library.scanner; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.mayaa.builder.library.scanner.SourceScanner; import org.seasar.mayaa.impl.ParameterAwareImpl; import org.seasar.mayaa.impl.source.FileSourceDescriptor; import org.seasar.mayaa.impl.util.StringUtil; import org.seasar.mayaa.impl.util.collection.IteratorIterator; /** * @author Taro Kato (Gluegent, Inc.) */ public class ResourceScanner extends ParameterAwareImpl implements SourceScanner { private static final long serialVersionUID = 9001235862576049476L; private static final Log LOG = LogFactory.getLog(ResourceScanner.class); private String _root; private List _classPath = new ArrayList(); private List _jars = new ArrayList(); private Set _extensions = new HashSet(); private Set _ignores = new HashSet(); public ResourceScanner() { String[] pathArray = System.getProperty( "java.class.path", ".").split(File.pathSeparator); for (int i = 0; i < pathArray.length; i++) { String path = pathArray[i]; File file = new File(path); if (file.exists()) { if (file.isDirectory()) { _classPath.add(path); } else if (file.getName().endsWith(".jar")) { _jars.add(path); } } } } public Iterator scan() { IteratorIterator itit = new IteratorIterator(); for (Iterator it = _classPath.iterator(); it.hasNext(); ) { String path = (String) it.next(); if (StringUtil.isEmpty(path)) { continue; } if (path.charAt(path.length()-1) != File.separatorChar) { path += File.separatorChar; } if (_root != null) { path += _root; File dir = new File(path); if (dir.exists() == false || dir.isDirectory() == false) { continue; } } FolderSourceScanner folderScanner = new FolderSourceScanner(); folderScanner.setParameter("folder", path); folderScanner.setParameter("recursive", "true"); folderScanner.setParameter("absolute", "true"); for (Iterator extIterator = _extensions.iterator() ; extIterator.hasNext(); ) { folderScanner.setParameter("extension", (String) extIterator.next()); } itit.add(folderScanner.scan()); if (LOG.isDebugEnabled()) { LOG.debug("scan path: " + path); } } for (Iterator it = _jars.iterator(); it.hasNext(); ) { String path = (String) it.next(); if (StringUtil.isEmpty(path)) { continue; } File jarFile = new File(path).getAbsoluteFile(); JarSourceScanner jarScanner = new JarSourceScanner(); FileSourceDescriptor descriptor = new FileSourceDescriptor(); descriptor.setParameter("absolute", "true"); descriptor.setFile(jarFile); descriptor.setSystemID(jarFile.getName()); jarScanner.setDescriptor(descriptor); if (jarFile.getParent() != null) { jarScanner.setParameter("appPath", jarFile.getParent()); } if (_root != null) { jarScanner.setParameter("folder", _root); } for (Iterator ignoreIterator = _ignores.iterator(); ignoreIterator.hasNext(); ) { jarScanner.setParameter("ignore", (String) ignoreIterator.next()); } for (Iterator extIterator = _extensions.iterator() ; extIterator.hasNext(); ) { jarScanner.setParameter("extension", (String) extIterator.next()); } itit.add(jarScanner); if (LOG.isDebugEnabled()) { LOG.debug("scan jar: " + jarFile.getAbsolutePath()); } } return itit; } // Parameterizable implements ------------------------------------ public void setParameter(String name, String value) { if ("root".equals(name)) { _root = value; if (StringUtil.isEmpty(_root) == false) { if (_root.charAt(0) == File.separatorChar) { _root = _root.substring(1); } } } else if ("extension".equals(name)) { _extensions.add(value); } else if ("ignore".equals(name)) { _ignores.add(value); } else { super.setParameter(name, value); } } }