コード例 #1
0
  @Override
  protected void doOpen() throws Exception {
    Assert.notNull(resource, "Input resource must be set");
    Assert.notNull(recordSeparatorPolicy, "RecordSeparatorPolicy must be set");

    noInput = true;
    if (!resource.exists()) {
      if (strict) {
        throw new IllegalStateException(
            "Input resource must exist (reader is in 'strict' mode): " + resource);
      }
      logger.warn("Input resource does not exist " + resource.getDescription());
      return;
    }

    if (!resource.isReadable()) {
      if (strict) {
        throw new IllegalStateException(
            "Input resource must be readable (reader is in 'strict' mode): " + resource);
      }
      logger.warn("Input resource is not readable " + resource.getDescription());
      return;
    }

    reader = bufferedReaderFactory.create(resource, encoding);
    for (int i = 0; i < linesToSkip; i++) {
      String line = readLine();
      if (skippedLinesCallback != null) {
        skippedLinesCallback.handleLine(line);
      }
    }
    noInput = false;
  }
 /**
  * Perform Spring-based scanning for entity classes, registering them as annotated classes with
  * this {@code Configuration}.
  *
  * @param packagesToScan one or more Java package names
  * @throws HibernateException if scanning fails for any reason
  */
 public void scanPackages(String... packagesToScan) throws HibernateException {
   try {
     for (String pkg : packagesToScan) {
       String pattern =
           ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
               + ClassUtils.convertClassNameToResourcePath(pkg)
               + RESOURCE_PATTERN;
       Resource[] resources = resourcePatternResolver.getResources(pattern);
       MetadataReaderFactory readerFactory =
           new CachingMetadataReaderFactory(resourcePatternResolver);
       for (Resource resource : resources) {
         if (resource.isReadable()) {
           MetadataReader reader = readerFactory.getMetadataReader(resource);
           String className = reader.getClassMetadata().getClassName();
           if (matchesFilter(reader, readerFactory)) {
             addAnnotatedClasses(resourcePatternResolver.getClassLoader().loadClass(className));
           }
         }
       }
     }
   } catch (IOException ex) {
     throw new MappingException("Failed to scan classpath for unlisted classes", ex);
   } catch (ClassNotFoundException ex) {
     throw new MappingException("Failed to load annotated classes from classpath", ex);
   }
 }
 /**
  * Perform Spring-based scanning for entity classes.
  *
  * @see #setPackagesToScan
  */
 private SpringPersistenceUnitInfo buildDefaultPersistenceUnitInfo() {
   SpringPersistenceUnitInfo scannedUnit = new SpringPersistenceUnitInfo();
   scannedUnit.setPersistenceUnitName(this.defaultPersistenceUnitName);
   scannedUnit.excludeUnlistedClasses();
   if (this.packagesToScan != null) {
     for (String pkg : this.packagesToScan) {
       try {
         String pattern =
             ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                 + ClassUtils.convertClassNameToResourcePath(pkg)
                 + ENTITY_CLASS_RESOURCE_PATTERN;
         Resource[] resources = this.resourcePatternResolver.getResources(pattern);
         MetadataReaderFactory readerFactory =
             new CachingMetadataReaderFactory(this.resourcePatternResolver);
         for (Resource resource : resources) {
           if (resource.isReadable()) {
             MetadataReader reader = readerFactory.getMetadataReader(resource);
             String className = reader.getClassMetadata().getClassName();
             if (matchesFilter(reader, readerFactory)) {
               scannedUnit.addManagedClassName(className);
             }
           }
         }
       } catch (IOException ex) {
         throw new PersistenceException("Failed to scan classpath for unlisted classes", ex);
       }
     }
   }
   if (this.mappingResources != null) {
     for (String mappingFileName : this.mappingResources) {
       scannedUnit.addMappingFileName(mappingFileName);
     }
   }
   return scannedUnit;
 }
コード例 #4
0
ファイル: CronMethodParser.java プロジェクト: Guru-SH/mifosx
 /** method adds all the method names to map with annotation attribute value as key */
 private static void findAnnotationMethods(
     final Class<? extends Annotation> annotationClass, final String attributeName)
     throws IOException {
   final String basePackagePath =
       ClassUtils.convertClassNameToResourcePath(
           new StandardEnvironment().resolveRequiredPlaceholders(SEARCH_PACKAGE));
   final String packageSearchPath =
       ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + basePackagePath + "/" + RESOURCE_PATTERN;
   final Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
   for (final Resource resource : resources) {
     if (resource.isReadable()) {
       final MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
       final Set<MethodMetadata> metadataSet =
           metadataReader.getAnnotationMetadata().getAnnotatedMethods(annotationClass.getName());
       if (metadataSet != null && metadataSet.size() > 0) {
         for (final MethodMetadata metadata : metadataSet) {
           final Map<String, Object> attributes =
               metadata.getAnnotationAttributes(annotationClass.getName());
           final JobName attributeValue = (JobName) attributes.get(attributeName);
           final String className = metadata.getDeclaringClassName();
           final String[] mapVal = {className, metadata.getMethodName()};
           targetMethosMap.put(attributeValue.toString(), mapVal);
         }
       }
     }
   }
 }
コード例 #5
0
  public void setAdsResource(Resource resource)
      throws ParserConfigurationException, IOException, SAXException {
    advertisementBlocks.clear();

    if (resource != null && resource.exists() && resource.isReadable()) {
      final DocumentBuilder builder = BUILDER_FACTORY.newDocumentBuilder();
      final Document document = builder.parse(resource.getInputStream());

      final Element root = document.getDocumentElement();
      final String client = root.getAttribute("client");

      final NodeList blocks = root.getElementsByTagName("block");
      for (int i = 0; i < blocks.getLength(); i++) {
        final Element block = (Element) blocks.item(i);
        final String name = block.getAttribute("name");

        final NodeList items = block.getElementsByTagName("item");
        for (int j = 0; j < items.getLength(); j++) {
          final Element item = (Element) items.item(j);
          final String slot = item.getAttribute("slot");
          final Language language = Language.byCode(item.getAttribute("language"));
          final int width = Integer.valueOf(item.getAttribute("width"));
          final int height = Integer.valueOf(item.getAttribute("height"));

          advertisementBlocks.put(
              new AdsBlockKey(name, language),
              new AdvertisementBlock(client, slot, width, height, AdvertisementProvider.GOOGLE));
        }
      }
    }
  }
コード例 #6
0
ファイル: ClassScaner.java プロジェクト: gitter-badger/wx_api
  public Set<Class> doScan(String basePackage) {
    Set<Class> classes = new HashSet<Class>();
    try {
      String packageSearchPath =
          ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
              + ClassUtils.convertClassNameToResourcePath(
                  SystemPropertyUtils.resolvePlaceholders(basePackage))
              + DEFAULT_RESOURCE_PATTERN;
      Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

      for (int i = 0; i < resources.length; i++) {
        Resource resource = resources[i];
        if (resource.isReadable()) {
          MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
          if ((includeFilters.size() == 0 && excludeFilters.size() == 0)
              || matches(metadataReader)) {
            try {
              classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));
            } catch (ClassNotFoundException e) {
              e.printStackTrace();
            }
          }
        }
      }
    } catch (IOException ex) {
      throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
    }
    return classes;
  }
コード例 #7
0
  private PluginConfiguration[] locatePluginConfigurations() throws Exception {
    List<PluginConfiguration> pluginConfigs = new LinkedList<PluginConfiguration>();

    // first we see if the config is etc exists
    if (m_configResource != null && m_configResource.isReadable()) {
      LogUtils.infof(this, "Found Drools Plugin config file %s.", m_configResource);
      pluginConfigs.add(new PluginConfiguration(m_configResource));
    }

    // then we look in each plugin dir for a config
    File[] pluginDirs = getPluginDirs();

    for (File pluginDir : pluginDirs) {
      File configFile = new File(pluginDir, PLUGIN_CONFIG_FILE_NAME);
      if (!configFile.exists()) {
        LogUtils.errorf(
            this,
            "Drools Plugin directory %s does not contains a %s config file.  Ignoring plugin.",
            pluginDir,
            PLUGIN_CONFIG_FILE_NAME);
      } else {
        LogUtils.infof(
            this,
            "Found Drools Plugin directory %s containing a %s config file.",
            pluginDir,
            PLUGIN_CONFIG_FILE_NAME);
        pluginConfigs.add(new PluginConfiguration(new FileSystemResource(configFile)));
      }
    }

    return pluginConfigs.toArray(new PluginConfiguration[0]);
  }
