/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.metadata; import java.io.Serializable; import java.util.Collections; import java.util.Map; import java.util.TreeMap; import org.teiid.connector.DataPlugin; import org.teiid.core.util.StringUtil; /** * Defines a base schema that is the holder for namespace and type information */ public class NamespaceContainer implements Serializable { static final String TEIID_RESERVED = "teiid_"; //$NON-NLS-1$ private static final String TEIID_SF = "teiid_sf"; //$NON-NLS-1$ private static final String TEIID_RELATIONAL = "teiid_rel"; //$NON-NLS-1$ private static final String TEIID_WS = "teiid_ws"; //$NON-NLS-1$ private static final String TEIID_MONGO = "teiid_mongo"; //$NON-NLS-1$ private static final String TEIID_ODATA = "teiid_odata"; //$NON-NLS-1$ private static final String TEIID_ACCUMULO = "teiid_accumulo"; //$NON-NLS-1$ private static final String TEIID_EXCEL = "teiid_excel"; //$NON-NLS-1$ private static final String TEIID_JPA = "teiid_jpa"; //$NON-NLS-1$ private static final String TEIID_HBASE = "teiid_hbase"; //$NON-NLS-1$ private static final String TEIID_SPATIAL = "teiid_spatial"; //$NON-NLS-1$ private static final String TEIID_LDAP = "teiid_ldap"; //$NON-NLS-1$ private static final String TEIID_REST = "teiid_rest"; //$NON-NLS-1$ private static final String TEIID_PI = "teiid_pi"; //$NON-NLS-1$ private static final String TEIID_COUCHBASE = "teiid_couchbase"; //$NON-NLS-1$ private static final String TEIID_INFINISPAN = "teiid_ispn"; //$NON-NLS-1$ public static final String SF_URI = "{http://www.teiid.org/translator/salesforce/2012}"; //$NON-NLS-1$ public static final String WS_URI = "{http://www.teiid.org/translator/ws/2012}"; //$NON-NLS-1$ public static final String MONGO_URI = "{http://www.teiid.org/translator/mongodb/2013}"; //$NON-NLS-1$ public static final String ODATA_URI = "{http://www.jboss.org/teiiddesigner/ext/odata/2012}"; //$NON-NLS-1$ public static final String ACCUMULO_URI = "{http://www.teiid.org/translator/accumulo/2013}"; //$NON-NLS-1$ public static final String EXCEL_URI = "{http://www.teiid.org/translator/excel/2014}"; //$NON-NLS-1$ public static final String JPA_URI = "{http://www.teiid.org/translator/jpa/2014}"; //$NON-NLS-1$ public static final String HBASE_URI = "{http://www.teiid.org/translator/hbase/2014}"; //$NON-NLS-1$ public static final String SPATIAL_URI = "{http://www.teiid.org/translator/spatial/2015}"; //$NON-NLS-1$ public static final String LDAP_URI = "{http://www.teiid.org/translator/ldap/2015}"; //$NON-NLS-1$ public static final String REST_URI = "{http://teiid.org/rest}"; //$NON-NLS-1$ public static final String PI_URI = "{http://www.teiid.org/translator/pi/2016}"; //$NON-NLS-1$ public static final String COUCHBASE_URI = "{http://www.teiid.org/translator/couchbase/2017}"; //$NON-NLS-1$ public static final String INFINISPAN_URI = "{http://www.teiid.org/translator/infinispan/2017}"; //$NON-NLS-1$ public static final Map<String, String> BUILTIN_NAMESPACES; static { Map<String, String> map = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER); map.put(TEIID_RELATIONAL, AbstractMetadataRecord.RELATIONAL_URI.substring(1, AbstractMetadataRecord.RELATIONAL_URI.length()-1)); map.put(TEIID_SF, SF_URI.substring(1, SF_URI.length()-1)); map.put(TEIID_WS, WS_URI.substring(1, WS_URI.length()-1)); map.put(TEIID_MONGO, MONGO_URI.substring(1, MONGO_URI.length()-1)); map.put(TEIID_ODATA, ODATA_URI.substring(1, ODATA_URI.length()-1)); map.put(TEIID_ACCUMULO, ACCUMULO_URI.substring(1, ACCUMULO_URI.length()-1)); map.put(TEIID_EXCEL, EXCEL_URI.substring(1, EXCEL_URI.length()-1)); map.put(TEIID_JPA, JPA_URI.substring(1, JPA_URI.length()-1)); map.put(TEIID_HBASE, HBASE_URI.substring(1, HBASE_URI.length()-1)); map.put(TEIID_SPATIAL, SPATIAL_URI.substring(1, SPATIAL_URI.length()-1)); map.put(TEIID_LDAP, LDAP_URI.substring(1, LDAP_URI.length()-1)); map.put(TEIID_REST, REST_URI.substring(1, REST_URI.length()-1)); map.put(TEIID_PI, PI_URI.substring(1, PI_URI.length()-1)); map.put(TEIID_COUCHBASE, COUCHBASE_URI.substring(1, COUCHBASE_URI.length()-1)); map.put(TEIID_INFINISPAN, INFINISPAN_URI.substring(1, INFINISPAN_URI.length()-1)); BUILTIN_NAMESPACES = Collections.unmodifiableMap(map); } protected Map<String, String> namespaces; public void addNamespace(String prefix, String uri) { if (uri == null || uri.indexOf('}') != -1) { throw new MetadataException(DataPlugin.Event.TEIID60018, DataPlugin.Util.gs(DataPlugin.Event.TEIID60018, uri)); } if (StringUtil.startsWithIgnoreCase(prefix, MetadataFactory.TEIID_RESERVED)) { String validURI = MetadataFactory.BUILTIN_NAMESPACES.get(prefix); if (validURI == null || !uri.equals(validURI)) { throw new MetadataException(DataPlugin.Event.TEIID60017, DataPlugin.Util.gs(DataPlugin.Event.TEIID60017, prefix)); } } if (this.namespaces == null) { this.namespaces = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER); } String old = this.namespaces.put(prefix, uri); if (old != null && !old.equals(uri)) { throw new MetadataException(DataPlugin.Event.TEIID60037, DataPlugin.Util.gs(DataPlugin.Event.TEIID60037, prefix, old, uri)); } } public Map<String, String> getNamespaces() { if (this.namespaces == null) { return Collections.emptyMap(); } return this.namespaces; } public static String resolvePropertyKey(NamespaceContainer baseSchema, String key) { int index = key.indexOf(':'); if (index > 0 && index < key.length() - 1) { String prefix = key.substring(0, index); String uri = BUILTIN_NAMESPACES.get(prefix); if (uri == null && baseSchema != null) { uri = baseSchema.getNamespaces().get(prefix); } if (uri != null) { key = '{' +uri + '}' + key.substring(index + 1, key.length()); } //TODO warnings or errors if not resolvable } return key; } }