/**
  * 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;
 }
 /**
  * Prepare the PersistenceUnitInfos according to the configuration of this manager: scanning for
  * <code>persistence.xml</code> files, parsing all matching files, configurating and
  * post-processing them.
  *
  * <p>PersistenceUnitInfos cannot be obtained before this preparation method has been invoked.
  *
  * @see #obtainDefaultPersistenceUnitInfo()
  * @see #obtainPersistenceUnitInfo(String)
  */
 public void preparePersistenceUnitInfos() {
   this.persistenceUnitInfoNames.clear();
   this.persistenceUnitInfos.clear();
   List<SpringPersistenceUnitInfo> puis = readPersistenceUnitInfos();
   for (SpringPersistenceUnitInfo pui : puis) {
     if (pui.getPersistenceUnitRootUrl() == null) {
       pui.setPersistenceUnitRootUrl(determineDefaultPersistenceUnitRootUrl());
     }
     if (pui.getNonJtaDataSource() == null) {
       pui.setNonJtaDataSource(this.defaultDataSource);
     }
     if (this.loadTimeWeaver != null) {
       pui.init(this.loadTimeWeaver);
     } else {
       pui.init(this.resourcePatternResolver.getClassLoader());
     }
     postProcessPersistenceUnitInfo(pui);
     String name = pui.getPersistenceUnitName();
     if (!this.persistenceUnitInfoNames.add(name)) {
       StringBuilder msg = new StringBuilder();
       msg.append("Conflicting persistence unit definitions for name '")
           .append(name)
           .append("': ");
       msg.append(pui.getPersistenceUnitRootUrl()).append(", ");
       msg.append(this.persistenceUnitInfos.get(name).getPersistenceUnitRootUrl());
       throw new IllegalStateException(msg.toString());
     }
     PersistenceUnitInfo puiToStore = pui;
     if (jpa2ApiPresent) {
       puiToStore =
           (PersistenceUnitInfo)
               Proxy.newProxyInstance(
                   SmartPersistenceUnitInfo.class.getClassLoader(),
                   new Class[] {SmartPersistenceUnitInfo.class},
                   new Jpa2PersistenceUnitInfoDecorator(pui));
     }
     this.persistenceUnitInfos.put(name, puiToStore);
   }
 }