Dan Haywood created ISIS-1512:
---------------------------------

             Summary: MetaModelValidator should detect domain objects that have 
collections, and fail-fast.
                 Key: ISIS-1512
                 URL: https://issues.apache.org/jira/browse/ISIS-1512
             Project: Isis
          Issue Type: Improvement
          Components: Core
    Affects Versions: 1.13.0
            Reporter: Dan Haywood
            Assignee: Dan Haywood
            Priority: Minor
             Fix For: 1.13.1


this issue arose because attempting to download the metamodel.csv threw an 
exception when it encountered an invalid class (specifically, 
EstatioFakeDataService):

{code}
@DomainService(nature = NatureOfService.DOMAIN)
public class EstatioFakeDataService {

    static Random random;
    static {
        random = new Random(System.currentTimeMillis());
    }

    Faker2 faker2;
    @PostConstruct
    public void init() {
        faker2 = new Faker2(random);
    }

    @Inject
    private ClockService clockService;

    @Inject
    private DomainObjectContainer container;

    private RandomService randomService;

    private final Values values;
    private final Collections collections;
    private final Dates dates;
    private final Periods periods;

    public EstatioFakeDataService() {

        randomService = new RandomService(random);

        this.values = new Values();
        this.collections = new Collections();
        this.dates = new Dates();
        this.periods = new Periods();

    }

    @Programmatic
    public PhoneNumber phoneNumber() {
        return faker2.phoneNumber();
    }

    @Programmatic
    public Options options() {
        return faker2.options();
    }

    @Programmatic
    public Internet internet() {
        return faker2.internet();
    }

    @Programmatic
    public Code code() {
        return faker2.code();
    }

    @Programmatic
    public Business business() {
        return faker2.business();
    }

    @Programmatic
    public Address address() {
        return faker2.address();
    }

    @Programmatic
    public Name name() {
        return faker2.name();
    }

    @Programmatic
    public Lorem lorem() {
        return faker2.lorem();
    }

    public Values values() {
        return values;
    }

    public Collections collections() {
        return collections;
    }

    public Dates dates() {
        return dates;
    }

    public Periods periods() {
        return periods;
    }

    public class Values {

        public String code(final int numChars) {
            final StringBuilder buf = new StringBuilder();
            final char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
            for (int i = 0; i < numChars; i++) {
                char c = collections().anElement(chars);
                buf.append(c);
            }
            return buf.toString();
        }

        public int anInt(final int upTo) {
            return randomService.nextInt(upTo);
        }

        public int anInt(final int min, final int max) {
            return min + randomService.nextInt(max-min);
        }

        public int aDouble(final int upTo) {
            return randomService.nextInt(upTo);
        }

        public boolean aCoinFlip() {
            return randomService.nextDouble() < 0.5;
        }

        public boolean aDiceRollOf6() {
            return anInt(6) == 5;
        }

    }

    public class Collections  {

        public <E extends Enum<E>> E anEnum(final Class<E> enumType) {
            final E[] enumConstants = enumType.getEnumConstants();
            return enumConstants[values().anInt(enumConstants.length)];
        }

        public <T> T aBounded(final Class<T> cls) {
            final List<T> list = container.allInstances(cls);
            return anElement(list);
        }

        public <T> T anElement(final List<T> list) {
            final int randomIdx = values().anInt(list.size());
            return list.get(randomIdx);
        }

        public char anElement(final char[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public byte anElement(final byte[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public short anElement(final short[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public int anElement(final int[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public long anElement(final long[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public float anElement(final float[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public double anElement(final double[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public boolean anElement(final boolean[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }

        public <T> T anElement(final T[] elements) {
            final int randomIdx = values().anInt(elements.length);
            return elements[randomIdx];
        }
    }


    public class Dates {

        public LocalDate around(final Period period) {
            final LocalDate now = clockService.now();
            return values().aCoinFlip() ? before(period): after(period);
        }

        public LocalDate before(final Period period) {
            final LocalDate now = clockService.now();
            return now.minus(period);
        }

        public LocalDate after(final Period period) {
            final LocalDate now = clockService.now();
            return now.plus(period);
        }

    }

    public class Periods {

        public Period days(final int minDays, final int maxDays) {
            return Period.days(values().anInt(minDays, maxDays));
        }

        public Period daysUpTo(final int maxDays) {
            return days(0, maxDays);
        }

        public Period months(final int minMonths, final int maxMonths) {
            return Period.months(values().anInt(minMonths, maxMonths));
        }

        public Period monthsUpTo(final int months) {
            return months(0, months);
        }

        public Period years(final int minYears, final int maxYears) {
            return Period.years(values().anInt(minYears, maxYears));
        }

        public Period yearsUpTo(final int years) {
            return years(0, years);
        }

    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to