Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ dependency:
<groupId>org.microbean</groupId>
<artifactId>microbean-assign</artifactId>
<!-- Always check https://search.maven.org/artifact/org.microbean/microbean-bean for up-to-date available versions. -->
<version>0.0.10</version>
<version>0.0.11</version>
</dependency>
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import java.lang.constant.MethodHandleDesc;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

import javax.lang.model.element.Element;
Expand Down
179 changes: 30 additions & 149 deletions src/main/java/org/microbean/assign/Qualifiers.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,124 +21,45 @@
import org.microbean.attributes.Attributes;

/**
* A utility class for working with commonly-used <dfn>qualifiers</dfn>.
* A utility class for working with <dfn>qualifiers</dfn>.
*
* <p>This class is currently not used by other classes in this package. It may be useful in a variety of dependency
* injection systems.</p>
*
* @author <a href="https://about.me/lairdnelson" target="_top">Laird Nelson</a>
*
* @see Attributes
*/
public final class Qualifiers {

private static final Attributes QUALIFIER = Attributes.of("Qualifier");

private static final List<Attributes> QUALIFIERS = List.of(QUALIFIER);
public class Qualifiers {

private static final Attributes ANY_QUALIFIER = Attributes.of("Any", QUALIFIERS);

private static final List<Attributes> ANY_QUALIFIERS = List.of(ANY_QUALIFIER);

private static final Attributes DEFAULT_QUALIFIER = Attributes.of("Default", QUALIFIERS);

private static final List<Attributes> DEFAULT_QUALIFIERS = List.of(DEFAULT_QUALIFIER);

private static final List<Attributes> ANY_AND_DEFAULT_QUALIFIERS = List.of(ANY_QUALIFIER, DEFAULT_QUALIFIER);
/*
* Static fields.
*/

private static final Attributes PRIMORDIAL_QUALIFIER = Attributes.of("Primordial", QUALIFIERS);

private static final List<Attributes> PRIMORDIAL_QUALIFIERS = List.of(PRIMORDIAL_QUALIFIER);
private static final Attributes QUALIFIER = Attributes.of("Qualifier");

private Qualifiers() {
super();
}
private static final List<Attributes> QUALIFIERS = List.of(QUALIFIER);

/**
* Returns an unmodifiable {@link List} consisting solely of the unattributed <dfn>any qualifier</dfn> and the
* <dfn>default qualifier</dfn>.
*
* @return an unmodifiable {@link List} consisting solely of the unattributed any qualifier and the default qualifier;
* never {@code null}
*
* @see #anyQualifier()
*
* @see #defaultQualifier()
*/
public static final List<Attributes> anyAndDefaultQualifiers() {
return ANY_AND_DEFAULT_QUALIFIERS;
}

/**
* Returns the unattributed <dfn>any qualifier</dfn>.
*
* @return the <dfn>any qualifier</dfn>; never {@code null}
*
* @see #anyQualifiers()
/*
* Constructors.
*/
public static final Attributes anyQualifier() {
return ANY_QUALIFIER;
}

/**
* Returns {@code true} if and only if the supplied {@link Attributes} {@linkplain Attributes#equals(Object) is equal
* to} the unattributed {@linkplain #anyQualifier() any qualifier}.
*
* @param a an {@link Attributes}; must not be {@code null}
*
* @return {@code true} if and only if the supplied {@link Attributes} {@linkplain Attributes#equals(Object) is equal
* to} the unattributed {@linkplain #anyQualifier() any qualifier}
*
* @exception NullPointerException if {@code a} is {@code null}
*/
public static final boolean anyQualifier(final Attributes a) {
return ANY_QUALIFIER == a || anyQualifier().equals(a) && qualifier(a);
}

/**
* Returns an immutable {@link List} consisting solely of the unattributed <dfn>any qualifier</dfn>.
*
* @return an immutable {@link List}; never {@code null}
*
* @see #anyQualifier()
* Creates a new {@link Qualifiers}.
*/
public static final List<Attributes> anyQualifiers() {
return ANY_QUALIFIERS;
public Qualifiers() {
super();
}

/**
* Returns the <dfn>default qualifier</dfn>.
*
* @return the <dfn>default qualifier</dfn>; never {@code null}
*
* @see #defaultQualifiers()
*/
public static final Attributes defaultQualifier() {
return DEFAULT_QUALIFIER;
}

/**
* Returns {@code true} if and only if the supplied {@link Attributes} {@linkplain
* Attributes#equals(Object) is equal to} the {@linkplain #defaultQualifier() default qualifier}.
*
* @param a an {@link Attributes}; must not be {@code null}
*
* @return {@code true} if and only if the supplied {@link Attributes} {@linkplain
* Attributes#equals(Object) is equal to} the {@linkplain #defaultQualifier() default qualifier}
*
* @exception NullPointerException if {@code a} is {@code null}
/*
* Instance methods.
*/
public static final boolean defaultQualifier(final Attributes a) {
return DEFAULT_QUALIFIER == a || defaultQualifier().equals(a) && qualifier(a);
}

/**
* Returns an immutable {@link List} consisting solely of the <dfn>default qualifier</dfn>.
*
* @return an immutable {@link List}; never {@code null}
*
* @see #defaultQualifier()
*/
public static final List<Attributes> defaultQualifiers() {
return DEFAULT_QUALIFIERS;
}

/**
* Returns an {@link Attributes} that is {@linkplain Attributes#equals(Object) equal to} the supplied {@link
Expand All @@ -153,11 +74,10 @@ public static final List<Attributes> defaultQualifiers() {
*
* @exception NullPointerException if {@code a} is {@code null}
*/
public static final Attributes normalize(final Attributes a) {
public Attributes normalize(final Attributes a) {
return switch (a) {
case null -> throw new NullPointerException("a");
case Attributes q when defaultQualifier(q) -> defaultQualifier();
case Attributes q when QUALIFIER.equals(q) -> qualifier();
case Attributes q when this.qualifier().equals(q) -> this.qualifier();
default -> a;
};
}
Expand All @@ -175,63 +95,26 @@ public static final Attributes normalize(final Attributes a) {
*
* @exception NullPointerException if {@code list} is {@code null}
*/
public static final List<Attributes> normalize(final List<Attributes> list) {
public List<Attributes> normalize(final List<Attributes> list) {
return switch (list.size()) {
case 0 -> List.of();
case 1 -> list.equals(defaultQualifiers()) ? defaultQualifiers() : List.copyOf(list);
case 1 -> list.equals(this.qualifiers()) ? this.qualifiers() : List.copyOf(list);
default -> {
final List<Attributes> l = new ArrayList<>(list.size());
for (final Attributes a : list) {
l.add(normalize(a));
l.add(this.normalize(a));
}
yield Collections.unmodifiableList(l);
}
};
}

/**
* Returns the <dfn>primordial qualifier</dfn>.
*
* @return the <dfn>primordial qualifier</dfn>; never {@code null}
*
* @see #primordialQualifiers()
*/
public static final Attributes primordialQualifier() {
return PRIMORDIAL_QUALIFIER;
}

/**
* Returns {@code true} if and only if the supplied {@link Attributes} {@linkplain
* Attributes#equals(Object) is equal to} the {@linkplain #primordialQualifier() primordial qualifier}.
*
* @param a an {@link Attributes}; must not be {@code null}
*
* @return {@code true} if and only if the supplied {@link Attributes} {@linkplain
* Attributes#equals(Object) is equal to} the {@linkplain #primordialQualifier() primordial qualifier}
*
* @exception NullPointerException if {@code a} is {@code null}
*/
public static final boolean primordialQualifier(final Attributes a) {
return PRIMORDIAL_QUALIFIER == a || primordialQualifier().equals(a) && qualifier(a);
}

/**
* Returns an immutable {@link List} consisting solely of the <dfn>primordial qualifier</dfn>.
*
* @return an immutable {@link List}; never {@code null}
*
* @see #primordialQualifier()
*/
public static final List<Attributes> primordialQualifiers() {
return PRIMORDIAL_QUALIFIERS;
}

/**
* Returns the <dfn>qualifier</dfn> (meta-) qualifier.
*
* @return the <dfn>qualifier</dfn> (meta-) qualifier; never {@code null}
*/
public static final Attributes qualifier() {
public Attributes qualifier() {
return QUALIFIER;
}

Expand All @@ -246,8 +129,8 @@ public static final Attributes qualifier() {
*
* @exception NullPointerException if {@code q} is {@code null}
*/
public static final boolean qualifier(final Attributes q) {
return q.attributes().contains(qualifier());
public boolean qualifier(final Attributes q) {
return q.attributes().contains(this.qualifier());
}

/**
Expand All @@ -257,7 +140,7 @@ public static final boolean qualifier(final Attributes q) {
*
* @see #qualifier()
*/
public static final List<Attributes> qualifiers() {
public List<Attributes> qualifiers() {
return QUALIFIERS;
}

Expand All @@ -272,16 +155,14 @@ public static final List<Attributes> qualifiers() {
*
* @exception NullPointerException if {@code c} is {@code null}
*/
public static final List<Attributes> qualifiers(final Collection<? extends Attributes> c) {
public List<Attributes> qualifiers(final Collection<? extends Attributes> c) {
return switch (c) {
case Collection<?> c0 when c0.isEmpty() -> List.of();
case Collection<?> c0 when c0.equals(defaultQualifiers()) -> defaultQualifiers();
case Collection<?> c0 when c0.equals(anyAndDefaultQualifiers()) -> anyAndDefaultQualifiers();
default ->{
default -> {
final ArrayList<Attributes> list = new ArrayList<>(c.size());
for (final Attributes a : c) {
if (qualifier(a)) {
list.add(normalize(a));
if (this.qualifier(a)) {
list.add(this.normalize(a));
}
}
list.trimToSize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
package org.microbean.assign;

import java.util.Comparator;
import java.util.Objects;

import javax.lang.model.type.TypeMirror;

import org.microbean.construct.Domain;

import static java.util.Objects.requireNonNull;

/**
* A {@link Comparator} of {@link TypeMirror}s that establishes a <dfn>partial order</dfn> on its arguments, enforcing
* only that more specialized types precede less specialized ones.
Expand All @@ -43,7 +44,7 @@ public final class SpecializationComparator implements Comparator<TypeMirror> {
*/
public SpecializationComparator(final Domain domain) {
super();
this.domain = Objects.requireNonNull(domain, "domain");
this.domain = requireNonNull(domain, "domain");
}

/**
Expand Down