Skip to content
This repository has been archived by the owner on Sep 14, 2023. It is now read-only.

Commit

Permalink
Added support for @ConstructorProperties
Browse files Browse the repository at this point in the history
  • Loading branch information
mwanji committed Dec 27, 2014
1 parent f5873c0 commit fac7005
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
*/
package co.jirm.mapper.definition;

import static co.jirm.core.util.JirmPrecondition.check;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Strings.isNullOrEmpty;

import java.beans.ConstructorProperties;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
Expand All @@ -35,13 +37,11 @@
import javax.persistence.ManyToOne;
import javax.persistence.Version;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import static co.jirm.core.util.JirmPrecondition.check;
import co.jirm.mapper.SqlObjectConfig;
import co.jirm.mapper.converter.SqlParameterConverter;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Optional;

public class SqlParameterDefinition {
Expand Down Expand Up @@ -119,35 +119,20 @@ static Map<String, SqlParameterDefinition> getSqlBeanParameters(Class<?> k, SqlO
Map<String, SqlParameterDefinition> parameters = new LinkedHashMap<String, SqlParameterDefinition>();
Constructor<?> cons[] = k.getDeclaredConstructors();
for (Constructor<?> c : cons) {
JsonCreator jc = c.getAnnotation(JsonCreator.class);
if (jc == null) continue;
Annotation[][] aas = c.getParameterAnnotations();
Class<?>[] pts = c.getParameterTypes();
if (aas == null || aas.length == 0) continue;
for (int i = 0; i < aas.length; i++) {
Annotation[] as = aas[i];
Class<?> parameterType = pts[i];
for (int j = 0; j < as.length; j++) {
Annotation a = as[j];
//TODO handle http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html
//https://github.com/joshbeitelspacher/jackson-extensions/blob/master/src/main/java/com/netbeetle/jackson/ConstructorPropertiesAnnotationIntrospector.java
if (JsonProperty.class.equals(a.annotationType())) {
JsonProperty p = (JsonProperty) a;
String value = p.value();
final SqlParameterDefinition definition = parameterDef(config, k, value, parameterType, i);
parameters.put(value, definition);
}
}
if (c.isAnnotationPresent(JsonCreator.class)) {
return getSqlBeanParametersFromJsonCreatorConstructor(c, config);
}

if (c.isAnnotationPresent(ConstructorProperties.class)) {
return getSqlBeanParametersFromConstructorProperties(c, config);
}
break;
}
check.argument(! parameters.isEmpty(),
"No SQL columns/parameters found for: {}", k);
return parameters;
}


public Optional<SqlParameterObjectDefinition> getObjectDefinition() {
public Optional<SqlParameterObjectDefinition> getObjectDefinition() {
return objectDefinition;
}

Expand Down Expand Up @@ -307,4 +292,42 @@ else if (!sqlName.equals(other.sqlName))
return true;
}

private static Map<String, SqlParameterDefinition> getSqlBeanParametersFromJsonCreatorConstructor(Constructor<?> c, SqlObjectConfig config) {
Map<String, SqlParameterDefinition> parameters = new LinkedHashMap<String, SqlParameterDefinition>();
Annotation[][] aas = c.getParameterAnnotations();
Class<?>[] pts = c.getParameterTypes();
if (aas == null || aas.length == 0) {
return parameters;
}

for (int i = 0; i < aas.length; i++) {
Annotation[] as = aas[i];
Class<?> parameterType = pts[i];
for (int j = 0; j < as.length; j++) {
Annotation a = as[j];
if (JsonProperty.class.equals(a.annotationType())) {
JsonProperty p = (JsonProperty) a;
String value = p.value();
final SqlParameterDefinition definition = parameterDef(config, c.getDeclaringClass(), value, parameterType, i);
parameters.put(value, definition);
}
}

}

return parameters;
}

private static Map<String, SqlParameterDefinition> getSqlBeanParametersFromConstructorProperties(Constructor<?> c, SqlObjectConfig config) {
Map<String, SqlParameterDefinition> parameters = new LinkedHashMap<String, SqlParameterDefinition>();

String[] constructorProperties = c.getAnnotation(ConstructorProperties.class).value();
Class<?>[] pts = c.getParameterTypes();

for (int i = 0; i < pts.length; i++) {
parameters.put(constructorProperties[i], parameterDef(config, c.getDeclaringClass(), constructorProperties[i], pts[i], i));
}

return parameters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@

import static org.junit.Assert.*;

import java.beans.ConstructorProperties;

import javax.persistence.Column;
import javax.persistence.Id;

import co.jirm.core.JirmIllegalArgumentException;
import co.jirm.mapper.SqlObjectConfig;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import org.junit.Before;
import org.junit.Test;

import co.jirm.core.JirmIllegalArgumentException;
import co.jirm.mapper.SqlObjectConfig;


public class SqlObjectDefinitionTest {

Expand All @@ -47,6 +50,14 @@ public void testNoDefinitionFailure() {
SqlObjectDefinition.fromClass(NoDef.class, SqlObjectConfig.DEFAULT);
}

@Test
public void testConstructorProperties() {
SqlObjectDefinition<ConstructorPropertiesTest> d = SqlObjectDefinition.fromClass(ConstructorPropertiesTest.class, SqlObjectConfig.DEFAULT);

assertTrue(d.getIdParameters().containsKey("id"));
assertEquals("name", d.getParameters().get("name").sqlName());
}

public static class ProtectedConsTest {
@Id
@Column(length = 8192)
Expand Down Expand Up @@ -74,5 +85,17 @@ public String getNoColumName() {
}

public static class NoDef {}

public static class ConstructorPropertiesTest {
@Id
private final Long id;
private final String name;

@ConstructorProperties({ "id", "name" })
public ConstructorPropertiesTest(Long id, String name) {
this.id = id;
this.name = name;
}
}

}

0 comments on commit fac7005

Please sign in to comment.