1*ac2a7c1bSSadaf Ebrahimi /** 2*ac2a7c1bSSadaf Ebrahimi * Copyright (c) 2008, SnakeYAML 3*ac2a7c1bSSadaf Ebrahimi * 4*ac2a7c1bSSadaf Ebrahimi * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5*ac2a7c1bSSadaf Ebrahimi * in compliance with the License. You may obtain a copy of the License at 6*ac2a7c1bSSadaf Ebrahimi * 7*ac2a7c1bSSadaf Ebrahimi * http://www.apache.org/licenses/LICENSE-2.0 8*ac2a7c1bSSadaf Ebrahimi * 9*ac2a7c1bSSadaf Ebrahimi * Unless required by applicable law or agreed to in writing, software distributed under the License 10*ac2a7c1bSSadaf Ebrahimi * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11*ac2a7c1bSSadaf Ebrahimi * or implied. See the License for the specific language governing permissions and limitations under 12*ac2a7c1bSSadaf Ebrahimi * the License. 13*ac2a7c1bSSadaf Ebrahimi */ 14*ac2a7c1bSSadaf Ebrahimi package examples; 15*ac2a7c1bSSadaf Ebrahimi 16*ac2a7c1bSSadaf Ebrahimi import java.math.BigDecimal; 17*ac2a7c1bSSadaf Ebrahimi import java.util.regex.Pattern; 18*ac2a7c1bSSadaf Ebrahimi import junit.framework.TestCase; 19*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.Yaml; 20*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.constructor.Constructor; 21*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.Node; 22*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.NodeId; 23*ac2a7c1bSSadaf Ebrahimi import org.yaml.snakeyaml.nodes.ScalarNode; 24*ac2a7c1bSSadaf Ebrahimi 25*ac2a7c1bSSadaf Ebrahimi /** 26*ac2a7c1bSSadaf Ebrahimi * http://code.google.com/p/snakeyaml/issues/detail?id=75 27*ac2a7c1bSSadaf Ebrahimi */ 28*ac2a7c1bSSadaf Ebrahimi public class CustomBeanResolverTest extends TestCase { 29*ac2a7c1bSSadaf Ebrahimi 30*ac2a7c1bSSadaf Ebrahimi private final Pattern CUSTOM_PATTERN = Pattern.compile("\\d+%"); 31*ac2a7c1bSSadaf Ebrahimi testOnlyBigDecimal()32*ac2a7c1bSSadaf Ebrahimi public void testOnlyBigDecimal() { 33*ac2a7c1bSSadaf Ebrahimi Yaml yaml = new Yaml(new BigBeanConstructor()); 34*ac2a7c1bSSadaf Ebrahimi Foo foo = yaml.load("bar: 50\nbaz: 35%\nbas: 1250"); 35*ac2a7c1bSSadaf Ebrahimi assertEquals(50.0, foo.bar); 36*ac2a7c1bSSadaf Ebrahimi assertEquals("0.35", foo.baz.toString()); 37*ac2a7c1bSSadaf Ebrahimi assertEquals("1250", foo.bas); 38*ac2a7c1bSSadaf Ebrahimi } 39*ac2a7c1bSSadaf Ebrahimi testPrimitive()40*ac2a7c1bSSadaf Ebrahimi public void testPrimitive() { 41*ac2a7c1bSSadaf Ebrahimi Yaml yaml = new Yaml(new BigBeanConstructor()); 42*ac2a7c1bSSadaf Ebrahimi Foo foo = yaml.load("bar: 50%\nbaz: 35%\nbas: 1250%\nbaw: 35"); 43*ac2a7c1bSSadaf Ebrahimi assertEquals(0.5, foo.bar); 44*ac2a7c1bSSadaf Ebrahimi assertEquals("0.35", foo.baz.toString()); 45*ac2a7c1bSSadaf Ebrahimi assertEquals("1250%", foo.bas); 46*ac2a7c1bSSadaf Ebrahimi assertEquals("35", foo.baw.toString()); 47*ac2a7c1bSSadaf Ebrahimi } 48*ac2a7c1bSSadaf Ebrahimi 49*ac2a7c1bSSadaf Ebrahimi class BigBeanConstructor extends Constructor { 50*ac2a7c1bSSadaf Ebrahimi BigBeanConstructor()51*ac2a7c1bSSadaf Ebrahimi public BigBeanConstructor() { 52*ac2a7c1bSSadaf Ebrahimi super(Foo.class); 53*ac2a7c1bSSadaf Ebrahimi yamlClassConstructors.put(NodeId.scalar, new ConstructBig()); 54*ac2a7c1bSSadaf Ebrahimi } 55*ac2a7c1bSSadaf Ebrahimi 56*ac2a7c1bSSadaf Ebrahimi private class ConstructBig extends ConstructScalar { 57*ac2a7c1bSSadaf Ebrahimi construct(Node node)58*ac2a7c1bSSadaf Ebrahimi public Object construct(Node node) { 59*ac2a7c1bSSadaf Ebrahimi if (node.getType().equals(BigDecimal.class)) { 60*ac2a7c1bSSadaf Ebrahimi String val = constructScalar((ScalarNode) node); 61*ac2a7c1bSSadaf Ebrahimi if (CUSTOM_PATTERN.matcher(val).matches()) { 62*ac2a7c1bSSadaf Ebrahimi return new BigDecimal(val.substring(0, val.length() - 1)).divide(new BigDecimal(100)); 63*ac2a7c1bSSadaf Ebrahimi } 64*ac2a7c1bSSadaf Ebrahimi } else if (node.getType().isAssignableFrom(double.class)) { 65*ac2a7c1bSSadaf Ebrahimi String val = constructScalar((ScalarNode) node); 66*ac2a7c1bSSadaf Ebrahimi if (CUSTOM_PATTERN.matcher(val).matches()) { 67*ac2a7c1bSSadaf Ebrahimi return Double.valueOf(val.substring(0, val.length() - 1)) / 100; 68*ac2a7c1bSSadaf Ebrahimi } 69*ac2a7c1bSSadaf Ebrahimi } 70*ac2a7c1bSSadaf Ebrahimi return super.construct(node); 71*ac2a7c1bSSadaf Ebrahimi } 72*ac2a7c1bSSadaf Ebrahimi } 73*ac2a7c1bSSadaf Ebrahimi } 74*ac2a7c1bSSadaf Ebrahimi 75*ac2a7c1bSSadaf Ebrahimi public static class Foo { 76*ac2a7c1bSSadaf Ebrahimi 77*ac2a7c1bSSadaf Ebrahimi public double bar = 0; 78*ac2a7c1bSSadaf Ebrahimi public BigDecimal baz; 79*ac2a7c1bSSadaf Ebrahimi public BigDecimal baw; 80*ac2a7c1bSSadaf Ebrahimi public String bas; 81*ac2a7c1bSSadaf Ebrahimi } 82*ac2a7c1bSSadaf Ebrahimi } 83