![JAR search and dependency download from the Maven repository](/logo.png)
com.tsc9526.monalisa.orm.mqs.SQLClass Maven / Gradle / Ivy
/*******************************************************************************************
* Copyright (c) 2016, zzg.zhou([email protected])
*
* Monalisa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*******************************************************************************************/
package com.tsc9526.monalisa.orm.mqs;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import com.tsc9526.monalisa.orm.Query;
import com.tsc9526.monalisa.orm.datasource.DbProp;
import com.tsc9526.monalisa.orm.mqs.query.QueryPackage;
import com.tsc9526.monalisa.orm.mqs.query.QueryStatement;
import com.tsc9526.monalisa.tools.io.MelpClose;
import com.tsc9526.monalisa.tools.io.MelpFile;
import com.tsc9526.monalisa.tools.io.JavaWriter;
import com.tsc9526.monalisa.tools.logger.Logger;
import com.tsc9526.monalisa.tools.template.Args;
import com.tsc9526.monalisa.tools.template.jsp.Jsp;
/**
*
* @author zzg.zhou([email protected])
*/
public class SQLClass implements Closeable{
static Logger logger=Logger.getLogger(SQLClass.class.getName());
public static String PACKAGE_PREFIX="_sql";
private String packageName;
private String className;
private transient QueryLoader queryLoader;
private File sqlFile;
private long lastModified;
public Query createQuery(String id,Args args){
checkAndCompile();
return queryLoader.createQuery(id, args);
}
public Collection getStatements(){
return queryLoader.hQueryStatements.values();
}
public SQLClass(File sqlFile){
this.sqlFile=sqlFile;
}
protected synchronized void checkAndCompile(){
try{
if(lastModified hQueryStatements=new LinkedHashMap();
for(QueryStatement qs:pkg.getStatements()){
hQueryStatements.put(qs.getId(), qs);
}
URLClassLoader loader=new URLClassLoader(new URL[]{classes.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
Class> qClazz=loader.loadClass(PACKAGE_PREFIX+"."+packageName+"."+className);
for(Method m:qClazz.getMethods()){
Class>[] pTypes= m.getParameterTypes();
if(pTypes.length==2 && pTypes[0]==Query.class && pTypes[1]==Args.class){
hQueryStatements.get(m.getName()).setMethod(m);
}
}
Object runObject=qClazz.newInstance();
if(this.queryLoader!=null){
MelpClose.delayClose(this.queryLoader, 15);
}
this.queryLoader=new QueryLoader(runObject, loader, hQueryStatements);
logger.info("Loaded namespace: "+packageName+"."+className+", id: "+hQueryStatements.keySet());
}
public void close(){
MelpClose.close(this.queryLoader);
this.queryLoader=null;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getClassName(){
return this.className;
}
public long getLastModified() {
return lastModified;
}
public File getSqlFile(){
return sqlFile;
}
public class QueryLoader implements Closeable{
private Object runObject;
private URLClassLoader loader;
private Map hQueryStatements;
QueryLoader(Object runObject,URLClassLoader loader,Map hQueryStatements){
this.runObject=runObject;
this.loader=loader;
this.hQueryStatements=hQueryStatements;
}
Query createQuery(String id,Args args){
Method m=hQueryStatements.get(id).getMethod();
if(m==null){
throw new RuntimeException("Query id: "+id+" not found: "+queryLoader.hQueryStatements.keySet());
}
try{
Query query=new Query();
m.invoke(queryLoader.runObject, query,args);
return query;
}catch(Exception e){
throw new RuntimeException(e);
}
}
public void close(){
hQueryStatements.clear();
MelpClose.close(loader);
loader=null;
runObject=null;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy