ingo@1571: package de.intevation.flys.client.server;
ingo@1571:
ingo@1571: import javax.xml.xpath.XPathConstants;
ingo@1571:
ingo@1571: import org.w3c.dom.Element;
ingo@1571: import org.w3c.dom.NodeList;
ingo@1571:
ingo@1571: import org.apache.log4j.Logger;
ingo@1571:
ingo@1571: import de.intevation.artifacts.common.ArtifactNamespaceContext;
ingo@1571: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@1571:
ingo@1571: import de.intevation.flys.client.shared.model.Data;
ingo@1571: import de.intevation.flys.client.shared.model.DataItem;
ingo@1571: import de.intevation.flys.client.shared.model.DefaultData;
ingo@1571: import de.intevation.flys.client.shared.model.DefaultDataItem;
ingo@1575: import de.intevation.flys.client.shared.model.DoubleArrayData;
ingo@1575: import de.intevation.flys.client.shared.model.IntegerArrayData;
ingo@1575: import de.intevation.flys.client.shared.model.IntegerData;
ingo@1575: import de.intevation.flys.client.shared.model.IntegerOptionsData;
ingo@1575: import de.intevation.flys.client.shared.model.IntegerRangeData;
ingo@1575: import de.intevation.flys.client.shared.model.StringData;
ingo@1571:
ingo@1571:
ingo@1571: /**
ingo@1571: * @author Ingo Weinzierl
ingo@1571: */
ingo@1571: public class DataFactory {
ingo@1571:
ingo@1571: private static final Logger logger = Logger.getLogger(DataFactory.class);
ingo@1571:
ingo@1571: public static final String NS_URI = ArtifactNamespaceContext.NAMESPACE_URI;
ingo@1571:
ingo@1571:
ingo@1571: /**
ingo@1571: * Creates a new Data instance based on the art:type attribute of
ingo@1571: * element.
ingo@1571: *
ingo@1571: * @param element The Data element.
ingo@1571: *
ingo@1571: * @return a Data instance.
ingo@1571: */
ingo@1571: public static Data createDataFromElement(Element element) {
ingo@1571: String name = element.getAttributeNS(NS_URI, "name");
ingo@1571: String type = element.getAttributeNS(NS_URI, "type");
ingo@1571:
ingo@1575: try {
ingo@1575: logger.debug("Create Data instance for: " + name + " | " + type);
ingo@1571:
ingo@1575: if (type == null || type.length() == 0) {
ingo@1575: return createDefaultData(element, name);
ingo@1575: }
ingo@1575:
ingo@1575: type = type.toLowerCase();
ingo@1575:
ingo@1575: if (type.equals(StringData.TYPE)) {
ingo@1575: return createStringData(element, name);
ingo@1575: }
ingo@1575: else if (type.equals(IntegerData.TYPE)) {
ingo@1575: return createIntegerData(element, name);
ingo@1575: }
ingo@1575: else if (type.equals(IntegerOptionsData.TYPE)) {
ingo@1575: return createIntegerOptionsData(element, name);
ingo@1575: }
ingo@1575: else if (type.equals(IntegerRangeData.TYPE)) {
ingo@1575: return createIntegerRangeData(element, name);
ingo@1575: }
ingo@1575: else if (type.equals(IntegerArrayData.TYPE)) {
ingo@1575: return createIntegerArrayData(element, name);
ingo@1575: }
ingo@1575: else if (type.equals(DoubleArrayData.TYPE)) {
ingo@1575: return createDoubleArrayData(element, name);
ingo@1575: }
ingo@1575: else {
ingo@1575: return createDefaultData(element, name);
ingo@1575: }
ingo@1571: }
ingo@1575: catch (Exception e) {
ingo@1575: logger.error("Error while data creation for: " + name);
ingo@1571: }
ingo@1575:
ingo@1575: return null;
ingo@1571: }
ingo@1571:
ingo@1571:
ingo@1571: /**
ingo@1571: * This method creates a new instance of DefaultData which has no real type
ingo@1571: * set.
ingo@1571: *
ingo@1571: * @param ele The Data element.
ingo@1571: * @param name The name of the Data instance.
ingo@1571: *
ingo@1571: * @return an instance of DefaultData.
ingo@1571: */
ingo@1571: protected static Data createDefaultData(Element ele, String name) {
ingo@1571: logger.debug("Create new DefaultData");
ingo@1571: return new DefaultData(name, name, "default", extractDataItems(ele));
ingo@1571: }
ingo@1571:
ingo@1571:
ingo@1571: /**
ingo@1575: * This method creates a new instance of StringData which has a type
ingo@1575: * "string" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of StringData.
ingo@1575: */
ingo@1575: protected static Data createStringData(Element ele, String name) {
ingo@1575: return new StringData(name, name, extractDataItems(ele));
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1575: * This method creates a new instance of DefaultData which has a type
ingo@1575: * "integer" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of IntegerData.
ingo@1575: */
ingo@1575: protected static Data createIntegerData(Element ele, String name) {
ingo@1575: return new IntegerData(name, name, extractDataItems(ele));
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1575: * This method creates a new instance of DefaultData which has a type
ingo@1575: * "intoptions" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of IntegerOptionsData.
ingo@1575: */
ingo@1575: protected static Data createIntegerOptionsData(Element ele, String name) {
ingo@1575: return new IntegerOptionsData(name, name, extractDataItems(ele));
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1575: * This method creates a new instance of DefaultData which has a type
ingo@1575: * "intrange" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of IntegerRangeData.
ingo@1575: */
ingo@1575: protected static Data createIntegerRangeData(Element ele, String name) {
ingo@1575: DataItem[] items = extractDataItems(ele);
ingo@1575: String rawValue = items[0].getStringValue();
ingo@1575:
ingo@1575: String[] minmax = rawValue.split(";");
ingo@1575:
ingo@1575: return new IntegerRangeData(
ingo@1575: name,
ingo@1575: name,
ingo@1575: Integer.valueOf(minmax[0]),
ingo@1575: Integer.valueOf(minmax[1]));
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1575: * This method creates a new instance of DefaultData which has a type
ingo@1575: * "integerarray" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of IntegerArrayData.
ingo@1575: */
ingo@1575: protected static Data createIntegerArrayData(Element ele, String name) {
ingo@1575: DataItem[] items = extractDataItems(ele);
ingo@1575: String rawValue = items[0].getStringValue();
ingo@1575:
ingo@1575: String[] values = rawValue.split(";");
ingo@1575: int[] integers = new int[values.length];
ingo@1575:
ingo@1575: for (int i = 0; i < values.length; i++) {
ingo@1575: try {
ingo@1575: integers[i] = Integer.valueOf(values[i]);
ingo@1575: }
ingo@1575: catch (NumberFormatException nfe) {
ingo@1575: logger.warn("Error while parsing IntegerArrayData: " + nfe);
ingo@1575: }
ingo@1575: }
ingo@1575:
ingo@1595: return new IntegerArrayData(name, items[0].getLabel(), integers);
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1575: * This method creates a new instance of DefaultData which has a type
ingo@1575: * "doublearray" set.
ingo@1575: *
ingo@1575: * @param ele The Data element.
ingo@1575: * @param name The name of the Data instance.
ingo@1575: *
ingo@1575: * @return an instance of DoubleArrayData.
ingo@1575: */
ingo@1575: protected static Data createDoubleArrayData(Element ele, String name) {
ingo@1595: DataItem[] items = extractDataItems(ele);
ingo@1595: String rawValue = items[0].getStringValue();
ingo@1595:
ingo@1595: String[] values = rawValue.split(";");
ingo@1595: double[] doubles = new double[values.length];
ingo@1595:
ingo@1595: for (int i = 0; i < values.length; i++) {
ingo@1595: try {
ingo@1595: doubles[i] = Double.valueOf(values[i]);
ingo@1595: }
ingo@1595: catch (NumberFormatException nfe) {
ingo@1595: logger.warn("Error while parsing DoubleArrayData: " + nfe);
ingo@1595: }
ingo@1595: }
ingo@1595:
ingo@1595: return new DoubleArrayData(name, items[0].getLabel(), doubles);
ingo@1575: }
ingo@1575:
ingo@1575:
ingo@1575: /**
ingo@1571: * This method extracts the art:item elements placed under elements.
ingo@1571: *
ingo@1571: * @param element A data node that contains items.
ingo@1571: *
ingo@1571: * @return a list of DataItems.
ingo@1571: */
ingo@1571: protected static DataItem[] extractDataItems(Element element) {
ingo@1571: NodeList itemList = (NodeList) XMLUtils.xpath(
ingo@1571: element,
ingo@1571: "art:item",
ingo@1571: XPathConstants.NODESET,
ingo@1571: ArtifactNamespaceContext.INSTANCE);
ingo@1571:
ingo@1571: if (itemList == null || itemList.getLength() == 0) {
ingo@1571: logger.debug("No old data items found.");
ingo@1571: return null;
ingo@1571: }
ingo@1571:
ingo@1571: int count = itemList.getLength();
ingo@1571:
ingo@1571: DataItem[] items = new DataItem[count];
ingo@1571:
ingo@1571: for (int i = 0; i < count; i++) {
ingo@1571: Element tmp = (Element) itemList.item(i);
ingo@1571:
ingo@1571: String value = tmp.getAttributeNS(NS_URI, "value");
ingo@1571: String label = tmp.getAttributeNS(NS_URI, "label");
ingo@1571:
ingo@1571: items[i] = new DefaultDataItem(label, label, value);
ingo@1571: }
ingo@1571:
ingo@1571: return items;
ingo@1571: }
ingo@1571: }
ingo@1571: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :