Clone Tools
  • last updated a few seconds ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates
Extract an interface out of `ServiceRegistry` to include only the pieces needed for injection by the instantiator infrastructure. This will evolve to allow different annotations to be handled differently, but for now it simply behaves the same way as before.

Use a custom implementation of this interface for artifact transform instantiation, to avoid the cost of setting up a full mutable registry (for now).

  1. … 21 more files in changeset.
Bust up some of the internals of the class generator, to allow different pieces to be composed. Add some more validation to where `@Inject` can be used.

  1. … 5 more files in changeset.
Fail class decoration for a class with any abstract methods for which an implementation will not be provided by the generated subclass. Improve property inspection to better understand getter methods with covariant return types.

  1. … 6 more files in changeset.
Adjust copyright header years

  1. … 1 more file in changeset.
Ignore fewer methods

  1. … 2 more files in changeset.
Move PropertyExtractor to base services

    • -0
    • +356
    ./PropertyExtractor.java
    • -0
    • +40
    ./PropertyMetadata.java
  1. … 9 more files in changeset.
Replace most direct usages of `DirectInstantiator` with indirect usages via `InstantiatorFactory` or test fixtures instead. This means more consistent behaviour in unit tests because the objects under test will behave more similarly to how they do at runtime. This also allows the decision of how the instantiation should behave to live in as few places as possible, so this can be more easily evolved and contextualized.

  1. … 60 more files in changeset.
Fix handling of InterruptedExceptions

These exceptions were handled incorrectly throughout the whole

codebase, usually rethrown without restoring the interrupt status

or discarded entirely. This means that the system would not stop

executing even though the user wanted it to. In some cases this

also left the system in an inconsistent state, leading to deadlocks.

The most notable changes include:

- UncheckedException.rethrow automatically restores the interrupt status

- AsyncDispatch is guaranteed to deliver its messages, even when interrupted

- ExecHandle cancels the started process if it is interrupted while waiting

- ExecHandle disconnects from the process' output before killing it

- The worker API cancels the started work items if it is interrupted

- ManagedExecutors shut down immediately if they are interrupted while stopping

- We no longer log exceptions caused by interruption to the console

- Interrupting our caches no longer leaks file locks

  1. … 38 more files in changeset.
