/** * This file Copyright (c) 2005-2010 Aptana, Inc. This program is * dual-licensed under both the Aptana Public License and the GNU General * Public license. You may elect to use one or the other of these licenses. * * This program is distributed in the hope that it will be useful, but * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or * NONINFRINGEMENT. Redistribution, except as permitted by whichever of * the GPL or APL you select, is prohibited. * * 1. For the GPL license (GPL), you can redistribute and/or modify this * program under the terms of the GNU General Public License, * Version 3, as published by the Free Software Foundation. You should * have received a copy of the GNU General Public License, Version 3 along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Aptana provides a special exception to allow redistribution of this file * with certain Eclipse Public Licensed code and certain additional terms * pursuant to Section 7 of the GPL. You may view the exception and these * terms on the web at http://www.aptana.com/legal/gpl/. * * 2. For the Aptana Public License (APL), this program and the * accompanying materials are made available under the terms of the APL * v1.0 which accompanies this distribution, and is available at * http://www.aptana.com/legal/apl/. * * You may view the GPL, Aptana's exception and additional terms, and the * APL in the file titled license.html at the root of the corresponding * plugin containing this source file. * * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.subscription; import java.net.MalformedURLException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import com.aptana.ide.core.IdeLog; import com.aptana.ide.subscription.model.SubscriptionService; public class SubscriptionContentHandler implements ContentHandler { private static final String SERVICE = "service"; //$NON-NLS-1$ private static final String FEATURE_ID = "feature_id"; //$NON-NLS-1$ private static final String UPDATE_SITE = "update_site"; //$NON-NLS-1$ private static final String START_DATE = "created_at"; //$NON-NLS-1$ private static final String NEXT_BILL_DATE = "next_bill_date"; //$NON-NLS-1$ private static final String STATUS = "status"; //$NON-NLS-1$ private static final String ACTIVITY_ID = "activity_id"; //$NON-NLS-1$ private static final SimpleDateFormat XML_DATETIME_FORMAT = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss'Z'"); //$NON-NLS-1$ private StringBuilder fData; private List<SubscriptionService> fServices; private String fFeatureId; private URL fUpdateSite; private long fStartTime; private long fNextBillTime; private String fStatus; private List<String> fActivityIds; public SubscriptionContentHandler() { fServices = new ArrayList<SubscriptionService>(); fActivityIds = new ArrayList<String>(); } public SubscriptionService[] getServices() { return fServices.toArray(new SubscriptionService[fServices.size()]); } public void characters(char[] ch, int start, int length) throws SAXException { for (int i = start; i < start + length; ++i) { fData.append(ch[i]); } } public void endDocument() throws SAXException { } public void endElement(String uri, String localName, String qName) throws SAXException { String data = fData.toString().trim(); if (qName.equals(FEATURE_ID)) { fFeatureId = data; } else if (qName.equals(UPDATE_SITE)) { try { fUpdateSite = new URL(data); } catch (MalformedURLException e) { logError(e); } } else if (qName.equals(START_DATE)) { try { fStartTime = XML_DATETIME_FORMAT.parse(data).getTime(); } catch (ParseException e) { logError(e); } } else if (qName.equals(NEXT_BILL_DATE)) { try { fNextBillTime = XML_DATETIME_FORMAT.parse(data).getTime(); } catch (ParseException e) { logError(e); } } else if (qName.equals(STATUS)) { fStatus = data; } else if (qName.equals(ACTIVITY_ID)) { fActivityIds.add(data); } else if (qName.equals(SERVICE)) { SubscriptionService service = new SubscriptionService(fFeatureId, fUpdateSite, fStartTime, fNextBillTime, fStatus, fActivityIds.toArray(new String[fActivityIds.size()])); fServices.add(service); } } public void endPrefixMapping(String prefix) throws SAXException { } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } public void processingInstruction(String target, String data) throws SAXException { } public void setDocumentLocator(Locator locator) { } public void skippedEntity(String name) throws SAXException { } public void startDocument() throws SAXException { } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { fData = new StringBuilder(); if (qName.equals(SERVICE)) { fFeatureId = null; fUpdateSite = null; fStartTime = 0; fNextBillTime = 0; fStatus = null; fActivityIds.clear(); } } public void startPrefixMapping(String prefix, String uri) throws SAXException { } private static void logError(Exception e) { IdeLog.logError(SubscriptionPlugin.getDefault(), e.getMessage(), e); } }