User: dsundstrom
  Date: 01/08/19 20:19:55

  Added:       src/main/org/jboss/ejb/plugins/cmp/jdbc/metadata
                        JDBCFunctionMappingMetaData.java
  Log:
  Handles metadata about sql function mappings.
  
  Revision  Changes    Path
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/metadata/JDBCFunctionMappingMetaData.java
  
  Index: JDBCFunctionMappingMetaData.java
  ===================================================================
  package org.jboss.ejb.plugins.cmp.jdbc.metadata;
  
  import java.io.IOException;
  import java.io.StringReader;
  import java.util.ArrayList;
  import org.jboss.ejb.DeploymentException;
  import org.jboss.metadata.MetaData;
  import org.w3c.dom.Element;
  
  public final class JDBCFunctionMappingMetaData {
        private final String functionName;
        private final String[] sqlChunks;
        private final int[] parameters;
  
        public JDBCFunctionMappingMetaData(String functionName, String[] sqlChunks, 
int[] parameters) {
                this.functionName = functionName;
                this.sqlChunks = sqlChunks;
                this.parameters = parameters;
        }
  
        public JDBCFunctionMappingMetaData(Element element) throws DeploymentException 
{
                functionName = MetaData.getUniqueChildContent(element, 
"function-name");
                
                String sql = MetaData.getUniqueChildContent(element, "function-sql");
                
                ArrayList chunkList = new ArrayList();          
                ArrayList parameterList = new ArrayList();              
                
                // add a dummy chunk so we can be assured that the sql started with 
chunk before a number
                if(sql.charAt(0) == '?') {
                        chunkList.add("");
                }
                // break the sql into chunks and parameters
                StringBuffer chunk = new StringBuffer();
                StringReader reader = new StringReader(sql);
                try {
                        for(int c=reader.read(); c >= 0; c=reader.read()) {
                                if(c != '?') {
                                        chunk.append((char)c);
                                } else {
                                        chunkList.add(chunk.toString());
                                        chunk = new StringBuffer();
                                        
                                        // read the number
                                        StringBuffer number = new StringBuffer();
                                        for(int digit=reader.read(); digit >= 0; 
digit=reader.read()) {
                                                if(Character.isDigit((char)digit)) {
                                                        number.append((char)digit);
                                                } else {
                                                        if(digit >= 0) {
                                                                
chunk.append((char)digit);
                                                        }
                                                        break;
                                                }
                                        }
                                        if(number.length() == 0) {
                                                throw new DeploymentException("Invalid 
parameter in function-sql: "+sql);
                                        }
                                        Integer parameter = null;
                                        try {
                                                parameter = new 
Integer(number.toString());
                                        } catch(NumberFormatException e) {
                                                throw new DeploymentException("Invalid 
parameter number in function-sql: number="+number+" sql="+sql);
                                        }
                                        parameterList.add(parameter);
                                }
                        }
                } catch(IOException e) {
                        // will never happen because io is in memory, but required by 
the interface
                        throw new DeploymentException("Error parsing function-sql: " + 
sql);
                }
                chunkList.add(chunk.toString());
                
                // save out the chunks
                sqlChunks = new String[chunkList.size()];
                chunkList.toArray(sqlChunks);
                
                // save out the parameter order
                parameters = new int[parameterList.size()];
                for(int i=0; i<parameters.length; i++) {
                        parameters[i] = ((Integer)parameterList.get(i)).intValue()-1;
                }                               
        }
  
        public String getFunctionName() {
                return functionName;
        }
        
        public String getFunctionSql(String[] args) {
                StringBuffer buf = new StringBuffer();
                
                for(int i=0; i<sqlChunks.length; i++) {
                        buf.append(sqlChunks[i]);
                        if(i<parameters.length) {
                                buf.append(args[parameters[i]]);
                        }
                }
                return buf.toString();
        }
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to