コード例 #8
0
 // Copies a set of resources to a given directory. The set is specified
 // by an Ant-style path-matching pattern.
 public void copyGrailsResources(Object destDir, Object pattern, boolean overwrite)
     throws FileNotFoundException, IOException {
   new File(destDir.toString()).mkdirs();
   Resource[] resources = resolveResources("classpath:" + pattern);
   for (Resource resource : resources) {
     if (resource.isReadable()) {
       copyGrailsResource(destDir + "/" + resource.getFilename(), resource, overwrite);
     }
   }
 }
 /**
  * Scan the class path for candidate components.
  *
  * @param basePackage the package to check for annotated classes
  * @return a corresponding Set of autodetected bean definitions
  */
 public Set<BeanDefinition> findCandidateComponents(String basePackage) {
   Set<BeanDefinition> candidates = new LinkedHashSet<BeanDefinition>();
   try {
     String packageSearchPath =
         ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
             + resolveBasePackage(basePackage)
             + "/"
             + this.resourcePattern;
     Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);
     boolean traceEnabled = logger.isTraceEnabled();
     boolean debugEnabled = logger.isDebugEnabled();
     for (Resource resource : resources) {
       if (traceEnabled) {
         logger.trace("Scanning " + resource);
       }
       if (resource.isReadable()) {
         try {
           MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
           if (isCandidateComponent(metadataReader)) {
             ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
             sbd.setResource(resource);
             sbd.setSource(resource);
             if (isCandidateComponent(sbd)) {
               if (debugEnabled) {
                 logger.debug("Identified candidate component class: " + resource);
               }
               candidates.add(sbd);
             } else {
               if (debugEnabled) {
                 logger.debug("Ignored because not a concrete top-level class: " + resource);
               }
             }
           } else {
             if (traceEnabled) {
               logger.trace("Ignored because not matching any filter: " + resource);
             }
           }
         } catch (Throwable ex) {
           throw new BeanDefinitionStoreException(
               "Failed to read candidate component class: " + resource, ex);
         }
       } else {
         if (traceEnabled) {
           logger.trace("Ignored because not readable: " + resource);
         }
       }
     }
   } catch (IOException ex) {
     throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
   }
   return candidates;
 }
コード例 #10
0
 /**
  * Perform Spring-based scanning for entity classes, registering them as annotated classes with
  * this {@code Configuration}.
  *
  * @param packagesToScan one or more Java package names
  * @throws HibernateException if scanning fails for any reason
  */
 public LocalSessionFactoryBuilder scanPackages(String... packagesToScan)
     throws HibernateException {
   Set<String> entityClassNames = new TreeSet<String>();
   Set<String> converterClassNames = new TreeSet<String>();
   Set<String> packageNames = new TreeSet<String>();
   try {
     for (String pkg : packagesToScan) {
       String pattern =
           ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
               + ClassUtils.convertClassNameToResourcePath(pkg)
               + RESOURCE_PATTERN;
       Resource[] resources = this.resourcePatternResolver.getResources(pattern);
       MetadataReaderFactory readerFactory =
           new CachingMetadataReaderFactory(this.resourcePatternResolver);
       for (Resource resource : resources) {
         if (resource.isReadable()) {
           MetadataReader reader = readerFactory.getMetadataReader(resource);
           String className = reader.getClassMetadata().getClassName();
           if (matchesEntityTypeFilter(reader, readerFactory)) {
             entityClassNames.add(className);
           } else if (converterTypeFilter != null
               && converterTypeFilter.match(reader, readerFactory)) {
             converterClassNames.add(className);
           } else if (className.endsWith(PACKAGE_INFO_SUFFIX)) {
             packageNames.add(
                 className.substring(0, className.length() - PACKAGE_INFO_SUFFIX.length()));
           }
         }
       }
     }
   } catch (IOException ex) {
     throw new MappingException("Failed to scan classpath for unlisted classes", ex);
   }
   try {
     ClassLoader cl = this.resourcePatternResolver.getClassLoader();
     for (String className : entityClassNames) {
       addAnnotatedClass(cl.loadClass(className));
     }
     for (String className : converterClassNames) {
       ConverterRegistrationDelegate.registerConverter(this, cl.loadClass(className));
     }
     for (String packageName : packageNames) {
       addPackage(packageName);
     }
   } catch (ClassNotFoundException ex) {
     throw new MappingException("Failed to load annotated classes from classpath", ex);
   }
   return this;
 }
