diff --git a/README.md b/README.md index f0f8a65bb..0d9021690 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ GraphQL Query for JPA Entity Model [![Maven Central](https://img.shields.io/maven-central/v/com.introproventures/graphql-jpa-query.svg)](https://mvnrepository.com/artifact/com.introproventures/graphql-jpa-query) [![Jitpack.io](https://jitpack.io/v/introproventures/graphql-jpa-query.svg)](https://jitpack.io/#introproventures/graphql-jpa-query) -This library uses [graphql-java 6.0](https://github.com/andimarek/graphql-java) to derive and build the GraphQL schema from JPA Entity Schema provided by entity classes. +This library uses [graphql-java 9.4](https://github.com/andimarek/graphql-java) to derive and build the GraphQL schema from JPA Entity Schema provided by entity classes. It implements a schema builder to generate GraphQL Schema using JPA EntityManager with JPA Query Data Fetchers that transform GraphQL queries into JPA queries with flexible type safe criteria expressions and user-friendly SQL query syntax semantics i.e. query by page, , where criteria expressions, select, order by etc. diff --git a/graphql-jpa-query-annotations/pom.xml b/graphql-jpa-query-annotations/pom.xml index 2cf548827..864741b70 100644 --- a/graphql-jpa-query-annotations/pom.xml +++ b/graphql-jpa-query-annotations/pom.xml @@ -5,9 +5,9 @@ com.introproventures - graphql-jpa-query + graphql-jpa-query-dependencies 0.3.8-SNAPSHOT - ../pom.xml + ../graphql-jpa-query-dependencies 4.0.0 diff --git a/graphql-jpa-query-boot-starter/pom.xml b/graphql-jpa-query-boot-starter/pom.xml index be59a622e..b15cb7c34 100644 --- a/graphql-jpa-query-boot-starter/pom.xml +++ b/graphql-jpa-query-boot-starter/pom.xml @@ -6,9 +6,9 @@ com.introproventures - graphql-jpa-query + graphql-jpa-query-build 0.3.8-SNAPSHOT - ../pom.xml + ../graphql-jpa-query-build diff --git a/graphql-jpa-query-build/pom.xml b/graphql-jpa-query-build/pom.xml new file mode 100644 index 000000000..90e51dcc7 --- /dev/null +++ b/graphql-jpa-query-build/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + com.introproventures + graphql-jpa-query-dependencies + 0.3.8-SNAPSHOT + ../graphql-jpa-query-dependencies + + graphql-jpa-query-build + pom + + + + + + io.spring.platform + platform-bom + Brussels-SR6 + pom + import + + + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + test + + + + com.h2database + h2 + test + + + + + \ No newline at end of file diff --git a/graphql-jpa-query-dependencies/pom.xml b/graphql-jpa-query-dependencies/pom.xml new file mode 100644 index 000000000..1e0d0e196 --- /dev/null +++ b/graphql-jpa-query-dependencies/pom.xml @@ -0,0 +1,56 @@ + + 4.0.0 + + com.introproventures + graphql-jpa-query + 0.3.8-SNAPSHOT + .. + + graphql-jpa-query-dependencies + pom + + + 9.4 + 1.0.0.Final + + + + + + + com.graphql-java + graphql-java + ${graphql-java.version} + + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + ${hibernate-jpa-2.1-api.version} + + + + com.introproventures + graphql-jpa-query-annotations + ${project.version} + + + + com.introproventures + graphql-jpa-query-schema + ${project.version} + + + + com.introproventures + graphql-jpa-query-boot-starter + ${project.version} + + + + + + + \ No newline at end of file diff --git a/graphql-jpa-query-example/pom.xml b/graphql-jpa-query-example/pom.xml index d632fef9a..862a08281 100644 --- a/graphql-jpa-query-example/pom.xml +++ b/graphql-jpa-query-example/pom.xml @@ -6,9 +6,9 @@ com.introproventures - graphql-jpa-query + graphql-jpa-query-build 0.3.8-SNAPSHOT - ../pom.xml + ../graphql-jpa-query-build diff --git a/graphql-jpa-query-schema/pom.xml b/graphql-jpa-query-schema/pom.xml index 9f788a7f3..0b4b644f2 100644 --- a/graphql-jpa-query-schema/pom.xml +++ b/graphql-jpa-query-schema/pom.xml @@ -1,66 +1,67 @@ - - graphql-jpa-query-schema - graphql-jpa-query-schema + + graphql-jpa-query-schema + graphql-jpa-query-schema - - com.introproventures - graphql-jpa-query - 0.3.8-SNAPSHOT - ../pom.xml - - - 4.0.0 - - + + com.introproventures + graphql-jpa-query-build + 0.3.8-SNAPSHOT + ../graphql-jpa-query-build + - - com.introproventures - graphql-jpa-query-annotations - + 4.0.0 - - com.graphql-java - graphql-java - + - - org.atteo - evo-inflector - + + com.introproventures + graphql-jpa-query-annotations + - - org.slf4j - slf4j-api - + + com.graphql-java + graphql-java + - - joda-time - joda-time - true - + + org.atteo + evo-inflector + - - org.hibernate.javax.persistence - hibernate-jpa-2.1-api - 1.0.0.Final - + + org.slf4j + slf4j-api + - - javax.transaction - javax.transaction-api - + + joda-time + joda-time + true + - - javax.interceptor - javax.interceptor-api - + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + - - org.springframework.boot - spring-boot-starter-data-jpa - test - + + javax.transaction + javax.transaction-api + + + + javax.interceptor + javax.interceptor-api + + + + org.springframework.boot + spring-boot-starter-data-jpa + test + + + - - \ No newline at end of file diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java index c2519c432..7c8f33a2c 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java @@ -94,7 +94,8 @@ public Object get(DataFetchingEnvironment environment) { environment.getFragmentsByName(), environment.getExecutionId(), environment.getSelectionSet(), - environment.getFieldTypeInfo() + environment.getFieldTypeInfo(), + environment.getExecutionContext() )).orElse(environment); queryField = new Field(fieldName, field.getArguments(), recordsSelection.get().getSelectionSet()); diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java index 8fbe8c48e..dd3450893 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java @@ -443,7 +443,7 @@ private GraphQLFieldDefinition getObjectField(Attribute attribute) { if (type instanceof GraphQLOutputType) { List arguments = new ArrayList<>(); - DataFetcher dataFetcher = new PropertyDataFetcher<>(attribute.getName()); + DataFetcher dataFetcher = PropertyDataFetcher.fetching(attribute.getName()); // Only add the orderBy argument for basic attribute types if (attribute instanceof SingularAttribute diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/QraphQLJpaBaseDataFetcher.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/QraphQLJpaBaseDataFetcher.java index d64089bca..9ba15b478 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/QraphQLJpaBaseDataFetcher.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/QraphQLJpaBaseDataFetcher.java @@ -63,6 +63,7 @@ import graphql.language.FloatValue; import graphql.language.IntValue; import graphql.language.Node; +import graphql.language.NodeVisitor; import graphql.language.ObjectField; import graphql.language.ObjectValue; import graphql.language.SelectionSet; @@ -78,6 +79,8 @@ import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import graphql.schema.GraphQLType; +import graphql.util.TraversalControl; +import graphql.util.TraverserContext; /** * Provides base implemetation for GraphQL JPA Query Data Fetchers @@ -318,7 +321,8 @@ protected Predicate getWherePredicate(CriteriaBuilder cb, Root root, From getComments() { public boolean isEqualTo(Node node) { return node instanceof NullValue; } + + @Override + public TraversalControl accept(TraverserContext context, NodeVisitor visitor) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Value deepCopy() { + // TODO Auto-generated method stub + return null; + } } diff --git a/graphql-jpa-query-schema/src/main/java/graphql/schema/PropertyDataFetcher.java b/graphql-jpa-query-schema/src/main/java/graphql/schema/PropertyDataFetcher.java deleted file mode 100644 index 855a509a2..000000000 --- a/graphql-jpa-query-schema/src/main/java/graphql/schema/PropertyDataFetcher.java +++ /dev/null @@ -1,288 +0,0 @@ -package graphql.schema; - -import static graphql.Scalars.GraphQLBoolean; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.function.Function; - -import graphql.Assert; -import graphql.GraphQLException; -import graphql.PublicApi; - -/** - * This is the default data fetcher used in graphql-java. It will examine - * maps and POJO java beans for values that match the desired name, typically the field name - * or it will use a provided function to obtain values. - * maps and POJO java beans for values that match the desired name. - * - * It uses the following strategies - *
    - *
  • If the source is null, return null
  • - *
  • If the source is a Map, return map.get(propertyName)
  • - *
  • If a function is provided, it is used
  • - *
  • Find a public JavaBean getter method named `propertyName`
  • - *
  • Find any getter method named `propertyName` and call method.setAccessible(true)
  • - *
  • Find a public field named `propertyName`
  • - *
  • Find any field named `propertyName` and call field.setAccessible(true)
  • - *
  • If this cant find anything, then null is returned
  • - *
- * - * You can write your own data fetchers to get data from some other backing system - * if you need highly customised behaviour. - * - * @see graphql.schema.DataFetcher - */ -@PublicApi -public class PropertyDataFetcher implements DataFetcher { - - private final String propertyName; - private final Function function; - - /** - * This constructor will use the property name and examine the {@link DataFetchingEnvironment#getSource()} - * object for a getter method or field with that name. - * - * @param propertyName the name of the property to retrieve - */ - public PropertyDataFetcher(String propertyName) { - this.propertyName = propertyName; - this.function = null; - } - - @SuppressWarnings("unchecked") - private PropertyDataFetcher(Function function) { - this.function = (Function) Assert.assertNotNull(function); - this.propertyName = null; - } - - /** - * Returns a data fetcher that will use the property name to examine the {@link DataFetchingEnvironment#getSource()} object - * for a getter method or field with that name, or if its a map, it will look up a value using - * property name as a key. - * - * For example : - *
-     * {@code
-     *
-     *      DataFetcher functionDataFetcher = fetching("pojoPropertyName");
-     *
-     * }
-     * 
- * - * @param propertyName the name of the property to retrieve - * @param the type of result - * - * @return a new PropertyDataFetcher using the provided function as its source of values - */ - public static PropertyDataFetcher fetching(String propertyName) { - return new PropertyDataFetcher<>(propertyName); - } - - /** - * Returns a data fetcher that will present the {@link DataFetchingEnvironment#getSource()} object to the supplied - * function to obtain a value, which allows you to use Java 8 method references say obtain values in a - * more type safe way. - * - * For example : - *
-     * {@code
-     *
-     *      DataFetcher functionDataFetcher = fetching(Thing::getId);
-     *
-     * }
-     * 
- * - * @param function the function to use to obtain a value from the source object - * @param the type of the source object - * @param the type of result - * - * @return a new PropertyDataFetcher using the provided function as its source of values - */ - public static PropertyDataFetcher fetching(Function function) { - return new PropertyDataFetcher<>(function); - } - - - @SuppressWarnings("unchecked") - @Override - public T get(DataFetchingEnvironment environment) { - Object source = environment.getSource(); - if (source == null) { - return null; - } - - if (function != null) { - return (T) function.apply(source); - } - - if (source instanceof Map) { - return (T) ((Map) source).get(propertyName); - } - return (T) getPropertyViaGetter(source, environment.getFieldType()); - } - - private Object getPropertyViaGetter(Object object, GraphQLOutputType outputType) { - try { - return getPropertyViaGetterMethod(object, outputType, this::findPubliclyAccessibleMethod); - } catch (NoSuchMethodException ignored) { - try { - return getPropertyViaGetterMethod(object, outputType, this::findViaSetAccessible); - } catch (NoSuchMethodException ignored2) { - return getPropertyViaFieldAccess(object); - } - } - } - - @FunctionalInterface - private interface MethodFinder { - Method apply(Class aClass, String s) throws NoSuchMethodException; - } - - private Object getPropertyViaGetterMethod(Object object, GraphQLOutputType outputType, MethodFinder methodFinder) throws NoSuchMethodException { - if (isBooleanProperty(outputType)) { - try { - return getPropertyViaGetterUsingPrefix(object, "is", methodFinder); - } catch (NoSuchMethodException e) { - return getPropertyViaGetterUsingPrefix(object, "get", methodFinder); - } - } else { - return getPropertyViaGetterUsingPrefix(object, "get", methodFinder); - } - } - - private Object getPropertyViaGetterUsingPrefix(Object object, String prefix, MethodFinder methodFinder) throws NoSuchMethodException { - String getterName = prefix + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); - try { - Method method = methodFinder.apply(object.getClass(), getterName); - return method.invoke(object); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new GraphQLException(e); - } - } - - @SuppressWarnings("SimplifiableIfStatement") - private boolean isBooleanProperty(GraphQLOutputType outputType) { - if (outputType == GraphQLBoolean) return true; - if (outputType instanceof GraphQLNonNull) { - return ((GraphQLNonNull) outputType).getWrappedType() == GraphQLBoolean; - } - return false; - } - - private static final ConcurrentMap METHOD_CACHE = new ConcurrentHashMap<>(); - private static final ConcurrentMap FIELD_CACHE = new ConcurrentHashMap<>(); - /** - * PropertyDataFetcher caches the methods and fields that map from a class to a property for runtime performance reasons. - * - * However during development you might be using an assistance tool like JRebel to allow you to tweak your code base and this - * caching may interfere with this. So you can call this method to clear the cache. A JRebel plugin could - * be developed to do just that. - */ - @SuppressWarnings("unused") - public static void clearReflectionCache() { - METHOD_CACHE.clear(); - FIELD_CACHE.clear(); - } - private String mkKey(Class clazz, String propertyName) { - return clazz.getName() + "__" + propertyName; - } - // by not filling out the stack trace, we gain speed when using the exception as flow control - private static class FastNoSuchMethodException extends NoSuchMethodException { - public FastNoSuchMethodException(String methodName) { - super(methodName); - } - @Override - public synchronized Throwable fillInStackTrace() { - return this; - } - } - - /** - * Invoking public methods on package-protected classes via reflection - * causes exceptions. This method searches a class's hierarchy for - * public visibility parent classes with the desired getter. This - * particular case is required to support AutoValue style data classes, - * which have abstract public interfaces implemented by package-protected - * (generated) subclasses. - */ - private Method findPubliclyAccessibleMethod(Class root, String methodName) throws NoSuchMethodException { - Class currentClass = root; - while (currentClass != null) { - String key = mkKey(currentClass, propertyName); - Method method = METHOD_CACHE.get(key); - if (method != null) { - return method; - } - if (Modifier.isPublic(currentClass.getModifiers())) { - method = currentClass.getMethod(methodName); - if (Modifier.isPublic(method.getModifiers())) { - METHOD_CACHE.putIfAbsent(key, method); - return method; - } - } - currentClass = currentClass.getSuperclass(); - } - //noinspection unchecked - return root.getMethod(methodName); - } - - private Method findViaSetAccessible(Class aClass, String methodName) throws NoSuchMethodException { - String key = mkKey(aClass, propertyName); - Method method = METHOD_CACHE.get(key); - if (method != null) { - return method; - } - - Method[] declaredMethods = aClass.getDeclaredMethods(); - Optional m = Arrays.stream(declaredMethods) - .filter(mtd -> methodName.equals(mtd.getName())) - .findFirst(); - - if (m.isPresent()) { - try { - // few JVMs actually enforce this but it might happen - method = m.get(); - method.setAccessible(true); - METHOD_CACHE.putIfAbsent(key, method); - return method; - } catch (SecurityException ignored) { - } - } - throw new FastNoSuchMethodException(methodName); - } - - private Object getPropertyViaFieldAccess(Object object) { - Class aClass = object.getClass(); - String key = mkKey(aClass, propertyName); - try { - Field field = FIELD_CACHE.get(key); - if (field == null) { - field = aClass.getField(propertyName); - FIELD_CACHE.putIfAbsent(key, field); - } - return field.get(object); - } catch (NoSuchFieldException e) { - // if not public fields then try via setAccessible - try { - Field field = aClass.getDeclaredField(propertyName); - field.setAccessible(true); - FIELD_CACHE.putIfAbsent(key, field); - return field.get(object); - } catch (SecurityException | NoSuchFieldException ignored2) { - return null; - } catch (IllegalAccessException e1) { - throw new GraphQLException(e); - } - } catch (IllegalAccessException e) { - throw new GraphQLException(e); - } - } -} diff --git a/pom.xml b/pom.xml index c4319c0ca..26c0779af 100644 --- a/pom.xml +++ b/pom.xml @@ -1,210 +1,153 @@ - - 4.0.0 + + 4.0.0 - com.introproventures - graphql-jpa-query + com.introproventures + graphql-jpa-query - 0.3.8-SNAPSHOT + 0.3.8-SNAPSHOT - pom + pom - GraphQL JPA Query + GraphQL JPA Query - + GraphQL JPA Query library auto-generates GraphQL Schema using JPA's EntityManager and implements GraphQL Relay protocol to execute JPA queries with flexible type safe criteria expressions and user-friendly SQL query syntax semantics. - - 1.8 - 1.8 - - UTF-8 - UTF-8 - - 1.8 - 6.0 - - - - graphql-jpa-query-annotations - graphql-jpa-query-schema - graphql-jpa-query-boot-starter - graphql-jpa-query-example - - - - - sonatype-nexus-snapshots - Sonatype + + 1.8 + 1.8 + + UTF-8 + UTF-8 + + 1.8 + + + + graphql-jpa-query-annotations + graphql-jpa-query-schema + graphql-jpa-query-boot-starter + graphql-jpa-query-example + graphql-jpa-query-dependencies + graphql-jpa-query-build + + + + + sonatype-nexus-snapshots + Sonatype Nexus snapshot repository - https://oss.sonatype.org/content/repositories/snapshots - - - sonatype-nexus-staging - Sonatype + https://oss.sonatype.org/content/repositories/snapshots + + + sonatype-nexus-staging + Sonatype Nexus release repository - https://oss.sonatype.org/service/local/staging/deploy/maven2 - - - - - - - - io.spring.platform - platform-bom - Brussels-SR6 - pom - import - - - - com.introproventures - graphql-jpa-query-annotations - ${project.version} - - - - com.introproventures - graphql-jpa-query-schema - ${project.version} - - - - com.introproventures - graphql-jpa-query-boot-starter - ${project.version} - - - - com.graphql-java - graphql-java - ${graphql-java.version} - - - - - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.projectlombok - lombok - test - - - - com.h2database - h2 - test - - - - - - scm:git:https://github.com/introproventures/graphql-jpa-query.git - scm:git:git@github.com:introproventures/graphql-jpa-query.git - https://github.com/introproventures/graphql-jpa-query - HEAD - - - 2017 - https://github.com/introproventures/graphql-jpa-query - - - - Apache 2.0 - http://www.apache.org/licenses/LICENSE-2.0 - - - - - https://github.com/introproventures/graphql-jpa-query/issues - GitHub Issues - - - - - - igdianov - Igor Dianov - igor.dianov@introproventures.com - IntroPro Ventures Inc. - https://github.com/introproventures - https://github.com/igdianov - - - - - - - - info.plichta.maven.plugins - git-changelog-maven-plugin - 0.2.0 - - - maven-resources-plugin - 3.0.1 - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - - org.apache.maven.plugins - maven-dependency-plugin - 2.10 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - - org.apache.maven.plugins - maven-assembly-plugin - 2.3 - - - maven-release-plugin - 2.5.1 - - - - - - - - ${project.basedir} - - README* - NOTICE* - LICENSE* - - - - src/main/resources - - - - - - - maven-resources-plugin - - UTF-8 + https://oss.sonatype.org/service/local/staging/deploy/maven2 + + + + + + scm:git:https://github.com/introproventures/graphql-jpa-query.git + scm:git:git@github.com:introproventures/graphql-jpa-query.git + https://github.com/introproventures/graphql-jpa-query + HEAD + + + 2017 + https://github.com/introproventures/graphql-jpa-query + + + + Apache 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + https://github.com/introproventures/graphql-jpa-query/issues + GitHub Issues + + + + + + igdianov + Igor Dianov + igor.dianov@introproventures.com + IntroPro Ventures Inc. + https://github.com/introproventures + https://github.com/igdianov + + + + + + + + info.plichta.maven.plugins + git-changelog-maven-plugin + 0.2.0 + + + maven-resources-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + + org.apache.maven.plugins + maven-assembly-plugin + 2.3 + + + maven-release-plugin + 2.5.1 + + + + + + + + ${project.basedir} + + README* + NOTICE* + LICENSE* + + + + src/main/resources + + + + + + + maven-resources-plugin + + UTF-8 @@ -218,35 +161,35 @@ org.apache.maven.plugins maven-dependency-plugin - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - ${project.build.sourceEncoding} - - - - - org.apache.maven.plugins - maven-assembly-plugin - - assembly - - skip - - - - - - - maven-release-plugin - - @{version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + org.apache.maven.plugins + maven-assembly-plugin + + assembly + + skip + + + + + + + maven-release-plugin + + @{version} true releases forked-path @@ -255,184 +198,185 @@ - maven-surefire-plugin - 2.12 - - - **/*Test.java - **/*Tests.java - **/*Test_*.java - **/*Tests_*.java - - - ${slf4j.version} - ${log4j.version} - - - - - - maven-javadoc-plugin - 2.9.1 - - - attach-javadoc - verify - - jar - - - - - - - maven-jar-plugin - 2.4 - - - - true - true - - - - - - - maven-source-plugin - 2.1.2 - - - attach-sources - package - - jar-no-fork - - - - - - - maven-enforcer-plugin - 1.1.1 - - - enforce-java - deploy - - enforce - - - - - ${java.version} - - - - - - - - - org.jacoco - jacoco-maven-plugin - 0.7.9 - - - - pre-unit-test - - prepare-agent - - - - post-unit-test - test - - report - - - - - pre-integration-test - pre-integration-test - - prepare-agent-integration - - - - post-integration-test - post-integration-test - - report-integration - - - - - - - - - - - - releases - - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - - - default-deploy - deploy - - deploy - - - - true - - sonatype-nexus-staging - https://oss.sonatype.org/ - true - - - - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - + maven-surefire-plugin + 2.12 + + + **/*Test.java + **/*Tests.java + **/*Test_*.java + **/*Tests_*.java + + + ${slf4j.version} + ${log4j.version} + + + + + + maven-javadoc-plugin + 2.9.1 + + + attach-javadoc + verify + + jar + + + + + + + maven-jar-plugin + 2.4 + + + + true + true + + + + + + + maven-source-plugin + 2.1.2 + + + attach-sources + package + + jar-no-fork + + + + + + + maven-enforcer-plugin + 1.1.1 + + + enforce-java + deploy + + enforce + + + + + ${java.version} + + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.7.9 + + + + pre-unit-test + + prepare-agent + + + + post-unit-test + test + + report + + + + + pre-integration-test + pre-integration-test + + prepare-agent-integration + + + + post-integration-test + post-integration-test + + report-integration + + + + + + + + + + + + releases + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + + + default-deploy + deploy + + deploy + + + + true + + sonatype-nexus-staging + https://oss.sonatype.org/ + true + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.4 + + + sign-artifacts + verify + + sign + + + + + + + + +