/******************************************************************************* * Copyright (c) 2007 - 2012 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.util; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.eclipse.wst.common.uriresolver.internal.ExtensibleURIResolver; import org.eclipse.wst.xml.core.internal.XMLCorePlugin; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.XModelEntity; import org.jboss.tools.common.xml.XMLEntityResolver; public class EntityXMLRegistration { private static EntityXMLRegistration instance = new EntityXMLRegistration(); public static int UNRESOLVED = -1; public static int DTD = 0; public static int SCHEMA = 1; public static int MISSING = 2; static boolean isResolvingSchema = false; private EntityXMLRegistration() {} public static EntityXMLRegistration getInstance() { return instance; } private Map<XModelEntity, Integer> resolved = new HashMap<XModelEntity, Integer>(); public int resolve(XModelEntity entity) { Integer i = resolved.get(entity); if(i != null) return i.intValue(); XAttribute a = entity.getAttribute("publicId"); //$NON-NLS-1$ if(a != null) { return resolveDTD(entity, a); } a = entity.getAttribute("xsi:schemaLocation"); //$NON-NLS-1$ if(a != null && isResolvingSchema) { return resolveSchema(entity, a); } resolved.put(entity, Integer.valueOf(UNRESOLVED)); return UNRESOLVED; } private int resolveDTD(XModelEntity entity, XAttribute a) { String v = a.getDefaultValue(); if(XMLEntityResolver.getInstance().isResolved(v, null)) { resolved.put(entity, Integer.valueOf(DTD)); return DTD; } ExtensibleURIResolver r = new ExtensibleURIResolver(); String s = r.resolve(null, v, null); if(s != null && s.length() > 0) { resolved.put(entity, Integer.valueOf(DTD)); XMLEntityResolver.registerPublicEntity(v, s); return DTD; } resolved.put(entity, Integer.valueOf(MISSING)); return MISSING; } private int resolveSchema(XModelEntity entity, XAttribute a) { String v = a.getDefaultValue(); String[] vs = v.split(" "); //$NON-NLS-1$ if(vs == null || vs.length < 2) { resolved.put(entity, Integer.valueOf(MISSING)); return MISSING; } String location = null; try { location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolvePublic(vs[0], vs[1]); if(location == null) location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolveSystem(vs[1]); if(location == null) location = XMLCorePlugin.getDefault().getDefaultXMLCatalog().resolveURI(vs[1]); } catch (IOException e) { //ignore } if(location == null) { ExtensibleURIResolver r = new ExtensibleURIResolver(); location = r.resolve(null, vs[0], vs[1]); } if(location != null && location.length() > 0) { resolved.put(entity, Integer.valueOf(SCHEMA)); return SCHEMA; } return SCHEMA; } public static boolean isSystemId(String body) { if(body == null) return false; int i = body.indexOf("<!DOCTYPE"); //$NON-NLS-1$ if(i < 0) return false; int j = body.indexOf(">", i); //$NON-NLS-1$ if(j < 0) return false; String dt = body.substring(i, j); return (dt.indexOf("SYSTEM") > 0); //$NON-NLS-1$ } }