/* * GeotoolKit - An Open Source Java GIS Toolkit * http://geotoolkit.org * * (C) 2009, Geomatys * * 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. */ package org.geotoolkit.resources.jaxb.feature.catalog; import com.sun.xml.internal.bind.IDResolver; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; import java.util.logging.Logger; import org.geotoolkit.feature.catalog.Referenceable; import org.apache.sis.util.logging.Logging; /** * * @author guilhem * @since 3.03 * @module */ public class DocumentIDResolver extends IDResolver { Map<String, Referenceable> referenceables = new HashMap<String, Referenceable>(); private Logger logger = Logging.getLogger("DocumentIdResolver"); void startDocument() { referenceables.clear(); } public void bind(final String id, final Object obj) { if (obj instanceof Referenceable) referenceables.put(id, (Referenceable)obj); else logger.info("not refereanceable type: " + obj.getClass().getSimpleName()); } public Callable resolve(final String id, final Class targetType) { return new Callable() { public Object call() throws Exception { logger.finer("searching id=" + id + " of type " + targetType.getSimpleName()); Object result; boolean referenceable = false; for (Class c:targetType.getInterfaces()) { if (c.equals(Referenceable.class)) { referenceable = true; } } if (referenceable) result = referenceables.get(id); else { logger.severe("not a referenceable targetType: " + targetType.getSimpleName()); result = null; } if (result == null) { logger.severe("unable to find an object for this id=" + id); } return result; } }; } }