├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── src
├── main
│ └── java
│ │ └── com
│ │ └── github
│ │ └── leeonky
│ │ └── jfactory
│ │ ├── Persistable.java
│ │ ├── Arguments.java
│ │ ├── InvalidSpecException.java
│ │ ├── DataRepository.java
│ │ ├── ArgumentMapFactory.java
│ │ ├── Global.java
│ │ ├── Trait.java
│ │ ├── PropertyAliases.java
│ │ ├── ArgumentMap.java
│ │ ├── ListPersistable.java
│ │ ├── DefaultValueFactoryProducer.java
│ │ ├── Transformer.java
│ │ ├── TypeSequence.java
│ │ ├── PropertyValue.java
│ │ ├── PropertyAlias.java
│ │ ├── UnFixedValueProducer.java
│ │ ├── Factory.java
│ │ ├── TypeReference.java
│ │ ├── Instance.java
│ │ ├── DefaultValueFactory.java
│ │ ├── MemoryDataRepository.java
│ │ ├── ValueCache.java
│ │ ├── FixedValueProducer.java
│ │ ├── LinkSpecCollection.java
│ │ ├── SpecFactory.java
│ │ ├── SubInstance.java
│ │ ├── DefaultValueProducer.java
│ │ ├── DependencyProducer.java
│ │ ├── ReadOnlyProducer.java
│ │ ├── CollectionInstance.java
│ │ ├── SingleValueExpression.java
│ │ ├── Dependency.java
│ │ ├── Builder.java
│ │ ├── LinkProducer.java
│ │ ├── Expression.java
│ │ ├── TraitsSpec.java
│ │ ├── LinkSpec.java
│ │ ├── DefaultArguments.java
│ │ ├── BuilderValueProducer.java
│ │ ├── CompositeRepository.java
│ │ ├── SubObjectExpression.java
│ │ ├── RootInstance.java
│ │ ├── AliasSetStore.java
│ │ ├── Link.java
│ │ ├── Producer.java
│ │ ├── SpecClassFactory.java
│ │ ├── CollectionExpression.java
│ │ ├── Spec.java
│ │ ├── PropertyChain.java
│ │ ├── KeyValueCollection.java
│ │ ├── CollectionProducer.java
│ │ ├── FactorySet.java
│ │ ├── KeyValue.java
│ │ ├── JFactory.java
│ │ ├── ObjectFactory.java
│ │ ├── PropertySpec.java
│ │ ├── DefaultBuilder.java
│ │ ├── ObjectProducer.java
│ │ └── DefaultValueFactories.java
└── test
│ ├── resources
│ └── features
│ │ ├── test_case_design
│ │ ├── 100-temporarily-ignored.feature
│ │ └── 2-reverse-association.feature
│ │ └── bug
│ │ ├── dependency.feature
│ │ └── link.feature
│ └── java
│ └── com
│ └── github
│ └── leeonky
│ └── jfactory
│ ├── cucumber
│ ├── Run.java
│ ├── Steps.java
│ └── IntegrationTestContext.java
│ ├── ExpressionTest.java
│ ├── PropertySpecTest.java
│ ├── JFactoryTest.java
│ ├── bug
│ ├── UseSubObjectSpec.java
│ └── PropertyShouldOverridePropertyInSpec.java
│ ├── CompositeRepositoryTest.java
│ ├── DefaultBuilderTest.java
│ ├── PropertyChainTest.java
│ ├── DefaultValueFactoriesTest.java
│ └── ProducerTest.java
├── pi-report.sh
├── .gitignore
├── .circleci
└── config.yml
├── gradlew.bat
├── gradlew
├── README.md
└── LICENSE
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leeonky/jfactory/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/Persistable.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | public interface Persistable {
4 | void save(Object object);
5 | }
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/Arguments.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | public interface Arguments {
4 |
P param(String key);
5 |
6 |
P param(String key, P defaultValue);
7 |
8 | Arguments params(String property);
9 | }
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/InvalidSpecException.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | public class InvalidSpecException extends RuntimeException {
4 | public InvalidSpecException(String message) {
5 | super(message);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/test/resources/features/test_case_design/100-temporarily-ignored.feature:
--------------------------------------------------------------------------------
1 | Feature: Temporarily ignored for test case design
2 |
3 | Scenario: customize constructor - create bean use customer constructor
4 |
5 | Scenario: customized - define default value strategy by type
6 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/DataRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.util.Collection;
4 |
5 | public interface DataRepository extends Persistable {
6 | Collection queryAll(Class type);
7 |
8 | void clear();
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/ArgumentMapFactory.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | public class ArgumentMapFactory {
4 | public static ArgumentMap arg(String key, Object value) {
5 | ArgumentMap argumentMap = new ArgumentMap();
6 | argumentMap.put(key, value);
7 | return argumentMap;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/Global.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.Target;
5 |
6 | import static java.lang.annotation.ElementType.TYPE;
7 | import static java.lang.annotation.RetentionPolicy.RUNTIME;
8 |
9 | @Target(TYPE)
10 | @Retention(RUNTIME)
11 | public @interface Global {
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/Trait.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Target(ElementType.METHOD)
9 | @Retention(RetentionPolicy.RUNTIME)
10 | public @interface Trait {
11 | String value() default "";
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/PropertyAliases.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.Target;
5 |
6 | import static java.lang.annotation.ElementType.TYPE;
7 | import static java.lang.annotation.RetentionPolicy.RUNTIME;
8 |
9 | @Target(TYPE)
10 | @Retention(RUNTIME)
11 | public @interface PropertyAliases {
12 | PropertyAlias[] value();
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/ArgumentMap.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.util.LinkedHashMap;
4 |
5 | public class ArgumentMap extends LinkedHashMap {
6 | public ArgumentMap arg(String key, Object value) {
7 | ArgumentMap argumentMap = new ArgumentMap();
8 | argumentMap.putAll(this);
9 | argumentMap.put(key, value);
10 | return argumentMap;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/leeonky/jfactory/ListPersistable.java:
--------------------------------------------------------------------------------
1 | package com.github.leeonky.jfactory;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | class ListPersistable implements Persistable {
7 | private List