You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2018/04/16 22:45:22 UTC
[18/38] tomee git commit: some refactoring
some refactoring
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c5964e07
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c5964e07
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c5964e07
Branch: refs/heads/master
Commit: c5964e079df2dbadc0bd5f7f6567aaf509c69d83
Parents: 830b372
Author: Jean-Louis Monteiro <je...@gmail.com>
Authored: Tue Feb 27 10:14:53 2018 +0100
Committer: Jean-Louis Monteiro <je...@gmail.com>
Committed: Tue Feb 27 10:14:53 2018 +0100
----------------------------------------------------------------------
.../tomee/microprofile/jwt/ClaimLiteral.java | 32 --
.../jwt/ClaimProviderBeanAttributes.java | 83 ----
.../microprofile/jwt/ClaimValueProducer.java | 75 ----
.../microprofile/jwt/ClaimValueWrapper.java | 54 ---
.../jwt/DefaultJWTCallerPrincipal.java | 334 ----------------
.../jwt/DefaultJWTCallerPrincipalFactory.java | 86 ----
.../microprofile/jwt/JWTAuthContextInfo.java | 66 ----
.../jwt/JWTAuthContextInfoProvider.java | 59 ---
.../microprofile/jwt/JWTCallerPrincipal.java | 59 ---
.../jwt/JWTCallerPrincipalFactory.java | 124 ------
.../microprofile/jwt/JsonValueProducer.java | 111 ------
.../microprofile/jwt/MPJWTCDIExtension.java | 391 ------------------
.../tomee/microprofile/jwt/MPJWTFilter.java | 4 +
.../tomee/microprofile/jwt/MPJWTProducer.java | 196 ---------
.../microprofile/jwt/RawClaimTypeProducer.java | 69 ----
.../tomee/microprofile/jwt/TCKTokenParser.java | 3 +
.../microprofile/jwt/cdi/ClaimLiteral.java | 32 ++
.../jwt/cdi/ClaimProviderBeanAttributes.java | 83 ++++
.../jwt/cdi/ClaimValueProducer.java | 75 ++++
.../microprofile/jwt/cdi/ClaimValueWrapper.java | 54 +++
.../microprofile/jwt/cdi/JsonValueProducer.java | 111 ++++++
.../microprofile/jwt/cdi/MPJWTCDIExtension.java | 395 +++++++++++++++++++
.../microprofile/jwt/cdi/MPJWTProducer.java | 196 +++++++++
.../jwt/cdi/RawClaimTypeProducer.java | 69 ++++
.../jwt/config/JWTAuthContextInfo.java | 66 ++++
.../jwt/config/JWTAuthContextInfoProvider.java | 61 +++
.../principal/DefaultJWTCallerPrincipal.java | 334 ++++++++++++++++
.../DefaultJWTCallerPrincipalFactory.java | 88 +++++
.../jwt/principal/JWTCallerPrincipal.java | 59 +++
.../principal/JWTCallerPrincipalFactory.java | 127 ++++++
.../javax.enterprise.inject.spi.Extension | 2 +-
...e.microprofile.jwt.JWTCallerPrincipalFactory | 1 -
...file.jwt.principal.JWTCallerPrincipalFactory | 1 +
33 files changed, 1759 insertions(+), 1741 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimLiteral.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimLiteral.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimLiteral.java
deleted file mode 100644
index 5471b2e..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimLiteral.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import javax.enterprise.util.AnnotationLiteral;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.Claims;
-
-public class ClaimLiteral extends AnnotationLiteral<Claim> implements Claim {
- public String value() {
- return "";
- }
-
- public Claims standard() {
- return Claims.UNKNOWN;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimProviderBeanAttributes.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimProviderBeanAttributes.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimProviderBeanAttributes.java
deleted file mode 100644
index ce6e97c..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimProviderBeanAttributes.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Set;
-
-import javax.enterprise.inject.spi.BeanAttributes;
-
-/**
- * An implementation of BeanAttributes<Object> that wraps the generic producer BeanAttributes
- * to allow the MPJWTExtension to collect the types of all corresponding injection sites
- *
- */
-public class ClaimProviderBeanAttributes implements BeanAttributes<Object> {
- /**
- * Decorate the ConfigPropertyProducer BeanAttributes to set the types the producer applies to. This set is collected
- * from all injection points annotated with @ConfigProperty.
- *
- * @param delegate - the original producer method BeanAttributes
- * @param types - the full set of @Claim injection point types
- */
- public ClaimProviderBeanAttributes(BeanAttributes<Object> delegate, Set<Type> types, Set<Annotation> qualifiers) {
- this.delegate = delegate;
- this.types = types;
- this.qualifiers = qualifiers;
- if (types.size() == 0) {
- Thread.dumpStack();
- }
- }
-
- @Override
- public Set<Type> getTypes() {
- return types;
- }
-
- @Override
- public Set<Annotation> getQualifiers() {
- return qualifiers;
- }
-
- @Override
- public Class<? extends Annotation> getScope() {
- return delegate.getScope();
- }
-
- @Override
- public String getName() {
- return delegate.getName();
- }
-
- @Override
- public Set<Class<? extends Annotation>> getStereotypes() {
- return delegate.getStereotypes();
- }
-
- @Override
- public boolean isAlternative() {
- return delegate.isAlternative();
- }
-
- private BeanAttributes<Object> delegate;
-
- private Set<Type> types;
-
- private Set<Annotation> qualifiers;
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueProducer.java
deleted file mode 100644
index ae2338f..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueProducer.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Optional;
-
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.spi.InjectionPoint;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.ClaimValue;
-import org.eclipse.microprofile.jwt.Claims;
-
-/**
- * A producer for the ClaimValue<T> wrapper injection sites.
- * @param <T> the raw claim type
- */
-public class ClaimValueProducer<T> {
-
- @Produces
- @Claim("")
- ClaimValue<T> produce(InjectionPoint ip) {
- String name = getName(ip);
- ClaimValue<Optional<T>> cv = MPJWTProducer.generalClaimValueProducer(name);
- ClaimValue<T> returnValue = (ClaimValue<T>) cv;
- Optional<T> value = cv.getValue();
- // Pull out the ClaimValue<T> T type,
- Type matchType = ip.getType();
- Type actualType = Object.class;
- boolean isOptional = false;
- if (matchType instanceof ParameterizedType) {
- actualType = ((ParameterizedType) matchType).getActualTypeArguments()[0];
- isOptional = matchType.getTypeName().equals(Optional.class.getTypeName());
- if (isOptional) {
- actualType = ((ParameterizedType) matchType).getActualTypeArguments()[0];
- }
- }
-
- if (!actualType.getTypeName().startsWith(Optional.class.getTypeName())) {
- T nestedValue = value.orElse(null);
- ClaimValueWrapper<T> wrapper = new ClaimValueWrapper<>(cv.getName());
- wrapper.setValue(nestedValue);
- returnValue = wrapper;
- }
- return returnValue;
- }
-
- String getName(InjectionPoint ip) {
- String name = null;
- for (Annotation ann : ip.getQualifiers()) {
- if (ann instanceof Claim) {
- Claim claim = (Claim) ann;
- name = claim.standard() == Claims.UNKNOWN ? claim.value() : claim.standard().name();
- }
- }
- return name;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueWrapper.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueWrapper.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueWrapper.java
deleted file mode 100644
index cc16771..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/ClaimValueWrapper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.ClaimValue;
-
-/**
- * An implementation of the ClaimValue interface
- *
- * @param <T> the claim value type
- */
-public class ClaimValueWrapper<T> implements ClaimValue<T> {
- private String name;
-
- private T value;
-
- public ClaimValueWrapper(String name) {
- this.name = name;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- public T getValue() {
- return value;
- }
-
- public void setValue(T value) {
- this.value = value;
- }
-
- @Override
- public String toString() {
- return String.format("ClaimValueWrapper[@%s], name=%s, value[%s]=%s", Integer.toHexString(hashCode()),
- name, value.getClass(), value);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipal.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipal.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipal.java
deleted file mode 100644
index 2559b1e..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipal.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.Claims;
-import org.jose4j.jwt.JwtClaims;
-import org.jose4j.jwt.MalformedClaimException;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-import javax.security.auth.Subject;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A default implementation of JWTCallerPrincipal using jose4j
- * Another implementation could use nimbus and another plain JSON-P
- */
-public class DefaultJWTCallerPrincipal extends JWTCallerPrincipal {
-
- private static Logger logger = Logger.getLogger(DefaultJWTCallerPrincipal.class.getName());
- private String jwt;
- private String type;
- private JwtClaims claimsSet;
-
- /**
- * Create the DefaultJWTCallerPrincipal from the parsed JWT token and the extracted principal name
- *
- * @param jwt - the parsed JWT token representation
- * @param name - the extracted unqiue name to use as the principal name; from "upn", "preferred_username" or "sub" claim
- */
- public DefaultJWTCallerPrincipal(String jwt, String type, JwtClaims claimsSet, String name) {
- super(name);
- this.jwt = jwt;
- this.type = type;
- this.claimsSet = claimsSet;
- fixJoseTypes();
- }
-
- @Override
- public Set<String> getAudience() {
- Set<String> audSet = new HashSet<>();
- try {
- List<String> audList = claimsSet.getStringListClaimValue("aud");
- if (audList != null) {
- audSet.addAll(audList);
- }
- } catch (MalformedClaimException e) {
- try {
- String aud = claimsSet.getStringClaimValue("aud");
- audSet.add(aud);
- } catch (MalformedClaimException e1) {
- }
- }
- return audSet;
- }
-
- @Override
- public Set<String> getGroups() {
- HashSet<String> groups = new HashSet<>();
- try {
- List<String> globalGroups = claimsSet.getStringListClaimValue("groups");
- if (globalGroups != null) {
- groups.addAll(globalGroups);
- }
- } catch (MalformedClaimException e) {
- e.printStackTrace();
- }
- return groups;
- }
-
-
- @Override
- public Set<String> getClaimNames() {
- return new HashSet<>(claimsSet.getClaimNames());
- }
-
- @Override
- public Object getClaim(String claimName) {
- Claims claimType = Claims.UNKNOWN;
- Object claim = null;
- try {
- claimType = Claims.valueOf(claimName);
- } catch (IllegalArgumentException e) {
- }
- // Handle the jose4j NumericDate types and
- switch (claimType) {
- case exp:
- case iat:
- case auth_time:
- case nbf:
- case updated_at:
- try {
- claim = claimsSet.getClaimValue(claimType.name(), Long.class);
- if (claim == null) {
- claim = new Long(0);
- }
- } catch (MalformedClaimException e) {
- }
- break;
- case groups:
- claim = getGroups();
- break;
- case aud:
- claim = getAudience();
- break;
- case UNKNOWN:
- claim = claimsSet.getClaimValue(claimName);
- break;
- default:
- claim = claimsSet.getClaimValue(claimType.name());
- }
- return claim;
- }
-
- @Override
- public boolean implies(Subject subject) {
- return false;
- }
-
- public String toString() {
- return toString(false);
- }
-
- /**
- * TODO: showAll is ignored and currently assumed true
- *
- * @param showAll - should all claims associated with the JWT be displayed or should only those defined in the
- * JsonWebToken interface be displayed.
- * @return JWTCallerPrincipal string view
- */
- @Override
- public String toString(boolean showAll) {
- String toString = "DefaultJWTCallerPrincipal{" +
- "id='" + getTokenID() + '\'' +
- ", name='" + getName() + '\'' +
- ", expiration=" + getExpirationTime() +
- ", notBefore=" + getClaim(Claims.nbf.name()) +
- ", issuedAt=" + getIssuedAtTime() +
- ", issuer='" + getIssuer() + '\'' +
- ", audience=" + getAudience() +
- ", subject='" + getSubject() + '\'' +
- ", type='" + type + '\'' +
- ", issuedFor='" + getClaim("azp") + '\'' +
- ", authTime=" + getClaim("auth_time") +
- ", givenName='" + getClaim("given_name") + '\'' +
- ", familyName='" + getClaim("family_name") + '\'' +
- ", middleName='" + getClaim("middle_name") + '\'' +
- ", nickName='" + getClaim("nickname") + '\'' +
- ", preferredUsername='" + getClaim("preferred_username") + '\'' +
- ", email='" + getClaim("email") + '\'' +
- ", emailVerified=" + getClaim(Claims.email_verified.name()) +
- ", allowedOrigins=" + getClaim("allowedOrigins") +
- ", updatedAt=" + getClaim("updated_at") +
- ", acr='" + getClaim("acr") + '\'';
- StringBuilder tmp = new StringBuilder(toString);
- tmp.append(", groups=[");
- for (String group : getGroups()) {
- tmp.append(group);
- tmp.append(',');
- }
- tmp.setLength(tmp.length() - 1);
- tmp.append("]}");
- return tmp.toString();
- }
-
- /**
- * Convert the types jose4j uses for address, sub_jwk, and jwk
- */
- private void fixJoseTypes() {
- if (claimsSet.hasClaim(Claims.address.name())) {
- replaceMap(Claims.address.name());
- }
- if (claimsSet.hasClaim(Claims.jwk.name())) {
- replaceMap(Claims.jwk.name());
- }
- if (claimsSet.hasClaim(Claims.sub_jwk.name())) {
- replaceMap(Claims.sub_jwk.name());
- }
- // Handle custom claims
- Set<String> customClaimNames = filterCustomClaimNames(claimsSet.getClaimNames());
- for (String name : customClaimNames) {
- Object claimValue = claimsSet.getClaimValue(name);
- Class claimType = claimValue.getClass();
- if (claimValue instanceof List) {
- replaceList(name);
- } else if (claimValue instanceof Map) {
- replaceMap(name);
- } else if (claimValue instanceof Number) {
- replaceNumber(name);
- }
- }
- }
-
- /**
- * Determine the custom claims in the set
- *
- * @param claimNames - the current set of claim names in this token
- * @return the possibly empty set of names for non-Claims claims
- */
- private Set<String> filterCustomClaimNames(Collection<String> claimNames) {
- HashSet<String> customNames = new HashSet<>(claimNames);
- for (Claims claim : Claims.values()) {
- customNames.remove(claim.name());
- }
- return customNames;
- }
-
- /**
- * Replace the jose4j Map<String,Object> with a JsonObject
- *
- * @param name - claim name
- */
- private void replaceMap(String name) {
- try {
- Map<String, Object> map = claimsSet.getClaimValue(name, Map.class);
- JsonObject jsonObject = replaceMap(map);
- claimsSet.setClaim(name, jsonObject);
- } catch (MalformedClaimException e) {
- logger.log(Level.WARNING, "replaceMap failure for: " + name, e);
- }
- }
-
- private JsonObject replaceMap(Map<String, Object> map) {
- JsonObjectBuilder builder = Json.createObjectBuilder();
- for (Map.Entry<String, Object> entry : map.entrySet()) {
- Object entryValue = entry.getValue();
- if (entryValue instanceof Map) {
- JsonObject entryJsonObject = replaceMap((Map<String, Object>) entryValue);
- builder.add(entry.getKey(), entryJsonObject);
- } else if (entryValue instanceof List) {
- JsonArray array = (JsonArray) wrapValue(entryValue);
- builder.add(entry.getKey(), array);
- } else if (entryValue instanceof Long || entryValue instanceof Integer) {
- long lvalue = ((Number) entryValue).longValue();
- builder.add(entry.getKey(), lvalue);
- } else if (entryValue instanceof Double || entryValue instanceof Float) {
- double dvalue = ((Number) entryValue).doubleValue();
- builder.add(entry.getKey(), dvalue);
- } else if (entryValue instanceof Boolean) {
- boolean flag = ((Boolean) entryValue).booleanValue();
- builder.add(entry.getKey(), flag);
- } else if (entryValue instanceof String) {
- builder.add(entry.getKey(), entryValue.toString());
- }
- }
- return builder.build();
- }
-
- private JsonValue wrapValue(Object value) {
- JsonValue jsonValue = null;
- if (value instanceof Number) {
- Number number = (Number) value;
- if ((number instanceof Long) || (number instanceof Integer)) {
- jsonValue = Json.createObjectBuilder()
- .add("tmp", number.longValue())
- .build()
- .getJsonNumber("tmp");
- } else {
- jsonValue = Json.createObjectBuilder()
- .add("tmp", number.doubleValue())
- .build()
- .getJsonNumber("tmp");
- }
- } else if (value instanceof Boolean) {
- Boolean flag = (Boolean) value;
- jsonValue = flag ? JsonValue.TRUE : JsonValue.FALSE;
- } else if (value instanceof List) {
- JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
- List list = (List) value;
- for (Object element : list) {
- if (element instanceof String) {
- arrayBuilder.add(element.toString());
- } else {
- JsonValue jvalue = wrapValue(element);
- arrayBuilder.add(jvalue);
- }
- }
- jsonValue = arrayBuilder.build();
- }
- return jsonValue;
- }
-
-
- /**
- * Replace the jose4j List<?> with a JsonArray
- *
- * @param name - claim name
- */
- private void replaceList(String name) {
- try {
- List list = claimsSet.getClaimValue(name, List.class);
- JsonArray array = (JsonArray) wrapValue(list);
- claimsSet.setClaim(name, array);
- } catch (MalformedClaimException e) {
- logger.log(Level.WARNING, "replaceList failure for: " + name, e);
- }
- }
-
- private void replaceNumber(String name) {
- try {
- Number number = claimsSet.getClaimValue(name, Number.class);
- JsonNumber jsonNumber = (JsonNumber) wrapValue(number);
- claimsSet.setClaim(name, jsonNumber);
- } catch (MalformedClaimException e) {
- logger.log(Level.WARNING, "replaceNumber failure for: " + name, e);
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipalFactory.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipalFactory.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipalFactory.java
deleted file mode 100644
index 9c0a870..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/DefaultJWTCallerPrincipalFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.Claims;
-import org.jose4j.jwa.AlgorithmConstraints;
-import org.jose4j.jws.AlgorithmIdentifiers;
-import org.jose4j.jwt.JwtClaims;
-import org.jose4j.jwt.MalformedClaimException;
-import org.jose4j.jwt.NumericDate;
-import org.jose4j.jwt.consumer.InvalidJwtException;
-import org.jose4j.jwt.consumer.JwtConsumer;
-import org.jose4j.jwt.consumer.JwtConsumerBuilder;
-import org.jose4j.jwt.consumer.JwtContext;
-
-/**
- * A default implementation of the abstract JWTCallerPrincipalFactory that uses the Keycloak token parsing classes.
- */
-public class DefaultJWTCallerPrincipalFactory extends JWTCallerPrincipalFactory {
-
- /**
- * Tries to load the JWTAuthContextInfo from CDI if the class level authContextInfo has not been set.
- */
- public DefaultJWTCallerPrincipalFactory() {
- }
-
- @Override
- public JWTCallerPrincipal parse(final String token, final JWTAuthContextInfo authContextInfo) throws ParseException {
- JWTCallerPrincipal principal = null;
-
- try {
- JwtConsumerBuilder builder = new JwtConsumerBuilder()
- .setRequireExpirationTime()
- .setRequireSubject()
- .setSkipDefaultAudienceValidation()
- .setExpectedIssuer(authContextInfo.getIssuedBy())
- .setVerificationKey(authContextInfo.getSignerKey())
- .setJwsAlgorithmConstraints(
- new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST,
- AlgorithmIdentifiers.RSA_USING_SHA256));
- if (authContextInfo.getExpGracePeriodSecs() > 0) {
- builder.setAllowedClockSkewInSeconds(authContextInfo.getExpGracePeriodSecs());
- } else {
- builder.setEvaluationTime(NumericDate.fromSeconds(0));
- }
-
- JwtConsumer jwtConsumer = builder.build();
- JwtContext jwtContext = jwtConsumer.process(token);
- String type = jwtContext.getJoseObjects().get(0).getHeader("typ");
- // Validate the JWT and process it to the Claims
- jwtConsumer.processContext(jwtContext);
- JwtClaims claimsSet = jwtContext.getJwtClaims();
-
- // We have to determine the unique name to use as the principal name. It comes from upn, preferred_username, sub in that order
- String principalName = claimsSet.getClaimValue("upn", String.class);
- if (principalName == null) {
- principalName = claimsSet.getClaimValue("preferred_username", String.class);
- if (principalName == null) {
- principalName = claimsSet.getSubject();
- }
- }
- claimsSet.setClaim(Claims.raw_token.name(), token);
- principal = new DefaultJWTCallerPrincipal(token, type, claimsSet, principalName);
- } catch (InvalidJwtException e) {
- throw new ParseException("Failed to verify token", e);
- } catch (MalformedClaimException e) {
- throw new ParseException("Failed to verify token claims", e);
- }
-
- return principal;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfo.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfo.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfo.java
deleted file mode 100644
index a93e2cc..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import java.security.interfaces.RSAPublicKey;
-
-/**
- * The public key and expected issuer needed to validate a token.
- */
-public class JWTAuthContextInfo {
- private RSAPublicKey signerKey;
- private String issuedBy;
- private int expGracePeriodSecs = 60;
-
- public JWTAuthContextInfo() {
- }
-
- public JWTAuthContextInfo(RSAPublicKey signerKey, String issuedBy) {
- this.signerKey = signerKey;
- this.issuedBy = issuedBy;
- }
-
- public JWTAuthContextInfo(JWTAuthContextInfo orig) {
- this.signerKey = orig.signerKey;
- this.issuedBy = orig.issuedBy;
- this.expGracePeriodSecs = orig.expGracePeriodSecs;
- }
-
- public RSAPublicKey getSignerKey() {
- return signerKey;
- }
-
- public void setSignerKey(RSAPublicKey signerKey) {
- this.signerKey = signerKey;
- }
-
- public String getIssuedBy() {
- return issuedBy;
- }
-
- public void setIssuedBy(String issuedBy) {
- this.issuedBy = issuedBy;
- }
-
- public int getExpGracePeriodSecs() {
- return expGracePeriodSecs;
- }
-
- public void setExpGracePeriodSecs(int expGracePeriodSecs) {
- this.expGracePeriodSecs = expGracePeriodSecs;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfoProvider.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfoProvider.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfoProvider.java
deleted file mode 100644
index a173ea2..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTAuthContextInfoProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import javax.enterprise.context.Dependent;
-import javax.enterprise.inject.Produces;
-import java.security.interfaces.RSAPublicKey;
-import java.util.Optional;
-
-@Dependent
-public class JWTAuthContextInfoProvider {
-
- @Produces
- Optional<JWTAuthContextInfo> getOptionalContextInfo() {
- JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
-
- // todo use MP Config to load the configuration
- contextInfo.setIssuedBy("https://server.example.com");
- RSAPublicKey pk = null;
- try {
- pk = (RSAPublicKey) KeyUtils.decodePublicKey("-----BEGIN RSA PUBLIC KEY-----\n" +
- "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq\n" +
- "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR\n" +
- "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e\n" +
- "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9\n" +
- "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn\n" +
- "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x\n" +
- "nQIDAQAB\n" +
- "-----END RSA PUBLIC KEY-----\n");
-
- } catch (final Exception e) {
- e.printStackTrace();
- // todo better handling
- throw new RuntimeException(e);
- }
- contextInfo.setSignerKey(pk);
-
- return Optional.of(contextInfo);
- }
-
- @Produces
- JWTAuthContextInfo getContextInfo() {
- return getOptionalContextInfo().get();
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipal.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipal.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipal.java
deleted file mode 100644
index e130213..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipal.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-
-import org.eclipse.microprofile.jwt.JsonWebToken;
-
-import java.util.Optional;
-
-/**
- * An abstract CallerPrincipal implementation that provides access to the JWT claims that are required by
- * the microprofile token.
- */
-public abstract class JWTCallerPrincipal implements JsonWebToken {
-
- private String name;
-
- /**
- * Create a JWTCallerPrincipal with the caller's name
- *
- * @param name - caller's name
- */
- public JWTCallerPrincipal(String name) {
- this.name = name;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- /**
- * Generate a human readable version of the caller principal and associated JWT.
- *
- * @param showAll - should all claims associated with the JWT be displayed or should only those defined in the
- * JsonWebToken interface be displayed.
- * @return human readable presentation of the caller principal and associated JWT.
- */
- public abstract String toString(boolean showAll);
-
- public <T> Optional<T> claim(final String claimName) {
- final T claim = (T) getClaim(claimName);
- return Optional.ofNullable(claim);
- }
-}
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipalFactory.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipalFactory.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipalFactory.java
deleted file mode 100644
index cb00cc5..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JWTCallerPrincipalFactory.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ServiceLoader;
-
-/**
- * The factory class that provides the token string to JWTCallerPrincipal parsing for a given implementation.
- */
-public abstract class JWTCallerPrincipalFactory {
- private static JWTCallerPrincipalFactory instance;
-
- /**
- * Obtain the JWTCallerPrincipalFactory that has been set or by using the ServiceLoader pattern.
- *
- * @return the factory instance
- * @see #setInstance(JWTCallerPrincipalFactory)
- */
- public static JWTCallerPrincipalFactory instance() {
- if (instance == null) {
- synchronized (JWTCallerPrincipalFactory.class) {
- if (instance != null) {
- return instance;
- }
-
- ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
- @Override
- public ClassLoader run() {
- return Thread.currentThread().getContextClassLoader();
- }
- });
- if (cl == null) {
- cl = JWTCallerPrincipalFactory.class.getClassLoader();
- }
-
- JWTCallerPrincipalFactory newInstance = loadSpi(cl);
-
- if (newInstance == null && cl != JWTCallerPrincipalFactory.class.getClassLoader()) {
- cl = JWTCallerPrincipalFactory.class.getClassLoader();
- newInstance = loadSpi(cl);
- }
- if (newInstance == null) {
- throw new IllegalStateException("No JWTCallerPrincipalFactory implementation found!");
- }
-
- instance = newInstance;
- }
- }
-
- return instance;
- }
-
- /**
- * Look for a JWTCallerPrincipalFactory service implementation using the ServiceLoader.
- *
- * @param cl - the ClassLoader to pass into the {@link ServiceLoader#load(Class, ClassLoader)} method.
- * @return the JWTCallerPrincipalFactory if found, null otherwise
- */
- private static JWTCallerPrincipalFactory loadSpi(ClassLoader cl) {
- if (cl == null) {
- return null;
- }
-
- // start from the root CL and go back down to the TCCL
- JWTCallerPrincipalFactory instance = loadSpi(cl.getParent());
-
- if (instance == null) {
- ServiceLoader<JWTCallerPrincipalFactory> sl = ServiceLoader.load(JWTCallerPrincipalFactory.class, cl);
- URL u = cl.getResource("/META-INF/services/org.apache.tomee.microprofile.jwt.JWTCallerPrincipalFactory");
- System.out.printf("JWTCallerPrincipalFactory, cl=%s, u=%s, sl=%s\n", cl, u, sl);
- try {
- for (JWTCallerPrincipalFactory spi : sl) {
- if (instance != null) {
- throw new IllegalStateException(
- "Multiple JWTCallerPrincipalFactory implementations found: "
- + spi.getClass().getName() + " and "
- + instance.getClass().getName());
- } else {
- System.out.printf("sl=%s, loaded=%s\n", sl, spi);
- instance = spi;
- }
- }
- } catch (Throwable e) {
- System.err.printf("Warning: %s\n", e.getMessage());
- }
- }
- return instance;
- }
-
- /**
- * Set the instance. It is used by OSGi environment where service loader pattern is not supported.
- *
- * @param resolver the instance to use.
- */
- public static void setInstance(JWTCallerPrincipalFactory resolver) {
- instance = resolver;
- }
-
- /**
- * Parse the given bearer token string into a JWTCallerPrincipal instance.
- *
- * @param token - the bearer token provided for authorization
- * @return A JWTCallerPrincipal representation for the token.
- * @throws ParseException on parse or verification failure.
- */
- public abstract JWTCallerPrincipal parse(String token, JWTAuthContextInfo authContextInfo) throws ParseException;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JsonValueProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JsonValueProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JsonValueProducer.java
deleted file mode 100644
index 355b1d5..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/JsonValueProducer.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.Claims;
-
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.json.JsonArray;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonString;
-import javax.json.JsonValue;
-import java.lang.annotation.Annotation;
-import java.util.Optional;
-import java.util.logging.Logger;
-
-/**
- * A producer for JsonValue injection types
- */
-public class JsonValueProducer {
- private static Logger log = Logger.getLogger(JsonValueProducer.class.getName());
-
- @Produces
- @Claim("")
- public JsonString getJsonString(InjectionPoint ip) {
- return getValue(ip);
- }
-
- @Produces
- @Claim("")
- public Optional<JsonString> getOptionalJsonString(InjectionPoint ip) {
- return getOptionalValue(ip);
- }
-
- @Produces
- @Claim("")
- public JsonNumber getJsonNumber(InjectionPoint ip) {
- return getValue(ip);
- }
-
- @Produces
- @Claim("")
- public Optional<JsonNumber> getOptionalJsonNumber(InjectionPoint ip) {
- return getOptionalValue(ip);
- }
-
- @Produces
- @Claim("")
- public JsonArray getJsonArray(InjectionPoint ip) {
- return getValue(ip);
- }
-
- @Produces
- @Claim("")
- public Optional<JsonArray> getOptionalJsonArray(InjectionPoint ip) {
- return getOptionalValue(ip);
- }
-
- @Produces
- @Claim("")
- public JsonObject getJsonObject(InjectionPoint ip) {
- return getValue(ip);
- }
-
- @Produces
- @Claim("")
- public Optional<JsonObject> getOptionalJsonObject(InjectionPoint ip) {
- return getOptionalValue(ip);
- }
-
- public <T extends JsonValue> T getValue(InjectionPoint ip) {
- log.fine(String.format("JsonValueProducer(%s).produce", ip));
- String name = getName(ip);
- T jsonValue = (T) MPJWTProducer.generalJsonValueProducer(name);
- return jsonValue;
- }
-
- public <T extends JsonValue> Optional<T> getOptionalValue(InjectionPoint ip) {
- log.fine(String.format("JsonValueProducer(%s).produce", ip));
- String name = getName(ip);
- T jsonValue = (T) MPJWTProducer.generalJsonValueProducer(name);
- return Optional.ofNullable(jsonValue);
- }
-
- String getName(InjectionPoint ip) {
- String name = null;
- for (Annotation ann : ip.getQualifiers()) {
- if (ann instanceof Claim) {
- Claim claim = (Claim) ann;
- name = claim.standard() == Claims.UNKNOWN ? claim.value() : claim.standard().name();
- }
- }
- return name;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTCDIExtension.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTCDIExtension.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTCDIExtension.java
deleted file mode 100644
index aa15a33..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTCDIExtension.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.Claims;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.spi.AfterBeanDiscovery;
-import javax.enterprise.inject.spi.AfterDeploymentValidation;
-import javax.enterprise.inject.spi.BeanAttributes;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.BeforeBeanDiscovery;
-import javax.enterprise.inject.spi.DeploymentException;
-import javax.enterprise.inject.spi.Extension;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.ProcessBeanAttributes;
-import javax.enterprise.inject.spi.ProcessInjectionPoint;
-import javax.enterprise.inject.spi.ProcessProducer;
-import javax.inject.Provider;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Optional;
-import java.util.Set;
-import java.util.logging.Logger;
-
-/**
- * A CDI extension that provides a producer for the current authenticated JsonWebToken based on a thread
- * local value that is managed by the {@link JWTAuthMechanism} request
- * authentication handler.
- * <p>
- * This also installs the producer methods for the discovered:
- * <ul>
- * <li>@Claim ClaimValue<T> injection sites.</li>
- * <li>@Claim raw type<T> injection sites.</li>
- * <li>@Claim JsonValue injection sites.</li>
- * </ul>
- *
- * @see JWTAuthMechanism
- */
-public class MPJWTCDIExtension implements Extension {
- private static Logger log = Logger.getLogger(MPJWTCDIExtension.class.getName());
-
- /**
- * Register the MPJWTProducer JsonWebToken producer bean
- *
- * @param bbd before discovery event
- * @param beanManager cdi bean manager
- */
- public void observeBeforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd, BeanManager beanManager) {
- log.fine(String.format("MPJWTExtension(), added JWTPrincipalProducer"));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(TCKTokenParser.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(MPJWTFilter.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(MPJWTInitializer.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(JWTAuthContextInfoProvider.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(MPJWTProducer.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(RawClaimTypeProducer.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(ClaimValueProducer.class));
- bbd.addAnnotatedType(beanManager.createAnnotatedType(JsonValueProducer.class));
- }
-
- /**
- * Replace the general producer method BeanAttributes with one bound to the collected injection site
- * types to properly reflect all of the type locations the producer method applies to.
- *
- * @param pba the ProcessBeanAttributes
- * @see ClaimProviderBeanAttributes
- */
- public void addTypeToClaimProducer(@Observes ProcessBeanAttributes pba) {
- if (pba.getAnnotated().isAnnotationPresent(Claim.class)) {
- Claim claim = pba.getAnnotated().getAnnotation(Claim.class);
- if (claim.value().length() == 0 && claim.standard() == Claims.UNKNOWN) {
- log.fine(String.format("addTypeToClaimProducer: %s\n", pba.getAnnotated()));
- BeanAttributes delegate = pba.getBeanAttributes();
- String name = delegate.getName();
- if (delegate.getTypes().contains(Optional.class)) {
- if (providerOptionalTypes.size() == 0) {
- providerOptionalTypes.add(Optional.class);
- }
- pba.setBeanAttributes(new ClaimProviderBeanAttributes(delegate, providerOptionalTypes, providerQualifiers));
- // This is
- } else if (name != null && name.startsWith("RawClaimTypeProducer#")) {
- if (rawTypes.size() == 0) {
- rawTypes.add(Object.class);
- }
- pba.setBeanAttributes(new ClaimProviderBeanAttributes(delegate, rawTypes, rawTypeQualifiers));
- log.fine(String.format("Setup RawClaimTypeProducer BeanAttributes"));
- }
- }
- }
- }
-
- public void afterDeploymentValidation(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
- }
-
- void doProcessProducers(@Observes ProcessProducer pp) {
- }
-
- /**
- * Handle the non-{@linkplain Provider}, {@linkplain org.eclipse.microprofile.jwt.ClaimValue}, and
- * {@linkplain javax.json.JsonValue} claim injection types.
- *
- * @param pip - the injection point event information
- * @see RawClaimTypeProducer
- */
- void processClaimInjections(@Observes ProcessInjectionPoint pip) {
- log.fine(String.format("pipRaw: %s", pip.getInjectionPoint()));
- InjectionPoint ip = pip.getInjectionPoint();
- if (ip.getAnnotated().isAnnotationPresent(Claim.class)) {
- Claim claim = ip.getAnnotated().getAnnotation(Claim.class);
- if (ip.getType() instanceof Class) {
- Class rawClass = (Class) ip.getType();
- // Primative types
- if (Modifier.isFinal(rawClass.getModifiers())) {
- rawTypes.add(ip.getType());
- rawTypeQualifiers.add(claim);
- log.fine(String.format("+++ Added Claim raw type: %s", ip.getType()));
- Class declaringClass = ip.getMember().getDeclaringClass();
- Annotation[] appScoped = declaringClass.getAnnotationsByType(ApplicationScoped.class);
- Annotation[] sessionScoped = declaringClass.getAnnotationsByType(SessionScoped.class);
- if ((appScoped != null && appScoped.length > 0) || (sessionScoped != null && sessionScoped.length > 0)) {
- String err = String.format("A raw type cannot be injected into application/session scope: IP=%s", ip);
- pip.addDefinitionError(new DeploymentException(err));
- }
- }
- // This handles collections of primative types
- } else if (isRawParameterizedType(ip.getType())) {
- log.fine(String.format("+++ Added Claim ParameterizedType: %s", ip.getType()));
- rawTypes.add(ip.getType());
- rawTypeQualifiers.add(claim);
- }
- } else {
- log.fine(String.format("Skipping pip: %s, type: %s/%s", ip, ip.getType(), ip.getType().getClass()));
- }
- }
-
- /**
- * Collect the types of all {@linkplain Provider} injection points annotated with {@linkplain Claim}.
- *
- * @param pip - the injection point event information
- */
- void processClaimProviderInjections(@Observes ProcessInjectionPoint<?, ? extends Provider> pip) {
- log.fine(String.format("pip: %s", pip.getInjectionPoint()));
- final InjectionPoint ip = pip.getInjectionPoint();
- if (ip.getAnnotated().isAnnotationPresent(Claim.class)) {
- Claim claim = ip.getAnnotated().getAnnotation(Claim.class);
- if (claim.value().length() == 0 && claim.standard() == Claims.UNKNOWN) {
- pip.addDefinitionError(new DeploymentException("@Claim at: " + ip + " has no name or valid standard enum setting"));
- }
- boolean usesEnum = claim.standard() != Claims.UNKNOWN;
- final String claimName = usesEnum ? claim.standard().name() : claim.value();
- log.fine(String.format("Checking Provider Claim(%s), ip: %s", claimName, ip));
- ClaimIP claimIP = claims.get(claimName);
- Type matchType = ip.getType();
- // The T from the Provider<T> injection site
- Type actualType = ((ParameterizedType) matchType).getActualTypeArguments()[0];
- // Don't add Optional or JsonValue as this is handled specially
- if (!optionalOrJsonValue(actualType)) {
- rawTypes.add(actualType);
- } else if (!actualType.getTypeName().startsWith("javax.json.Json")) {
- // Validate that this is not an Optional<JsonValue>
- Type innerType = ((ParameterizedType) actualType).getActualTypeArguments()[0];
- if (!innerType.getTypeName().startsWith("javax.json.Json")) {
- providerOptionalTypes.add(actualType);
- providerQualifiers.add(claim);
- }
- }
- rawTypeQualifiers.add(claim);
- ClaimIPType key = new ClaimIPType(claimName, actualType);
- if (claimIP == null) {
- claimIP = new ClaimIP(actualType, actualType, false, claim);
- claimIP.setProviderSite(true);
- claims.put(key, claimIP);
- }
- claimIP.getInjectionPoints().add(ip);
- log.fine(String.format("+++ Added Provider Claim(%s) ip: %s", claimName, ip));
-
- }
- }
-
- /**
- * Create producer methods for each ClaimValue injection site
- *
- * @param event - AfterBeanDiscovery
- * @param beanManager - CDI bean manager
- */
- void observesAfterBeanDiscovery(@Observes final AfterBeanDiscovery event, final BeanManager beanManager) {
- log.fine(String.format("observesAfterBeanDiscovery, %s", claims));
- installClaimValueProducerMethodsViaSyntheticBeans(event, beanManager);
-
- //installClaimValueProducesViaTemplateType(event, beanManager);
- }
-
- /**
- * Create a synthetic bean with a custom Producer for the non-Provider injection sites.
- *
- * @param event - AfterBeanDiscovery
- * @param beanManager - CDI bean manager
- */
- private void installClaimValueProducerMethodsViaSyntheticBeans(final AfterBeanDiscovery event, final BeanManager beanManager) {
-
- }
-
- private boolean optionalOrJsonValue(Type type) {
- boolean isOptionOrJson = type.getTypeName().startsWith(Optional.class.getTypeName())
- | type.getTypeName().startsWith("javax.json.Json");
- return isOptionOrJson;
- }
-
- private boolean isRawParameterizedType(Type type) {
- boolean isRawParameterizedType = false;
- if (type instanceof ParameterizedType) {
- ParameterizedType ptype = ParameterizedType.class.cast(type);
- Type rawType = ptype.getRawType();
- String rawTypeName = rawType.getTypeName();
- isRawParameterizedType = !rawTypeName.startsWith("org.eclipse.microprofile.jwt");
- }
- return isRawParameterizedType;
- }
-
- /**
- * A map of claim,type pairs to the injection site information
- */
- private HashMap<ClaimIPType, ClaimIP> claims = new HashMap<>();
-
- private Set<Type> providerOptionalTypes = new HashSet<>();
-
- private Set<Type> providerTypes = new HashSet<>();
-
- private Set<Type> rawTypes = new HashSet<>();
-
- private Set<Annotation> rawTypeQualifiers = new HashSet<>();
-
- private Set<Annotation> providerQualifiers = new HashSet<>();
-
- /**
- * A key for a claim,injection site type pair
- */
- public static class ClaimIPType implements Comparable<ClaimIPType> {
- public ClaimIPType(String claimName, Type ipType) {
- this.claimName = claimName;
- this.ipType = ipType;
- }
-
- /**
- * Order the @Claim ClaimValue<T> on the @Claim.value and then T type name
- *
- * @param o - ClaimIP to compare to
- * @return the ordering of this claim relative to o
- */
- @Override
- public int compareTo(ClaimIPType o) {
- int compareTo = claimName.compareTo(o.claimName);
- if (compareTo == 0) {
- compareTo = ipType.getTypeName().compareTo(o.ipType.getTypeName());
- }
- return compareTo;
- }
-
- private String claimName;
-
- private Type ipType;
- }
-
- /**
- * The representation of an @Claim annotated injection site
- */
- public static class ClaimIP {
- /**
- * Create a ClaimIP from the injection site information
- *
- * @param matchType - the outer type of the injection site
- * @param valueType - the parameterized type of the injection site
- * @param isOptional - is the injection site an Optional
- * @param claim - the Claim qualifier
- */
- public ClaimIP(Type matchType, Type valueType, boolean isOptional, Claim claim) {
- this.matchType = matchType;
- this.valueType = valueType;
- this.claim = claim;
- }
-
- public Type getMatchType() {
- return matchType;
- }
-
- public String getClaimName() {
- return claim.standard() == Claims.UNKNOWN ? claim.value() : claim.standard().name();
- }
-
- public Claim getClaim() {
- return claim;
- }
-
- public Type getValueType() {
- return valueType;
- }
-
- public boolean isOptional() {
- return isOptional;
- }
-
- public boolean isProviderSite() {
- return isProviderSite;
- }
-
- public void setProviderSite(boolean providerSite) {
- this.isProviderSite = providerSite;
- }
-
- public boolean isNonStandard() {
- return isNonStandard;
- }
-
- public void setNonStandard(boolean nonStandard) {
- isNonStandard = nonStandard;
- }
-
- public boolean isJsonValue() {
- return isJsonValue;
- }
-
- public void setJsonValue(boolean jsonValue) {
- isJsonValue = jsonValue;
- }
-
- public Set<InjectionPoint> getInjectionPoints() {
- return injectionPoints;
- }
-
- @Override
- public String toString() {
- return "ClaimIP{" +
- "type=" + matchType +
- ", claim=" + claim +
- ", ips=" + injectionPoints +
- '}';
- }
-
- /**
- * The injection site value type
- */
- private Type matchType;
-
- /**
- * The actual type of of the ParameterizedType matchType
- */
- private Type valueType;
-
- /**
- * Is valueType actually wrapped in an Optional
- */
- private boolean isOptional;
-
- private boolean isProviderSite;
-
- private boolean isNonStandard;
-
- private boolean isJsonValue;
-
- /**
- * The injection site @Claim annotation value
- */
- private Claim claim;
-
- /**
- * The location that share the @Claim/type combination
- */
- private HashSet<InjectionPoint> injectionPoints = new HashSet<>();
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
index a8f7cb4..0c80696 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTFilter.java
@@ -16,6 +16,10 @@
*/
package org.apache.tomee.microprofile.jwt;
+import org.apache.tomee.microprofile.jwt.cdi.MPJWTProducer;
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+import org.apache.tomee.microprofile.jwt.principal.DefaultJWTCallerPrincipalFactory;
+import org.apache.tomee.microprofile.jwt.principal.JWTCallerPrincipalFactory;
import org.eclipse.microprofile.jwt.JsonWebToken;
import javax.inject.Inject;
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTProducer.java
deleted file mode 100644
index 195f323..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/MPJWTProducer.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.ClaimValue;
-import org.eclipse.microprofile.jwt.JsonWebToken;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.Destroyed;
-import javax.enterprise.context.Initialized;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Produces;
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.logging.Logger;
-
-/**
- * A class that tracks the current validated MP-JWT and associated JsonWebToken via a thread
- * local to provide a @RequestScoped JsonWebToken producer method.
- * <p>
- * It also provides utility methods for access the current JsonWebToken claim values.
- */
-@ApplicationScoped
-public class MPJWTProducer {
- private static Logger log = Logger.getLogger(MPJWTProducer.class.getName());
- private static final String TMP = "tmp";
- private static ThreadLocal<JsonWebToken> currentPrincipal = new ThreadLocal<>();
-
- public static void setJWTPrincipal(JsonWebToken principal) {
- currentPrincipal.set(principal);
- }
-
- public static JsonWebToken getJWTPrincpal() {
- return currentPrincipal.get();
- }
-
- @PostConstruct
- void init() {
- log.fine("MPJWTProducer initialized");
- }
-
- void observeRequestInitialized(@Observes @Initialized(RequestScoped.class) Object event) {
- log.finest(String.format("observeRequestInitialized, event=%s", event));
- }
-
- void observeRequestDestroyed(@Observes @Destroyed(RequestScoped.class) Object event) {
- log.finest(String.format("observeRequestDestroyed, event=%s", event));
- }
-
- /**
- * The @RequestScoped producer method for the current JsonWebToken
- *
- * @return
- */
- @Produces
- @RequestScoped
- JsonWebToken currentPrincipalOrNull() {
- return currentPrincipal.get();
- }
-
- /**
- * A utility method for accessing a claim from the current JsonWebToken as a ClaimValue<Optional<T>> object.
- *
- * @param name - name of the claim
- * @param <T> expected actual type of the claim
- * @return the claim value wrapper object
- */
- static <T> ClaimValue<Optional<T>> generalClaimValueProducer(String name) {
- ClaimValueWrapper<Optional<T>> wrapper = new ClaimValueWrapper<>(name);
- T value = getValue(name, false);
- Optional<T> optValue = Optional.ofNullable(value);
- wrapper.setValue(optValue);
- return wrapper;
- }
-
- /**
- * Return the indicated claim value as a JsonValue
- *
- * @param name - name of the claim
- * @return a JsonValue wrapper
- */
- static JsonValue generalJsonValueProducer(String name) {
- Object value = getValue(name, false);
- JsonValue jsonValue = wrapValue(value);
- return jsonValue;
- }
-
- public static <T> T getValue(String name, boolean isOptional) {
- JsonWebToken jwt = getJWTPrincpal();
- if (jwt == null) {
- log.fine(String.format("getValue(%s), null JsonWebToken", name));
- return null;
- }
-
- Optional<T> claimValue = jwt.claim(name);
- if (!isOptional && !claimValue.isPresent()) {
- log.fine(String.format("Failed to find Claim for: %s", name));
- }
- log.fine(String.format("getValue(%s), isOptional=%s, claimValue=%s", name, isOptional, claimValue));
- return claimValue.orElse(null);
- }
-
- static JsonObject replaceMap(Map<String, Object> map) {
- JsonObjectBuilder builder = Json.createObjectBuilder();
- for (Map.Entry<String, Object> entry : map.entrySet()) {
- Object entryValue = entry.getValue();
- if (entryValue instanceof Map) {
- JsonObject entryJsonObject = replaceMap((Map<String, Object>) entryValue);
- builder.add(entry.getKey(), entryJsonObject);
- } else if (entryValue instanceof List) {
- JsonArray array = (JsonArray) wrapValue(entryValue);
- builder.add(entry.getKey(), array);
- } else if (entryValue instanceof Long || entryValue instanceof Integer) {
- long lvalue = ((Number) entryValue).longValue();
- builder.add(entry.getKey(), lvalue);
- } else if (entryValue instanceof Double || entryValue instanceof Float) {
- double dvalue = ((Number) entryValue).doubleValue();
- builder.add(entry.getKey(), dvalue);
- } else if (entryValue instanceof Boolean) {
- boolean flag = ((Boolean) entryValue).booleanValue();
- builder.add(entry.getKey(), flag);
- } else if (entryValue instanceof String) {
- builder.add(entry.getKey(), entryValue.toString());
- }
- }
- return builder.build();
- }
-
- static JsonValue wrapValue(Object value) {
- JsonValue jsonValue = null;
- if (value instanceof JsonValue) {
- // This may already be a JsonValue
- jsonValue = (JsonValue) value;
- } else if (value instanceof String) {
- jsonValue = Json.createObjectBuilder()
- .add(TMP, value.toString())
- .build()
- .getJsonString(TMP);
- } else if (value instanceof Number) {
- Number number = (Number) value;
- if ((number instanceof Long) || (number instanceof Integer)) {
- jsonValue = Json.createObjectBuilder()
- .add(TMP, number.longValue())
- .build()
- .getJsonNumber(TMP);
- } else {
- jsonValue = Json.createObjectBuilder()
- .add(TMP, number.doubleValue())
- .build()
- .getJsonNumber(TMP);
- }
- } else if (value instanceof Boolean) {
- Boolean flag = (Boolean) value;
- jsonValue = flag ? JsonValue.TRUE : JsonValue.FALSE;
- } else if (value instanceof Collection) {
- JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
- Collection list = (Collection) value;
- for (Object element : list) {
- if (element instanceof String) {
- arrayBuilder.add(element.toString());
- } else {
- JsonValue jvalue = wrapValue(element);
- arrayBuilder.add(jvalue);
- }
- }
- jsonValue = arrayBuilder.build();
- } else if (value instanceof Map) {
- jsonValue = replaceMap((Map) value);
- }
- return jsonValue;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/RawClaimTypeProducer.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/RawClaimTypeProducer.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/RawClaimTypeProducer.java
deleted file mode 100644
index b52912c..0000000
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/RawClaimTypeProducer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.microprofile.jwt;
-
-import org.eclipse.microprofile.jwt.Claim;
-import org.eclipse.microprofile.jwt.ClaimValue;
-import org.eclipse.microprofile.jwt.Claims;
-
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.inject.Named;
-import java.lang.annotation.Annotation;
-import java.util.Optional;
-import java.util.logging.Logger;
-
-/**
- *
- */
-public class RawClaimTypeProducer {
- private static Logger log = Logger.getLogger(RawClaimTypeProducer.class.getName());
-
- @Produces
- @Claim("")
- @Named("RawClaimTypeProducer#getValue")
- public Object getValue(InjectionPoint ip) {
- log.fine(String.format("getValue(%s)", ip));
- String name = getName(ip);
- ClaimValue<Optional<Object>> cv = MPJWTProducer.generalClaimValueProducer(name);
- Optional<Object> value = cv.getValue();
- Object returnValue = value.orElse(null);
- return returnValue;
- }
-
- @Produces
- @Claim("")
- @Named("RawClaimTypeProducer#getOptionalValue")
- public Optional getOptionalValue(InjectionPoint ip) {
- log.fine(String.format("getOptionalValue(%s)", ip));
- String name = getName(ip);
- ClaimValue<Optional<Object>> cv = MPJWTProducer.generalClaimValueProducer(name);
- Optional<Object> value = cv.getValue();
- return value;
- }
-
- String getName(InjectionPoint ip) {
- String name = null;
- for (Annotation ann : ip.getQualifiers()) {
- if (ann instanceof Claim) {
- Claim claim = (Claim) ann;
- name = claim.standard() == Claims.UNKNOWN ? claim.value() : claim.standard().name();
- }
- }
- return name;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
index ba57491..0c65795 100644
--- a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/TCKTokenParser.java
@@ -16,6 +16,9 @@
*/
package org.apache.tomee.microprofile.jwt;
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+import org.apache.tomee.microprofile.jwt.principal.DefaultJWTCallerPrincipalFactory;
+import org.apache.tomee.microprofile.jwt.principal.JWTCallerPrincipalFactory;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.eclipse.microprofile.jwt.tck.util.ITokenParser;
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
new file mode 100644
index 0000000..6c07f8c
--- /dev/null
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimLiteral.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomee.microprofile.jwt.cdi;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+import org.eclipse.microprofile.jwt.Claim;
+import org.eclipse.microprofile.jwt.Claims;
+
+public class ClaimLiteral extends AnnotationLiteral<Claim> implements Claim {
+ public String value() {
+ return "";
+ }
+
+ public Claims standard() {
+ return Claims.UNKNOWN;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tomee/blob/c5964e07/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
----------------------------------------------------------------------
diff --git a/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
new file mode 100644
index 0000000..4c446c0
--- /dev/null
+++ b/tck/mp-jwt-embedded/src/main/java/org/apache/tomee/microprofile/jwt/cdi/ClaimProviderBeanAttributes.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomee.microprofile.jwt.cdi;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.enterprise.inject.spi.BeanAttributes;
+
+/**
+ * An implementation of BeanAttributes<Object> that wraps the generic producer BeanAttributes
+ * to allow the MPJWTExtension to collect the types of all corresponding injection sites
+ *
+ */
+public class ClaimProviderBeanAttributes implements BeanAttributes<Object> {
+ /**
+ * Decorate the ConfigPropertyProducer BeanAttributes to set the types the producer applies to. This set is collected
+ * from all injection points annotated with @ConfigProperty.
+ *
+ * @param delegate - the original producer method BeanAttributes
+ * @param types - the full set of @Claim injection point types
+ */
+ public ClaimProviderBeanAttributes(BeanAttributes<Object> delegate, Set<Type> types, Set<Annotation> qualifiers) {
+ this.delegate = delegate;
+ this.types = types;
+ this.qualifiers = qualifiers;
+ if (types.size() == 0) {
+ Thread.dumpStack();
+ }
+ }
+
+ @Override
+ public Set<Type> getTypes() {
+ return types;
+ }
+
+ @Override
+ public Set<Annotation> getQualifiers() {
+ return qualifiers;
+ }
+
+ @Override
+ public Class<? extends Annotation> getScope() {
+ return delegate.getScope();
+ }
+
+ @Override
+ public String getName() {
+ return delegate.getName();
+ }
+
+ @Override
+ public Set<Class<? extends Annotation>> getStereotypes() {
+ return delegate.getStereotypes();
+ }
+
+ @Override
+ public boolean isAlternative() {
+ return delegate.isAlternative();
+ }
+
+ private BeanAttributes<Object> delegate;
+
+ private Set<Type> types;
+
+ private Set<Annotation> qualifiers;
+
+}
\ No newline at end of file