XQueryImpl.jcs Sample

This topic inludes the source code for the XQueryImpl.jcs Sample.

Sample Location

This sample is located in the following directory in your WebLogic Workshop installation:

BEA_HOME/weblogic81/samples/workshop/ExtensionDevKit/ControlDevKit/ControlFeatures/jcxCreate/

Sample Source Code


001 package jcxCreate; 
002 
003 import com.bea.control.*;
004 import com.bea.xml.XmlCursor;
005 import com.bea.xml.XmlObject;
006 import java.lang.reflect.Method;
007 import java.lang.reflect.InvocationTargetException;
008 import java.io.File;
009 import java.io.InputStream;
010 import java.io.FileInputStream;
011 
012 /**
013  * The XQuery control illustrates how to create a control
014  * that generates a JCX file. A JCX file enables the control's
015  * user to customize the control's interface.
016  
017  * This control also includes a dialog for editing an attribute
018  * containing the XQuery expression. Each method of the control's
019  * extended interface is annotation with this attribute. 
020  
021  * @jcs:control-tags file="XQuery-tags.xml"
022  * @jcs:jc-jar label="XQuery"
023  *      insert-wizard-class="jcxCreate.ide.XQueryWizard" 
024  *      version="0.8" 
025  *      icon-16="/images/xml.gif" 
026  *      palette-priority="5" 
027  *      group-name="Feature Sample Controls"
028  *      description="Extensible control that creates a jcx and runs an XQuery."
029  *      @editor-info:code-gen control-interface="true"
030   */
031 public class XQueryImpl implements XQuery, com.bea.control.Extensible, com.bea.control.ControlSource
032 
033     /**
034      * @common:context
035      */
036     com.bea.control.ControlContext context;
037 
038     /* 
039      * A String to hold the XQuery expression specified by the control's
040      * user.
041      */
042     String m_expression = null;
043 
044     /*
045      * Constants representing annotation and attribute names. The 
046      * jc:query annotation will be written into the JCX file for 
047      * each XQuery expression the control's user associates with a 
048      * control method.
049      */
050   public static final String TAG_XQUERY = "jc:query";
051   public static final String ATTR_EXPRESSION = "expression";
052 
053     /*
054      * The invoke method is implemented from the Extensible interface.
055      * It is a key aspect of any control that provides a customizable
056      * interface. When a method on a control's JCX file is called, that
057      * call is delegated to the invoke method. The name and arguments for
058      * the JCX method called are passed to invoke as arguments. Within
059      * the invoke method, you extract and process the method and arguments,
060      * returning a value if appropriate.
061      
062      * A JCX file for the XQuery control would contain methods whose argument
063      * is an object containing the XML on which to execute the query. An
064      * annotation on that method would specify the XQuery expression to use.
065      */
066     public Object invoke(Method method, Object[] argsthrows Throwable {
067         XmlCursor resultCursor;
068         try{
069              // Create an instance of the class designed to handle the XQuery.
070             XQueryUtil queryUtil = new XQueryUtil();
071 
072             // Retrieve the XQuery expression from the annotation in the JCX.
073             m_expression = context.getMethodAttribute(TAG_XQUERY, ATTR_EXPRESSION);
074 
075             // Get the XML Stream named by the first parameter.
076             // First look to see if it is a resource in the jar that will be created from this project.
077             // Any non-source files in this project will be moved to the jar by default
078             String filePath = new String().valueOf(args[0]);
079             InputStream iXml= null;
080             if (filePath.substring(0,1).equals("/"))
081                 iXml= this.getClass().getClassLoader().getResourceAsStream(filePath);
082                 // try as a file
083             if (iXml==null)
084             {
085                 File f=new File(filePath);
086                 if (f.exists())
087                     iXml = new FileInputStream(f);
088                 else 
089                 {
090                     throw new ControlException("file not found at " + f.getAbsolutePath());
091                 }
092             }
093             // Load the XML using the XMLBeans API.
094             XmlObject instanceDoc = XmlObject.Factory.parse(iXml);
095 
096             /*
097              * Pass the value to the XQuery utility class, and return the results
098              * in an XMLBeans XmlCursor object.
099              */
100             resultCursor = queryUtil.runXQueryExpression(instanceDoc, m_expression);
101             return resultCursor;
102         catch (InvocationTargetException ite) {
103             throw new ControlException("Error while executing the query: " + ite.getMessage(), ite);
104         catch (Exception e) {
105             throw new ControlException("XQueryControl: Exception while executing expression.", e);
106         }
107     }
108     
109     /*
110      * Implement onException for any unhandled exceptions.
111      */
112     public void context_onException(Exception e, String methodName, Object [] args){
113         throw new ControlException("XQuery control exception in " + methodName + ": ", e);
114     }
115