sascha@2561: package de.intevation.flys.artifacts.services; sascha@2561: sascha@2561: import de.intevation.artifacts.CallMeta; sascha@2561: import de.intevation.artifacts.GlobalContext; sascha@2561: sascha@2561: import de.intevation.artifacts.common.utils.XMLUtils; sascha@2561: sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.Fixing.Filter; sascha@2564: sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.AndFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.DateFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.DateRangeFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.IdFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.NotFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.OrFilter; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.Range; sascha@2564: import de.intevation.flys.artifacts.model.FixingsOverview.SectorRangeFilter; sascha@2564: sascha@2561: import de.intevation.flys.artifacts.model.FixingsOverview; sascha@2561: import de.intevation.flys.artifacts.model.FixingsOverviewFactory; sascha@2561: sascha@2564: import java.text.ParsePosition; sascha@2564: import java.text.SimpleDateFormat; sascha@2564: sascha@2564: import java.util.ArrayList; sascha@2564: import java.util.Date; sascha@2564: import java.util.List; sascha@2564: sascha@2561: import org.apache.log4j.Logger; sascha@2561: sascha@2561: import org.w3c.dom.Document; sascha@2561: import org.w3c.dom.Element; sascha@2564: import org.w3c.dom.Node; sascha@2561: import org.w3c.dom.NodeList; sascha@2561: sascha@2561: public class FixingsOverviewService sascha@2561: extends FLYSService sascha@2561: { sascha@2561: private static Logger log = sascha@2561: Logger.getLogger(FixingsOverviewService.class); sascha@2561: sascha@2561: public FixingsOverviewService() { sascha@2561: } sascha@2561: sascha@2561: @Override sascha@2561: public Document doProcess( sascha@2561: Document data, sascha@2561: GlobalContext globalContext, sascha@2561: CallMeta callMeta sascha@2561: ) { sascha@2561: log.debug("FixingsOverviewService.doProcess"); sascha@2561: sascha@2561: Document document = XMLUtils.newDocument(); sascha@2561: sascha@2561: NodeList nodes = data.getElementsByTagName("river"); sascha@2561: sascha@2561: String river = nodes.getLength() > 0 sascha@2561: ? ((Element)nodes.item(0)).getAttribute("name") sascha@2561: : ""; sascha@2561: sascha@2561: FixingsOverview overview = FixingsOverviewFactory.getOverview(river); sascha@2561: sascha@2561: if (overview != null) { sascha@2564: Range range = getRange(data); sascha@2564: Filter filter = getFilter(data); sascha@2564: overview.generateOverview(document, range, filter); sascha@2561: } sascha@2561: else { sascha@2561: log.warn("No overview for river '" + river + "' available."); sascha@2561: } sascha@2561: sascha@2561: return document; sascha@2561: } sascha@2564: sascha@2564: public static Range getRange(Document data) { sascha@2564: sascha@2564: NodeList ranges = data.getElementsByTagName("range"); sascha@2564: sascha@2564: if (ranges.getLength() < 1) { sascha@2564: return FixingsOverview.FULL_EXTENT; sascha@2564: } sascha@2564: sascha@2564: Element range = (Element)ranges.item(0); sascha@2564: sascha@2564: String from = range.getAttribute("from").trim(); sascha@2564: String to = range.getAttribute("to" ).trim(); sascha@2564: sascha@2564: double start = -Double.MAX_VALUE; sascha@2564: double end = Double.MAX_VALUE; sascha@2564: sascha@2564: if (from.length() > 0) { sascha@2564: try { sascha@2564: start = Double.parseDouble(from); sascha@2564: } sascha@2564: catch (NumberFormatException nfe) { sascha@2564: log.warn("Invalid from value: " + from); sascha@2564: } sascha@2564: } sascha@2564: sascha@2564: if (to.length() > 0) { sascha@2564: try { sascha@2564: end = Double.parseDouble(to); sascha@2564: } sascha@2564: catch (NumberFormatException nfe) { sascha@2564: log.warn("Invalid to value: " + to); sascha@2564: } sascha@2564: } sascha@2564: sascha@2564: if (start > end) { sascha@2564: double t = start; sascha@2564: start = end; sascha@2564: end = t; sascha@2564: } sascha@2564: sascha@2564: return new Range(start, end); sascha@2564: } sascha@2564: sascha@2564: public static Filter getFilter(Document data) { sascha@2564: sascha@2564: NodeList filters = data.getElementsByTagName("filter"); sascha@2564: sascha@2564: return filters.getLength() < 1 sascha@2564: ? FixingsOverview.ACCEPT sascha@2564: : buildFilter((Element)filters.item(0)); sascha@2564: } sascha@2564: sascha@2564: public static Filter buildFilter(Element root) { sascha@2564: List filters = buildRecursiveFilter(root); sascha@2564: switch (filters.size()) { sascha@2564: case 0: return FixingsOverview.ACCEPT; sascha@2564: case 1: return filters.get(0); sascha@2564: default: return new AndFilter(filters); sascha@2564: } sascha@2564: } sascha@2564: sascha@2564: private static final Date parseDate(String text) { sascha@2564: SimpleDateFormat format = sascha@2564: new SimpleDateFormat(FixingsOverview.DATE_FORMAT); sascha@2564: return format.parse(text, new ParsePosition(0)); sascha@2564: } sascha@2564: sascha@2564: public static List buildRecursiveFilter(Element root) { sascha@2564: List filters = new ArrayList(); sascha@2564: sascha@2564: NodeList children = root.getChildNodes(); sascha@2564: sascha@2564: for (int i = 0, N = children.getLength(); i < N; ++i) { sascha@2564: Node child = children.item(i); sascha@2564: if (child.getNodeType() != Node.ELEMENT_NODE) { sascha@2564: continue; sascha@2564: } sascha@2564: sascha@2564: Element element = (Element)child; sascha@2564: String name = element.getLocalName(); sascha@2564: sascha@2564: if ("and".equals(name)) { sascha@2564: filters.add(new AndFilter(buildRecursiveFilter(element))); sascha@2564: } sascha@2564: else if ("or".equals(name)) { sascha@2564: filters.add(new OrFilter(buildRecursiveFilter(element))); sascha@2564: } sascha@2564: else if ("not".equals(name)) { sascha@2564: List childrenFilters = buildRecursiveFilter(element); sascha@2564: if (!childrenFilters.isEmpty()) { sascha@2564: filters.add(new NotFilter(childrenFilters.get(0))); sascha@2564: } sascha@2564: } sascha@2564: else if ("column".equals(name)) { sascha@2564: String cid = element.getAttribute("cid").trim(); sascha@2564: if (cid.length() > 0) { sascha@2564: try { sascha@2564: filters.add(new IdFilter(Integer.parseInt(cid))); sascha@2564: } sascha@2564: catch (NumberFormatException nfe) { sascha@2564: } sascha@2564: } sascha@2564: } sascha@2564: else if ("date".equals(name)) { sascha@2564: String when = element.getAttribute("when").trim(); sascha@2564: if (when.length() > 0) { sascha@2564: Date date = parseDate(when); sascha@2564: if (date != null) { sascha@2564: filters.add(new DateFilter(date)); sascha@2564: } sascha@2564: } sascha@2564: } sascha@2564: else if ("date-range".equals(name)) { sascha@2564: String from = element.getAttribute("from").trim(); sascha@2564: String to = element.getAttribute("to" ).trim(); sascha@2564: if (from.length() > 0 && to.length() > 0) { sascha@2564: Date start = parseDate(from); sascha@2564: Date end = parseDate(to); sascha@2564: if (start != null && end != null) { sascha@2564: filters.add(new DateRangeFilter(start, end)); sascha@2564: } sascha@2564: } sascha@2564: } sascha@2564: else if ("sector-range".equals(name)) { sascha@2564: String from = element.getAttribute("from").trim(); sascha@2564: String to = element.getAttribute("to" ).trim(); sascha@2564: if (from.length() > 0 && to.length() > 0) { sascha@2564: try { sascha@2564: filters.add(new SectorRangeFilter( sascha@2564: Integer.parseInt(from), sascha@2564: Integer.parseInt(to))); sascha@2564: } sascha@2564: catch (NumberFormatException nfe) { sascha@2564: } sascha@2564: } sascha@2564: } sascha@2564: } sascha@2564: sascha@2564: return filters; sascha@2564: } sascha@2561: } sascha@2561: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :