From: <ker...@us...> - 2009-05-25 20:55:24
|
Revision: 15336 http://jedit.svn.sourceforge.net/jedit/?rev=15336&view=rev Author: kerik-sf Date: 2009-05-25 20:54:23 +0000 (Mon, 25 May 2009) Log Message: ----------- removing deprecated CatalogManager, SAXParserImpl and last pointers to them Modified Paths: -------------- plugins/XML/branches/relax-ng/actions.xml plugins/XML/branches/relax-ng/test_data/import_schema/instance.xml plugins/XML/branches/relax-ng/xml/Resolver.java plugins/XML/branches/relax-ng/xml/XmlPlugin.java plugins/XML/branches/relax-ng/xml/completion/CompletionInfoHandler.java plugins/XML/branches/relax-ng/xml/parser/XercesParserImpl.java Removed Paths: ------------- plugins/XML/branches/relax-ng/xml/CatalogManager.java plugins/XML/branches/relax-ng/xml/parser/SAXParserImpl.java Modified: plugins/XML/branches/relax-ng/actions.xml =================================================================== --- plugins/XML/branches/relax-ng/actions.xml 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/actions.xml 2009-05-25 20:54:23 UTC (rev 15336) @@ -73,13 +73,12 @@ </ACTION> <ACTION NAME="xml-clear-cache"> <CODE> - xml.CatalogManager.clearCache(); + xml.Resolver.instance().clearCache(); </CODE> </ACTION> <ACTION NAME="xml-reload-catalogs"> <CODE> xml.Resolver.instance().reloadCatalogs(); - xml.CatalogManager.reloadCatalogs(); </CODE> </ACTION> <ACTION NAME="xml-select-element"> Modified: plugins/XML/branches/relax-ng/test_data/import_schema/instance.xml =================================================================== --- plugins/XML/branches/relax-ng/test_data/import_schema/instance.xml 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/test_data/import_schema/instance.xml 2009-05-25 20:54:23 UTC (rev 15336) @@ -14,7 +14,9 @@ <!-- that one is correct : --> <comment> <!-- the completion information is missing here ! --> - <ipo:comment>erjrj</ipo:comment> + <ipo:comment>erjrj + <!-- the completion information is misleading here : only string content --> + </ipo:comment> </comment> </purchaseReport> Deleted: plugins/XML/branches/relax-ng/xml/CatalogManager.java =================================================================== --- plugins/XML/branches/relax-ng/xml/CatalogManager.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/CatalogManager.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -1,646 +0,0 @@ -/* - * CatalogManager.java - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2001, 2003 Slava Pestov - * Portions copyright (C) 2002 Chris Stevenson - * - * The XML plugin is licensed under the GNU General Public License, with - * the following exception: - * - * "Permission is granted to link this code with software released under - * the Apache license version 1.1, for example used by the Xerces XML - * parser package." - */ - -package xml; - -//{{{ Imports -import java.awt.Component; -import java.io.*; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; - -import org.apache.xml.resolver.Catalog; -import org.gjt.sp.jedit.*; -import org.gjt.sp.jedit.io.VFS; -import org.gjt.sp.jedit.io.VFSManager; -import org.gjt.sp.jedit.msg.VFSUpdate; -import org.gjt.sp.util.Log; -import org.xml.sax.InputSource; - -//}}} -/** - * - */ -public class CatalogManager -{ - //{{{ resolve() method - - /** - * @param current - * @param publicId - * @param systemId - */ - - public static InputSource resolve(String current, - String publicId, String systemId) - throws Exception - { - load(); - - if(publicId != null && publicId.length() == 0) - publicId = null; - - if(systemId != null && systemId.length() == 0) - systemId = null; - - String newSystemId = null; - - /* we need this hack to support relative path names inside - * cached files. we want them to be resolved relative to - * the original system ID of the cached resource, not the - * cache file name on disk. */ - String parent; - if(current != null) - { - Entry entry = (Entry)reverseResourceCache.get(current); - if(entry != null) - parent = entry.uri; - else - parent = MiscUtilities.getParentOfPath(current); - } - else - parent = null; - - if(publicId == null && systemId != null && parent != null) - { - if(systemId.startsWith(parent)) - { - // first, try resolving a relative name, - // to handle jEdit built-in DTDs - newSystemId = systemId.substring( - parent.length()); - if(newSystemId.startsWith("/")) - newSystemId = newSystemId.substring(1); - newSystemId = resolveSystem(newSystemId); - } - } - - // next, try resolving full path name - if(newSystemId == null) - { - if(publicId == null) - newSystemId = resolveSystem(systemId); - else - newSystemId = resolvePublic(systemId,publicId); - } - - // well, the catalog can't help us, so just assume the - // system id points to a file - if(newSystemId == null) - { - if(systemId == null) - return null; - else if(MiscUtilities.isURL(systemId)) - newSystemId = systemId; - // XXX: is this correct? - else if(systemId.startsWith("/") || systemId.startsWith("\\")) - newSystemId = "file://" + systemId; - else if(':' == systemId.charAt(1)) - newSystemId = "file:///" + systemId; - else if((parent != null) && MiscUtilities.isURL(parent)) - newSystemId = parent + systemId; - else if((parent != null) && (parent.startsWith("/") || parent.startsWith("\\"))) - newSystemId = "file://" + parent + systemId; - else if((parent != null) && (':' == parent.charAt(1))) - newSystemId = "file:///" + parent + systemId; - } - - if(newSystemId == null) - return null; - - Buffer buf = jEdit.getBuffer(XmlPlugin.uriToFile(newSystemId)); - if(buf != null) - { - if(buf.isPerformingIO()) - VFSManager.waitForRequests(); - Log.log(Log.DEBUG,CatalogManager.class,"Found open buffer for " + newSystemId); - InputSource source = new InputSource(buf.getPath()); - try - { - buf.readLock(); - source.setCharacterStream(new StringReader(buf.getText(0, - buf.getLength()))); - } - finally - { - buf.readUnlock(); - } - return source; - } - else if(newSystemId.startsWith("file:") - || newSystemId.startsWith("jeditresource:")) - { - InputSource source = new InputSource(systemId); - source.setByteStream(new URL(newSystemId).openStream()); - return source; - } - else if(!network) - return null; - else - { - final String _newSystemId = newSystemId; - final VFS vfs = VFSManager.getVFSForPath(_newSystemId); - // use a final array to pass a mutable value from the - // invokeAndWait() call - final Object[] session = new Object[1]; - Runnable run = new Runnable() - { - public void run() - { - View view = jEdit.getActiveView(); - if (Resolver.getNetworkModeVal() == Resolver.LOCAL) return; - if (Resolver.getNetworkModeVal()==Resolver.ALWAYS || - (Resolver.getNetworkModeVal()==Resolver.ASK && - showDownloadResourceDialog(view,_newSystemId))) - { - session[0] = vfs.createVFSSession( - _newSystemId,view); - } - } - }; - - if(SwingUtilities.isEventDispatchThread()) - run.run(); - else - { - try - { - SwingUtilities.invokeAndWait(run); - } - catch(Exception e) - { - throw new RuntimeException(e); - // Log.log(Log.ERROR,CatalogManager.class,e); - } - } - - if(session[0] != null) - { - InputSource source = new InputSource(systemId); - if(Resolver.isUsingCache()) - { - File file; - try - { - file = copyToLocalFile(session[0],vfs,newSystemId); - } - finally - { - vfs._endVFSSession(session,null); - } - - addUserResource(publicId,systemId,file.toURL().toString()); - source.setByteStream(new FileInputStream(file)); - } - else - source.setByteStream(vfs._createInputStream(session,newSystemId,false,null)); - - return source; - } - else - throw new IOException(jEdit.getProperty("xml.network-error")); - } - } //}}} - - /*{{{ reload() method - public static void reload(Entry e) - { - if(e.type == Entry.PUBLIC) - { - throw new RuntimeException( - "Cannot reload a DTD from a PUBLIC id, only a SYSTEM id." ); - } - - try - { - - if(isLocal(e)) - { - - File oldDtdFile = new File((String)resourceCache.get(e)); - - File newFile = copyToLocalFile(new URL(e.id)); - - oldDtdFile.delete(); - newFile.renameTo(oldDtdFile); - - JOptionPane.showMessageDialog( - null, - "Reloaded DTD to " + oldDtdFile ); - } - } - catch (Exception ex) - { - JOptionPane.showMessageDialog( null, ex.getMessage() ); - } - } *///}}} - - //{{{ isLocal() method - public static boolean isLocal(Entry e) - { - if(e == null || jEdit.getSettingsDirectory() == null) - return false; - - try - { - URL url = new File(jEdit.getSettingsDirectory()).toURL(); - String fileUrl = (String)resourceCache.get(e); - return fileUrl.startsWith(url.toString()); - } - catch (MalformedURLException ex) - { - return false; - } - } //}}} - - //{{{ propertiesChanged() method - public static void propertiesChanged() - { - if(jEdit.getSettingsDirectory() == null) - { - Resolver.setUsingCache(false); - } - else - { - resourceDir = MiscUtilities.constructPath( - jEdit.getSettingsDirectory(),"dtds"); - - } - network = Resolver.getNetworkModeVal() != Resolver.LOCAL; - - if(!Resolver.isUsingCache()) - clearCache(); - - loadedCatalogs = false; - } //}}} - - //{{{ save() method - public static void save() - { - if(loadedCache) - { - int systemCount = 0; - int publicCount = 0; - - Iterator keys = resourceCache.keySet().iterator(); - while(keys.hasNext()) - { - Entry entry = (Entry)keys.next(); - Object uri = resourceCache.get(entry); - if(uri == IGNORE) - continue; - - if(entry.type == Entry.PUBLIC) - { - jEdit.setProperty("xml.cache.public-id." + publicCount,entry.id); - jEdit.setProperty("xml.cache.public-id." + publicCount - + ".uri",uri.toString()); - publicCount++; - } - else - { - jEdit.setProperty("xml.cache.system-id." + systemCount,entry.id); - jEdit.setProperty("xml.cache.system-id." + systemCount - + ".uri",uri.toString()); - systemCount++; - } - } - - jEdit.unsetProperty("xml.cache.public-id." + publicCount); - jEdit.unsetProperty("xml.cache.public-id." + publicCount + ".uri"); - jEdit.unsetProperty("xml.cache.system-id." + systemCount); - jEdit.unsetProperty("xml.cache.system-id." + systemCount + ".uri"); - } - } //}}} - - //{{{ clearCache() method - public static void clearCache() - { - load(); - - Iterator files = resourceCache.values().iterator(); - while(files.hasNext()) - { - Object obj = files.next(); - if(obj instanceof String) - { - String file = (String)XmlPlugin.uriToFile((String)obj); - Log.log(Log.NOTICE,CatalogManager.class,"Deleting " + file); - new File(file).delete(); - } - } - resourceCache.clear(); - } //}}} - - //{{{ reloadCatalogs() method - public static void reloadCatalogs() - { - loadedCatalogs = false; - } //}}} - - //{{{ Package-private members - - //{{{ init() method - static void init() - { - EditBus.addToBus(vfsUpdateHandler = new VFSUpdateHandler()); - } //}}} - - //{{{ uninit() method - static void uninit() - { - EditBus.removeFromBus(vfsUpdateHandler); - } //}}} - - //}}} - - //{{{ Private members - - //{{{ Static variables - private static boolean loadedCache; - private static boolean loadedCatalogs; - private static boolean network; - private static Catalog catalog; - private static Set catalogFiles; - private static HashMap resourceCache; - private static HashMap reverseResourceCache; - private static String resourceDir; - - // placeholder for DTDs we never want to download - private static Object IGNORE = new Object(); - - private static EBComponent vfsUpdateHandler; - //}}} - - //{{{ addUserResource() method - /** - * Don't want this public because then invoking {@link clearCache()} - * will remove this file, not what you would expect! - */ - private static void addUserResource(String publicId, String systemId, String url) - { - if(publicId != null) - { - Entry pe = new Entry( Entry.PUBLIC, publicId, url ); - resourceCache.put( pe, url ); - } - - Entry se = new Entry( Entry.SYSTEM, systemId, url ); - resourceCache.put( se, url ); - reverseResourceCache.put(url,se); - } //}}} - - //{{{ copyToLocalFile() method - private static File copyToLocalFile(Object session, VFS vfs, String path) - throws IOException - { - if(jEdit.getSettingsDirectory() == null) - return null; - -// String userDir = jEdit.getSettingsDirectory(); - - File _resourceDir = new File(resourceDir); - if (!_resourceDir.exists()) - _resourceDir.mkdir(); - - // Need to put this "copy from one stream to another" - // into a common method some day, since other parts - // of jEdit need it too... - BufferedInputStream in = new BufferedInputStream( - vfs._createInputStream(session,path,false,null)); - - File localFile = File.createTempFile("cache", ".xml", _resourceDir); - - BufferedOutputStream out = new BufferedOutputStream( - new FileOutputStream(localFile)); - - byte[] buf = new byte[4096]; - int count = 0; - while ((count = in.read(buf)) != -1) - out.write(buf,0,count); - out.close(); - - return localFile; - } //}}} - - //{{{ resolvePublic() method - private static String resolvePublic(String systemId, String publicId) - throws Exception - { - Entry e = new Entry(Entry.PUBLIC,publicId,null); - String uri = (String)resourceCache.get(e); - if(uri == null) - return catalog.resolvePublic(publicId,null); - else if(uri == IGNORE) - return null; - else - return uri; - } //}}} - - //{{{ resolveSystem() method - public static String resolveSystem(String id) throws Exception - { - Entry e = new Entry(Entry.SYSTEM,id,null); - String uri = (String)resourceCache.get(e); - if(uri == null) - return catalog.resolveSystem(id); - else if(uri == IGNORE) - return null; - else - return uri; - } //}}} - - //{{{ showDownloadResourceDialog() method - private static boolean showDownloadResourceDialog(Component comp, String systemId) - { - Entry e = new Entry(Entry.SYSTEM,systemId,null); - if(resourceCache.get(e) == IGNORE) - return false; - - int result = GUIUtilities.confirm(comp,"xml.download-resource", - new String[] { systemId },JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - if(result == JOptionPane.YES_OPTION) - return true; - else - { - resourceCache.put(e,IGNORE); - return false; - } - } //}}} - - //{{{ load() method - private synchronized static void load() - { - if(!loadedCache) - { - loadedCache = true; - - resourceCache = new HashMap(); - reverseResourceCache = new HashMap(); - - int i; - String id, prop, uri; - - i = 0; - while((id = jEdit.getProperty(prop = "xml.cache" - + ".public-id." + i++)) != null) - { - try - { - uri = jEdit.getProperty(prop + ".uri"); - resourceCache.put(new Entry(Entry.PUBLIC,id,uri),uri); - } - catch(Exception ex2) - { ex2.printStackTrace(); - Log.log(Log.ERROR,CatalogManager.class,ex2); - } - } - - i = 0; - while((id = jEdit.getProperty(prop = "xml.cache" - + ".system-id." + i++)) != null) - { - try - { - uri = jEdit.getProperty(prop + ".uri"); - Entry se = new Entry(Entry.SYSTEM,id,uri); - resourceCache.put(se,uri); - reverseResourceCache.put(uri,se); - } - catch(Exception ex2) - { - ex2.printStackTrace(); - Log.log(Log.ERROR,CatalogManager.class,ex2); - } - } - } - - if(!loadedCatalogs) - { - loadedCatalogs = true; - - catalog = new Catalog(); - catalogFiles = new HashSet(); - - catalog.setupReaders(); - //catalog.setParserClass("org.apache.xerces.parsers.SAXParser"); - - try - { - catalog.loadSystemCatalogs(); - - catalog.parseCatalog("jeditresource:XML.jar!/xml/dtds/catalog"); - - int i = 0; - String prop, uri; - while((uri = jEdit.getProperty( - prop = "xml.catalog." + i++)) != null) - { - Log.log(Log.MESSAGE,CatalogManager.class, - "Loading catalog: " + uri); - - try - { - if(MiscUtilities.isURL(uri)) - catalogFiles.add(uri); - else - { - catalogFiles.add( - MiscUtilities - .resolveSymlinks( - uri)); - } - catalog.parseCatalog(uri); - } - catch(Exception ex2) - { - ex2.printStackTrace(); - Log.log(Log.ERROR,CatalogManager.class,ex2); - } - } - } - catch(Exception ex1) - { - Log.log(Log.ERROR,CatalogManager.class,ex1); - ex1.printStackTrace(); - } - } - } //}}} - - //}}} - - //{{{ Entry class - public static class Entry - { - public static final int SYSTEM = 0; - public static final int PUBLIC = 1; - - public int type; - public String id; - public String uri; - - public Entry(int type, String id, String uri) - { - this.type = type; - this.id = id; - this.uri = uri; - } - - public boolean equals(Object o) - { - if(o instanceof Entry) - { - Entry e = (Entry)o; - return e.type == type && e.id.equals(id); - } - else - return false; - } - - public int hashCode() - { - return id.hashCode(); - } - } //}}} - - //{{{ VFSUpdateHandler class - /** - * Reloads a catalog file when the user changes it on disk. - */ - public static class VFSUpdateHandler implements EBComponent - { - public void handleMessage(EBMessage msg) - { - if(!loadedCatalogs) - return; - - if(msg instanceof VFSUpdate) - { - String path = ((VFSUpdate)msg).getPath(); - if(catalogFiles.contains(path)) - loadedCatalogs = false; - } - } - } //}}} -} Modified: plugins/XML/branches/relax-ng/xml/Resolver.java =================================================================== --- plugins/XML/branches/relax-ng/xml/Resolver.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/Resolver.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -280,7 +280,7 @@ catch(Exception ex2) { ex2.printStackTrace(); - Log.log(Log.ERROR,CatalogManager.class,ex2); + Log.log(Log.ERROR,Resolver.class,ex2); } @@ -366,7 +366,7 @@ // XXX: is this correct? /* else if(systemId.startsWith("/")) newSystemId = "file://" + systemId;*/ - //need this to resolve actions.xds from actions.xsd + //need this to resolve xinclude.mod from user-guide.xml //I don't understand this condition : && !MiscUtilities.isURL(parent) else if(parent != null) newSystemId = parent + systemId; @@ -495,8 +495,8 @@ resourceCache.clear(); } //}}} - - private String resolveSystem(String id) throws IOException + // TODO: remove package access (for XMLPlugin) + String resolveSystem(String id) throws IOException { Entry e = new Entry(Entry.SYSTEM,id,null); String uri = resourceCache.get(e); Modified: plugins/XML/branches/relax-ng/xml/XmlPlugin.java =================================================================== --- plugins/XML/branches/relax-ng/xml/XmlPlugin.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/XmlPlugin.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -151,7 +151,9 @@ public static String uriToFile(String uri) { if (uri.startsWith("http:/")) try { - String result = CatalogManager.resolveSystem(uri); + // TODO: document the usage of uriToFile in Resolver + // and gain confidence that it doesn't loop + String result = Resolver.instance().resolveSystem(uri); if (result != null) return result; } catch (Exception e) { Modified: plugins/XML/branches/relax-ng/xml/completion/CompletionInfoHandler.java =================================================================== --- plugins/XML/branches/relax-ng/xml/completion/CompletionInfoHandler.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/completion/CompletionInfoHandler.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -55,8 +55,11 @@ { try { - return CatalogManager.resolve( - loc.getSystemId(),publicId,systemId); + return Resolver.instance().resolveEntity( + null,//name + publicId, + loc.getSystemId(), //current + systemId); } catch(Exception e) { Deleted: plugins/XML/branches/relax-ng/xml/parser/SAXParserImpl.java =================================================================== --- plugins/XML/branches/relax-ng/xml/parser/SAXParserImpl.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/parser/SAXParserImpl.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -1,714 +0,0 @@ -/* - * SAXParserImpl.java - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2003 Slava Pestov - * Portions copyright (C) 2001 David Walend - * - * The XML plugin is licensed under the GNU General Public License, with - * the following exception: - * - * "Permission is granted to link this code with software released under - * the Apache license version 1.1, for example used by the Xerces XML - * parser package." - */ - -package xml.parser; - -//{{{ Imports -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Stack; -import java.util.StringTokenizer; - -import javax.swing.text.Position; -import javax.swing.tree.DefaultMutableTreeNode; - -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.ext.DeclHandler; -import org.xml.sax.helpers.DefaultHandler; -import org.apache.xerces.impl.xs.XSDDescription; -import org.apache.xerces.impl.xs.XSParticleDecl; -import org.apache.xerces.util.SymbolTable; -import org.apache.xerces.util.XMLGrammarPoolImpl; -import org.apache.xerces.xni.grammars.Grammar; -import org.apache.xerces.xni.grammars.XSGrammar; -import org.apache.xerces.xs.XSAttributeDeclaration; -import org.apache.xerces.xs.XSAttributeUse; -import org.apache.xerces.xs.XSComplexTypeDefinition; -import org.apache.xerces.xs.XSSimpleTypeDefinition; -import org.apache.xerces.xs.StringList; -import org.apache.xerces.xs.XSConstants; -import org.apache.xerces.xs.XSElementDeclaration; -import org.apache.xerces.xs.XSModel; -import org.apache.xerces.xs.XSModelGroup; -import org.apache.xerces.xs.XSNamedMap; -import org.apache.xerces.xs.XSObject; -import org.apache.xerces.xs.XSObjectList; -import org.apache.xerces.xs.XSParticle; -import org.apache.xerces.xs.XSTerm; -import org.apache.xerces.xs.XSTypeDefinition; -import org.apache.xerces.xs.XSWildcard; -import org.gjt.sp.jedit.Buffer; -import org.gjt.sp.jedit.MiscUtilities; -import org.gjt.sp.util.Log; - -import errorlist.DefaultErrorSource; -import errorlist.ErrorSource; -import sidekick.SideKickParsedData; - -import xml.CatalogManager; -import xml.XmlParsedData; -import xml.XmlPlugin; -import xml.completion.CompletionInfo; -import xml.completion.ElementDecl; -import xml.completion.EntityDecl; -import xml.completion.IDDecl; -import xml.completion.XsdElementDecl; -//}}} -/** - * Eventually this will be replaced by XercesParserImpl. - * - */ -public class SAXParserImpl extends XmlParser -{ - //{{{ SAXParserImpl constructors - public SAXParserImpl() - { - super("xml"); - } - protected SAXParserImpl(String name) { - super(name); - } //}}} - - //{{{ parse() method - public SideKickParsedData parse(Buffer buffer, DefaultErrorSource errorSource) - { - stopped = false; - - String text; - - try - { - buffer.readLock(); - text = buffer.getText(0, buffer.getLength()); - } - finally - { - buffer.readUnlock(); - } - - if(text.length() == 0) - return new XmlParsedData(buffer.getName(), false); - - XmlParsedData data = new XmlParsedData(buffer.getName(), false); - - SymbolTable symbolTable = new SymbolTable(); - XMLGrammarPoolImpl grammarPool = new XMLGrammarPoolImpl(); - - Handler handler = new Handler(buffer, text, errorSource, data, grammarPool); - - XMLReader reader = new org.apache.xerces.parsers.SAXParser(symbolTable,grammarPool); - try - { - reader.setFeature("http://xml.org/sax/features/validation", - buffer.getBooleanProperty("xml.validate")); - reader.setFeature("http://apache.org/xml/features/validation/dynamic", true); - reader.setFeature("http://apache.org/xml/features/validation/schema", - buffer.getBooleanProperty("xml.validate")); - reader.setFeature("http://xml.org/sax/features/namespaces", true); - //reader.setFeature("http://apache.org/xml/features/continue-after-fatal-error",true); - reader.setErrorHandler(handler); - reader.setEntityResolver(handler); - reader.setContentHandler(handler); - reader.setProperty("http://xml.org/sax/properties/declaration-handler", handler); - } - catch(SAXException se) - { - Log.log(Log.ERROR,this,se); - } - - //TODO - CompletionInfo info = CompletionInfo.getCompletionInfoForBuffer( - buffer); - if(info != null) - data.setCompletionInfo("",info); - - InputSource source = new InputSource(); - - String rootDocument = buffer.getStringProperty("xml.root"); - if(rootDocument != null) - { - Log.log(Log.NOTICE,this,"rootDocument specified; " - + "parsing " + rootDocument); - rootDocument = MiscUtilities.constructPath( - MiscUtilities.getParentOfPath( - buffer.getPath()),rootDocument); - if (rootDocument.startsWith("/") || rootDocument.startsWith("\\")) - rootDocument = "file://" + rootDocument; - else if (':' == rootDocument.charAt(1)) - rootDocument = "file:///" + rootDocument; - source.setSystemId(rootDocument); - } - else - { - source.setCharacterStream(new StringReader(text)); - source.setSystemId(buffer.getPath()); - } - - try - { - reader.parse(source); - } - catch(StoppedException e) - { - } - catch(IOException ioe) - { - Log.log(Log.ERROR,this,ioe); - errorSource.addError( - ErrorSource.ERROR, buffer.getPath(), 0, 0, 0, ioe.toString()); - } - catch(SAXParseException se) - { - /* Handled by Handler already, we can ignore it */ - /* - Log.log(Log.ERROR,this,se.getException()); - - if(se.getMessage() != null) - { - errorSource.addError( - ErrorSource.ERROR,buffer.getPath(), se.getLineNumber()-1, se.getColumnNumber(), 0, se.getMessage()); - } - */ - } - catch(Exception e) - { - Log.log(Log.ERROR,this,e); - } - - Collections.sort(data.ids, new IDDecl.Compare()); - - return data; - } //}}} - - //{{{ Private members - - //{{{ xsElementToElementDecl() method - private void xsElementToElementDecl(CompletionInfo info, - XSElementDeclaration element, ElementDecl parent) - { - String name = element.getName(); - - if(parent != null) - { - if(parent.content == null) - parent.content = new HashSet(); - parent.content.add(name); - } - - if(info.elementHash.get(name) != null) - return; - - - ElementDecl elementDecl = new XsdElementDecl(element, info, name, null); - info.addElement(elementDecl); - XSTypeDefinition typedef = element.getTypeDefinition(); - - if(typedef.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) - { - XSComplexTypeDefinition complex = (XSComplexTypeDefinition)typedef; - - XSParticle particle = complex.getParticle(); - if(particle != null) - { - XSTerm particleTerm = particle.getTerm(); - if(particleTerm instanceof XSWildcard) - elementDecl.any = true; - else - xsTermToElementDecl(info,particleTerm,elementDecl); - } - - XSObjectList attributes = complex.getAttributeUses(); - for(int i = 0; i < attributes.getLength(); i++) - { - XSAttributeUse attr = (XSAttributeUse) - attributes.item(i); - boolean required = attr.getRequired(); - XSAttributeDeclaration decl = attr.getAttrDeclaration(); - String attrName = decl.getName(); - String value = decl.getConstraintValue(); - XSSimpleTypeDefinition typeDef = decl.getTypeDefinition(); - String type = typeDef.getName(); - StringList valueStringList = typeDef.getLexicalEnumeration(); - ArrayList values = new ArrayList(); - for (int j = 0; j < valueStringList.getLength(); j++) { - values.add(valueStringList.item(j)); - } - if(type == null) - type = "CDATA"; - elementDecl.addAttribute(new ElementDecl.AttributeDecl( - attrName,value,values,type,required)); - } - } - } //}}} - - //{{{ xsTermToElementDecl() method - private void xsTermToElementDecl(CompletionInfo info, XSTerm term, - ElementDecl parent) - { - if(term instanceof XSElementDeclaration) - { - xsElementToElementDecl(info, - (XSElementDeclaration)term, - parent); - } - else if(term instanceof XSModelGroup) - { - XSObjectList content = ((XSModelGroup)term).getParticles(); - for(int i = 0; i < content.getLength(); i++) - { - XSTerm childTerm = ((XSParticleDecl)content.item(i)).getTerm(); - xsTermToElementDecl(info,childTerm,parent); - } - } - } - //}}} - - //}}} - - //{{{ Handler class - class Handler extends DefaultHandler implements DeclHandler - { - Buffer buffer; - - DefaultErrorSource errorSource; - String text; - XmlParsedData data; - XMLGrammarPoolImpl grammarPool; - - HashMap<String, String> activePrefixes; - Stack currentNodeStack; - Locator loc; - boolean empty; - - //{{{ Handler constructor - Handler(Buffer buffer, String text, DefaultErrorSource errorSource, - XmlParsedData data, XMLGrammarPoolImpl grammarPool) - { - this.buffer = buffer; - this.text = text; - this.errorSource = errorSource; - this.data = data; - this.grammarPool = grammarPool; - this.activePrefixes = new HashMap<String, String>(); - this.currentNodeStack = new Stack(); - this.empty = true; - - } //}}} - - //{{{ addError() method - private void addError(int type, String uri, int line, String message) - { - try { - String resolved = XmlPlugin.uriToFile(uri); - if (resolved != null) uri = resolved; - } - catch (Exception e) {} - errorSource.addError(type, uri, line, 0, 0, message); - } //}}} - - //{{{ getGrammarForNamespace() method - private Grammar getGrammarForNamespace(String uri) - { - XSDDescription schemaDesc = new XSDDescription(); - schemaDesc.setTargetNamespace(uri); - Grammar grammar = grammarPool.getGrammar(schemaDesc); - return grammar; - } //}}} - - //{{{ grammarToCompletionInfo() method - private CompletionInfo grammarToCompletionInfo(Grammar grammar) - { - if(!(grammar instanceof XSGrammar)) - return null; - - CompletionInfo info = new CompletionInfo(); - - XSModel model = ((XSGrammar)grammar).toXSModel(); - - XSNamedMap elements = model.getComponents(XSConstants.ELEMENT_DECLARATION); - for(int i = 0; i < elements.getLength(); i++) - { - XSElementDeclaration element = (XSElementDeclaration) - elements.item(i); - - xsElementToElementDecl(info,element,null); - } - - XSNamedMap attributes = model.getComponents(XSConstants.ATTRIBUTE_DECLARATION); - for(int i = 0; i < attributes.getLength(); i++) - { - XSObject attribute = attributes.item(i); - System.err.println("look! " + attribute.getName()); - } - - return info; - } //}}} - - //{{{ endDocument() method - public void endDocument() throws SAXException - { - Grammar grammar = getGrammarForNamespace(null); - - if(grammar != null) - { - CompletionInfo info = grammarToCompletionInfo(grammar); - if(info != null) - data.setCompletionInfo("",info); - } - } //}}} - - //{{{ setDocumentLocator() method - public void setDocumentLocator(Locator locator) - { - loc = locator; - } //}}} - - //{{{ resolveEntity() method - public InputSource resolveEntity(String publicId, String systemId) - throws SAXException - { - InputSource source = null; - - try - { - source = CatalogManager.resolve( - loc.getSystemId(),publicId,systemId); - } - catch(SAXException s) - { - errorSource.addError(ErrorSource.ERROR, - buffer.getPath(), - Math.max(0,loc.getLineNumber()-1),0,0, - s.getMessage()); - } - catch(Exception e) - { - error(new SAXParseException(e.toString(),loc)); - } - - if(source == null) - { - Log.log(Log.DEBUG,this,"PUBLIC=" + publicId - + ", SYSTEM=" + systemId - + " cannot be resolved"); - InputSource dummy = new InputSource(new StringReader("<!-- -->")); - dummy.setSystemId(systemId); - dummy.setPublicId(publicId); - return dummy; - } - else - { - Log.log(Log.DEBUG,this,"PUBLIC=" + publicId - + ", SYSTEM=" + systemId - + " resolved to " + source.getSystemId()); - return source; - } - } //}}} - - //{{{ startPrefixMapping() method - public void startPrefixMapping(String prefix, String uri) - { - activePrefixes.put(prefix, uri); - } //}}} - - //{{{ endPrefixMapping() method - public void endPrefixMapping(String prefix) - { - String uri = (String)activePrefixes.get(prefix); - // check for built-in completion info for this URI - // (eg, XSL, XSD, XHTML has this). - if(uri != null) - { - CompletionInfo info = CompletionInfo - .getCompletionInfoForNamespace(uri); - if(info != null) - { - data.setCompletionInfo(prefix,info); - return; - } - } - - Grammar grammar = getGrammarForNamespace(uri); - - if(grammar != null) - { - CompletionInfo info = grammarToCompletionInfo(grammar); - if(info != null) - data.setCompletionInfo(prefix,info); - } - } //}}} - - //{{{ startElement() method - public void startElement(String namespaceURI, - String lName, // local name - String qName, // qualified name - Attributes attrs) throws SAXException - { - if(stopped) - throw new StoppedException(); - - empty = true; - - String currentURI = XmlPlugin.uriToFile(loc.getSystemId()); - - if(!buffer.getPath().equals(currentURI)) - return; - - // what do we do in this case? - if(loc.getLineNumber() == -1) - return; - - // add all attributes with type "ID" to the ids vector - for(int i = 0; i < attrs.getLength(); i++) - { - if(attrs.getType(i).equals("ID") - || attrs.getLocalName(i).equalsIgnoreCase("id")) - { - data.ids.add(new IDDecl(currentURI, - attrs.getValue(i),qName, - loc.getLineNumber() - 1, - loc.getColumnNumber() - 1)); - } - } - - buffer.readLock(); - - try - { - int line = Math.min(buffer.getLineCount() - 1, - loc.getLineNumber() - 1); - int column = loc.getColumnNumber() - 1; - int offset = Math.min(text.length() - 1, - buffer.getLineStartOffset(line) - + column - 1); - - offset = findTagStart(offset); - Position pos = buffer.createPosition(offset); - - DefaultMutableTreeNode newNode = new DefaultMutableTreeNode( - new XmlTag(qName,pos,attrs)); - - if(!currentNodeStack.isEmpty()) - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) - currentNodeStack.peek(); - - node.insert(newNode,node.getChildCount()); - } - else - data.root.insert(newNode,0); - - currentNodeStack.push(newNode); - } - finally - { - buffer.readUnlock(); - } - } //}}} - - //{{{ endElement() method - public void endElement(String namespaceURI, - String sName, // simple name - String qName // qualified name - ) throws SAXException - { - if(stopped) - throw new StoppedException(); - - if(!buffer.getPath().equals(XmlPlugin.uriToFile(loc.getSystemId()))) - return; - - // what do we do in this case? - if(loc.getLineNumber() == -1) - return; - - buffer.readLock(); - - try - { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) - currentNodeStack.peek(); - XmlTag tag = (XmlTag)node.getUserObject(); - if(tag.getName().equals(qName)) - { - int line = Math.min(buffer.getLineCount() - 1, - loc.getLineNumber() - 1); - int column = loc.getColumnNumber() - 1; - int offset = Math.min(buffer.getLength(), - buffer.getLineStartOffset(line) - + column); - - tag.setEnd(buffer.createPosition(offset)); - tag.empty = empty; - currentNodeStack.pop(); - } - } - finally - { - buffer.readUnlock(); - } - - empty = false; - } //}}} - - //{{{ characters() method - public void characters (char ch[], int start, int length) - throws SAXException - { - if(stopped) - throw new StoppedException(); - - empty = false; - } //}}} - - //{{{ error() method - public void error(SAXParseException spe) - { - String systemId = spe.getSystemId(); - if(systemId == null) - systemId = buffer.getPath(); - addError(ErrorSource.ERROR, spe.getSystemId(), - Math.max(0, spe.getLineNumber()-1), spe.getMessage()); - } //}}} - - //{{{ warning() method - public void warning(SAXParseException spe) - { - String systemId = spe.getSystemId(); - if(systemId == null) - systemId = buffer.getPath(); - addError(ErrorSource.WARNING,spe.getSystemId(), - Math.max(0,spe.getLineNumber()-1), - spe.getMessage()); - } //}}} - - //{{{ fatalError() method - public void fatalError(SAXParseException spe) - throws SAXParseException - { - String systemId = spe.getSystemId(); - if(systemId == null) - systemId = buffer.getPath(); - addError(ErrorSource.ERROR, systemId, - Math.max(0, spe.getLineNumber()-1), spe.getMessage()); - } //}}} - - //{{{ elementDecl() method - public void elementDecl(String name, String model) - { - ElementDecl element = data.getElementDecl(name); - if(element == null) - { - CompletionInfo info = data.getNoNamespaceCompletionInfo(); - element = new ElementDecl(info,name,model); - info.addElement(element); - } - else - element.setContent(model); - } //}}} - - //{{{ attributeDecl() method - public void attributeDecl(String eName, String aName, - String type, String valueDefault, String value) - { - ElementDecl element = data.getElementDecl(eName); - if(element == null) - { - CompletionInfo info = data.getNoNamespaceCompletionInfo(); - element = new ElementDecl(info,eName,null); - info.addElement(element); - } - - // as per the XML spec - if(element.getAttribute(aName) != null) - return; - - ArrayList values; - - if(type.startsWith("(")) - { - values = new ArrayList(); - - StringTokenizer st = new StringTokenizer( - type.substring(1,type.length() - 1),"|"); - while(st.hasMoreTokens()) - { - values.add(st.nextToken()); - } - } - else - values = null; - - boolean required = "#REQUIRED".equals(valueDefault); - - element.addAttribute(new ElementDecl.AttributeDecl( - aName,value,values,type,required)); - } //}}} - - //{{{ internalEntityDecl() method - public void internalEntityDecl(String name, String value) - { - // this is a bit of a hack - if(name.startsWith("%")) - return; - - data.getNoNamespaceCompletionInfo() - .addEntity(EntityDecl.INTERNAL,name,value); - } //}}} - - //{{{ externalEntityDecl() method - public void externalEntityDecl(String name, String publicId, - String systemId) - { - if(name.startsWith("%")) - return; - - data.getNoNamespaceCompletionInfo() - .addEntity(EntityDecl.EXTERNAL,name, - publicId,systemId); - } //}}} - - //{{{ findTagStart() method - private int findTagStart(int offset) - { - for(int i = offset; i >= 0; i--) - { - if(text.charAt(i) == '<') - return i; - } - - return 0; - } //}}} - } //}}} - - //{{{ StoppedException class - static class StoppedException extends SAXException - { - StoppedException() - { - super("Parsing stopped"); - } - } //}}} -} Modified: plugins/XML/branches/relax-ng/xml/parser/XercesParserImpl.java =================================================================== --- plugins/XML/branches/relax-ng/xml/parser/XercesParserImpl.java 2009-05-23 13:50:43 UTC (rev 15335) +++ plugins/XML/branches/relax-ng/xml/parser/XercesParserImpl.java 2009-05-25 20:54:23 UTC (rev 15336) @@ -77,7 +77,7 @@ public class XercesParserImpl extends XmlParser { - //{{{ SAXParserImpl constructor + //{{{ XercesParserImpl constructor public XercesParserImpl() { super("xml"); @@ -110,7 +110,7 @@ XMLReader reader = null; try { - // One has to explicitly require the parser from XercesPlugin, otherwise + // One has to explicitely require the parser from XercesPlugin, otherwise // one gets the crimson version bundled in the JRE and the rest fails // miserably (at least on Mac OS X, JDK 5) reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); @@ -422,8 +422,8 @@ public InputSource resolveEntity (String name, String publicId, String baseURI, String systemId) throws SAXException, java.io.IOException { - Log.log(Log.DEBUG,this,"resolveEntity PUBLIC=" + publicId - + ", SYSTEM=" + systemId); + Log.log(Log.DEBUG,this,"resolveEntity("+name+","+publicId+","+baseURI+","+systemId+")"); + InputSource source = null; try { @@ -769,6 +769,7 @@ */ public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { + Log.log(Log.DEBUG,XercesParserImpl.class,"simple resolveEnt("+publicId+","+systemId+")"); return resolveEntity(null, publicId, null, systemId); } } //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |