/* * Copyright (c) 2004, Stefan Walter * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * * The names of contributors to this software may not be * used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * * CONTRIBUTORS * Stef Walter * */ package com.memberwebs.ldapxml.map; import java.io.IOException; import java.util.Map; import java.util.Set; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; /** * The in memory representation of an LX map. * * @author stef@memberwebs.com * @version 0.5 */ public class LXMap extends LXBase { // Cache of the name map private Map m_nameMap; // Cache of the name set private Set m_nameSet; // Whether to use the nameset or not boolean m_hasInclusive; /** * Constructs a new LXMap object. */ LXMap(Map nameMap, Set nameSet) { super(null); m_nameMap = nameMap; m_nameSet = nameSet; m_hasInclusive = false; } /** * Get an entry in this LX map by name. * * @param name The entry name. * @return The entry, or null if no such entry is present */ public LXEntry getEntry(String name) { LXEntry entry = (LXEntry)getChild(name); if(entry != null && !entry.isUseable()) entry = null; return entry; } /** * Get public (XML) to private (LDAP) name mappings * for the first entry. * * @return The name map. */ public final Map getNameMap() { return m_nameMap; } /** * Get the minimum set of LDAP attributes required * to retrieve items via this map. */ public final Set getNameSet() { return m_hasInclusive ? null : m_nameSet; } /** * Load an LX map from an XML data stream * * @param source The source of the XML data. */ public static LXMap loadMap(InputSource source) throws LXMapException, IOException { try { XMLReader xr = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); // We require some form of validation on the document // as our internal checks are lax xr.setFeature("http://xml.org/sax/features/validation", true); // Parse and load the map. LXSAXHandler handler = new LXSAXHandler(); xr.setContentHandler(handler); xr.setErrorHandler(handler); xr.parse(source); LXMap map = handler.getMap(); return map; } catch(SAXException e) { Exception inside = e.getException(); if(inside != null) { inside.printStackTrace(); if(inside instanceof LXMapException) throw (LXMapException)inside; else if(inside.getMessage() != null) throw new LXMapException(inside.getMessage()); else throw new LXMapException(inside.getClass().getName()); } throw new LXMapException(e.getMessage()); } } /** * Load an LX map from a uri. * * @param uri The fully qualified uri of the file. */ public static LXMap loadMap(String uri) throws LXMapException, IOException { return loadMap(new InputSource(uri)); } }