blob: d3eddf2bf8d91091e885684469cee18cfdee6d3e [file] [log] [blame]
/**
* Copyright (c) 2008-2011, http://www.snakeyaml.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.yaml.snakeyaml.issues.issue29;
import java.beans.IntrospectionException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import junit.framework.TestCase;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.introspector.BeanAccess;
import org.yaml.snakeyaml.introspector.Property;
import org.yaml.snakeyaml.nodes.NodeTuple;
import org.yaml.snakeyaml.nodes.ScalarNode;
import org.yaml.snakeyaml.nodes.SequenceNode;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;
public class FlexibleScalarStylesInJavaBeanTest extends TestCase {
public void testDifferentStyles() {
BigJavaBean bean1 = new BigJavaBean(1, "simple", "line 1\nline2\nzipcode", "short text1");
List<Integer> numbers1 = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
bean1.setNumbers(numbers1);
Map<String, String> data1 = new HashMap<String, String>();
data1.put("key1", "value1");
data1.put("key2", "value2");
bean1.setData(data1);
//
BigJavaBean bean2 = new BigJavaBean(1, "second", "line 111\nline 222\nzipcode 12345\n\n",
"info: semicolon is used");
List<Integer> numbers2 = new ArrayList<Integer>(Arrays.asList(4, 5, 6, 777, 888, 999, 1000));
bean2.setNumbers(numbers2);
Map<String, String> data2 = new HashMap<String, String>();
data2.put("key21", "value12");
data2.put("key22", "value with\ntwo lines");
bean2.setData(data2);
//
List<BigJavaBean> list = new ArrayList<BigJavaBean>();
list.add(bean1);
list.add(bean2);
Yaml yaml = new Yaml(new MyRepresenter());
yaml.setBeanAccess(BeanAccess.FIELD);
String output = yaml.dump(list);
// System.out.println(output);
// parse back
@SuppressWarnings("unchecked")
List<BigJavaBean> parsed = (List<BigJavaBean>) yaml.load(output);
assertEquals(2, parsed.size());
assertEquals(bean1, parsed.get(0));
assertEquals(bean2, parsed.get(1));
}
private class MyRepresenter extends Representer {
/*
* Change the default order. Important data goes first.
*/
@Override
protected Set<Property> getProperties(Class<? extends Object> type)
throws IntrospectionException {
if (type.isAssignableFrom(BigJavaBean.class)) {
Set<Property> standard = super.getProperties(type);
Set<Property> sorted = new TreeSet<Property>(new PropertyComparator());
sorted.addAll(standard);
return sorted;
} else {
return super.getProperties(type);
}
}
private class PropertyComparator implements Comparator<Property> {
public int compare(Property o1, Property o2) {
// important go first
List<String> order = new ArrayList<String>(Arrays.asList("id", "name",
"description", "address"));
for (String name : order) {
int c = compareByName(o1, o2, name);
if (c != 0) {
return c;
}
}
// all the rest
return o1.compareTo(o2);
}
private int compareByName(Property o1, Property o2, String name) {
if (o1.getName().equals(name)) {
return -1;
} else if (o2.getName().equals(name)) {
return 1;
}
return 0;// compare further
}
}
@Override
protected NodeTuple representJavaBeanProperty(Object javaBean, Property property,
Object propertyValue, Tag customTag) {
if (javaBean instanceof BigJavaBean) {
BigJavaBean bean = (BigJavaBean) javaBean;
NodeTuple standard = super.representJavaBeanProperty(javaBean, property,
propertyValue, customTag);
if (property.getName().equals("numbers")) {
// when the list is small, make it block collection style
if (bean.getNumbers().size() < 5) {
SequenceNode n = (SequenceNode) standard.getValueNode();
return new NodeTuple(standard.getKeyNode(), new SequenceNode(n.getTag(),
true, n.getValue(), n.getStartMark(), n.getEndMark(), false));
}
}
if (property.getName().equals("description")) {
// if description contains ':' use folded scalar style and
// not single quoted scalar style
if (bean.getDescription().indexOf(':') > 0) {
ScalarNode n = (ScalarNode) standard.getValueNode();
return new NodeTuple(standard.getKeyNode(), new ScalarNode(n.getTag(),
n.getValue(), n.getStartMark(), n.getEndMark(), '>'));
}
}
return standard;
} else {
return super
.representJavaBeanProperty(javaBean, property, propertyValue, customTag);
}
}
}
}