2013/9/24 Matt Benson <[email protected]> > On Sep 24, 2013 10:48 AM, "Benedikt Ritter" <[email protected]> wrote: > > > > Hi Matt, > > > > > Am 24.09.2013 um 01:24 schrieb Matt Benson <[email protected]>: > > > > > > <grumpy> > > > This is why I submitted this in JIRA first and let it sit Friday > > > afternoon, all weekend, and basically all day Monday before committing. > > > </grumpy> > > > > Although I'm subscribed to the jira ML, I don't follow the list as > careful as I follow the dev ML. Since you seem to have been unsure about > whether to add this feature or not, maybe you should have asked for > opinions on the dev ML first. > > Well, we're here now. What's your opinion? >
To be honest I'm undecided here. I'd say if we need this for other API functionality it can stay. For now it feels not only like a replication of CDI, but also of other OSS libs as you have pointed out :-) OTOH it's bad to have a swiss army knife that's missing a screwdriver... > > Matt > > > > > Regards, > > Benedikt > > > > > > > > IMO the CDI API, however small in binary terms, is a rather large > > > dependency *conceptually*. In just a few minutes I have dug up three > > > similar OSS classes [1, 2, 3] I remember having encountered (not > including > > > my own, from which the proposed changes were extracted) whose existence > > > seems to support me in this opinion. I wouldn't be at all surprised to > > > find more out there. I reiterate that [lang]'s mission is to provide > where > > > Java SE is lacking. Finally, the suggested change arguably improves > upon > > > other solutions by providing an abstraction in terms of which > TypeLiteral > > > instances can be handled compatibly with user custom types. I submit > that > > > these comprise the "good argument" you have requested. > > > > > > Matt > > > [1] > > > > > http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/reflect/TypeToken.html > > > [2] > > > > > http://fasterxml.github.io/jackson-core/javadoc/2.2.0/com/fasterxml/jackson/core/type/TypeReference.html > > > [3] > > > > > https://code.google.com/p/orika/source/browse/trunk/core/src/main/java/ma/glasnost/orika/metadata/TypeBuilder.java > > > > > > > > > On Mon, Sep 23, 2013 at 5:53 PM, Gary Gregory <[email protected] > >wrote: > > > > > >> I think might -1 unless a good argument is made to start duplicating > Java > > >> EE classes. Is it that hard to depend on > > >> > > >> > > http://search.maven.org/remotecontent?filepath=javax/enterprise/cdi-api/1.0-SP4/cdi-api-1.0-SP4.jar(or > > >> a jar like it) for 50K? > > >> > > >> Gary > > >> > > >> > > >>> On Mon, Sep 23, 2013 at 6:13 PM, <[email protected]> wrote: > > >>> > > >>> Author: mbenson > > >>> Date: Mon Sep 23 22:13:57 2013 > > >>> New Revision: 1525711 > > >>> > > >>> URL: http://svn.apache.org/r1525711 > > >>> Log: > > >>> [LANG-919] Provide TypeLiteral class similar to > > >>> javax.enterprise.util.TypeLiteral > > >>> > > >>> Added: > > >>> > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java > > >>> > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java > > >>> (with props) > > >>> > > >>> > > >> > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java > > >>> > > >>> Added: > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java > > >>> URL: > > >>> > > >> > > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java?rev=1525711&view=auto > > >>> > > >>> > > >> > > ============================================================================== > > >>> --- > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java > > >>> (added) > > >>> +++ > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/TypeLiteral.java > > >>> Mon Sep 23 22:13:57 2013 > > >>> @@ -0,0 +1,79 @@ > > >>> +/* > > >>> + * 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.commons.lang3.reflect; > > >>> + > > >>> +import java.lang.reflect.Type; > > >>> +import java.lang.reflect.TypeVariable; > > >>> + > > >>> +import org.apache.commons.lang3.Validate; > > >>> + > > >>> +/** > > >>> + * Type literal comparable to {@code > javax.enterprise.util.TypeLiteral}, > > >>> + * made generally available outside the JEE context. Allows the > passing > > >>> around of > > >>> + * a "token" that represents a type in a typesafe manner, as opposed > to > > >>> + * passing the (non-parameterized) {@link Type} object itself. > > >>> + * Additionally {@link TypeLiteral} implements the {@link Typed} > > >>> interface which > > >>> + * is a generalization of this concept. It is suggested that APIs be > > >>> defined in > > >>> + * terms of the interface, which others might implemented in custom > > >>> classes. > > >>> + */ > > >>> +public abstract class TypeLiteral<T> implements Typed<T> { > > >>> + > > >>> + @SuppressWarnings("rawtypes") > > >>> + private static final TypeVariable<Class<TypeLiteral>> T = > > >>> TypeLiteral.class.getTypeParameters()[0]; > > >>> + > > >>> + /** > > >>> + * Represented type. > > >>> + */ > > >>> + public final Type value; > > >>> + > > >>> + private final String toString; > > >>> + > > >>> + protected TypeLiteral() { > > >>> + this.value = > > >>> + Validate.notNull(TypeUtils.getTypeArguments(getClass(), > > >>> TypeLiteral.class).get(T), > > >>> + "%s does not assign type parameter %s", getClass(), > > >>> TypeUtils.toLongString(T)); > > >>> + > > >>> + this.toString = String.format("%s<%s>", > > >>> TypeLiteral.class.getSimpleName(), TypeUtils.toString(value)); > > >>> + } > > >>> + > > >>> + @Override > > >>> + public final boolean equals(Object obj) { > > >>> + if (obj == this) { > > >>> + return true; > > >>> + } > > >>> + if (obj instanceof TypeLiteral == false) { > > >>> + return false; > > >>> + } > > >>> + final TypeLiteral<?> other = (TypeLiteral<?>) obj; > > >>> + return TypeUtils.equals(value, other.value); > > >>> + } > > >>> + > > >>> + @Override > > >>> + public int hashCode() { > > >>> + return 37 << 4 | value.hashCode(); > > >>> + } > > >>> + > > >>> + @Override > > >>> + public String toString() { > > >>> + return toString; > > >>> + } > > >>> + > > >>> + @Override > > >>> + public Type getType() { > > >>> + return value; > > >>> + } > > >>> +} > > >>> > > >>> Added: > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java > > >>> URL: > > >>> > > >> > > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java?rev=1525711&view=auto > > >>> > > >>> > > >> > > ============================================================================== > > >>> --- > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java > > >>> (added) > > >>> +++ > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java > > >>> Mon Sep 23 22:13:57 2013 > > >>> @@ -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.commons.lang3.reflect; > > >>> + > > >>> +import java.lang.reflect.Type; > > >>> + > > >>> +/** > > >>> + * Generalization of "has a type." > > >>> + */ > > >>> +public interface Typed<T> { > > >>> + > > >>> + /** > > >>> + * Get the {@link Type} represented by this entity. > > >>> + * > > >>> + * @return Type > > >>> + */ > > >>> + Type getType(); > > >>> +} > > >>> > > >>> Propchange: > > >>> > > >> > > commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/Typed.java > > >>> > > >>> > > >> > > ------------------------------------------------------------------------------ > > >>> svn:executable = * > > >>> > > >>> Added: > > >>> > > >> > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java > > >>> URL: > > >>> > > >> > > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java?rev=1525711&view=auto > > >>> > > >>> > > >> > > ============================================================================== > > >>> --- > > >>> > > >> > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java > > >>> (added) > > >>> +++ > > >>> > > >> > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/TypeLiteralTest.java > > >>> Mon Sep 23 22:13:57 2013 > > >>> @@ -0,0 +1,56 @@ > > >>> +/* > > >>> + * 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.commons.lang3.reflect; > > >>> + > > >>> +import static org.junit.Assert.assertEquals; > > >>> +import static org.junit.Assert.assertNotEquals; > > >>> +import static org.junit.Assert.assertTrue; > > >>> + > > >>> +import java.util.List; > > >>> + > > >>> +import org.junit.Test; > > >>> + > > >>> +public class TypeLiteralTest { > > >>> + > > >>> + @Test > > >>> + public void testBasic() { > > >>> + assertTrue(TypeUtils.equals(String.class, new > > >>> TypeLiteral<String>() {}.value)); > > >>> + > assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class, > > >>> String.class), > > >>> + new TypeLiteral<List<String>>() {}.value)); > > >>> + } > > >>> + > > >>> + @Test > > >>> + public void testTyped() { > > >>> + final Typed<String> stringType = new TypeLiteral<String>() > {}; > > >>> + assertTrue(TypeUtils.equals(String.class, > > >> stringType.getType())); > > >>> + final Typed<List<String>> listOfStringType = new > > >>> TypeLiteral<List<String>>() {}; > > >>> + > assertTrue(TypeUtils.equals(TypeUtils.parameterize(List.class, > > >>> String.class), listOfStringType.getType())); > > >>> + } > > >>> + > > >>> + @Test > > >>> + public void testEquals() { > > >>> + assertEquals(new TypeLiteral<String>() {}, new > > >>> TypeLiteral<String>() {}); > > >>> + assertEquals(new TypeLiteral<List<String>>() {}, new > > >>> TypeLiteral<List<String>>() {}); > > >>> + assertNotEquals(new TypeLiteral<String>() {}, new > > >>> TypeLiteral<List<String>>() {}); > > >>> + } > > >>> + > > >>> + @SuppressWarnings("rawtypes") > > >>> + @Test(expected = NullPointerException.class) > > >>> + public void testRaw() { > > >>> + new TypeLiteral() {}; > > >>> + } > > >>> +} > > >>> > > >>> > > >>> > > >> > > >> > > >> -- > > >> E-Mail: [email protected] | [email protected] > > >> Java Persistence with Hibernate, Second Edition< > > >> http://www.manning.com/bauer3/> > > >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > > >> Spring Batch in Action <http://www.manning.com/templier/> > > >> Blog: http://garygregory.wordpress.com > > >> Home: http://garygregory.com/ > > >> Tweet! http://twitter.com/GaryGregory > > >> > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter
