Persistência flexível com BoxSQL

Bom black fire eu também sei que vc baixou o código e alterou algumas coisas para que o framework ficasse mais adaptado ao seu caso. Essa é a essência do open source. Algumas vezes alguém me pede uma alteração ou reclama de algo, mas na verdade basta baixar o código e modificá-lo. No caso do BoxSQL o código é estupidamente simples de ser entendido e corrigido.

Não me lembro desse problema. Talvez ele retorne 0 se o atributo for numérico. Mas se for o caso podemos deixar um default para isso e colocar um parâmetro de configuração para quem quiser mudar o default.

Bom, mas deixando de lado, vou terminar a versão 2.0 do BoxSQL ainda este ano. Demorei porque estou implementando tudo de novo em Groovy (não há um bom motivo a não ser opção pessoal. Enjoei de Java.). O bom é que ele será compilado para BytoCode e todo mundo poderá utilizar na boa o framework. Também vou publicar o projeto com mais conteúdo como tutoriais e documentação, mas só para o ano que vem, pois to muito corrido com a InfoQ.

Oi Felipe, pelo que notei vc é um dos criadores do boxsql, por isso resolvi tentar te contactar por aqui.
Estou trabalhando em um projeto no qual optei por adotar o boxsql devido a sua flexibilidade e etc. Estou neste momento enfrentando um problema que talvez seja de fácil solução para vc.
Logo no momento do login do sistema, ao tentar acessar o BD mysql pela primeira vez, recebo um erro java.lang.IllegalArgumentException: URI is not hierarchical.
Quando rodo o sistema no Eclipse tudo funciona bem, mas quando gero um jar no ANT e rodo o sistema direto no browser, apesar de carregar a tela inicial, no primeiro acesso ao BD para validação de login e senha, recebo este erro.
Não achei nada esclarecedor sobre isso na internet.
Meu arquivo boxsql.properties está configurado assim:
box.connectionType=jdbc
box.pathBase=br/com/atchik/resources
log.path=/c://java/workspace_atchik/
log.active=true
jdbc.url=jdbc:mysql://localhost/quebrabases
jdbc.driver=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=2108

O erro ocorre no metodo abaixo quando chamo box.getList :

public static Boolean Login_Validation (String username, String password){
BoxSQL box = new BoxSQL();

    try{	  
    	    	box.setParameter("username",username );
    	box.setParameter("password",password );	
    	
    	List<Login> logged_user = box.getList("check_login.sql", Login.class); 		    	
    	
    	if (logged_user.get(0).getUsername()==null || logged_user.get(0).getUsername().length()==0){
    		return false;
    	}
    }
	  catch (IndexOutOfBoundsException iobe){
		  System.out.println ("IndexOutOfBoundsException on LoginDAO.Login_Validation");
		  return false;
	}
	  catch (Exception jle){
		  System.out.println ("Exception on LoginDAO.Login_Validation ==> " + jle.getMessage());
		  System.out.println (" Cause ==> " + jle.getCause());    		  
		  return false;
	}
	  finally{
		  System.out.println ("Will call box.release");
		  box.release(); 
	  } 
    
	return true;
}

Qualquer ajuda será muito bem vinda.
Obrigado desde já.
Abs.
Gilberto

Só corrigindo, pois a linha log.path correta é: log.path=c://java/workspace_atchik/. Mas o problema certamente não é esse.
Outro ponto que vale a pena citar é que este projeto utiliza STRUTS2.

Espero que vc possa me dar uma luz nesse problema.

Abs.

Olá Gilberto,

Com base no que você me passou, o problema parece na URL de conexão. Não tá faltando a porta em que o banco roda não?

Porém, pela Exception pode ser erro na hora de ler os templates. Talvez com a stack_trace completa seja mais fácil de identificar.
Isso pode ser erro até mesmo do Struts2. Pelo fato de funcionar de dentro do eclipse e depois não funcionar no Browser, pode ser falta de alguma dependência também. Mas aí acho que Exception seria outra.

E pra terminar, acho que vale a tentativa também, você já experimentou colocar uma barra na frente do ‘br’ na linha ‘box.pathBase=br/com/atchik/resources’ ?

Oi Felipe

Tentei colocando o “/” antes do BR, mas não adiantou.

Abaixo envio todo o stack para que, quem sabe, vc possa identificar se o erro é no acesso ao BD ou na tentativa de ler os templates (.sql).

Agradeço desde já pela ajuda!

May 15, 2009 11:06:01 AM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
May 15, 2009 11:06:01 AM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
May 15, 2009 11:06:24 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.(File.java:363)
at org.boxsql.ioEngine.IOEngine.readResourceFile(IOEngine.java:23)
at org.boxsql.templateEngine.TemplateEngine.getSQLQuery(TemplateEngine.java:36)
at org.boxsql.BoxSQL.getTemplate(BoxSQL.java:254)
at org.boxsql.BoxSQL.getList(BoxSQL.java:298)
at br.com.atchik.dao.LoginDAO.Login_Validation(LoginDAO.java:25)
at br.com.atchik.actions.LoginAction.checkLogin(LoginAction.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:186)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

Oi Felipe

Queria adicionar uma questão:

Se o problema for no acesso aos templates, para eliminar a linha box.pathBase=br/com/atchik/resources ( que no caso, por alguma razão não estaria encontrando os respectivos arquivos). Onde devo colocar os templates (.sql) para que os metodos das classes do pacote br.com.atchik.dao possam encontrá-los por default ?

PS: Só para informação tentei colocar a porta usada pelo BD, mas não adiantou também.

Abs.

Não há uma convenção para isso. Ainda não. =(
Estou trabalhando numa nova versão do BoxSQL, mas as coisas estão corridas demais. Porém posso dizer que será interessante essa nova versão. E pelas funcionalidade e escopo irá receber outro nome.

Votando ao problema:
Sim o erro é na leitura dos templates. Você mencionou que funciona no eclipse?
Se funciona no eclipse e não funciona fora do eclipse o erro só pode estar no ambiente. Falta algo no classpath (como esse pacote em que estão os templates por exemplo).

Voc6e consegue verificar se no servidor de aplicações este pacote existe? Talvez você deva verificar se o .war foi descompactado. Não se isso influenciaria (eu acho que sim).

Pode também passar a sua estrutura de diretórios?

Ah… e se você estiver no windows, mude o path do log para c:\java\workspace_atchik\ e não c://java/workspace_atchik/

Oi Felipe

Para gerar o jar desta aplicacao uso o ANT. O built.xml que construí segue abaixo.

<!-- Project settings -->
<property name="project.title" value="QuebraBases"/>
<property name="project.jar.file" value="QuebraBases.jar"/>

	<path id="class.path">
		<fileset dir="lib">
	  		<include name="**/*.jar"/>
		</fileset>		
  	</path>


  	<!-- Classpath for Project -->
	<path id="compile.classpath">
		<pathelement path ="lib/commons-beanutils.jar"/>
		<pathelement path ="lib/commons-digester.jar"/>
		<pathelement path ="lib/struts.jar"/>
		<pathelement path ="lib/BoxSQL-1.5.jar"/>
		<pathelement path ="lib/dwr.jar"/>
		<pathelement path ="lib/dwr-1.1-beta-3.jar"/>
		<pathelement path ="lib/myfaces-jsf-api-1.0.9.jar"/>
		<pathelement path ="lib/mysql-connector-java-5.0.5-bin.jar"/>
		<pathelement path ="lib/servlet-api-2.4.jar"/>
		<pathelement path ="lib/struts2-jsf-plugin-2.0.11.2.jar"/>
		<pathelement path ="lib/commons-fileupload-1.1.1.jar"/>
		<pathelement path ="lib/commons-io-1.0.jar"/>
		<pathelement path ="lib/commons-dbutils-1.1.jar"/>
		<pathelement path ="lib/commons-logging-1.0.4.jar"/>
		<pathelement path ="lib/freemarker-2.3.8.jar"/>
		<pathelement path ="lib/ognl-2.6.11.jar"/>
		<pathelement path ="lib/struts2-core-2.0.11.2.jar"/>
		<pathelement path ="lib/xwork-2.0.5.jar"/>
		<pathelement path ="lib/catalina-ant.jar"/>
		<pathelement path ="classes"/>
		<pathelement path ="${classpath}"/>
	</path>



	<!-- Check timestamp on files -->
	<target name="prepare">
		<tstamp/>
		  <copy file="src/struts.xml" todir="src/classes"/>
	</target>


	<!-- Copy any resource or configuration files -->
	<target name="resources">
		<copy todir="src/classes" includeEmptyDirs="no">
			<fileset dir="src/">
			<patternset>
				<include name="**/*.conf"/>
				<include name="**/*.properties"/>
				<include name="**/*.xml"/>
			</patternset>
			</fileset>
		</copy>
		<copy todir="src/classes/br/com/atchik/resources/" 								includeEmptyDirs="no">
			<fileset dir="src/br/com/atchik/resources/">
			<patternset>
				<include name="**/*.sql"/>					
			</patternset>
			</fileset>
		</copy>
		<copy todir="src/classes/" 								includeEmptyDirs="no">
			<fileset dir="src/br/com/atchik/resources/">
			<patternset>
				<include name="**/*.sql"/>					
			</patternset>
			</fileset>
		</copy>

		
	</target>


	<!-- Normal build of application -->
	<target name="compile" depends="prepare,resources">
		<javac srcdir="src" destdir="src/classes" debug="true" debuglevel="lines,vars,source">
			<classpath refid="class.path"/>
		</javac>
		<jar
		jarfile="lib/${project.jar.file}"
		basedir="src/classes"/>
	</target>


	<!-- Remove classes directory for clean build -->
	<target name="clean"
	  description="Prepare for clean build">
	  <delete dir="classes"/>
	  <mkdir  dir="classes"/>
	</target>


	<!-- Build Javadoc documentation -->
	<target name="javadoc" description="Generate JavaDoc API docs">
		<delete dir="./doc/api"/>
		<mkdir dir="./doc/api"/>
		<javadoc sourcepath="./src/java"
			destdir="./doc/api"
			classpath="${servlet.jar}:${jdbc20ext.jar}"
			packagenames="*"
			author="true"
			private="true"
			version="true"
			windowtitle="${project.title} API Documentation"
			doctitle="&lt;h1&gt;${project.title} Documentation (Version ${project.version})&lt;/h1&gt;"
			bottom="Copyright &#169; 2002">
			<classpath refid="compile.classpath"/>
		</javadoc>
	</target>


	<!-- Build entire project -->
	<target name="project" depends="clean,prepare,compile"/>


	<!-- Create binary distribution -->
	<target name="dist" description="Create binary distribution">

	  <mkdir dir="${distpath.project}"/>
	  <jar 
		jarfile="${distpath.project}/${project.distname}.jar"
		basedir="./classes"/>
	  <copy
		file="${distpath.project}/${project.distname}.jar"
		todir="${distpath.project}"/>

	  <war
		basedir="../"
		warfile="${distpath.project}/${project.distname}.war"
		webxml="web.xml">
		<exclude name="${distpath.project}/${project.distname}.war"/>
	   </war>

</target>


<!-- Build project and create distribution-->
<target name="all" depends="project"/>

Tentei, como vc pode ver neste XML acima, copiar os templates para diferentes pastas para ver se a aplicacao os encontrava. Mas não funcionou.

Estou infelizmente usando o windows Vista, mas até agora não havia apresentado nenhum problema, e acho que este especificamente não tem a ver com esse fato.

Inclui no meu classpath a pasta aonde são colocados os templates após rodar o ant, veja abaixo:
.;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip; c:\Java\ANT_HOME; c:\Java\xerces-2_9_1;c:\Java\Tomcat 6.0\webapps\QuebraBases\WEB-INF\src\br\com\atchik\resources;

Porém a aplicação continua não encontrando os templates…alguma luz no fim desse tunel?

Gilberto,

Como eu falei antes, o problema é que os recursos estão em um arquivo compactado (.jar ou .war por exemplo). Esse tipo de arquivo possue um classpath interno apenas. Isso quer dizer que ele só enxerga as classes e pacotes que estão dentro dele, a não ser que seja especificado outros jars para que ele busque.

Esse é o problema. Esse também é o motivo pelo qual o projeto funciona no Eclipse e nõa funciona fora dele.

Uma pequena busca no google sobre essa exception trouxe a solução.

http://www.google.com/search?client=opera&rls=en&q=java.lang.IllegalArgumentException:+URI+is+not+hierarchical+at+java.io.File.<init>(File.java:363)&sourceid=opera&ie=utf-8&oe=utf-8

Você terá que adaptar o seu deploy ou a criação do Jar.

Espero ter ajudado…

Oi Felipe,

Muito obrigado. Sem dúvida o caso que vc descobriu é igual ao meu. Porém existe uma pequena diferença que talvez vc tenha alguma dica de como solucionar.

No meu caso, seguindo o seu framework, eu uso o getList para recuperar o template, e este vai buscá-lo de acordo com a linha box.pathBase=br/com/atchik/resources, ou seja, eu não busco por este arquivo .sql diretamente pois pelo que entendi é preciso usar a propriedade box.pathBase.

Como meu procedimento ANT gera um arquivo .jar com o projeto, segundo o artigo em questão, eu deveria acessar os templates usando ClassLoader.getSystemResourceAsStream (DEFAULT_PATH + FILE). A questão é que não sei se é possível fazer isso utilizando o boxsql.

Enfim, a questão é como usar ou substituir o box.getList para que ele pegue o template via ClassLoader.getSystemResourceAsStream.

Novamente agradeço muito a ajuda.

Abs

Neste caso, se não der mesmo pra não colocar dentro do Jar, a solução é baixar o fonte do BoxSQL e modificar a classe org.boxsql.IOEngine na linha 23. Assim você pode colocar a alteração necessária. Depois gera um jar do BoxSQL e pronto.

O BoxSQL é um framework de 7 classes em sua versão 1.5.1. Muito simples de customizar. =)