コード例 #11
0
  public static void main(String[] args) throws Exception {
    try {
      ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();

      AnnotationConfiguration config =
          new AnnotationConfiguration()
              .configure(new File("D:/gjxt/source/news/config/hibernate/hibernate.cfg.xml"));
      config.setProperty("output", "C:\\ddl.txt");

      String[] packagesToScan = {"com.team.cmc.domain.model"};
      for (String pkg : packagesToScan) {
        String pattern =
            ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                + ClassUtils.convertClassNameToResourcePath(pkg)
                + "/**/*.class";
        Resource[] resources = resourcePatternResolver.getResources(pattern);
        MetadataReaderFactory readerFactory =
            new CachingMetadataReaderFactory(resourcePatternResolver);
        for (Resource resource : resources) {
          if (resource.isReadable()) {
            MetadataReader reader = readerFactory.getMetadataReader(resource);
            String className = reader.getClassMetadata().getClassName();
            if (matchesFilter(reader, readerFactory)) {
              config.addAnnotatedClass(
                  resourcePatternResolver.getClassLoader().loadClass(className));
            }
          }
        }
      }

      SessionFactory sessionFactory = config.buildSessionFactory();
      session = sessionFactory.openSession();
      tx = session.beginTransaction();

      SchemaExport schemaExport = new SchemaExport(config);
      schemaExport.setOutputFile("c:\\a.txt");
      schemaExport.create(true, true);

      System.out.println("Table created.");

      tx.commit();

      //
      // config = new Configuration().configure(new File(
      // "src/hibernate.cfg.xml"));
      //
      // System.out.println("Creating tables...");
      //
      // SessionFactory sessionFactory = config.configure()
      // .buildSessionFactory();
      // session = sessionFactory.openSession();
      // tx = session.beginTransaction();
      //
      // SchemaExport schemaExport = new SchemaExport(config);
      // schemaExport.create(true, true);
      //
      // System.out.println("Table created.");
      //
      // tx.commit();

    } catch (HibernateException e) {
      e.printStackTrace();
      try {
        tx.rollback();
      } catch (HibernateException e1) {
        e1.printStackTrace();
      }
    } finally {

    }
  }
コード例 #12
0
 @Override
 public boolean isReadable() {
   return delegate.isReadable();
 }
コード例 #13
0
 public static Map<String, PirsfDatRecord> parse(final Resource pirsfDatFileResource)
     throws IOException {
   LOGGER.debug("Running PIRSF data file parser...");
   if (pirsfDatFileResource == null) {
     throw new NullPointerException("Resource to the PIRSF dat file is null");
   }
   if (!pirsfDatFileResource.exists()) {
     throw new IllegalStateException(pirsfDatFileResource.getFilename() + " does not exist");
   }
   if (!pirsfDatFileResource.isReadable()) {
     throw new IllegalStateException(pirsfDatFileResource.getFilename() + " is not readable");
   }
   // Result map
   final Map<String, PirsfDatRecord> data = new HashMap<String, PirsfDatRecord>();
   BufferedReader reader = null;
   try {
     // Read input file line by line
     reader = new BufferedReader(new InputStreamReader(pirsfDatFileResource.getInputStream()));
     String line;
     PirsfDatRecord pirsfDatRecord = null;
     int row = 1;
     while ((line = reader.readLine()) != null) {
       Matcher modelStart = PIRSF_DAT_PATTERN_SUPERFAM.matcher(line);
       if (modelStart.find()) {
         // New accession without sub families
         final String modelAccession = line.substring(1);
         pirsfDatRecord = new PirsfDatRecord(modelAccession);
         if (LOGGER.isDebugEnabled()) {
           LOGGER.debug("Found a new model accession without sub families: " + modelAccession);
         }
         // Reset row attributes
         row = 1;
       } else if (row == 2) {
         // Model name
         final String modelName = line;
         pirsfDatRecord.setModelName(modelName);
         if (LOGGER.isDebugEnabled()) {
           LOGGER.debug("Set model name to " + modelName);
         }
       } else if (row == 3) {
         final String[] values = line.split("\\s+");
         pirsfDatRecord.setValues(values);
       } else if (row == 4 && line.startsWith("BLAST: ")) {
         int index = line.indexOf(":");
         if (index > -1 && line.length() >= index + 1) {
           line = line.substring(index + 1).trim();
         }
         final boolean isBlastRequired = line.equalsIgnoreCase("YES");
         pirsfDatRecord.setBlastRequired(isBlastRequired);
         data.put(pirsfDatRecord.getModelAccession(), pirsfDatRecord);
       } else {
         modelStart = PIRSF_DAT_PATTERN_SUBFAM.matcher(line);
         if (modelStart.find()) {
           // New accession with sub families
           row = 1;
           pirsfDatRecord = parseSubFamilyLine(line);
         } else {
           LOGGER.warn("Unexpected line in pirsf.dat: " + line);
         }
       }
       row++;
     }
   } finally {
     if (reader != null) {
       reader.close();
     }
   }
   return data;
 }
コード例 #14
0
 /**
  * @author:shaochuan.wangsc
  * @date:2010-3-24
  */
 private void scan(WebModuleConfigurer webModuleConfigurer) {
   try {
     String pattern =
         ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
             + ClassUtils.convertClassNameToResourcePath(
                 webModuleConfigurer.getModuleBasePackage())
             + webModuleConfigurer.getContextPackage()
             + RESOURCE_PATTERN;
     Resource[] resources = this.resourcePatternResolver.getResources(pattern);
     MetadataReaderFactory readerFactory =
         new CachingMetadataReaderFactory(this.resourcePatternResolver);
     //
     for (Resource resource : resources) {
       if (resource.isReadable()) {
         MetadataReader reader = readerFactory.getMetadataReader(resource);
         ClassMetadata classMetadata = reader.getClassMetadata();
         //
         if (classMetadata.isConcrete()) {
           String className = classMetadata.getClassName();
           if (!(BeanUtils.isWidget(className) || BeanUtils.isController(className))) {
             continue;
           }
           //
           AutowireCapableBeanFactory beanFactory =
               applicationContext.getAutowireCapableBeanFactory();
           Object clazz =
               beanFactory.createBean(
                   classLoader.loadClass(className),
                   AutowireCapableBeanFactory.AUTOWIRE_NO,
                   false);
           //
           if (clazz instanceof FreeMarkerWidget) {
             String widget = className.replace(webModuleConfigurer.getModuleBasePackage(), "");
             widget = ClassUtils.convertClassNameToResourcePath(widget);
             widget = BeanUtils.stripEndString(widget, BeanUtils.WIDGET_BEAN_SUFFIX);
             String widgetKey = BeanUtils.makeControllerOrWidgetMappingKey(widget);
             webModuleConfigurer.getWidgetMap().put(widgetKey, (FreeMarkerWidget) clazz);
             widgets.put(widgetKey, (FreeMarkerWidget) clazz);
           }
           //
           if (clazz instanceof Controller) {
             String controller = className.replace(webModuleConfigurer.getModuleBasePackage(), "");
             controller = ClassUtils.convertClassNameToResourcePath(controller);
             controller = BeanUtils.stripEndString(controller, BeanUtils.CONTROLLER_BEAN_SUFFIX);
             String controllerKey = BeanUtils.makeControllerOrWidgetMappingKey(controller);
             String controllerRule =
                 webModuleConfigurer.getContextPackage() + CONTROLLERS_PACKAGE + SLASH;
             if (controllerKey.startsWith(controllerRule)) {
               //
               controllerKey =
                   controllerKey.replaceFirst(controllerRule, webModuleConfigurer.getContext());
               //
               if ("/index".equals(controllerKey)) {
                 webModuleConfigurer.getControllerMap().put("/", (Controller) clazz);
                 controllers.put("/", (Controller) clazz);
                 defaultListableBeanFactory.registerSingleton("/", (Controller) clazz);
               }
               //
               String controller_key = BeanUtils.processControllerKey(controllerKey);
               String controller_keyv = controller_key + webModuleConfigurer.getUriExtension();
               //
               webModuleConfigurer.getControllerMap().put(controller_keyv, (Controller) clazz);
               controllers.put(controller_keyv, (Controller) clazz);
               defaultListableBeanFactory.registerSingleton(controller_keyv, (Controller) clazz);
             }
           }
         }
       }
     }
   } catch (IOException e) {
     logger.error("Failed to scan classpath for unlisted classes", e);
     throw new RuntimeException("Failed to scan classpath for unlisted classes", e);
   } catch (ClassNotFoundException e) {
     logger.error("Failed to load classes from classpath", e);
     throw new RuntimeException("Failed to load classes from classpath", e);
   }
 }
コード例 #15
0
  @Override
  protected void doParse(
      Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
    Map<String, ParsingModuleInfo> scripts =
        parseSpecificBeans(element, parserContext, builder.getRawBeanDefinition(), ns(LANG_URI));

    ElementSelector searchFolders = and(sameNs(element), name("search-folders"));
    ElementSelector searchFiles = and(sameNs(element), name("search-files"));

    for (Element subElement : subElements(element)) {
      String prefix = null;
      String typeName = null;
      String moduleName = null;
      Pattern scriptNamePattern = null;
      String scriptResourceName = null;
      String language = null;

      if (searchFolders.accept(subElement)) {
        String folderName =
            assertNotNull(
                normalizePathName(subElement.getAttribute("folders")),
                "no folder name provided for search-folders");

        // 取prefix
        prefix = getPrefix(folderName);

        if (prefix != null) {
          folderName = folderName.substring(prefix.length() + 1);
        }

        // folderName不以/开始
        if (folderName.startsWith("/")) {
          folderName = folderName.substring(1);
        }

        scriptNamePattern = compilePathName(folderName);
        typeName =
            assertNotNull(trimToNull(subElement.getAttribute("type")), "no type name provided");
        language = trimToNull(subElement.getAttribute("language"));
        scriptResourceName = folderName + "/**/*.*";

        log.trace(
            "Searching in folders: {}, moduleType={}, language={}",
            new Object[] {folderName, typeName, language == null ? "auto" : language});
      } else if (searchFiles.accept(subElement)) {
        String fileName =
            assertNotNull(
                normalizePathName(subElement.getAttribute("files")),
                "no script file name provided for search-files");

        // fileName不以/结尾
        assertTrue(!fileName.endsWith("/"), "invalid script file name: %s", fileName);

        // 取prefix
        prefix = getPrefix(fileName);

        if (prefix != null) {
          fileName = fileName.substring(prefix.length() + 1);
        }

        // fileName不以/开始
        if (fileName.startsWith("/")) {
          fileName = fileName.substring(1);
        }

        scriptNamePattern = compilePathName(fileName);
        typeName =
            assertNotNull(trimToNull(subElement.getAttribute("type")), "no type name provided");
        moduleName =
            assertNotNull(trimToNull(subElement.getAttribute("name")), "no module name provided");
        language = trimToNull(subElement.getAttribute("language"));
        scriptResourceName = fileName;

        log.trace(
            "Searching for script files: {}, moduleType={}, moduleName={}, language={}",
            new Object[] {fileName, typeName, moduleName, language == null ? "auto" : language});
      }

      if (scriptResourceName != null) {
        scriptResourceName =
            prefix == null ? scriptResourceName : prefix + ":" + scriptResourceName;

        // 扫描scripts
        ResourcePatternResolver resolver =
            new PathMatchingResourcePatternResolver(
                parserContext.getReaderContext().getResourceLoader());
        int found = 0;

        try {
          Resource[] resources = resolver.getResources(scriptResourceName.replace('?', '*'));
          BeanDefinitionDefaults defaults = getBeanDefinitionDefaults(subElement, parserContext);
          ParsingModuleMatcher matcher =
              new ParsingModuleMatcher(scripts, scriptNamePattern, typeName, moduleName) {
                @Override
                protected String getName(String name, String itemName) {
                  String ext = getExt(itemName);

                  if (ext != null && name.endsWith("." + ext)) {
                    return name.substring(0, name.length() - ext.length() - 1);
                  }

                  return name;
                }
              };

          for (Resource resource : resources) {
            if (resource.isReadable()) {
              URI uri = resource.getURI();

              if (uri == null) {
                continue;
              }

              String resourceName = uri.normalize().toString();

              if (matcher.doMatch(resourceName)) {
                BeanDefinition scriptBean =
                    createScriptBean(subElement, parserContext, resourceName, language, defaults);
                String beanName =
                    matcher.generateBeanName(resourceName, parserContext.getRegistry());

                parserContext.getRegistry().registerBeanDefinition(beanName, scriptBean);
                found++;
              }
            }
          }
        } catch (IOException e) {
          parserContext
              .getReaderContext()
              .error("Failed to scan resources: " + scriptResourceName, subElement, e);
          return;
        }

        log.debug("Found {} module scripts with pattern: {}", found, scriptResourceName);
      }
    }

    postProcessItems(element, parserContext, builder, scripts, "search-folders or search-files");
  }