BUG-1485: Introduce AbstractRangeGenerator and friends
[yangtools.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / AbstractBigRangeGenerator.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.sal.java.api.generator;
9
10 import java.util.Collection;
11 import javax.annotation.Nonnull;
12 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
13
14 abstract class AbstractBigRangeGenerator<T extends Number & Comparable<T>> extends AbstractRangeGenerator<T> {
15     protected AbstractBigRangeGenerator(final Class<T> typeClass) {
16         super(typeClass);
17     }
18
19     private String itemType() {
20         final StringBuilder sb = new StringBuilder("com.google.common.collect.Range<");
21         sb.append(getTypeName()).append('>');
22
23         return sb.toString();
24     }
25
26     private String arrayType() {
27         return new StringBuilder(itemType()).append("[]").toString();
28     }
29
30     @Override
31     protected final String generateRangeCheckerImplementation(final String checkerName, @Nonnull final Collection<RangeConstraint> restrictions) {
32         final StringBuilder sb = new StringBuilder();
33
34         // Field to hold the Range objects in an array
35         sb.append("private static final ").append(arrayType()).append(' ').append(checkerName).append(";\n");
36
37         // Static initializer block for the array
38         sb.append("static {\n");
39         sb.append("    @SuppressWarnings(\"unchecked\")\n");
40         sb.append("    final ").append(arrayType()).append(" a = (").append(arrayType())
41         .append(") java.lang.reflect.Array.newInstance(com.google.common.collect.Range.class, ").append(restrictions.size()).append(");\n");
42
43         int i = 0;
44         for (RangeConstraint r : restrictions) {
45             final String min = format(getValue(r.getMin()));
46             final String max = format(getValue(r.getMax()));
47
48             sb.append("    a[").append(i++).append("] = com.google.common.collect.Range.closed(").append(min).append(", ").append(max).append(");\n");
49         }
50
51         sb.append("    ").append(checkerName).append(" = a;\n");
52         sb.append("}\n\n");
53
54         // Static enforcement method
55         sb.append("private static void ").append(checkerName).append("(final ").append(getTypeName()).append(" value) {\n");
56         sb.append("    for (").append(itemType()).append(" r : ").append(checkerName).append(") {\n");
57         sb.append("        if (r.contains(value)) {\n");
58         sb.append("            return;\n");
59         sb.append("        }\n");
60         sb.append("    }\n");
61         sb.append("\n");
62         sb.append("    throw new IllegalArgumentException(String.format(\"Invalid value %s, expected: %s.\", value, java.util.Arrays.asList(").append(checkerName).append(")));\n");
63         sb.append("}\n\n");
64
65         return sb.toString();
66     }
67 }