package org.activityinfo.legacy.shared.reports.model.typeadapter;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import org.activityinfo.legacy.shared.command.DimensionType;
import org.activityinfo.legacy.shared.reports.content.EntityCategory;
import org.activityinfo.legacy.shared.reports.model.*;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* @author Alex Bertram
*/
public class DimensionAdapter extends XmlAdapter<DimensionAdapter.DimensionElement, Dimension> {
public static class CategoryElement {
@XmlAttribute(required = true)
private String name;
@XmlAttribute
private String label;
@XmlAttribute
private String color;
}
public static class DimensionElement {
@XmlAttribute
private String type;
@XmlAttribute
private Integer levelId;
@XmlAttribute
private String dateUnit;
@XmlAttribute
private Integer attributeGroupId;
@XmlElement(name = "category")
private List<CategoryElement> categories = new ArrayList<CategoryElement>(0);
}
private Dimension createDim(DimensionElement element) {
if ("admin".equals(element.type)) {
return new AdminDimension(element.levelId);
} else if ("date".equals(element.type)) {
return new DateDimension(findEnumValue(DateUnit.values(), element.dateUnit));
} else if ("attribute".equals(element.type)) {
return new AttributeGroupDimension(element.attributeGroupId);
} else {
return new Dimension(findEnumValue(DimensionType.values(), element.type));
}
}
private <T extends Enum<T>> T findEnumValue(T[] values, String text) {
for (T value : values) {
if (value.toString().equalsIgnoreCase(text)) {
return value;
}
}
throw new IllegalArgumentException("'" + text + "' is not a member of " + values[0].getClass().getName());
}
@Override
public Dimension unmarshal(DimensionElement element) {
Dimension dim = createDim(element);
for (CategoryElement category : element.categories) {
CategoryProperties props = new CategoryProperties();
props.setLabel(category.label);
if (category.color != null) {
props.setColor(decodeColor(category.color));
}
EntityCategory entityCategory = new EntityCategory(Integer.parseInt(category.name));
dim.getCategories().put(entityCategory, props);
dim.getOrdering().add(entityCategory);
}
return dim;
}
private int decodeColor(String color) {
if (color.startsWith("#")) {
return Integer.parseInt(color.substring(1), 16);
} else {
return Integer.parseInt(color, 16);
}
}
@Override
public DimensionElement marshal(Dimension dim) {
DimensionElement element = new DimensionElement();
element.type = dim.getType().toString();
if (dim instanceof AdminDimension) {
element.type = "admin";
element.levelId = ((AdminDimension) dim).getLevelId();
} else if (dim instanceof DateDimension) {
element.type = "date";
element.dateUnit = ((DateDimension) dim).getUnit().toString().toLowerCase();
} else if (dim instanceof AttributeGroupDimension) {
element.type = "attribute";
element.attributeGroupId = ((AttributeGroupDimension) dim).getAttributeGroupId();
}
return element;
}
}