home *** CD-ROM | disk | FTP | other *** search
Wrap
package com.ms.xml.dso; import com.ms.com.ComLib; import com.ms.com.ComSuccessException; import com.ms.osp.DataSourceListener; import com.ms.osp.OLEDBSimpleProvider; import com.ms.osp.OLEDBSimpleProviderListener; import com.ms.xml.om.Document; import com.ms.xml.om.Element; import com.ms.xml.om.ElementEnumeration; import com.ms.xml.util.Name; import com.ms.xml.util.StringInputStream; import com.ms.xml.util.XMLOutputStream; import java.applet.Applet; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.net.URL; import java.util.Enumeration; import java.util.TooManyListenersException; import java.util.Vector; import netscape.javascript.JSObject; public class XMLDSO extends Applet { private XMLRowsetProvider myProvider; private DataSourceListener myDSL; private Document document = new Document(); private Document schema; private Element schemaRoot; private String error; private URL url; private boolean loaded = false; private boolean inlineXML = false; static Vector providers = new Vector(); public void saveSchema(String var1) { if (this.schema != null) { try { FileOutputStream var2 = new FileOutputStream(var1); this.schema.save(new XMLOutputStream(var2)); return; } catch (Exception var3) { this.setError(((Throwable)var3).toString()); } } } int getColumn(Element var1, Element var2) { int var3 = 0; String var4 = var2.getTagName().toString(); Enumeration var5 = var1.getElements(); while(var5.hasMoreElements()) { ++var3; Element var6 = (Element)var5.nextElement(); String var7 = var6.getAttribute("NAME").toString(); if (var7.equals(var4)) { return var3; } } this.setError(var4 + " not found in schema."); return 0; } public Object getXML(int var1) { if (this.document != null) { ByteArrayOutputStream var2 = new ByteArrayOutputStream(); try { XMLOutputStream var3 = new XMLOutputStream(var2); var3.setOutputStyle(var1); this.document.save(var3); } catch (Exception var4) { this.setError(((Throwable)var4).toString()); } return var2.toString(); } else { return null; } } private boolean isWhiteSpace(char var1) { return Character.isSpace(var1) || var1 == '\r'; } void notifyNewRow(Element var1, boolean var2) { Enumeration var3 = providers.elements(); while(var3.hasMoreElements()) { XMLRowsetProvider var4 = (XMLRowsetProvider)var3.nextElement(); XMLRowsetProvider var5 = var4.findChildProvider(var1); if (var5 != null) { OLEDBSimpleProviderListener var6 = var5.getListener(); if (var6 != null) { int var7 = var2 ? var4.getRowCount() : 1; try { var6.aboutToInsertRows(var7, 1); } catch (ComSuccessException var8) { } var6.insertedRows(var7, 1); } } } } public void load(String var1) { URL var2 = ((Applet)this).getDocumentBase(); this.loaded = false; try { if (var2 == null) { this.url = new URL(var1); } else { this.url = new URL(var2, var1); } this.document.load(this.url.toString()); this.loaded = true; } catch (Exception var4) { this.setError("Error loading XML document '" + var1 + "'. " + ((Throwable)var4).toString()); } if (this.loaded && this.schema != null) { this.updateSchema(); } } public void save(String var1) { if (this.document != null) { try { FileOutputStream var2 = new FileOutputStream(var1); this.document.save(this.document.createOutputStream(var2)); return; } catch (Exception var3) { this.setError(((Throwable)var3).toString()); } } } public void addDataSourceListener(DataSourceListener var1) throws TooManyListenersException { if (this.myDSL != null) { ComLib.release(this.myDSL); } this.myDSL = var1; } void notifyCellChanged(int var1, Element var2, Element var3) { long var4 = 0L; Enumeration var6 = providers.elements(); while(var6.hasMoreElements()) { XMLRowsetProvider var7 = (XMLRowsetProvider)var6.nextElement(); for(Element var8 = var2; var8 != null; var8 = var8.getParent()) { XMLRowsetProvider var9 = var7.findChildProvider(var8); if (var9 != null) { ++var4; OLEDBSimpleProviderListener var10 = var9.getListener(); if (var10 != null) { int var11 = this.getColumn(var9.getSchema(), var3); if (var11 != 0) { var10.aboutToChangeCell(var1, var11); var10.cellChanged(var1, var11); return; } } } } } } public Document parseXML(String var1) { Document var2 = new Document(); if (var1 == null) { return var2; } else { try { var2.load(new StringInputStream(var1)); } catch (Exception var4) { this.setError("Caught exception parsing given XML. " + ((Throwable)var4).toString()); } return var2; } } void notifyRemovedRow(Element var1, int var2) { Enumeration var3 = providers.elements(); while(var3.hasMoreElements()) { XMLRowsetProvider var4 = (XMLRowsetProvider)var3.nextElement(); XMLRowsetProvider var5 = var4.findChildProvider(var1); if (var5 != null) { OLEDBSimpleProviderListener var6 = var5.getListener(); if (var6 != null) { try { var6.aboutToDeleteRows(var2, 1); } catch (ComSuccessException var7) { } var6.deletedRows(var2, 1); } } } } boolean updateTree(Element var1, Element var2) { int var3 = var2.getType(); if (var3 != 2 && var3 != 5 && var3 != 12) { if (var3 != 1 && var3 != 11) { String var4 = (String)var2.getAttribute("UPDATE-ACTION"); if (var4 == null || !var4.equalsIgnoreCase("APPEND") && !var4.equalsIgnoreCase("INSERT")) { int var16 = var2.numElements(); if (var16 > 0) { int var6 = 0; ElementEnumeration var7 = new ElementEnumeration(var1, var2.getTagName(), 0); while(var7.hasMoreElements()) { ++var6; Element var8 = (Element)var7.nextElement(); Vector var9 = new Vector(); boolean var10 = false; ElementEnumeration var11 = new ElementEnumeration(var2); while(var11.hasMoreElements()) { Element var12 = (Element)var11.nextElement(); String var13 = (String)var12.getAttribute("UPDATE-ACTION"); if (var13 != null && !var13.equalsIgnoreCase("APPEND") && !var13.equalsIgnoreCase("INSERT") && !var13.equalsIgnoreCase("REMOVE")) { var9.addElement(var12); } else { var10 = this.updateTree(var8, var12); if (!var10) { break; } } } if (var10) { if (var4 != null && var4.equalsIgnoreCase("REMOVE")) { var1.removeChild(var8); this.notifyRemovedRow(var1, var6); return true; } Enumeration var17 = var9.elements(); while(var17.hasMoreElements()) { Element var18 = (Element)var17.nextElement(); String var19 = (String)var18.getAttribute("UPDATE-ACTION"); var18.removeAttribute("UPDATE-ACTION"); if (var19.equalsIgnoreCase("REPLACE")) { ElementEnumeration var14 = new ElementEnumeration(var8, var18.getTagName(), 0); Element var15 = (Element)var14.nextElement(); var8.addChild(var18, var15); if (var15 != null) { var8.removeChild(var15); } var8.setParent(var1); this.notifyCellChanged(var6, var8, var18); } } return true; } } } return false; } else { var2.removeAttribute("UPDATE-ACTION"); boolean var5 = var4.equalsIgnoreCase("APPEND"); if (var5) { var1.addChild(var2, (Element)null); } else { var1.addChild(var2, 0, 0); } this.notifyNewRow(var1, var5); return true; } } else { return var1.getText().equals(var2.getText()); } } else { return true; } } public void asyncLoad(String var1, String var2) { this.document = null; try { URL var3 = new URL(((Applet)this).getDocumentBase(), var1); this.document = new Document(); JSObject var4 = JSObject.getWindow(this); XMLParserThread var5 = new XMLParserThread(var3, var4, var2); ((Thread)var5).start(); } catch (Exception var6) { this.setError("Error loading document '" + var1 + "'. " + ((Throwable)var6).toString()); } } public void handleUpdate(Element var1) { if (this.document == null) { this.document = new Document(); this.document.addChild(var1, (Element)null); this.updateSchema(); } else { try { Element var2 = this.document.getRoot(); ElementEnumeration var3 = new ElementEnumeration(var1); while(var3.hasMoreElements()) { Element var4 = (Element)var3.nextElement(); this.updateTree(var2, var4); } } catch (Exception var5) { this.setError("HandleUpdate error: " + ((Throwable)var5).toString()); } } } public Object getDocument() { return this.document; } void generateSchema(Element var1, SchemaNode var2) { ElementEnumeration var3 = new ElementEnumeration(var1); while(var3.hasMoreElements()) { Element var4 = (Element)var3.nextElement(); int var5 = var4.getType(); Name var6 = var4.getTagName(); if (var5 == 0) { SchemaNode var7 = var2.setRow(var6); this.generateSchema(var4, var7); } } if (var2.e == null) { var2.createElement(false); } } public void paint(Graphics var1) { Dimension var2 = ((Component)this).size(); if (var2.width > 0 && var2.height > 0) { if (this.error == null) { var1.setColor(Color.green); } else { var1.setColor(Color.red); } var1.fillRect(0, 0, var2.width, var2.height); String var3 = this.error; if (var3 == null) { if (this.url != null) { var3 = "Successfully loaded XML from \"" + this.url.toString() + "\""; } else if (this.inlineXML) { var3 = "Successfully loaded inline XML"; } else if (this.document.getRoot() != null) { var3 = "Successfully loaded document."; } else { var3 = "Empty"; } } var1.setColor(Color.black); this.drawText(var1, var3, 5, 5, var2.width - 10, true, 0); } } public void setRoot(Element var1) { this.document = new Document(); this.document.addChild(var1, (Element)null); this.updateSchema(); } public void handleUpdateString(String var1) { Document var2 = this.parseXML(var1); this.handleUpdate(var2.getRoot()); } public void updateSchema() { this.schema = new Document(); String var1 = ((Applet)this).getParameter("SCHEMA"); if (var1 != null && var1.length() > 0) { this.schema = this.parseXML(var1); this.schemaRoot = this.schema.getRoot(); } else if (this.document != null && this.document.getRoot() != null) { Element var2 = this.document.getRoot(); SchemaNode var3 = new SchemaNode(this.schema, this.schema, var2.getTagName()); this.generateSchema(var2, var3); ElementEnumeration var4 = new ElementEnumeration(this.schema.getRoot(), XMLRowsetProvider.nameROWSET, 0); this.schemaRoot = (Element)var4.nextElement(); } this.notifyListeners(); } public void removeDataSourceListener(DataSourceListener var1) { if (this.myDSL != null) { ComLib.release(this.myDSL); } this.myDSL = null; } void removeProvider(XMLRowsetProvider var1) { if (var1 != null) { providers.removeElement(var1); } } public OLEDBSimpleProvider msDataSourceObject(String var1) { this.removeProvider(this.myProvider); if (this.document != null && this.document.getRoot() != null && this.schemaRoot != null) { this.myProvider = new XMLRowsetProvider(this.document.getRoot(), this.schemaRoot, this.document, (XMLRowsetProvider)null); } else { this.myProvider = null; } this.addProvider(this.myProvider); return this.myProvider; } void addProvider(XMLRowsetProvider var1) { if (var1 != null) { providers.addElement(var1); } } public void clear() { this.document = new Document(); this.updateSchema(); } public void notifyListeners() { if (this.myDSL != null) { try { this.myDSL.dataMemberChanged(""); return; } catch (Exception var2) { this.setError("Error notifying data members changed: " + ((Throwable)var2).toString()); } } } public void init() { super.init(); String var1 = ((Applet)this).getParameter("URL"); if (var1 != null && var1.length() > 0) { this.load(var1); } else { this.loaded = true; var1 = ((Applet)this).getParameter("ID"); if (var1 != null && var1.length() > 0) { Object var2 = null; try { var6 = (JSObject)((JSObject)JSObject.getWindow(this).getMember("document")).getMember(var1); } catch (Exception var4) { this.setError("Error finding <APPLET> with ID=" + var1 + ": " + ((Throwable)var4).toString()); return; } if (var6 != null) { String var3 = (String)var6.getMember("altHtml"); if (var3 != null && var3.length() > 0) { this.document = this.parseXML(var3); this.inlineXML = true; } } else { this.setError("Error finding <APPLET> with ID=" + var1); } } else { this.setError("No PARAM with NAME=URL was found, so perhaps you specified the XML inside the APPET tag but in order for this to work you must also specify <PARAM NAME=\"APPLET\" VALUE=\"xmldso\"> where the value matches the ID of your APPLET tag."); } } this.updateSchema(); } public String getError() { return this.error; } private void setError(String var1) { this.error = var1; ((Component)this).repaint(); } public Object getSchema(int var1) { if (this.schema != null) { ByteArrayOutputStream var2 = new ByteArrayOutputStream(); try { XMLOutputStream var3 = new XMLOutputStream(var2); var3.setOutputStyle(var1); this.schema.save(var3); } catch (Exception var4) { this.setError(((Throwable)var4).toString()); } return var2.toString(); } else { return null; } } private int drawText(Graphics var1, String var2, int var3, int var4, int var5, boolean var6, int var7) { if (var2 != null && var2.length() != 0) { if (var5 < 5) { return var4; } else { int var8 = 0; int var10 = 0; int var9; if (var7 == 0) { var9 = var2.length(); } else { var9 = var7; } while(var8 < var9 && var6 && this.isWhiteSpace(var2.charAt(var8))) { ++var8; } FontMetrics var11 = var1.getFontMetrics(); int var12 = var8; int var13 = var8; while(var8 < var9) { char var14 = var2.charAt(var8); int var15 = var11.charWidth(var14); var10 += var15; if (var10 <= var5 && var14 != '\n') { if (var6 && this.isWhiteSpace(var14)) { var12 = var8; } ++var8; } else { if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') { var12 = var8 - 1; } else if (var13 == var12) { var12 = var8; } String var16 = var2.substring(var13, var12); var1.drawString(var16, var3, var4 + var11.getMaxAscent()); var4 += var11.getHeight(); if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') { var12 = var8 + 1; } while(var6 && var12 < var9 && this.isWhiteSpace(var2.charAt(var12))) { ++var12; } var8 = var12; var13 = var12; var10 = 0; } } String var17 = var2.substring(var13); var1.drawString(var17, var3, var4 + var11.getMaxAscent()); return var4; } } else { return var4; } } }