001/* 
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     anguenot
011 *
012 * $Id: DateRangeParser.java 20577 2007-06-16 09:26:07Z sfermigier $
013 */
014
015package org.nuxeo.ecm.platform.audit.api.query;
016
017import java.util.Calendar;
018import java.util.Date;
019import java.util.HashMap;
020import java.util.Map;
021
022/**
023 * Date range parser.
024 *
025 * @author <a href="mailto:ja@nuxeo.com">Julien Anguenot</a>
026 */
027public final class DateRangeParser {
028
029    // Utility class.
030    private DateRangeParser() {
031    }
032
033    public static Date parseDateRangeQuery(Date now, String dateRangeQuery) throws AuditQueryException {
034        try {
035            Calendar calendar = Calendar.getInstance();
036            calendar.setTime(now);
037            if (dateRangeQuery != null) {
038                Map<String, Integer> parsed = parseQuery(dateRangeQuery);
039                if (parsed.containsKey(DateRangeQueryConstants.HOUR)) {
040                    calendar.add(Calendar.HOUR_OF_DAY, -parsed.get(DateRangeQueryConstants.HOUR));
041                }
042                if (parsed.containsKey(DateRangeQueryConstants.MIN)) {
043                    calendar.add(Calendar.MINUTE, -parsed.get(DateRangeQueryConstants.MIN));
044                }
045            }
046            return calendar.getTime();
047        } catch (NumberFormatException nfe) {
048            throw new AuditQueryException("Invalid query format...", nfe);
049        }
050    }
051
052    private static Map<String, Integer> parseQuery(String query) throws AuditQueryException {
053        Map<String, Integer> parsed = new HashMap<String, Integer>();
054
055        query = query.trim();
056        query = query.replace(" ", "");
057
058        int offsetMinutes = query.indexOf(DateRangeQueryConstants.MIN);
059        int offsetHours = query.indexOf(DateRangeQueryConstants.HOUR);
060
061        if (offsetMinutes != -1) {
062            String sub = query.substring(0, offsetMinutes);
063            try {
064                parsed.put(DateRangeQueryConstants.MIN, Integer.parseInt(sub));
065            } catch (NumberFormatException nfe) {
066                throw new AuditQueryException(nfe.getMessage(), nfe);
067            }
068        }
069        if (offsetHours != -1) {
070            String sub;
071            if (offsetMinutes == -1) {
072                sub = query.substring(0, offsetHours);
073            } else {
074                sub = query.substring(offsetMinutes + 1, offsetHours);
075            }
076            try {
077                parsed.put(DateRangeQueryConstants.HOUR, Integer.parseInt(sub));
078            } catch (NumberFormatException nfe) {
079                throw new AuditQueryException(nfe.getMessage(), nfe);
080            }
081        }
082        return parsed;
083    }
084
085}