/**
* Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
package org.ralasafe.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ralasafe.db.DBPower;
import org.ralasafe.db.DBView;
import org.ralasafe.db.TableView;
import com.google.gson.Gson;
public class UtilAction extends Action {
private static final Log log=LogFactory.getLog( UtilAction.class );
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException {
String oper=req.getParameter( "oper" );
if( log.isDebugEnabled() ) {
log.debug( "oper=" + oper );
}
if( "getJavaBeanProperties".equals( oper ) ) {
getJavaBeanProperties( req, resp );
return;
} else if( "getAppDsNames".equals( oper ) ) {
getAppDsNames( req, resp );
return;
} else if( "loadDbView".equals( oper ) ) {
loadDbView( req, resp );
return;
} else if( "getTableColumns".equals( oper ) ) {
getTableColumns( req, resp );
return;
}
}
protected void doPost( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException {
String oper=req.getParameter( "oper" );
if( log.isDebugEnabled() ) {
log.debug( "oper=" + oper );
}
if( "loadDbView".equals( oper ) ) {
loadDbView( req, resp );
return;
}
}
private void getTableColumns( HttpServletRequest req,
HttpServletResponse resp ) throws IOException {
// get table or view definition
String schema=req.getParameter( "schema" );
String tableName=req.getParameter( "tableName" );
String dsName=req.getParameter( "dsName" );
//String queryId=req.getParameter( "queryId" );
String alias=req.getParameter( "alias" );
TableView tableView=DBView.getTable( dsName, schema, tableName );
responseTableDefinition( resp, tableView, alias );
}
private void responseTableDefinition( HttpServletResponse resp,
TableView tableView, String alias ) throws IOException {
Gson gson=new Gson();
String json=gson.toJson( tableView );
// append alias to json
json=json.substring( 0, json.lastIndexOf('}') )
+ ",\"alias\":\""+ alias + "\"}";
if( log.isDebugEnabled() ) {
log.debug( "The json is:" +json );
}
resp.setContentType("application/json;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter pw=resp.getWriter();
pw.write(json);
pw.flush();
}
private void getAppDsNames( HttpServletRequest req, HttpServletResponse resp ) throws IOException {
Collection dsNames=DBPower.getDsNames();
ArrayList appDsNames=new ArrayList( dsNames.size() );
for( Iterator iterator=dsNames.iterator(); iterator.hasNext(); ) {
String name=(String) iterator.next();
if( !name.equals( "ralasafe" ) ) {
appDsNames.add( name );
}
}
Gson gson=new Gson();
String json=gson.toJson( appDsNames );
if( log.isDebugEnabled() ) {
log.debug( "The json is:" +json );
}
resp.setContentType("application/json;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter pw=resp.getWriter();
//pw.write( "\"appDsNames\":" );
pw.write(json);
pw.flush();
}
private void loadDbView( HttpServletRequest req, HttpServletResponse resp ) throws IOException {
String dsName=req.getParameter( "dsName" );
String[] allSchemas=DBView.getSchemas( dsName );
String defaultSchema=DBView.getDefaultSchema( dsName );
int id=0;
resp.setContentType("application/json;charset=UTF-8");
PrintWriter writer=resp.getWriter();
// writer.write( "[ " );
// writer.write( " {id:0, name:'mydemo [Default]', nodes:[ " );
// writer.write( " {id:1, name:'Tables', nodes:[ " );
// writer.write( " {id:2, name:'company'}, " );
// writer.write( " {id:3, name:'demouser'}, " );
// writer.write( " {id:4, name:'department'}, " );
// writer.write( " {id:5, name:'loan_money'}, " );
// writer.write( " {id:6, name:'ralasafe_sequence'} ]}" );
// writer.write( " ]} " );
// writer.write( "] " );
writer.write( "[\r\n" );
for( int i=0; i<allSchemas.length; i++ ) {
String schema=allSchemas[i];
boolean isDefault=defaultSchema.equals( schema );
String[] tableNames=DBView.getTableNames( dsName, schema );
String[] viewNames=DBView.getViewNames( dsName, schema );
if( isDefault ) {
schema=schema+" [Default]";
}
if( i!=0 ) {
writer.write( ",\r\n" );
}
writer.write( "\t{id:" + id++ + ", iconSkin: 'schema', name:'" + schema + "', nodes:[\r\n" );
// if it's default schema, keep schema attribute value as blank
if( isDefault ) {
schema="";
}
writer.write( "\t\t{id:" + id++ + ", iconSkin: 'tables', name:'Tables', nodes:[\r\n" );
id=write( writer, tableNames, schema, "table", id );
writer.write( "\t\t]},\r\n" );
writer.write( "\t\t{id:" + id++ + ", iconSkin: 'views', name:'Views', nodes:[\r\n" );
id=write( writer, viewNames, schema, "view", id );
writer.write( "\t\t]}\r\n" );
writer.write( "\t]}" );
}
writer.write( "]" );
writer.flush();
}
private int write( PrintWriter writer, String[] names, String schema, String type, int id ) {
for( int i=0; i<names.length; i++ ) {
String name=names[i];
if( i!=0 ) {
writer.write( ",\r\n" );
}
writer.write( "\t\t\t{id:" + id++ + ", iconSkin: 'dbObject', name:'" + name
+ "', type:'" + type + "', schema:'" + schema + "'}" );
}
return id;
}
private void getJavaBeanProperties( HttpServletRequest req,
HttpServletResponse resp ) throws IOException, ServletException {
String clazz=req.getParameter( "clazz" );
Class c;
Properties prop=new Properties();
try {
c=Class.forName( clazz );
Field[] fields=c.getDeclaredFields();
int length=fields.length;
String[] properties=new String[length];
String[] javaTypes=new String[length];
for( int i=0; i<fields.length; i++ ) {
Field field=fields[i];
properties[i]=field.getName();
javaTypes[i]=field.getType().getName();
}
prop.setJavaTypes( javaTypes );
prop.setProperties( properties );
} catch( ClassNotFoundException e ) {
prop.setErrorMsg( e.toString() );
}
Gson gson=new Gson();
String json=gson.toJson( prop );
if( log.isDebugEnabled() ) {
log.debug( "The json is:" +json );
}
resp.setContentType("application/json;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter pw=resp.getWriter();
pw.write(json);
pw.flush();
}
class Properties {
private String errorMsg="";
private String[] properties;
private String[] javaTypes;
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg( String errorMsg ) {
this.errorMsg=errorMsg;
}
public String[] getProperties() {
return properties;
}
public void setProperties( String[] properties ) {
this.properties=properties;
}
public String[] getJavaTypes() {
return javaTypes;
}
public void setJavaTypes( String[] javaTypes ) {
this.javaTypes=javaTypes;
}
}
}