OI Felipe

Na verdade os templates estão todos dentro do jar, porém a aplicação não consegue exergá-los.

Não existe um caminho fisico ou logico que colocando no boxsql.properties, a aplicação conseguiria encontrar os templates?

Afinal eles estão dentro do jar, e se a aplicação consegue encontrar os arquivos .properties, não há uma forma de fazê-la encontrar os .sql (pois posso colocá-los em qualquer pasta do projeto)?

Queria realmente evitar mexer nos fontes do boxsql…

Gilberto,

Você tem algumas opções aqui:

  1. Porque esses arquivos estão dentro de um jar?
    Você pode retirá-los do jar como acontece com aplicações web normal. Pelo menos os .sql

  2. A linha de código da classe IOEngine.java que lê o arquivo é essa:

onde “file” é o pathBase + nomeDoTemplate passado para o getList()

Você pode mudar essa linha de código, o que seria mais rápido do que responder aqui no fórum.

  1. Gerar um Manifest melhor para seu jar
    No Manifest você consegue indicar quais outros jars fazem parte do classpath de seu jar. Isso quer dizer que no .war de sua aplicação você precisa ter um Manifest decente, se esse war não for descompactado.

  2. Ir até o issue tracker do BoxSQL e cadastrar um issue para que verifiquemos isso.
    Pode demorar bastante.

Particularmente, eu acho a 1 opção mais sensata. A segunda opção não é tão ruim assim também.
Esse também é um problema da forma que voc6e escolheu para fazer o deploy de sua aplicação.

Grande Abraço,

Amigo feliperod.

Estou para iniciar um novo projeto e gostaria de utilizar o BoxSQL, porém gostaria de saber se você já tem uma previsão do lançamento do BoxSQL 2.0 (ou o novo nome) ainda este ano de 2010 ?

Abraços e parabéns pelo projeto.

Cara… estou trabalhando nele, mas numa velocidade menor do que eu gostaria. Se alguém estiver a fim de me ajudar, numa atividade open source, eu ficaria muito feliz e o projeto!

:slight_smile:

Acredito que eu possa ajudar…

Quais as necessidades do Projeto ?

Olá amigos todo bem?

Vê se vocês podem me ajudar.

Estou com a seguinte dúvida sobre o BoxSQL, que em sua atual versão “2.21” não aceita alguns dos códigos que na versão 1.5 aceitava.

Minha dúvida é? Como faço para instanciar a Classe BoxSQL na versão atual, sendo que não há um construtor visível nesta classe?

O erro acontece quando tento instanciar a classe. Veja.

BoxSQL box = new BoxSQL(); o seguinte erro é mostrado ( The constructor BoxSQL() is not visible )

e também não à mais o método release, que é responsavel por fechar a conexão.

Bom, tentei da seguinte forma:

public List getLast6MonthSales(){
BoxSQL box = BoxSQL.getInstance();
List sales = box.getList(“list6MonthSales.sql”, Sales.class);
BoxSQL.closeConnection();
return sales;
}

Até aí tudo bem más quando executo o teste no JUnit a seguinte mensagem aparece:

BoxSQL - Mensagem de erro: Problemas ao ler ou encontrar arquivo.
BoxSQL - Mensagem de erro: Erro DB: null

O que pode está acontecendo? Os arquivos estão corretos.
Outra pergunta.

Como o arquivo boxsql.properties é iniciado?

Agradeço.

Caro amigo rubensmm.
Eu já tive a oportunidade de utilizar o BoxSQL e gostei muito, pena que seu código não recebe a devida atenção e por este motivo esta praticamente descontinuado.
Procurando na internet alguma solução viável, eu acabei encontrando o QueryDSL-SQL, o qual possui semântica parecida com o BoxSQL, porém mais poderoso e com seu código sendo mantido até a presente data.

Dê uma olhada nos exemplos e surpreenda-se com as facilidades de programação…

Fala Felipe…Aqui é o Igson…kkkkk
EI nao eskece de colocar no boxsql a função pra inserção de arquivo e valores do tipo Date !!!
Espero que essas melhorar sejam pra evoluir o box . Gostei muito de utilizar ele aqui .
Paz e Bem