On Wed, Sep 25, 2013 at 2:07 PM, Benedikt Ritter <[email protected]> wrote:
> 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 :-) > > TypeLiteral is quite incidental to CDI or this wouldn't be an issue. If you want to write a typesafe API that deals to any great extent with the relationships between types, you need some type with which to parameterize your API methods in the same manner as Class<T>. That is the reason for the duplication elsewhere. > OTOH it's bad to have a swiss army knife that's missing a screwdriver... > Nice analogy. If any non-core Java library is in place for its types to become de facto standards, it's [lang] or guava IMO. [lang] is much smaller so would be my natural choice for a dependency when designing a library (I personally take [lang] as a given for any other project I work on, which I continue to say is the whole mission of this component). I look on providing TypeLiteral as equivalent to providing Pair, which in fairness I also was responsible for: it may or may not be used directly by [lang], but it's such a common need (hmm, "common") that it deserves a home here. Matt > > > > > 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 >
