home *** CD-ROM | disk | FTP | other *** search
/ Online Today 2000 January / Onto0100.iso / pc / JAVA / MSJAVX86.EXE / xmldso.cab / com / ms / xml / dso / XMLDSO.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-05  |  10.0 KB  |  598 lines

  1. package com.ms.xml.dso;
  2.  
  3. import com.ms.com.ComLib;
  4. import com.ms.com.ComSuccessException;
  5. import com.ms.osp.DataSourceListener;
  6. import com.ms.osp.OLEDBSimpleProvider;
  7. import com.ms.osp.OLEDBSimpleProviderListener;
  8. import com.ms.xml.om.Document;
  9. import com.ms.xml.om.Element;
  10. import com.ms.xml.om.ElementEnumeration;
  11. import com.ms.xml.util.Name;
  12. import com.ms.xml.util.StringInputStream;
  13. import com.ms.xml.util.XMLOutputStream;
  14. import java.applet.Applet;
  15. import java.awt.Color;
  16. import java.awt.Component;
  17. import java.awt.Dimension;
  18. import java.awt.FontMetrics;
  19. import java.awt.Graphics;
  20. import java.io.ByteArrayOutputStream;
  21. import java.io.FileOutputStream;
  22. import java.net.URL;
  23. import java.util.Enumeration;
  24. import java.util.TooManyListenersException;
  25. import java.util.Vector;
  26. import netscape.javascript.JSObject;
  27.  
  28. public class XMLDSO extends Applet {
  29.    private XMLRowsetProvider myProvider;
  30.    private DataSourceListener myDSL;
  31.    private Document document = new Document();
  32.    private Document schema;
  33.    private Element schemaRoot;
  34.    private String error;
  35.    private URL url;
  36.    private boolean loaded = false;
  37.    private boolean inlineXML = false;
  38.    static Vector providers = new Vector();
  39.  
  40.    public void saveSchema(String var1) {
  41.       if (this.schema != null) {
  42.          try {
  43.             FileOutputStream var2 = new FileOutputStream(var1);
  44.             this.schema.save(new XMLOutputStream(var2));
  45.             return;
  46.          } catch (Exception var3) {
  47.             this.setError(((Throwable)var3).toString());
  48.          }
  49.       }
  50.  
  51.    }
  52.  
  53.    int getColumn(Element var1, Element var2) {
  54.       int var3 = 0;
  55.       String var4 = var2.getTagName().toString();
  56.       Enumeration var5 = var1.getElements();
  57.  
  58.       while(var5.hasMoreElements()) {
  59.          ++var3;
  60.          Element var6 = (Element)var5.nextElement();
  61.          String var7 = var6.getAttribute("NAME").toString();
  62.          if (var7.equals(var4)) {
  63.             return var3;
  64.          }
  65.       }
  66.  
  67.       this.setError(var4 + " not found in schema.");
  68.       return 0;
  69.    }
  70.  
  71.    public Object getXML(int var1) {
  72.       if (this.document != null) {
  73.          ByteArrayOutputStream var2 = new ByteArrayOutputStream();
  74.  
  75.          try {
  76.             XMLOutputStream var3 = new XMLOutputStream(var2);
  77.             var3.setOutputStyle(var1);
  78.             this.document.save(var3);
  79.          } catch (Exception var4) {
  80.             this.setError(((Throwable)var4).toString());
  81.          }
  82.  
  83.          return var2.toString();
  84.       } else {
  85.          return null;
  86.       }
  87.    }
  88.  
  89.    private boolean isWhiteSpace(char var1) {
  90.       return Character.isSpace(var1) || var1 == '\r';
  91.    }
  92.  
  93.    void notifyNewRow(Element var1, boolean var2) {
  94.       Enumeration var3 = providers.elements();
  95.  
  96.       while(var3.hasMoreElements()) {
  97.          XMLRowsetProvider var4 = (XMLRowsetProvider)var3.nextElement();
  98.          XMLRowsetProvider var5 = var4.findChildProvider(var1);
  99.          if (var5 != null) {
  100.             OLEDBSimpleProviderListener var6 = var5.getListener();
  101.             if (var6 != null) {
  102.                int var7 = var2 ? var4.getRowCount() : 1;
  103.  
  104.                try {
  105.                   var6.aboutToInsertRows(var7, 1);
  106.                } catch (ComSuccessException var8) {
  107.                }
  108.  
  109.                var6.insertedRows(var7, 1);
  110.             }
  111.          }
  112.       }
  113.  
  114.    }
  115.  
  116.    public void load(String var1) {
  117.       URL var2 = ((Applet)this).getDocumentBase();
  118.       this.loaded = false;
  119.  
  120.       try {
  121.          if (var2 == null) {
  122.             this.url = new URL(var1);
  123.          } else {
  124.             this.url = new URL(var2, var1);
  125.          }
  126.  
  127.          this.document.load(this.url.toString());
  128.          this.loaded = true;
  129.       } catch (Exception var4) {
  130.          this.setError("Error loading XML document '" + var1 + "'.  " + ((Throwable)var4).toString());
  131.       }
  132.  
  133.       if (this.loaded && this.schema != null) {
  134.          this.updateSchema();
  135.       }
  136.  
  137.    }
  138.  
  139.    public void save(String var1) {
  140.       if (this.document != null) {
  141.          try {
  142.             FileOutputStream var2 = new FileOutputStream(var1);
  143.             this.document.save(this.document.createOutputStream(var2));
  144.             return;
  145.          } catch (Exception var3) {
  146.             this.setError(((Throwable)var3).toString());
  147.          }
  148.       }
  149.  
  150.    }
  151.  
  152.    public void addDataSourceListener(DataSourceListener var1) throws TooManyListenersException {
  153.       if (this.myDSL != null) {
  154.          ComLib.release(this.myDSL);
  155.       }
  156.  
  157.       this.myDSL = var1;
  158.    }
  159.  
  160.    void notifyCellChanged(int var1, Element var2, Element var3) {
  161.       long var4 = 0L;
  162.       Enumeration var6 = providers.elements();
  163.  
  164.       while(var6.hasMoreElements()) {
  165.          XMLRowsetProvider var7 = (XMLRowsetProvider)var6.nextElement();
  166.  
  167.          for(Element var8 = var2; var8 != null; var8 = var8.getParent()) {
  168.             XMLRowsetProvider var9 = var7.findChildProvider(var8);
  169.             if (var9 != null) {
  170.                ++var4;
  171.                OLEDBSimpleProviderListener var10 = var9.getListener();
  172.                if (var10 != null) {
  173.                   int var11 = this.getColumn(var9.getSchema(), var3);
  174.                   if (var11 != 0) {
  175.                      var10.aboutToChangeCell(var1, var11);
  176.                      var10.cellChanged(var1, var11);
  177.                      return;
  178.                   }
  179.                }
  180.             }
  181.          }
  182.       }
  183.  
  184.    }
  185.  
  186.    public Document parseXML(String var1) {
  187.       Document var2 = new Document();
  188.       if (var1 == null) {
  189.          return var2;
  190.       } else {
  191.          try {
  192.             var2.load(new StringInputStream(var1));
  193.          } catch (Exception var4) {
  194.             this.setError("Caught exception parsing given XML.  " + ((Throwable)var4).toString());
  195.          }
  196.  
  197.          return var2;
  198.       }
  199.    }
  200.  
  201.    void notifyRemovedRow(Element var1, int var2) {
  202.       Enumeration var3 = providers.elements();
  203.  
  204.       while(var3.hasMoreElements()) {
  205.          XMLRowsetProvider var4 = (XMLRowsetProvider)var3.nextElement();
  206.          XMLRowsetProvider var5 = var4.findChildProvider(var1);
  207.          if (var5 != null) {
  208.             OLEDBSimpleProviderListener var6 = var5.getListener();
  209.             if (var6 != null) {
  210.                try {
  211.                   var6.aboutToDeleteRows(var2, 1);
  212.                } catch (ComSuccessException var7) {
  213.                }
  214.  
  215.                var6.deletedRows(var2, 1);
  216.             }
  217.          }
  218.       }
  219.  
  220.    }
  221.  
  222.    boolean updateTree(Element var1, Element var2) {
  223.       int var3 = var2.getType();
  224.       if (var3 != 2 && var3 != 5 && var3 != 12) {
  225.          if (var3 != 1 && var3 != 11) {
  226.             String var4 = (String)var2.getAttribute("UPDATE-ACTION");
  227.             if (var4 == null || !var4.equalsIgnoreCase("APPEND") && !var4.equalsIgnoreCase("INSERT")) {
  228.                int var16 = var2.numElements();
  229.                if (var16 > 0) {
  230.                   int var6 = 0;
  231.                   ElementEnumeration var7 = new ElementEnumeration(var1, var2.getTagName(), 0);
  232.  
  233.                   while(var7.hasMoreElements()) {
  234.                      ++var6;
  235.                      Element var8 = (Element)var7.nextElement();
  236.                      Vector var9 = new Vector();
  237.                      boolean var10 = false;
  238.                      ElementEnumeration var11 = new ElementEnumeration(var2);
  239.  
  240.                      while(var11.hasMoreElements()) {
  241.                         Element var12 = (Element)var11.nextElement();
  242.                         String var13 = (String)var12.getAttribute("UPDATE-ACTION");
  243.                         if (var13 != null && !var13.equalsIgnoreCase("APPEND") && !var13.equalsIgnoreCase("INSERT") && !var13.equalsIgnoreCase("REMOVE")) {
  244.                            var9.addElement(var12);
  245.                         } else {
  246.                            var10 = this.updateTree(var8, var12);
  247.                            if (!var10) {
  248.                               break;
  249.                            }
  250.                         }
  251.                      }
  252.  
  253.                      if (var10) {
  254.                         if (var4 != null && var4.equalsIgnoreCase("REMOVE")) {
  255.                            var1.removeChild(var8);
  256.                            this.notifyRemovedRow(var1, var6);
  257.                            return true;
  258.                         }
  259.  
  260.                         Enumeration var17 = var9.elements();
  261.  
  262.                         while(var17.hasMoreElements()) {
  263.                            Element var18 = (Element)var17.nextElement();
  264.                            String var19 = (String)var18.getAttribute("UPDATE-ACTION");
  265.                            var18.removeAttribute("UPDATE-ACTION");
  266.                            if (var19.equalsIgnoreCase("REPLACE")) {
  267.                               ElementEnumeration var14 = new ElementEnumeration(var8, var18.getTagName(), 0);
  268.                               Element var15 = (Element)var14.nextElement();
  269.                               var8.addChild(var18, var15);
  270.                               if (var15 != null) {
  271.                                  var8.removeChild(var15);
  272.                               }
  273.  
  274.                               var8.setParent(var1);
  275.                               this.notifyCellChanged(var6, var8, var18);
  276.                            }
  277.                         }
  278.  
  279.                         return true;
  280.                      }
  281.                   }
  282.                }
  283.  
  284.                return false;
  285.             } else {
  286.                var2.removeAttribute("UPDATE-ACTION");
  287.                boolean var5 = var4.equalsIgnoreCase("APPEND");
  288.                if (var5) {
  289.                   var1.addChild(var2, (Element)null);
  290.                } else {
  291.                   var1.addChild(var2, 0, 0);
  292.                }
  293.  
  294.                this.notifyNewRow(var1, var5);
  295.                return true;
  296.             }
  297.          } else {
  298.             return var1.getText().equals(var2.getText());
  299.          }
  300.       } else {
  301.          return true;
  302.       }
  303.    }
  304.  
  305.    public void asyncLoad(String var1, String var2) {
  306.       this.document = null;
  307.  
  308.       try {
  309.          URL var3 = new URL(((Applet)this).getDocumentBase(), var1);
  310.          this.document = new Document();
  311.          JSObject var4 = JSObject.getWindow(this);
  312.          XMLParserThread var5 = new XMLParserThread(var3, var4, var2);
  313.          ((Thread)var5).start();
  314.       } catch (Exception var6) {
  315.          this.setError("Error loading document '" + var1 + "'.  " + ((Throwable)var6).toString());
  316.       }
  317.    }
  318.  
  319.    public void handleUpdate(Element var1) {
  320.       if (this.document == null) {
  321.          this.document = new Document();
  322.          this.document.addChild(var1, (Element)null);
  323.          this.updateSchema();
  324.       } else {
  325.          try {
  326.             Element var2 = this.document.getRoot();
  327.             ElementEnumeration var3 = new ElementEnumeration(var1);
  328.  
  329.             while(var3.hasMoreElements()) {
  330.                Element var4 = (Element)var3.nextElement();
  331.                this.updateTree(var2, var4);
  332.             }
  333.  
  334.          } catch (Exception var5) {
  335.             this.setError("HandleUpdate error: " + ((Throwable)var5).toString());
  336.          }
  337.       }
  338.    }
  339.  
  340.    public Object getDocument() {
  341.       return this.document;
  342.    }
  343.  
  344.    void generateSchema(Element var1, SchemaNode var2) {
  345.       ElementEnumeration var3 = new ElementEnumeration(var1);
  346.  
  347.       while(var3.hasMoreElements()) {
  348.          Element var4 = (Element)var3.nextElement();
  349.          int var5 = var4.getType();
  350.          Name var6 = var4.getTagName();
  351.          if (var5 == 0) {
  352.             SchemaNode var7 = var2.setRow(var6);
  353.             this.generateSchema(var4, var7);
  354.          }
  355.       }
  356.  
  357.       if (var2.e == null) {
  358.          var2.createElement(false);
  359.       }
  360.  
  361.    }
  362.  
  363.    public void paint(Graphics var1) {
  364.       Dimension var2 = ((Component)this).size();
  365.       if (var2.width > 0 && var2.height > 0) {
  366.          if (this.error == null) {
  367.             var1.setColor(Color.green);
  368.          } else {
  369.             var1.setColor(Color.red);
  370.          }
  371.  
  372.          var1.fillRect(0, 0, var2.width, var2.height);
  373.          String var3 = this.error;
  374.          if (var3 == null) {
  375.             if (this.url != null) {
  376.                var3 = "Successfully loaded XML from \"" + this.url.toString() + "\"";
  377.             } else if (this.inlineXML) {
  378.                var3 = "Successfully loaded inline XML";
  379.             } else if (this.document.getRoot() != null) {
  380.                var3 = "Successfully loaded document.";
  381.             } else {
  382.                var3 = "Empty";
  383.             }
  384.          }
  385.  
  386.          var1.setColor(Color.black);
  387.          this.drawText(var1, var3, 5, 5, var2.width - 10, true, 0);
  388.       }
  389.  
  390.    }
  391.  
  392.    public void setRoot(Element var1) {
  393.       this.document = new Document();
  394.       this.document.addChild(var1, (Element)null);
  395.       this.updateSchema();
  396.    }
  397.  
  398.    public void handleUpdateString(String var1) {
  399.       Document var2 = this.parseXML(var1);
  400.       this.handleUpdate(var2.getRoot());
  401.    }
  402.  
  403.    public void updateSchema() {
  404.       this.schema = new Document();
  405.       String var1 = ((Applet)this).getParameter("SCHEMA");
  406.       if (var1 != null && var1.length() > 0) {
  407.          this.schema = this.parseXML(var1);
  408.          this.schemaRoot = this.schema.getRoot();
  409.       } else if (this.document != null && this.document.getRoot() != null) {
  410.          Element var2 = this.document.getRoot();
  411.          SchemaNode var3 = new SchemaNode(this.schema, this.schema, var2.getTagName());
  412.          this.generateSchema(var2, var3);
  413.          ElementEnumeration var4 = new ElementEnumeration(this.schema.getRoot(), XMLRowsetProvider.nameROWSET, 0);
  414.          this.schemaRoot = (Element)var4.nextElement();
  415.       }
  416.  
  417.       this.notifyListeners();
  418.    }
  419.  
  420.    public void removeDataSourceListener(DataSourceListener var1) {
  421.       if (this.myDSL != null) {
  422.          ComLib.release(this.myDSL);
  423.       }
  424.  
  425.       this.myDSL = null;
  426.    }
  427.  
  428.    void removeProvider(XMLRowsetProvider var1) {
  429.       if (var1 != null) {
  430.          providers.removeElement(var1);
  431.       }
  432.  
  433.    }
  434.  
  435.    public OLEDBSimpleProvider msDataSourceObject(String var1) {
  436.       this.removeProvider(this.myProvider);
  437.       if (this.document != null && this.document.getRoot() != null && this.schemaRoot != null) {
  438.          this.myProvider = new XMLRowsetProvider(this.document.getRoot(), this.schemaRoot, this.document, (XMLRowsetProvider)null);
  439.       } else {
  440.          this.myProvider = null;
  441.       }
  442.  
  443.       this.addProvider(this.myProvider);
  444.       return this.myProvider;
  445.    }
  446.  
  447.    void addProvider(XMLRowsetProvider var1) {
  448.       if (var1 != null) {
  449.          providers.addElement(var1);
  450.       }
  451.  
  452.    }
  453.  
  454.    public void clear() {
  455.       this.document = new Document();
  456.       this.updateSchema();
  457.    }
  458.  
  459.    public void notifyListeners() {
  460.       if (this.myDSL != null) {
  461.          try {
  462.             this.myDSL.dataMemberChanged("");
  463.             return;
  464.          } catch (Exception var2) {
  465.             this.setError("Error notifying data members changed: " + ((Throwable)var2).toString());
  466.          }
  467.       }
  468.  
  469.    }
  470.  
  471.    public void init() {
  472.       super.init();
  473.       String var1 = ((Applet)this).getParameter("URL");
  474.       if (var1 != null && var1.length() > 0) {
  475.          this.load(var1);
  476.       } else {
  477.          this.loaded = true;
  478.          var1 = ((Applet)this).getParameter("ID");
  479.          if (var1 != null && var1.length() > 0) {
  480.             Object var2 = null;
  481.  
  482.             try {
  483.                var6 = (JSObject)((JSObject)JSObject.getWindow(this).getMember("document")).getMember(var1);
  484.             } catch (Exception var4) {
  485.                this.setError("Error finding <APPLET> with ID=" + var1 + ": " + ((Throwable)var4).toString());
  486.                return;
  487.             }
  488.  
  489.             if (var6 != null) {
  490.                String var3 = (String)var6.getMember("altHtml");
  491.                if (var3 != null && var3.length() > 0) {
  492.                   this.document = this.parseXML(var3);
  493.                   this.inlineXML = true;
  494.                }
  495.             } else {
  496.                this.setError("Error finding <APPLET> with ID=" + var1);
  497.             }
  498.          } else {
  499.             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.");
  500.          }
  501.       }
  502.  
  503.       this.updateSchema();
  504.    }
  505.  
  506.    public String getError() {
  507.       return this.error;
  508.    }
  509.  
  510.    private void setError(String var1) {
  511.       this.error = var1;
  512.       ((Component)this).repaint();
  513.    }
  514.  
  515.    public Object getSchema(int var1) {
  516.       if (this.schema != null) {
  517.          ByteArrayOutputStream var2 = new ByteArrayOutputStream();
  518.  
  519.          try {
  520.             XMLOutputStream var3 = new XMLOutputStream(var2);
  521.             var3.setOutputStyle(var1);
  522.             this.schema.save(var3);
  523.          } catch (Exception var4) {
  524.             this.setError(((Throwable)var4).toString());
  525.          }
  526.  
  527.          return var2.toString();
  528.       } else {
  529.          return null;
  530.       }
  531.    }
  532.  
  533.    private int drawText(Graphics var1, String var2, int var3, int var4, int var5, boolean var6, int var7) {
  534.       if (var2 != null && var2.length() != 0) {
  535.          if (var5 < 5) {
  536.             return var4;
  537.          } else {
  538.             int var8 = 0;
  539.             int var10 = 0;
  540.             int var9;
  541.             if (var7 == 0) {
  542.                var9 = var2.length();
  543.             } else {
  544.                var9 = var7;
  545.             }
  546.  
  547.             while(var8 < var9 && var6 && this.isWhiteSpace(var2.charAt(var8))) {
  548.                ++var8;
  549.             }
  550.  
  551.             FontMetrics var11 = var1.getFontMetrics();
  552.             int var12 = var8;
  553.             int var13 = var8;
  554.  
  555.             while(var8 < var9) {
  556.                char var14 = var2.charAt(var8);
  557.                int var15 = var11.charWidth(var14);
  558.                var10 += var15;
  559.                if (var10 <= var5 && var14 != '\n') {
  560.                   if (var6 && this.isWhiteSpace(var14)) {
  561.                      var12 = var8;
  562.                   }
  563.  
  564.                   ++var8;
  565.                } else {
  566.                   if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') {
  567.                      var12 = var8 - 1;
  568.                   } else if (var13 == var12) {
  569.                      var12 = var8;
  570.                   }
  571.  
  572.                   String var16 = var2.substring(var13, var12);
  573.                   var1.drawString(var16, var3, var4 + var11.getMaxAscent());
  574.                   var4 += var11.getHeight();
  575.                   if (var14 == '\n' && var2.charAt(var8 - 1) == '\r') {
  576.                      var12 = var8 + 1;
  577.                   }
  578.  
  579.                   while(var6 && var12 < var9 && this.isWhiteSpace(var2.charAt(var12))) {
  580.                      ++var12;
  581.                   }
  582.  
  583.                   var8 = var12;
  584.                   var13 = var12;
  585.                   var10 = 0;
  586.                }
  587.             }
  588.  
  589.             String var17 = var2.substring(var13);
  590.             var1.drawString(var17, var3, var4 + var11.getMaxAscent());
  591.             return var4;
  592.          }
  593.       } else {
  594.          return var4;
  595.       }
  596.    }
  597. }
  598.