29
29
import java .util .Properties ;
30
30
import java .util .Set ;
31
31
import java .util .TreeSet ;
32
+ import java .util .concurrent .CompletableFuture ;
33
+ import java .util .concurrent .ConcurrentLinkedDeque ;
34
+ import java .util .concurrent .ExecutionException ;
35
+ import java .util .concurrent .ExecutorService ;
36
+ import java .util .concurrent .Future ;
32
37
import java .util .function .BiConsumer ;
33
38
import java .util .stream .Collectors ;
34
39
@@ -464,7 +469,8 @@ public BytecodeRecorderConstantDefinitionBuildItem pregenProxies(
464
469
List <PersistenceUnitDescriptorBuildItem > persistenceUnitDescriptorBuildItems ,
465
470
List <AdditionalJpaModelBuildItem > additionalJpaModelBuildItems ,
466
471
BuildProducer <GeneratedClassBuildItem > generatedClassBuildItemBuildProducer ,
467
- LiveReloadBuildItem liveReloadBuildItem ) {
472
+ LiveReloadBuildItem liveReloadBuildItem ,
473
+ ExecutorService buildExecutor ) throws ExecutionException , InterruptedException {
468
474
Set <String > managedClassAndPackageNames = new HashSet <>(jpaModel .getEntityClassNames ());
469
475
for (PersistenceUnitDescriptorBuildItem pud : persistenceUnitDescriptorBuildItems ) {
470
476
// Note: getManagedClassNames() can also return *package* names
@@ -478,9 +484,9 @@ public BytecodeRecorderConstantDefinitionBuildItem pregenProxies(
478
484
managedClassAndPackageNames .add (additionalJpaModelBuildItem .getClassName ());
479
485
}
480
486
481
- PreGeneratedProxies proxyDefinitions = generatedProxies (managedClassAndPackageNames ,
487
+ PreGeneratedProxies proxyDefinitions = generateProxies (managedClassAndPackageNames ,
482
488
indexBuildItem .getIndex (), transformedClassesBuildItem ,
483
- generatedClassBuildItemBuildProducer , liveReloadBuildItem );
489
+ generatedClassBuildItemBuildProducer , liveReloadBuildItem , buildExecutor );
484
490
485
491
// Make proxies available through a constant;
486
492
// this is a hack to avoid introducing circular dependencies between build steps.
@@ -1371,53 +1377,62 @@ private static MultiTenancyStrategy getMultiTenancyStrategy(Optional<String> mul
1371
1377
return multiTenancyStrategy ;
1372
1378
}
1373
1379
1374
- private PreGeneratedProxies generatedProxies (Set <String > managedClassAndPackageNames , IndexView combinedIndex ,
1380
+ private PreGeneratedProxies generateProxies (Set <String > managedClassAndPackageNames , IndexView combinedIndex ,
1375
1381
TransformedClassesBuildItem transformedClassesBuildItem ,
1376
1382
BuildProducer <GeneratedClassBuildItem > generatedClassBuildItemBuildProducer ,
1377
- LiveReloadBuildItem liveReloadBuildItem ) {
1383
+ LiveReloadBuildItem liveReloadBuildItem ,
1384
+ ExecutorService buildExecutor ) throws ExecutionException , InterruptedException {
1378
1385
ProxyCache proxyCache = liveReloadBuildItem .getContextObject (ProxyCache .class );
1379
1386
if (proxyCache == null ) {
1380
1387
proxyCache = new ProxyCache ();
1381
1388
liveReloadBuildItem .setContextObject (ProxyCache .class , proxyCache );
1382
1389
}
1383
- Set <String > changedClasses = Collections . emptySet ();
1390
+ Set <String > changedClasses = Set . of ();
1384
1391
if (liveReloadBuildItem .getChangeInformation () != null ) {
1385
1392
changedClasses = liveReloadBuildItem .getChangeInformation ().getChangedClasses ();
1386
1393
} else {
1387
1394
//we don't have class change info, invalidate the cache
1388
1395
proxyCache .cache .clear ();
1389
1396
}
1390
1397
//create a map of entity to proxy type
1391
- PreGeneratedProxies preGeneratedProxies = new PreGeneratedProxies ();
1392
1398
TypePool transformedClassesTypePool = createTransformedClassesTypePool (transformedClassesBuildItem ,
1393
1399
managedClassAndPackageNames );
1400
+
1401
+ PreGeneratedProxies preGeneratedProxies = new PreGeneratedProxies ();
1402
+
1394
1403
try (ProxyBuildingHelper proxyHelper = new ProxyBuildingHelper (transformedClassesTypePool )) {
1404
+ final ConcurrentLinkedDeque <Future <CachedProxy >> generatedProxyQueue = new ConcurrentLinkedDeque <>();
1405
+ Set <String > proxyInterfaceNames = Set .of (ClassNames .HIBERNATE_PROXY .toString ());
1406
+
1395
1407
for (String managedClassOrPackageName : managedClassAndPackageNames ) {
1396
- CachedProxy result ;
1397
1408
if (proxyCache .cache .containsKey (managedClassOrPackageName )
1398
1409
&& !isModified (managedClassOrPackageName , changedClasses , combinedIndex )) {
1399
- result = proxyCache .cache .get (managedClassOrPackageName );
1410
+ CachedProxy proxy = proxyCache .cache .get (managedClassOrPackageName );
1411
+ generatedProxyQueue .add (CompletableFuture .completedFuture (proxy ));
1400
1412
} else {
1401
- Set <String > proxyInterfaceNames = new TreeSet <>();
1402
- proxyInterfaceNames .add (ClassNames .HIBERNATE_PROXY .toString ()); //always added
1403
1413
if (!proxyHelper .isProxiable (combinedIndex .getClassByName (managedClassOrPackageName ))) {
1404
1414
// we need to make sure the actual class is proxiable
1405
1415
continue ;
1406
1416
}
1407
- final String mappedClass = managedClassOrPackageName ;
1408
- DynamicType .Unloaded <?> unloaded = proxyHelper .buildUnloadedProxy (mappedClass , proxyInterfaceNames );
1409
- result = new CachedProxy (unloaded , proxyInterfaceNames );
1410
- proxyCache .cache .put (managedClassOrPackageName , result );
1417
+ generatedProxyQueue .add (buildExecutor .submit (() -> {
1418
+ DynamicType .Unloaded <?> unloaded = proxyHelper .buildUnloadedProxy (managedClassOrPackageName ,
1419
+ proxyInterfaceNames );
1420
+ return new CachedProxy (managedClassOrPackageName , unloaded , proxyInterfaceNames );
1421
+ }));
1411
1422
}
1412
- for (Entry <TypeDescription , byte []> i : result .proxyDef .getAllTypes ().entrySet ()) {
1423
+ }
1424
+
1425
+ for (Future <CachedProxy > proxyFuture : generatedProxyQueue ) {
1426
+ CachedProxy proxy = proxyFuture .get ();
1427
+ for (Entry <TypeDescription , byte []> i : proxy .proxyDef .getAllTypes ().entrySet ()) {
1413
1428
generatedClassBuildItemBuildProducer
1414
1429
.produce (new GeneratedClassBuildItem (true , i .getKey ().getName (), i .getValue ()));
1415
1430
}
1416
- preGeneratedProxies .getProxies ().put (managedClassOrPackageName ,
1417
- new PreGeneratedProxies .ProxyClassDetailsHolder (result .proxyDef .getTypeDescription ().getName (),
1418
- result .interfaces ));
1431
+ preGeneratedProxies .getProxies ().put (proxy .managedClassName , new PreGeneratedProxies .ProxyClassDetailsHolder (
1432
+ proxy .proxyDef .getTypeDescription ().getName (), proxy .interfaces ));
1419
1433
}
1420
1434
}
1435
+
1421
1436
return preGeneratedProxies ;
1422
1437
}
1423
1438
@@ -1473,10 +1488,12 @@ private static final class ProxyCache {
1473
1488
}
1474
1489
1475
1490
static final class CachedProxy {
1491
+ final String managedClassName ;
1476
1492
final DynamicType .Unloaded <?> proxyDef ;
1477
1493
final Set <String > interfaces ;
1478
1494
1479
- CachedProxy (DynamicType .Unloaded <?> proxyDef , Set <String > interfaces ) {
1495
+ CachedProxy (String managedClassName , DynamicType .Unloaded <?> proxyDef , Set <String > interfaces ) {
1496
+ this .managedClassName = managedClassName ;
1480
1497
this .proxyDef = proxyDef ;
1481
1498
this .interfaces = interfaces ;
1482
1499
}
0 commit comments