Remove deprecated Class.newInstance() (#6496)

`Class.newInstance()` was deprecated in Java 9.

  1. … 34 more files in changeset.
Add initial support component metadata supplier caching

This commit adds the infrastructure for caching of component metadata rules.

For now, the only kind of rule we can cache are the component metadata supplier

rules, which are used during dynamic version selection, but the executor

infrastructure can be reused to cache more kinds of rules.

The implementation relies on the principal that a "rule" can be safely cached if:

- the rule has no side effect, and uses the "class-based pattern"

- the implementation of the rule didn't change

- the inputs of the rule didn't change

For this, we introduce a new persistent cache (hence cross-build) with an in-memory

facing cache, that allows us to avoid the execution of a rule if the result is

already in the cache. The implementation makes use of _snapshotting_ to capture the

state of the inputs of a rule, which consists of the implementation of the rule and

its potential parameters. It's worth noting that at this stage we do not consider

the services the rule can use, it's going to be done in a subsequent commit.

This worked required a clarification of what an rule cares about (the result) in

opposition to what the user is faced with. For example, a component metadata supplier

rule output is a `ComponentMetadata`, but what we offer to the user, to build that

metadata, is a `ComponentMetadataSupplierDetails` instance. Similarly, component

metadata rules would have different kind of output and what the user manipulates.

The cache works with a primary key (for the first implemented cache, the key is the

module version identifier) and will invalidate the results based on the cache policy

(should refresh modules).

The persistent cache uses the snapshot as the key in the store. In theory, should we

consider that we have a nearly perfect hash function, we could instead use the hash

of the snapshot as the key. Measurements would have to be made to check if it's worth

implementing.

  1. … 46 more files in changeset.
Add initial support component metadata supplier caching

This commit adds the infrastructure for caching of component metadata rules.

For now, the only kind of rule we can cache are the component metadata supplier

rules, which are used during dynamic version selection, but the executor

infrastructure can be reused to cache more kinds of rules.

The implementation relies on the principal that a "rule" can be safely cached if:

- the rule has no side effect, and uses the "class-based pattern"

- the implementation of the rule didn't change

- the inputs of the rule didn't change

For this, we introduce a new persistent cache (hence cross-build) with an in-memory

facing cache, that allows us to avoid the execution of a rule if the result is

already in the cache. The implementation makes use of _snapshotting_ to capture the

state of the inputs of a rule, which consists of the implementation of the rule and

its potential parameters. It's worth noting that at this stage we do not consider

the services the rule can use, it's going to be done in a subsequent commit.

This worked required a clarification of what an rule cares about (the result) in

opposition to what the user is faced with. For example, a component metadata supplier

rule output is a `ComponentMetadata`, but what we offer to the user, to build that

metadata, is a `ComponentMetadataSupplierDetails` instance. Similarly, component

metadata rules would have different kind of output and what the user manipulates.

The cache works with a primary key (for the first implemented cache, the key is the

module version identifier) and will invalidate the results based on the cache policy

(should refresh modules).

The persistent cache uses the snapshot as the key in the store. In theory, should we

consider that we have a nearly perfect hash function, we could instead use the hash

of the snapshot as the key. Measurements would have to be made to check if it's worth

implementing.

  1. … 46 more files in changeset.
Extract common InstantiatingAction type

    • -0
    • +47
    ./InstantiatingAction.java
  1. … 2 more files in changeset.
Extract common InstantiatingAction type

    • -0
    • +47
    ./InstantiatingAction.java
  1. … 2 more files in changeset.
Fix convention mapping class loader leak

The reflection cache keeps a set of property names for each class.

This set was provided by calling keySet() on a map which contains

class values. The keyset would thus keep a strong reference back

to its map and all of its values, leading to a classloader leak.

We now do a defensive copy of they keyset to avoid surprises for

callers of this method.

  1. … 1 more file in changeset.
Fix convention mapping class loader leak

The reflection cache keeps a set of property names for each class.

This set was provided by calling keySet() on a map which contains

class values. The keyset would thus keep a strong reference back

to its map and all of its values, leading to a classloader leak.

We now do a defensive copy of they keyset to avoid surprises for

callers of this method.

  1. … 1 more file in changeset.
Consistent ordering of `public` and `abstract` modifiers

  1. … 10 more files in changeset.
Replace usages of org.gradle.api.Nullable

With javax.annotation.Nullable.

  1. … 460 more files in changeset.
Javadoc.

Fix setter selection in presence of multiple setters (#2386)

  1. … 5 more files in changeset.
Removed some indirection.

  1. … 2 more files in changeset.
Moved ObjectInstantiationException to public API

This avoids leaking an internal exception type through the

ObjectFactory.newInstance API.

    • -29
    • +0
    ./ObjectInstantiationException.java
  1. … 24 more files in changeset.
Fixed handling for setters that return non-void types.

  1. … 2 more files in changeset.
Reused the property detection logic that is used for object decoration and task annotation handling also for determining whether a convention mapping can be applied to a decorated object.

The logic is shared but the actual work isn't shared, so this inspection can happen several times per decorated type (but no more than once per build).

  1. … 3 more files in changeset.
Use the same logic to decide whether a method is a property getter or not when decorating a task and when processing the annotations attached to the task's properties, so that this behaviour is consistent.

  1. … 3 more files in changeset.
Remove guava from worker process path

  1. … 15 more files in changeset.
Replaced all direct usages of `DependencyInjectingInstantiator` with a global `InstantiatorFactory` service.

  1. … 15 more files in changeset.
Use a consistent chain of exceptions on failure to create an instance of the action implementation, for worker actions, artifact transforms, attribute compatibility rules, attribute disambiguation rules and metadata supplier rules.

  1. … 7 more files in changeset.
Replace `TypeToken<T>` by `ModelType<T>` in `TypeOf<T>`

And introduce `TypeOf.Visitor`.

  1. … 6 more files in changeset.
Add coverage for Types.getGenericSimpleName(Type)

And fix basic wildcard type case, e.g. List<?>

  1. … 1 more file in changeset.
Allow extension public types to be specified via “type token”

and by being so, faithfully represent generic types.

  1. … 9 more files in changeset.