| /******************************************************************************* |
| * Copyright (c) 2011, Jesper Steen Moller, and others |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Jesper Steen Moller - initial API and implementation |
| * Jesper Steen Moller - bug 340933 - Migrate to new XPath2 API |
| *******************************************************************************/ |
| |
| package org.eclipse.wst.xml.xpath2.processor.util; |
| |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.URI; |
| import java.net.URL; |
| import java.util.GregorianCalendar; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.TimeZone; |
| |
| import javax.xml.datatype.DatatypeConfigurationException; |
| import javax.xml.datatype.DatatypeFactory; |
| import javax.xml.datatype.Duration; |
| import javax.xml.namespace.QName; |
| |
| import org.eclipse.wst.xml.xpath2.api.CollationProvider; |
| import org.eclipse.wst.xml.xpath2.api.DynamicContext; |
| import org.eclipse.wst.xml.xpath2.api.ResultSequence; |
| import org.eclipse.wst.xml.xpath2.api.StaticContext; |
| import org.eclipse.wst.xml.xpath2.processor.DOMLoader; |
| import org.eclipse.wst.xml.xpath2.processor.XercesLoader; |
| import org.eclipse.wst.xml.xpath2.processor.internal.function.FnCollection; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Node; |
| |
| |
| /** |
| * An implementation of a Dynamic Context. |
| * |
| * Initializes and provides functionality of a dynamic context according to the |
| * XPath 2.0 specification. |
| */ |
| public class DynamicContextBuilder implements DynamicContext { |
| |
| private static DatatypeFactory _datatypeFactory; |
| static { |
| try { |
| _datatypeFactory = DatatypeFactory.newInstance(); |
| } |
| catch (DatatypeConfigurationException e) { |
| throw new RuntimeException("Cannot initialize XML datatypes", e); |
| } |
| } |
| private TimeZone _systemTimezone = TimeZone.getDefault(); |
| |
| private Duration _tz = _datatypeFactory.newDuration(_systemTimezone.getRawOffset()); |
| private GregorianCalendar _currentDateTime; |
| |
| private Map<QName,ResultSequence> _variables = new HashMap<QName,ResultSequence>(); |
| private final StaticContext _staticContext; |
| |
| private Map<String, List<Document>> _collections; |
| |
| private Map<URI, Document> _loaded_documents = new HashMap<URI, Document>(); |
| |
| public DynamicContextBuilder(StaticContext sc) { |
| _staticContext = sc; |
| } |
| |
| /** |
| * Reads the day from a TimeDuration type |
| * |
| * @return an xs:integer _tz |
| */ |
| public Duration getTimezoneOffset() { |
| return _tz; |
| } |
| |
| /** |
| * Gets the Current stable date time from the dynamic context. |
| */ |
| public GregorianCalendar getCurrentDateTime() { |
| if (_currentDateTime == null) { |
| _currentDateTime = new GregorianCalendar(TimeZone.getTimeZone("GMT")); |
| } |
| return _currentDateTime; |
| } |
| |
| public Node getLimitNode() { |
| return null; |
| } |
| |
| public ResultSequence getVariable(QName name) { |
| return _variables.get(name); |
| } |
| |
| public Document getDocument(URI resolved) { |
| Document doc = null; |
| if (_loaded_documents.containsKey(resolved)) { |
| //tried before |
| doc = _loaded_documents.get(resolved); |
| } else { |
| doc = retrieve_doc(resolved); |
| _loaded_documents.put(resolved, doc); |
| } |
| return doc; |
| } |
| |
| // XXX make it nice, and move it out as a utility function |
| private Document retrieve_doc(URI uri) { |
| try { |
| DOMLoader loader = new XercesLoader(); |
| loader.set_validating(false); |
| |
| Document doc = loader.load(new URL(uri.toString()).openStream()); |
| doc.setDocumentURI(uri.toString()); |
| return doc; |
| } catch (FileNotFoundException e) { |
| return null; |
| } catch (MalformedURLException e) { |
| return null; |
| } catch (IOException e) { |
| return null; |
| } |
| } |
| |
| public URI resolveUri(String uri) { |
| try { |
| URI realURI = URI.create(uri); |
| if (realURI.isAbsolute()) { |
| return realURI; |
| } |
| return _staticContext.getBaseUri().resolve(uri); |
| } catch (IllegalArgumentException iae) { |
| return null; |
| } |
| } |
| |
| public Map<String, List<Document>> getCollections() { |
| return _collections; |
| } |
| |
| public List<Document> getDefaultCollection() { |
| return getCollections().get(FnCollection.DEFAULT_COLLECTION_URI); |
| } |
| |
| public DynamicContextBuilder withVariable(javax.xml.namespace.QName qName, ResultSequence values) { |
| this._variables.put(qName, values); |
| return this; |
| } |
| |
| public DynamicContextBuilder withTimezoneOffset(Duration d) { |
| this._tz = d; |
| return this; |
| } |
| |
| public void withCollections(Map<String, List<Document>> map) { |
| this._collections = map; |
| } |
| |
| public CollationProvider getCollationProvider() { |
| return _staticContext.getCollationProvider(); |
| } |
| } |