Pesquisa personalizada

2009/04/04

woodstock.xhr.post: Do you see Google? See?!

How to post a JSON data via woodstock.xhr.post?

Woodstock Festival

Sometimes simple things may be hard to do... but I'm one of 'the last Woodstock survives
- No, I wasn't at Woodstock Festival - but, I wanted to.

I learned the Woodstock JSF Components (now officially abandoned by Sun) and I'm using it in at least two projects. Damn! I love Dojo! And Woodstock was all built with Dojo. But, now, after a long time learning (reading, trying, testing, experiencing and going mad), after finally to know what and how to do with Woodstock, the project was buried. I'm desolated!

I did a good work using Woodstock, but now I should migrate to Icefaces (acording Sun), but I don't want and I can't rewrite all my work to another technology.

Several troubles I had using Woodstock and nearly ten times, several troubles I solved with it.

AJAX using Woodstock

When I need to use AJAX with Woodstock pages, I don't use Dynafaces. Instead, I used submit or refresh standard Woodstock component feature to do a postback or I use AJAX request with servlet.

To do a AJAX request using the methdo GET is easy and well documented by Woodstock. Bellow, see example showing how to get customer data via AJAX using only the first and last customer names:

   1:function getCustomerByNames(lastName, firstName) {
   2:    var props = {
   3:        async: true,
   4:
   5:        onError: function(xhr) {
   6:            window.alert("An error occurs while sending an AJAX request. See: " + xhr)
   7:        },
   8:
   9:        onReady: function(xhr) {
  10:            var resp = eval('(' + xhr.responseText + ')');
  11:            window.alert("Customer is " + resp.name + " <" + resp.email + ">");  
  12:        },
  13:
  14:        url: "/AjaxBridge?a=Customer&t=getCustomerByCode"
  15:    };
  16:
  17:    props.url += "&lastName=" + lastName;
  18:    props.url += "&firstName=" + firstName;
  19:
  20:    woodstock.xhr.get(props);
  21:}
  22:

From the server-side, each AJAX "Agent" is a subclass of:

   1:package br.com.trilha21.web.store.ajax;
   2:
   3:import java.io.IOException;
   4:import java.io.PrintWriter; 
   5:import java.lang.reflect.Method;
   6:import java.util.logging.Level;
   7:import java.util.logging.Logger;
   8:import javax.servlet.ServletException;
   9:import javax.servlet.http.HttpServletRequest;
  10:import javax.servlet.http.HttpServletResponse;
  11:import net.marciowb.poison.web.jsf.JSFUtil;
  12:import org.json.JSONException;
  13:import org.json.JSONObject;
  14:
  15:/**
  16: *
  17: * @author Marcio Wesley Borges
  18: */
  19:public class AjaxAgent {
  20:    private static final Logger logger = Logger.getLogger(AjaxAgent.class.getName());
  21:    
  22:    final String task;  
  23:    protected final HttpServletRequest request;
  24:    protected final HttpServletResponse response;
  25:    protected final JSONObject mainObj;
  26:    
  27:    protected AjaxAgent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  28:        this.request = request;
  29:        this.response = response;
  30:        response.setBufferSize(16384);
  31:        task = getParam("t");
  32:        try {
  33:            mainObj = new JSONObject();        
  34:            mainObj.put("agent", getClass().getSimpleName());
  35:            mainObj.put("by", task);
  36:        } catch (JSONException ex) {
  37:            throw new ServletException(ex);
  38:        }
  39:    }
  40:    
  41:    public String getTask() {
  42:        return task;
  43:    }
  44:    
  45:    protected static JSONObject toJSONObject(Object bean) {
  46:        try {
  47:            return JSFUtil.buildJSONObject(bean);
  48:        } catch (Exception ex) {
  49:            logger.log(Level.SEVERE, null, ex);
  50:        }
  51:        return null;
  52:    }
  53:    
  54:    private void outputJson() throws IOException, JSONException {
  55:        response.setContentType("text/json;charset=UTF-8");
  56:        response.setHeader("Cache-Control", "no-cache");        
  57:        final PrintWriter writer = response.getWriter();
  58:        writer.print(mainObj.toString());
  59:        writer.close();
  60:    } 
  61:    
  62:    protected String getParam(String name) {
  63:        return request.getParameter(name);
  64:    }
  65:
  66:    protected Long getParamAsLong(String name) {
  67:        final String p = getParam(name);
  68:        return Long.valueOf(p);
  69:    }
  70:
  71:    public final void exec() throws ServletException, IOException {
  72:        try {
  73:            final Method m = getClass().getMethod(task);
  74:            
  75:            m.invoke(this);
  76:            outputJson();
  77:        } catch (NoSuchMethodException ex) {
  78:            response.sendError( HttpServletResponse.SC_NOT_IMPLEMENTED );
  79:        } catch (Exception ex) {
  80:            logger.log(Level.SEVERE, "Error while executing an AJAX request.", ex);
  81:            response.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex.toString() );
  82:        }
  83:    }
  84:
  85:}
  86:

The servlet to attend AJAX request is like:

   1:package br.com.trilha21.web.store.ajax;
   2:
   3:import java.io.IOException;
   4:import java.lang.reflect.Constructor;
   5:import java.util.Map;
   6:import java.util.WeakHashMap;
   7:import java.util.logging.Level;
   8:import java.util.logging.Logger;
   9:import javax.servlet.ServletException;
  10:import javax.servlet.http.HttpServlet;
  11:import javax.servlet.http.HttpServletRequest;
  12:import javax.servlet.http.HttpServletResponse;
  13:
  14:/**
  15: * @author Marcio Wesley Borges
  16: */
  17:public class AjaxBridgeServlet extends HttpServlet {
  18:    private static final Logger logger = Logger.getLogger(AjaxBridgeServlet.class.getName());
  19:    
  20:    private static final String PCKG = AjaxBridgeServlet.class.getPackage().getName() + ".agents.";
  21:    private static final Map<String, Class<? extends AjaxAgent>> agents = new WeakHashMap<String, Class<? extends AjaxAgent>>();
  22:
  23:    private static final String AGENT_NAME_SUFIX = "Agent";
  24:   
  25:    private <T extends AjaxAgent> Class<T> getAgent(String agentName) {
  26:        if (!agentName.endsWith(AGENT_NAME_SUFIX))
  27:            agentName+=AGENT_NAME_SUFIX;
  28:
  29:        Class<T> agentClass = (Class<T>)agents.get(agentName);
  30:        if (agentClass==null) {
  31:            try {
  32:                agentClass = (Class<T>) Class.forName( PCKG + agentName );
  33:            } catch (ClassNotFoundException ex) {
  34:                return null;
  35:            }
  36:            agents.put(agentName, agentClass);
  37:        }
  38:        return agentClass;
  39:    }
  40:    
  41:    /** 
  42:    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
  43:    * @param request servlet request
  44:    * @param response servlet response
  45:    */
  46:    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  47:    throws ServletException, IOException {
  48:        try {
  49://        response.setContentType("text/html;charset=UTF-8");
  50:            final String agentName = request.getParameter("a");
  51:            final Class<? extends AjaxAgent> agentClass = getAgent(agentName);
  52:            if (agentClass == null) {
  53:                response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
  54:                return;
  55:            }
  56:
  57:            final Constructor agentConstructor = agentClass.getConstructors()[0];
  58:            final AjaxAgent agent = (AjaxAgent)agentConstructor.newInstance(request, response);
  59:            agent.exec();
  60:            return;
  61:            
  62:        } catch (Throwable ex) {
  63:            logger.log(Level.SEVERE, "Error in AjaxBridgeServlet while processing the request: " + request, ex);
  64:        }
  65:        
  66:        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  67:    } 
  68:
  69:    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
  70:    /** 
  71:    * Handles the HTTP <code>GET</code> method.
  72:    * @param request servlet request
  73:    * @param response servlet response
  74:    */
  75:    protected void doGet(HttpServletRequest request, HttpServletResponse response)
  76:    throws ServletException, IOException {
  77:        processRequest(request, response);
  78:    } 
  79:
  80:    /** 
  81:    * Handles the HTTP <code>POST</code> method.
  82:    * @param request servlet request
  83:    * @param response servlet response
  84:    */
  85:    protected void doPost(HttpServletRequest request, HttpServletResponse response)
  86:    throws ServletException, IOException {
  87:        processRequest(request, response);
  88:    }
  89:
  90:    /** 
  91:    * Returns a short description of the servlet.
  92:    */
  93:    public String getServletInfo() {
  94:        return "Short description";
  95:    }// </editor-fold>
  96:
  97:}
  98:

And, finally, the implementantion of the AJAX Agent (who is attending the AJAX requests) is like:

   1:package br.com.trilha21.web.store.ajax.agents;
   2:
   3:import br.com.trilha21.web.store.ajax.AjaxAgent;
   4:import br.com.trilha21.web.store.dao.Customer;
   5:import br.com.trilha21.web.store.ejb.CustomerLocal;
   6:import java.io.IOException;
   7:import javax.servlet.ServletException;
   8:import javax.servlet.http.HttpServletRequest;
   9:import javax.servlet.http.HttpServletResponse;
  10:import net.marciowb.poison.ejb.EJBUtil;
  11:import org.json.JSONException;
  12:
  13:/** 
  14: * @author Marcio Wesley Borges
  15: */
  16:public final class CustomerAgent extends AjaxAgent {
  17:    
  18:    final CustomerLocal customerBean = EJBUtil.lookupLocalBean(CustomerLocal.class);
  19:    
  20:    public CustomerAgent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  21:        super(request,response);
  22:    }
  23:    
  24:    public void getCustomerByDoc() throws ServletException, IOException, JSONException {
  25:        final String customerDoc = getParam("customerDoc");
  26:        
  27:        final Customer customer = customerBean.get(customerDoc);
  28:        mainObj.put("customer", toJSONObject(customer));
  29:    }
  30:    
  31:    public void getCustomerByNames() throws ServletException, IOException, JSONException {
  32:        final String last = getParam("lastName");
  33:        final String first = getParam("firstName");
  34:        
  35:        final Customer customer = customerBean.getCustomerByNames(last,first);
  36:        mainObj.put("customer", toJSONObject(customer));
  37:    }
  38:}
  39:

The code above, works to HTTP requests (via GET method), but it doesn't works to post data (via POST method). To post data using woodstock.xhr, you must use woodstock.xhr.post instead of woodstock.xhr.get

Posting: woodstock.xhr.post

After quickly googling for "woodstock.xhr.post", I cried, 'cause nothing was returned! So, how to post (and recover) data via "woodstock.xhr.post" stuff?

Seeing the woodstock JS documentation, you will find the mention to the parameter content. All post data must be 'posted' via this parameter. So, the idea to pass complex data (as objects with several kinds of properties) is to encode the data in client side and decode in server side. As example, you can pass a object using JSON and decoding it using Java JSON library at server side.

Bellow you see (Object.toJSON is a Prototype utility method) the equivalent post data of the previous client side code supplied:

   1:function getCustomerByNames(lastName, firstName) {
   2:    var props = {
   3:        async: true,
   4:
   5:        onError: function(xhr) {
   6:            window.alert("An error occurs while sending an AJAX request. See: " + xhr)
   7:        },
   8:
   9:        onReady: function(xhr) {
  10:            var resp = eval('(' + xhr.responseText + ')');
  11:            window.alert("Customer is " + resp.name + " <" + resp.email + ">");  
  12:        },
  13:
  14:        url: "/AjaxBridge?a=Customer&t=getCustomerByCode",
15: content: Object.toJSON({ 16: 'lastName': lastName, 17: 'firstName': firstName 18: })
19: }; 20: 21: woodstock.xhr.post(props); 22:} 23:

To read the content parameter passed above in the servlet, you can do:

   1:public final class CustomerAgent extends AjaxAgent {
   2:    
   3:    final CustomerLocal customerBean = EJBUtil.lookupLocalBean(CustomerLocal.class);
   4:    
   5:    public CustomerAgent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   6:        super(request,response);
   7:    }
   8:    
   9:    public void getCustomerByDoc() throws ServletException, IOException, JSONException {
  10:        final String customerDoc = getParam("customerDoc");
  11:        
  12:        final Customer customer = customerBean.get(customerDoc);
  13:        mainObj.put("customer", toJSONObject(customer));
  14:    }
  15:
16: public void getCustomerByNames() throws ServletException, IOException, JSONException { 17: final String data = IOUtil.readText(request.getInputStream());//Reads the 'content' parameter - it's equivalent to the post body. 18: final JSONObject json = new JSONObject(data); 19: final String lastName = json.getString("lastName"); 20: final String firstName = json.getString("firstName"); 21: final Customer customer = customerBean.getCustomerByNames(lastName,firstName); 22: mainObj.put("customer", toJSONObject(customer)); 23: }
24:} 25:

Good Icefaces look! I'll still with Woodstock for now.

Labels: , , ,

2009/03/12

Coding: Avoiding unnecessary locking

The code bellow, extracted from java.util.regex.Pattern, avoids unnecessary locking. Look the statement if (!compiled) {, it appears twice times because in the first time, we don't need to create a lock point, but if the code isn't "compiled" (!compiled evaluates true), so it creates a lock point and because the condition of variable compiled can be changed from the first time that it was evaluated (eg.: now !compiled can be evaluated to false, because it was "compiled" by another thread, between the first evaluation and the lock point). It avoids unnecessary retention in the case of the first evaluation was false, because in the entire lifecicly of the object there is only a transition of the variable compiled, from false to true, so only one time in the entire lifecicly, the lock point will be reached. It's a good technique! Think about it!
   1:    /**
   2:     * Creates a matcher that will match the given input against this pattern.
   3:     * </p>
   4:     *
   5:     * @param  input
   6:     *         The character sequence to be matched
   7:     *
   8:     * @return  A new matcher for this pattern
   9:     */
  10:    public Matcher matcher(CharSequence input) {
11: if (!compiled) { 12: synchronized(this) { 13: if (!compiled) 14: compile(); 15: } 16: }
17: Matcher m = new Matcher(this, input); 18: return m; 19: } 20:

Labels: , ,

2009/03/07

Poor Coding

It'snt a joke - the source code below was extracted from the website Mercado Livre.
   1://document.form1.as_observaciones.innerText = '';
   2:if ('N'=='Y'){
   3:document.form1.as_retiro[0].checked = true;}
   4:else{document.form1.as_retiro[1].checked = true;}
   5:
Do you believe?!

Labels: ,

2009/03/04

Easy XSS/AJAX using Greasemonkey

Did you have tried to use Greasemonkey? Try it! It's great!

Greasemonkey is a simple but extremely powerful addon to Mozilla Firefox. There are more than a thousand of user scripts to it. With Greasemonkey, you can develop your own script to (aka user script) customize, modify, extract data, insert and whatever you need to do with *any* page!

Easy XSS - Cross-Site Scripting

Recently I need to integrate a website from a customer with external data from another website, but it must occurs when the employee uses the customer website and without more requirements, except: Firefox, Greasemonkey and one little user script to do XSS. I need to do XSS because some part of the application data is extracted from another website (and domain). If you don't know nothing about what's XSS or Same Origin Police, take a read at Wikipedia and you'll know that isn't so easy to do XSS...

Along the rest of this article you will read the acronym XSS, but, please, understand XSS don't as "injection code", but as "The term "cross-site scripting" originated from the fact that a malicious web site could load another web site into another frame or window, then use Javascript to read/write data on the other web site." (or something near its).

When I need to do XSS, I have a couple of options, like: Greasemonkey, Selenium, Firefox Chrome, HTA, Httpunit, customized http clients via TCP sockets, customized browser version, proxy servers, fake dns/ip (eg.: editing system host file to resolve DNS to another IP and changing the document.domain to correspond to the same base domain) and some hacks. For my last application I choose to use Greasemonkey.

Greasemonkey has a javascript function called GM_xmlhttpRequest to be used for AJAX requests; but it, also, can be used to XSS because it runs as a Mozzilla Chrome context. It's amazing! 'cause to do XSS nowadays is so difficulty...

I've created a smaller user script to grease monkey allow me to do AJAX request between diferent domains. See bellow (click to automatically greasemonkey install it):

   1:// ==UserScript==
   2:// @name           UnlockXss
   3:// @namespace      net.marciowb.unlock.xss
   4:// @include        http://127.0.0.1:8080/
   5:// @include        http://www.trilha21.com.br/
   6:// ==/UserScript==
   7:// Copyright Marcio Wesley Borges<marciowb@gmail.com>, Created: 2009/03/05
   8:
   9:unsafeWindow.xss = {};
  10:unsafeWindow.xss._requests = new Array();
  11:
  12:unsafeWindow.xss.call = function(req) {
  13:        unsafeWindow.xss._requests.push(req);
  14:        window.setTimeout( xssExecutor, 1 );
  15:};
  16:
  17:function _xssExecutor() {
  18:        var reqs = unsafeWindow.xss._requests;
  19:        if (reqs.length<1)
  20:                return;
  21:                        
  22:        var req = reqs[reqs.length-1];
  23:        reqs.pop();
  24:        
  25:        GM_xmlhttpRequest(req);
  26:}
  27:
  28:function xssExecutor() {
  29:        try {
  30:                _xssExecutor();
  31:        } catch (ex) {
  32:                GM_log(ex);
  33:        }       
  34:}
  35:
  36:unsafeWindow.GM_xmlhttpRequest = unsafeWindow.xss.call;
  37:

To use it, take a look in the GM_xmlhttpRequest documentation. The example code, from Greasemonkey website, remains valid and works with the UnlockXss script:

   1:GM_xmlhttpRequest({
   2:    method: 'GET',
   3:    url: 'http://greaseblog.blogspot.com/atom.xml',
   4:    headers: {
   5:        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
   6:        'Accept': 'application/atom+xml,application/xml,text/xml',
   7:    },
   8:    onload: function(responseDetails) {
   9:        alert('Request for Atom feed returned ' + responseDetails.status +
  10:              ' ' + responseDetails.statusText + '\n\n' +
  11:              'Feed data:\n' + responseDetails.responseText);
  12:    }
  13:});

Remember: Now, you can embbending GM_xmlhttpRequest in your code, but, also, you must tell to greasemonkey where you run your user script. Do it, adding an entry as the above @include for each domain where you want to enable the XSS/Ajax request.

Assorted Greasemonkey Tips

Do you want compile your Greasemonkey User Script into a XPI extension to Firefox? Okay, you can! See the Greasemonkey Compiler.

Do you need to inject Dojo into a page via Greasemonkey? Don't know how? Do, it:

   1:// ==UserScript==
   2:// @name           ML - Copiar dados da Lista de Envios
   3:// @namespace      net.marciowb.ml.lista.envios
   4:// @description    Copia os dados da lista de envios do ML
   5:// @include        http://www.mercadolivre.com.br/jm/impressionList
   6:// ==/UserScript==
   7:
   8:var script = document.createElement("script");
   9:script.id="scriptInjectedDojo";
  10:script.src="http://www.trilha21.com.br/Webs/js/dojo/dojo.js";
  11:document.getElementsByTagName("head")[0].appendChild(script);
  12:
  13:var link = document.createElement("link");
  14:link.id = "linkInjectedTundra" 
  15:link.rel = "stylesheet";
  16:link.type= "text/css";
  17:link.href="http://www.trilha21.com.br/Webs/js/dijit/themes/tundra/tundra.css";
  18:document.getElementsByTagName("head")[0].appendChild(link);
  19:....

Labels: , ,

2009/02/28

An old 'new newbie learning how to hack (again!)

I'm trying to crack an application related a consultancy job, but I'm newbie (a long, long, long time ago I knew more, but it was in DOS age) and I haven't many time to learning many things about it. So, after a quickly search, I found Windbg, but, sinceraly, it's piece of bullshit. I wasted my entire day trying to break the key checking mechanism using the Windbg, but it doesn't help me much.

OllyDbg

OllyDbg

If you need a good (excelent!!!) software to crack (or to do reverse engineering), try the OllyDbg - it's fantastic: easy to use, intuitive, useful, and powerful! OllyDbg is shareware, but you can use it without paying nothing, if you want (or need).

Using Win32SDK Help and Windows Symbols with OllyDbg

OllyDbg automatically recognizes symbols and when you want, it launchs the Win32Help to the specific topic of the symbol!

If you need the Win32SDK help files, download it, here: win32hlp. If you use the Windows Vista, you need to download the Win32Hlp.exe from Microsoft.

Also, the Microsoft Windows Symbolic Information can be found at Download Windows Symbol Packages from Microsofot.

Labels: , ,

2009/02/11

EJB3: Workarounding Non XA Database/JDBC Driver

Sometimes we need to access more than one database to do some task. Eg.: Syncing data between two differents databases or when the data is physically sparse. But if you use Session Beans to do the job and your database(s) is a Non-XA (in simple terms: non prepared to work with distribute transaction), you was trapped. The Session EJBs doesn't works with more than a one Non-XA database (or XA defective JDBC driver...) in the same container managed transaction. When the Session Bean tries to open a second non-XA database (resource), the following (see the red contour) error raises:
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-test-single:
Testsuite: br.com.trilha21.web.store.IndexPageUITest
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        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.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
        ... 46 more

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe)
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        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.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
        ... 46 more

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe)
Tests run: 2, Failures: 0, Errors: 2, Time elapsed: 20,375 sec

Testcase: testNewCustomer_PersonalAccount(br.com.trilha21.web.store.IndexPageUITest): Caused an ERROR
nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        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.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.  
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
        ... 46 more

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:243)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at br.com.trilha21.web.store.ejb.__CustomerRemote_Remote_DynamicStub.forceDelete(br/com/trilha21/web/store/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at br.com.trilha21.web.store.ejb._CustomerRemote_Wrapper.forceDelete(br/com/trilha21/web/store/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.IndexPageUITest.testNewCustomer_PersonalAccount(IndexPageUITest.java:181)
Caused by: java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:251)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:289)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
Caused by: org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:913)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.ReplyMessage_1_2.getSystemException(ReplyMessage_1_2.java:131)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:685)
        at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:472)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:217)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Error Code: 0
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at br.com.trilha21.web.store.ejb._CustomerRemote_Wrapper.forceDelete(br/com/trilha21/web/store/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.IndexPageUITest.testNewCustomer_PersonalAccount(IndexPageUITest.java:181)


Testcase: testNewCustomer_EnterpriseAccount(br.com.trilha21.web.store.IndexPageUITest): Caused an ERROR
nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        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.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        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.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
        ... 46 more

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:243)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at br.com.trilha21.web.store.ejb.__CustomerRemote_Remote_DynamicStub.forceDelete(br/com/trilha21/web/store/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at br.com.trilha21.web.store.ejb._CustomerRemote_Wrapper.forceDelete(br/com/trilha21/web/store/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.IndexPageUITest.testNewCustomer_EnterpriseAccount(IndexPageUITest.java:261)
Caused by: java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:251)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:289)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
Caused by: org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:913)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.ReplyMessage_1_2.getSystemException(ReplyMessage_1_2.java:131)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:685)
        at com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:472)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:217)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: null; nested exception is: 
        javax.transaction.TransactionRolledbackException: CORBA TRANSACTION_ROLLEDBACK 9998 Maybe; nested exception is: 
        org.omg.CORBA.TRANSACTION_ROLLEDBACK: ----------BEGIN server-side stack trace----------
org.omg.CORBA.TRANSACTION_ROLLEDBACK:   vmcid: 0x2000  minor code: 1806 completed: Maybe
        at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:231)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1386)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy157.forceDeleteCustomer(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
        at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
        at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
        at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
        at net.marciowb.trilha.ejb.__CustomerRemote_Remote_DynamicStub.forceDeleteCustomer(net/marciowb/trilha/ejb/__CustomerRemote_Remote_DynamicStub.java)
        at net.marciowb.trilha.ejb._CustomerRemote_Wrapper.forceDeleteCustomer(net/marciowb/trilha/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.ejb.CustomerBean.forceDelete(CustomerBean.java:217)
        at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
        at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
        at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
        at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
        at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
        at $Proxy128.forceDelete(Unknown Source)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
        at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
        at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
        at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.IllegalArgumentException: NamedQuery of name: Customer.byIdentification not found.
        at com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:3728)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3576)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)

----------END server-side stack trace----------  vmcid: 0x2000  minor code: 1806 completed: Maybe
        at br.com.trilha21.web.store.ejb._CustomerRemote_Wrapper.forceDelete(br/com/trilha21/web/store/ejb/_CustomerRemote_Wrapper.java)
        at br.com.trilha21.web.store.IndexPageUITest.testNewCustomer_EnterpriseAccount(IndexPageUITest.java:261)


Test br.com.trilha21.web.store.IndexPageUITest FAILED
F:\devel\projects\trilha21\e-store\TrilhaStoreEApp\TrilhaStore\nbproject\build-impl.xml:883: Some tests failed; see details above.
BUILD FAILED (total time: 23 seconds)

To workaround it, you can annotate the EJB Session (or its specific method) as a non transaction participant. Do it, as:

   1:@Stateless
   2:@Remote(value=CustomerRemote.class)
   3:public class CustomerBean extends AbstractBean<Customer> implements CustomerLocal, CustomerRemote, Serializable {
   4:
   5:.....
   6:    public Customer saveCustomer(Customer customer) {
   7:        if (customer.getReseller()==null) {
   8:            customer.setReseller(resellerBean.getDefaultReseller());
   9:        }
  10:        customer = save(customer);
  11:        return customer;
  12:    }
  13:
  14:    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  15:    public boolean forceDeleteCustomer(String identification) {
  16:        boolean deleted = false;
  17:        identification = StrUtil.getDigits(identification);
  18:        final Customer customer = getCustomer(identification);
  19:        if (customer!=null) {
  20:            delete(customer.getId());
  21:            deleted = true;
  22:        }
  23:        
  24:        final UserAccount user = userAccountBean.getUserAccount(identification);
  25:        if (user!=null) {
  26:            userAccountBean.delete(user.getId());
  27:            deleted = true;
  28:        }
  29:
  30:        return deleted;
  31:    }
  32:}
  33:

Some more complicated cases maybe you would have an EJB Session that calls another EJB Session (or another method from itself), but the first Session Bean uses a SGBD and the second uses another SGBD - both aren't XA - and there are several operations to be done for each SGBD, and so, you will need a transaction. If your requirements can tolerate, you can tell to the container to start another transaction to your second EJB. Annotate (see the blue contour) in the second method or EJB:

   1:
   2:    public Customer saveCustomer(Customer customer) {
   3:        if (customer.getReseller()==null) {
   4:            customer.setReseller(resellerBean.getDefaultReseller());
   5:        }
   6:        customer = save(customer);
   7:        return customer;
   8:    }
   9:
  10:    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  11:    public boolean forceDeleteCustomer(String identification) {
  12:        boolean deleted = false;
  13:        identification = StrUtil.getDigits(identification);
  14:        final Customer customer = getCustomer(identification);
  15:        if (customer!=null) {
  16:            delete(customer.getId());
  17:            deleted = true;
  18:        }
  19:        
  20:        final UserAccount user = userAccountBean.getUserAccount(identification);
  21:        if (user!=null) {
  22:            userAccountBean.delete(user.getId());
  23:            deleted = true;
  24:        }
  25:
  26:        return deleted;
  27:    }
  28:

And remember, if you don't need any transaction, don't use it.

Read more, at:

Labels: , ,

2009/02/10

Tip: Troubles/Failures when Installing/Uninstalling Applications

Today I need to update my Sun JDK to the latest release on my desktop machine running Windows Vista 64, but when I tried to install the JRE I got the error:
Error 1723. A DLL required for this install to complete could not be run.

I saw in the Event Log that the error was about a non existent file named regutils.dll. I tried to delete some entries in the Registry, but it doesn't help me. I tried to uninstall all my JDK/JRE versions, but no success. I tried to use one or two Registry Cleaners, but, again, no success.

Windows Installer CleanUp

Windows Install Clean Up

So, after to read, to try and to fret my head - two hours later - I found a small utility from Microsoft to erase (cleanup) the Windows Installer database for a specific application package.

If you have some application that doesn't install never or desinstall and nothing else help you, and you are thinking to reinstall your OS, try the Windows Install Clean Up before do it... It is simple to use and works (for me) fine.

The utility works to 32 and 64 bit OSes. It can be used to remove the installer data about any application that uses Microsoft Installer machinery, including, non Microsoft applications. Read more at the Microsoft Knowledge Base article: kb290301 - Description of the Windows Installer CleanUp Utility.

Needing more help, read How to resolve Common "Windows Installer" Problems and Error Codes.

Labels: , , ,

2009/01/27

Lixo: Kubuntu Intrepid 8.10 e KDE 4

Até o presente momento, apesar de diversos problemas, tenho optado por usar KDE por causa de sua interface rica (agradável, amigável e para noobs vindos do Windows como eu) e da biblioteca QT. De todas as distribuições que testei ao longo de quase nove anos, período que trabalho com Linux, a que mais me agradou foi a Ubuntu; razão do que, por gostar do KDE, optei por usar sua variante Kubuntu.

Uso o Kubuntu com meu notebook HP Pavilion zv6000. No início tive muitoooosssss problemas para deixar tudo funcionando, mas após a versão 6 do Ubuntu e a melhora do suporte da ATI ao Linux, as coisas melhoraram bastante. Chegou ao ponto de conseguir deixar tudo funcionando 100% (exceto IR).

Sempre tive resistência às mudanças de versões, pois, prefiro perder meu tempo com outras coisas que ficar me extressando com os problemas advindos dos upgrades de distribuições. No entanto, um dito conhecedor e colaborador do Linux, com o qual trabalhei no MAPA (Min. Agricultura aqui do Brasil), me conveceu de que era muito seguro os upgrades do Ubuntu e que não teria problemas ao fazê-lo - sempre, enfatizando a estabilidade e conservadorismo do Debian; base do Ubuntu. Desde então (creio que a versão do Kubuntu 6), tenho feito os upgrades regularmente.

A última versão do Kubuntu que instalei, foi a 8.10, AKA: Intrepid. Nessa versão pude ter a péssima experiência de usar o KDE 4.1.X e 4.2. Que porcaria! Lixo! Desgraça! So aborrecimentos, como:

  • Short cuts globais com diversos problemas ao ponto de não funcionar na prática... além de redesignação de inumeras shortcuts que já estavam estabelecidas anteriormente. E se tentasse redesigná-las, 99.9% das vezes não funcionava...
  • Redesign de todo o desktop ao ponto de eu ficar totalmente perdido e sem saber onde fica e como usa um zilhão de coisas - até me fez lembrar a transição Windows XP para Windows Vista, mas acredite: a transição KDE 3 para KDE 4 é muito pior!
  • A consagração do Dolphin (que lástima) como gerenciador de arquivos em detrenimento do (bom) Konqueror
  • A constante impressão de que todo mudou, que você não sabe de mais nada, que era melhor nem ter feito o upgrade e que tudo ficou pior do que era e a questão que se repete em mente: Por que fizeram isso?!
  • Detonaram com o Adept ao ponto de ficar quase imprestável.
A única coisa que funcionou bem no Kubuntu Intrepid para minha surpresa foi o KDENetworkManager o WiFi do meu notebook. Funcionou de primeira e como nunca antes aconteceu! Fora isso, um completo lixo, perda de tempo e desempenho!

Sim, meu notebook é velho pra caramba! Com o KDE 4 ficou tudo mais lento e consideravelmente irritante para um desenvolvedor impaciente como eu.

Downgrade, não, Reinstalação mesmo

Após usar a cada do KDE 4 por uns três meses e tentar me enteder com ele, hoje, finalmente, resolvi reinstalar por completo o bom e nem tão velho Kubuntu Hardy 8.04! Ah, que alívio! Mas como nem tudo eram flores, e realmente fiz uma reinstalação do zero, tive que resolver os antigos problemas. Por sorte, alguns deles, cheguei a registrar aqui no blog, mas outros, eram novos.

NDISWrapper e Firmware do Wifi do HP Pavilion zv6000

Para quem tem um notebook como o meu ou um chipset WiFi como o Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller (rev 03) de identificador PCI 14E4:4320 ou compatível, deixo aqui a firmware que consegui fazê-lo funcionar. Faço isso, para mim mesmo já que sou extremamente desorganizado e não é a primeira vez que tenho que sair catando uma porção de drivers e sair testando um-por-um. Download do driver para Windows XP 64 para uso com Ubuntu de 64 bits (e variantes).

Por algum motivo o KDENetworkManager não funciona adequadamente no Hardy. Por isso, pode ser que você tenha problemas com os programas que fazem uso do NetworkManager, incluindo o Konquero e Firefox.

Firefox

Por falar em Firefox, já estou usando o Firefox 64 bits com o respectivo plugin do Flash. A versão do Firefox 3.0.X para 32 bits não está estável no Hardy 64 bits. Mas a versão 64 bits do Firefox está funcionando plenamente, inclusive, com a instalação padrão realizada no repositório do Ubuntu. Recomendo também a instalação do pacote ubufox. A instalação do plugin Flash já pode ser feita diretamente pelo próprio Firefox, coisa que antes não acontecia na versão 64 bits.

Dessa vez foi mais simples resolver os problemas de acentuação do C-Cedilha. Isso, tanto do KDE, quanto da GTK. De qualque forma, ainda assim foi útil o post Ć (C Acentuado) vs. Ç (C Cedilha) no Firefox32 rodando num AMD64 com Kubuntu 64 Bits.

Por causa do NetworkManager eu tive um problema com o Firefox. Ele sempre iniciava em modo "off-line". Por isso, após pesquisar, descobri que esse era um problema específico do Firefox 3.0.5 com o Hardy (ao menos foi o que li/entendi) conforme reportado no Bug #232243 do Ubuntu. De nada adianta desabilitar o item de menu "Work Offline", pois ao reiniciar o Firefox, novamente este se encontraria em modo offline. Como eficiente paliativo (workarround), nas configurações do Firefox (na barra de endereços digite: about:config), procure por toolkit.networkmanager.disable e atribua-o o valor true para desabilitar o gerenciador de rede e acabar com o problema para o Firefox.

Outra novidade é que já é possível rodar o plugin 64 bits com a JVM da SUN no Firefox 64 bit. Para mais informações, vide: 64 bit Sun Java Browser Plugin.

Até o presente momento, de forma geral, o Firefox 64 Bit está se comportado muito bem e com todos os recursos; sinal de amadurecimento da plataforma 64 bit que até pouco tempo atrás colecionava inúmeros programas dependentes de execução em modo 32 bit.

Labels: ,

2008/11/19

E-mails com Pedidos do Mercado Livre + GMail * Greasemonkey = Produtividade

Já faz algum tempinho que acumulei centenas de vendas no Mercado Livre. Em tempos de gloria, chegava a fazer mais de uma dezena de vendas ao dia e isso trouxe a problemática de atender aos clientes de forma ágil e adequada. E a verdade, é que o simples processo (sem falar nos outros) de enviar o e-mail com os dados do pedido ao cliente, me aborrecia pelo tempo perdido.

O Paulinho, um amigo, me disse que o bom programador, era antes de tudo, um grande preguiçoso. Eis-me: A preguiça personificada! Raramente repito duas tarefas da mesma forma, sempre dou um jeitinho de melhorar (nos meus critérios) o processo, seja o que for... Obviamente, as vezes, decaio na inprodutividade, no perfeccionismo imperfeito e na tolice aguda! Mas mesmo assim, invento e reinvento! Até, no ápice do sucesso, faço funcionar!

A questão é que, contrariando qualquer instinto (por mais forte que fosse), resisti a tentação de fazer um script, ou até mesmo, simplesmente criar uma regra/filtro que me ajudasse na simples tarefa de responder com os dados da compra de meus clientes. Visto que me despersuadia:
- "Não seja tolo, Marcio. Vai perder ainda mais tempo com isso."
Sinceramente, nem me reconheço com essa atitude, mas é verdade: resisti!

A questão, é que depois de fazer a mesma coisa por mais de 800 vezes (real!! foi mais que isso mesmo!), você pára (logo agora que tentava escrever direito, me tiram o tal do acento... <0) e, após xingar toda seus antepassados - se excomungar -, diz:
Devia ter automatizado isso antes...

EMail com Pedido do Mercado Livre

Eis, logo eu que atualmente me vejo trabalhando nuns trocentos projetos ao mesmo tempo e tentando ser dono de meu próprio narzi, mas ao contrário, cada vez mais preso... me vejo tomado por uma completa indignação por fazer a mesma tarefa por quase 1000 vezes e digo a mim mesmo:
- basta! Vou automatizar isto!

Chega o momento de ver o que seria melhor. Com certeza o melhor é criar um sistema, baseado em uma base de dados, que concentre todas as informações de compra, inclusive passadas e que fosse integrada com a "maravilha" do ML... até fiz vários progressos nesse sentido, mas parei no ponto onde precisava alimentar a base com os dados que retirava de 5 (sim, cinco!) diferentes páginas do ML e mantê-los de uma forma racional e principalmente utilizável!

Optei, então, por me concentrar somente no simples problema de responder ao cliente com os dados de sua compra, como: onde pagar, o quanto pagar, onde fazer etc. Isso poderia simplesmente ser feito com um filtro no GMail, por exemplo e até soluções mais elaboradas via VBA, por exemplo, com o Outlook. Mas queria uma coisa que NÃO funcionasse totalmente por si só, que ainda precisasse de minha leitura prévia (e rápida). Por isso, já que atualmente ando trabalhando tanto com AJAX e naturalmente Javascript (como se nunca o tivesse feito antes [8 anos atrás já usava DHTML e AJAX, sem nem saber que o nome desse tipo de coisa era isso]) que fosse simples e perfeitamente integrado à minha rotina.

Após estudar as opções, resolvi botar o meu velho entusiamo no Greasemonkey para render algo e fui atrás de alguma alguma API do GMAIL que funcionasse bem com ele. Nessas horas, é ótimo descobrir que você é um tolo nada original, vi que já haviam criado tal API - algo simples, mas que resolve o mínimo. Daí então, foi só botar a mão em XPath, RegEx, DTHML/DOM e, claro, não poderia faltar, o Firebug.

Firebug

E é esse, meu pequeno legado, e sei que não evitará que ainda assim me chamem de pária ou até mesmo lammer, mas eventualmente, inspirará (nem que seja o desprezo) alguém. Não sei quantos programadores vendem no ML, mas deve ter mais alguém; creio.

À Programação

O Greasemonkey tem uma variável com um objeto mágico chamado de nome window que encapsula a window "real". Se quiser acessar o objeto window real, na verdade, terá que usar unsafeWindow. Isso vale para qualquer variável global, pois ela só estará acessível em unsafeWindow. Isso é causa de muita dor de cabeça para os iniciantes no Greasemonkey. Por exemplo, a instância do console do Firebug só existe em unsafeWindow.

EMail já preenchido com os dados do pedido

O GMail te disponibiliza o objeto unsafeWindow.gmonkey e é por meio dele que você interage com o DOM do GMail e particularmente, alguns de seus membros. Antes de avançar no uso de unsafeWindow.gmonkey, você vai precisar informar ao GMail que deseja (sim o suporte ao Greasemonkey, graças a um funcionário da Google, é da própria Google) carregar o módulo do GMonkey. Para mais informações, leia a:
API reference for version 1.0 of the experimental Gmail Greasemonkey API.

Após se obter acesso à DOM (DHTML) do GMail, o resto é trivial e atualmente, totalmente dependente da estrutura atual do GMail, ou seja, em futuras modificações do GMail, corre-se o risco do código que funcionava antes parar de funcionar.

Para flexibilizar e facilitar o acesso à DHTML do GMail, preferi o uso conjunto de XPath e RegEx pelo poder inerente dessas linguagens de consultas.

O funcionamento é basicamente clicar em "Reply" no e-mail que foi recebido do Mercado Livre (com os dados da compra do cliente) e ir até o Greasemonkey e acionar o comando "Preencher Dados de Compra". Com isso, de forma automática e quase mágica, todos os dados, de todos os campos, serão preenchidos, e, inclui, seguintes recursos:

  • Preenchimento do Nome/Email do destinatário (o cliente);
  • Suporte a uma template de resposta HTML onde todos os campos são preenchidos de forma automática. Os dados são obtidos do email original que foi enviado pelo ML;
  • Cálculo automático do total da compra e incluindo o frete (padrão) e quantidade adquirida.
   1:// ==UserScript==
   2:// @name           GMail - Pedidos do ML
   3:// @namespace      net.marciowb.gmail.ml.pedidos
   4:// @description    Me ajuda a preencher os pedidos do ML - by Marcio Wesley Borges<marciowb@gmail.com>
   5:// @include        http://mail.google.com/mail/*
   6:// ==/UserScript==
   7:
   8:const GMONKEYVER = "1.0";
   9:var gmail = null;
  10:var console = null;
  11:
  12:function evaluateXPath(xPath, aNode) {
  13:        if (!aNode) {
  14:                aNode=document;
  15:        }
  16:        var res = aNode.ownerDocument.evaluate(xPath, aNode, null, XPathResult.ANY_TYPE, null);
  17:        switch (res.resultType) {
  18:                case XPathResult.STRING_TYPE:
  19:                        return res.stringValue;
  20:                case XPathResult.NUMBER_TYPE:
  21:                        return res.numberValue;
  22:                case XPathResult.BOOLEAN_TYPE:
  23:                        return res.booleanValue;
  24:                default:;
  25:        }
  26:        var foundNodes = new Array();
  27:        var item = res.iterateNext(); 
  28:        while (item) {
  29:                foundNodes.push(item);
  30:                item = res.iterateNext();
  31:        }
  32:        return foundNodes;
  33:}
  34:
  35:/**
  36:* Obtém o elemento BODY do e-mail que está sendo composto (criado).
  37:*/
  38:function getComposingMailBody() {
  39:        if (!gmail)
  40:                return null;
  41:        var el = gmail.getActiveViewElement();  
  42:        if (!el)
  43:                return null;
  44:        var aa=evaluateXPath("//iframe[@id!='remote_iframe_0']", el);
  45:        if (!aa || aa.length==0)
  46:                return null;
  47:        var doc = aa[0].contentDocument;
  48:        if (!doc)
  49:                return null;
  50:        var body = doc.body;
  51:        return body;
  52:}
  53:
  54:/** 
  55:* Esta função é para ser chamada por dadosCompra().<br>
  56:* @param _gmail É fornecido automaticamente pela função gmonkey.load que chama esta.
  57:*/
  58:function _dadosCompra(_gmail) {
  59:        console = unsafeWindow.console;
  60:        gmail = _gmail;
  61:        
  62:        var bodyElem = getComposingMailBody();
  63:        if (bodyElem==null) {
  64:                window.alert("Antes, é necessário que  um reply no e-mail com os dados da compra do Mercado Livre");
  65:                return;
  66:        }
  67:        
  68:        
  69:        //Tenta obter o "quoted" mail que está sendo respondido
  70:        var aQuoted=evaluateXPath("//div[@class='gmail_quote']", bodyElem);
  71:        if (!aQuoted || aQuoted.length==0) {
  72:                window.alert("Não se deve apagar o quoted mail ainda.");
  73:                return;
  74:        }
  75:        var quotedMailBody = aQuoted[0].innerHTML;
  76:                
  77:        //Obtém o código do anúncio e nome do produto
  78:        var rgx = /;id=(\d*)[^>]*>([^<]*)/
  79:        var m = rgx.exec(quotedMailBody);
  80:        if (!m || m.length<3) {
  81:                window.alert("Isto  funciona para os e-mails de compra do Mercado Livre.");
  82:                return;
  83:        }
  84:        var codAnuncio = m[1];
  85:        var nomeAnuncio = m[2];
  86:        
  87:        //Obtém o nome do comprador
  88:        rgx = /Nome:\s*<b\b[^>]*>(.*)<\/b>/
  89:        m = rgx.exec(quotedMailBody);
  90:        var nomeComprador = m[1];
  91:        
  92:        //Obtém o código, apelido e pontuação do comprador
  93:        rgx = /Apelido:.*id=(\d*)".*[^>]>(.*) \((\d*)\)/
  94:        m = rgx.exec(quotedMailBody);
  95:        var codComprador = m[1];
  96:        var apelidoComprador = m[2];
  97:        var pontuacaoComprador = m[3];
  98:        
  99:        //Obtém a quantidade de produtos comprados
 100:        rgx = /Quantidade:\s*(\d*)/
 101:        m = rgx.exec(quotedMailBody);
 102:        var quantidade = m[1];
 103:        
 104:        //Obtém o preço pelo qual o cliente comprou o produto
 105:        rgx = /Preço:\s*([^<]*)/
 106:        m = rgx.exec(quotedMailBody);
 107:        var descPreco = m[1].replace("R$","").replace("unit.","");
 108:        
 109:        //Obtém o e-mail do comprador
 110:        rgx = /E-mail:[^>]*>([^<]*)/i
 111:        m = rgx.exec(quotedMailBody);
 112:        var emailComprador = m[1];
 113:        
 114:        //Obtém o telefone do comprador
 115:        rgx = /Telefone:\s*([^<]*)/
 116:        m = rgx.exec(quotedMailBody);
 117:        var telefoneComprador = m[1];
 118:        
 119:        //Obtém a cidade do comprador
 120:        rgx = /Cidade:\s*([^<]*)/
 121:        m = rgx.exec(quotedMailBody);
 122:        var cidadeComprador = m[1];
 123:        
 124:        //Obtém o estado do comprador
 125:        rgx = /Estado:\s*([^<]*)/
 126:        m = rgx.exec(quotedMailBody);
 127:        var estadoComprador = m[1];
 128:        
 129:        //Obtém o país do comprador
 130:        rgx = /País:\s*([^<]*)/
 131:        m = rgx.exec(quotedMailBody);
 132:        var paisComprador = m[1];
 133:
 134:        //////////////////////////////////////  
 135:        var VLR_MIN = 4; //Valor mínimo da compra. Isto é realizado por segurança nossa e o objetivo é evitar que um erro qualquer nos cause prejuízo.
 136:        var TIP_FRETE = "Frete por SEDEX";
 137:        var VLR_FRETE = "23.00";
 138:        
 139:        var vlrTotal = (Number(descPreco) * Number(quantidade)) + Number(VLR_FRETE);
 140:        if (vlrTotal<VLR_MIN) {
 141:                window.alert("Erro: o valor total da compra está sendo computado como: " + vlrTotal);
 142:                return;
 143:        }
 144:        
 145:        var TEMPLATE = '<div>Oi,<br> <br> &nbsp;&nbsp; Td blz?<br><br></div><span style="color: rgb(0, 102, 0);">&nbsp;&nbsp; É o seguinte, informa aí:<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Nome: @NOME_COMPRADOR</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">Endereço:</span></span><br style="font-family: courier new,monospace;"><span style="color: rgb(0, 102, 0);"><span style="font-family: courier new,monospace;">Bairro: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">Cidade/Estado: @CIDADE_COMPRADOR-@ESTADO_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">CEP: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">APELIDO: @APELIDO_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">CPF: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">TEL: @TELEFONE_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">E-MAIL: @EMAIL_COMPRADOR </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">FORMA DE PAGAMENTO: </span><br><br>E se tu tivé uma companhia, diz, também:<br><span style="font-family: courier new,monospace;">Nome da Empresa: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">CNPJ: </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Inscrição Estadual: </span><br></span><br><b style="color: rgb(0, 102, 0);">Importante: </b><span style="color: rgb(0, 102, 0);"><br> Nessa, você  levando:<pre> <br><table border="1" cellspacing="0" cols="3" style="font-family: courier new,monospace;font-size:9pt" rules="groups" width="100%" frame="void"><tbody> <tr> <td width="35" align="right"><b>Qnt.</b></td> <td  align="right" width="94"><b>Valor</b></td> <td align="left"><b>Descrição</b></td> </tr> <tr> <td width="35" align="right">@QNT_PRODUTO</td> <td align="right" >@VALOR_PRODUTO</td> <td>@NOME_PRODUTO</td> </tr> <tr> <td width="35" align="right">@QNT_FRETE</td> <td align="right" >@VALOR_FRETE</td> <td>@TIPO_FRETE</td> </tr> <tr> <td bgcolor="#e6e6e6" align="right" height="16"><b>@QNT_TOTAL</b></td> <td bgcolor="#e6e6e6" align="right" ><b>@VALOR_TOTAL</b></td> <td bgcolor="#e6e6e6"><font size="2"><b>Total</b></font></td> </tr> </tbody> </table><font face="monospace"><br></font></pre> &nbsp;&nbsp; É isso, aí.<br>Valeu brother,<br> Ful. de Talz';
 146:        var emailBody = TEMPLATE
 147:                .replace("@NOME_PRODUTO", (nomeAnuncio+" #"+codAnuncio))
 148:                .replace("@VALOR_PRODUTO", descPreco)
 149:                .replace("@QNT_PRODUTO", quantidade)
 150:                .replace("@QNT_FRETE", "1")
 151:                .replace("@VALOR_FRETE", VLR_FRETE)
 152:                .replace("@TIPO_FRETE", TIP_FRETE)
 153:                .replace("@QNT_TOTAL", (Number(quantidade)+1))
 154:                .replace("@VALOR_TOTAL", vlrTotal)
 155:                .replace("@EMAIL_COMPRADOR", emailComprador)
 156:                .replace("@TELEFONE_COMPRADOR", telefoneComprador)
 157:                .replace("@APELIDO_COMPRADOR", apelidoComprador)
 158:                .replace("@CIDADE_COMPRADOR", cidadeComprador)
 159:                .replace("@ESTADO_COMPRADOR", estadoComprador)
 160:                .replace("@NOME_COMPRADOR", nomeComprador);
 161:                
 162:        bodyElem.innerHTML = emailBody;
 163:        
 164:        //Tenta obter o campo de listagens dos e-mails dos destinatários
 165:        var el = gmail.getActiveViewElement();
 166:        var aTos=evaluateXPath('//textarea[@name="to"]', el);
 167:        if (!aTos || aTos.length<1) {
 168:                window.alert("Erro: não foi possível determinar onde está o campo relativo aos emails do destinatário. Isso pode ocorrer no caso do GMail mudar sua estrutura DHTML.");
 169:                return;
 170:        }
 171:        var to = aTos[0];
 172:        to.value = nomeComprador + "<" + emailComprador + ">";
 173:        
 174:        console.log("Viva Java! Viva a Liberdade! Reviva a SUN!");
 175:}
 176:
 177:function dadosCompra() {
 178:        unsafeWindow.gmonkey.load(GMONKEYVER, _dadosCompra);
 179:}
 180:
 181:GM_registerMenuCommand('Preencher Dados de Compra', dadosCompra); 
 182:

Caso alguém queira o script acima para o Greasemonkey, pode pegá-lo aqui:
Preenchimento automático de e-mail com os dados da compra do cliente do Mercado Livre.

Referências

Labels: ,

2008/10/03

NoSerialMouse: Ao Plugar Dispositivo Serial, Windows fica "maluco" e reconhece como Mouse

Algumas vezes quando se pluga algum dispositivo serial - e isso vale para dispositivos seriais que funcionam via USB, ou seja, aqueles que criam uma porta COM virtual no computador -, o Windows aparentemente fica maluco, um monte de coisas começam a acontecer na tela e se tem a impressão de que alguém ou alguma coisa tomou o controle do computador. Isso pode acontecer com qualquer dispositivo serial, apesar de frequentemente acontecer mais com certos tipos, como: qualquer GPS NMEA 0183, seja plugado na USB ou na porta serial.

O problema acontece porque ao se plugar o dispositivo, o Windows verifica que ele é serial e durante um pequeno período de tempo ele amostrará os dados que estão sendo transmitidos pelo dispositivo, por coincidência, no momento da amostragem o Windows poderá detectar alguma sequência de dados que caracterize um Mouse, nesse caso, graças a magia do plug-and-play, ele irá automaticamente adicionar um Mouse de acordo com o dispositivo que ele (o Windows) pensa se tratar à lista de dispositivos do computador. Após isso, ocorre o comportamente aparentemente aleatório e inesperado na tela.

Para resolver esse problema, é bastante simples: basta desativar o Mouse que foi criado no Gerenciador de Dispositivos. No caso do meu GPS, o WIndows o reconheceu como sendo o "Microsoft Serial Ballpoint" - então, foi só desativá-lo para resolver o problema.

No vídeo abaixo, mostro como reconhecer esse falso Mouse e como desabilitá-lo:

Apesar do procedimento acima ser simples, nem sempre é fácil executá-lo pois o ponteiro do mouse fica pulando na tela e clicando em tudo que é lugar, então, até que se possa executar todos os passos e desativar o "falso mouse", muito trabalho será necessário. Pensando nisso, resolvi pesquisar melhores soluções para o problema, já que muita gente passa e passará por isso. Veja o que encontrei:

NoSerialMouse

NoSerialMouse

Pensando no bem coletivo e aproveitando um pequeno programinha que fiz anteriormente, acabei por automatizar a solução descrita pelo artigo 283063 da Microsoft. A idéia foi criar algo bem simples, mas que fosse eficaz. Você deixa ele rodando antes de plugar o dispositivo e quando o dispositivo é plugado, ele automaticamente desativa o mecanismo que faria o Windows reconhecê-lo como um Mouse. O programa funciona particularmente bem com dispositivos USB e foi testado no Windows XP, Vista 64 e 2000. O NoSerialMouse pode listar todas as portas COM do computador ou somente as COM que estejam efetivamente disponíveis.

O NoSerialMouse é gratuito. No entanto, pode ser que alguém se interesse pelos fontes, já que o mecanismo de reconhecimento das portas seriais é particularmente sofisticado e reconhece com excelente precisão os mais diversos tipos de portas seriais - onde, inclusive, outros mecanismos de enumeração do hardware, falham (isso vale para Win2k, XP, Vista32/64). Os fontes do programa estão em Delphi 6 (com código e comentários em inglês) e posso, eventualmente, responder alguma questão por e-mail. Para adquirir os fontes, acesse:

Referências:

Labels: ,

2008/08/07

Quickly: Using H2 Database with Glassfish and Toplink

For Glassfish: Configuring sun-resources.xml

To use H2 Database with Glassfish (or Sun AS), you must edit the sun-resources.xml file and configure a JDBC Resource and a JDBC Connection Pool using respectively the tags jdbc-resource and jdbc-connection-pool. Take care with the attribute datasource-classname of jdbc-connection-pool, because you must configure its value to org.h2.jdbcx.JdbcDataSource. If you configure this parameter with other value, like org.h2.Driver (it isn't a javax.sql.Datasource!), you get the error:

Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: org.h2.Driver cannot be cast to javax.sql.DataSource
Error Code: 0
        at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:305)
        at oracle.toplink.essentials.jndi.JNDIConnector.connect(JNDIConnector.java:150)
        at oracle.toplink.essentials.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:184)
        at oracle.toplink.essentials.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:582)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:280)
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:229)
So, after configure the sun-resources.xml, I have:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="jdbc/TrilhaH2" object-type="user" pool-name="trilhaH2Pool"/>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.h2.jdbcx.JdbcDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="trilhaH2Pool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="User" value=""/>
    <property name="Password" value=""/>
    <property name="URL" value="jdbc:h2:tcp://localhost//store/h2/trilha"/>
    <property name="driverClass" value="org.h2.Driver"/>
  </jdbc-connection-pool>
</resources>

H2Platform: H2 Specific Behavior to Toplink

To use H2 Database with Toplink, may be do you want to instruct the Toplink to take full use of H2 SQL/JDBC features. If yes, take a look at H2Platform java source code and read its instructions. And after compile it and place it into the JAR, configure your persistence.xml including the property:
<property name="toplink.target-database" value="oracle.toplink.essentials.platform.database.H2Platform"/> .
Note: The old property toplink.platform.class.name is deprecated - instead, use toplink.target-database.

Warning: H2Platform is inaccurate

The H2Platform class (from the h2-2008-07-28.zip)has a poor and inaccurate implementation. If you want to use IDENTITY data type to (duh!) alto-increment a primary key field, with the H2Platform, it doesn't work! Instead you are obligated to use SEQUENCE. By default, Toplink expected a SEQUENCE with a increment of 50.

Eg., if you have an annotated field like this:
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "TERMINALHISTORY_ID", nullable = false, insertable = true, updatable = false)
    private Long id;


The H2Platform supplied by H2, fails and you should be use the following (exactly) sequence:
CREATE SEQUENCE SEQ_GEN_SEQUENCE start with 0 INCREMENT BY 50;

If you set the increment size to a value less than the expected by Toplink (50), do you get the warning:
The sequence named [SEQ_GEN_SEQUENCE] is setup incorrectly. Its increment does not match its pre-allocation size.
I saw into the H2Platform source code and found this (negligent) method:
    public ValueReadQuery buildSelectQueryForNativeSequence(String seqName, Integer size) {
        return new ValueReadQuery("CALL NEXT VALUE FOR " + getQualifiedSequenceName(seqName));
        // return new ValueReadQuery("SELECT " + getQualifiedSequenceName(seqName) + ".NEXTVAL FROM DUAL");
    }


See? It ignores the Toplink parameter: size.

A few better H2Platform

If you want to use the native H2 support to IDENTITY with Toplink, you must use better H2Platform implementation. You can use this:
/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License").  You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * glassfish/bootstrap/legal/CDDLv1.0.txt or
 * https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * glassfish/bootstrap/legal/CDDLv1.0.txt.  If applicable,
 * add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your
 * own identifying information: Portions Copyright [yyyy]
 * [name of copyright owner]
 */
// Copyright (c) 1998, 2006, Oracle. All rights reserved.
package net.marciowb.trilha.dao;

import java.util.*;
import oracle.toplink.essentials.queryframework.*;
import oracle.toplink.essentials.expressions.*;
import oracle.toplink.essentials.internal.databaseaccess.*;

/**
 * This platform provides H2 specific behaviour.
 * Use the following setting to enable this platform:
 * <pre>
 * &lt;property
 *   name="toplink.platform.class.name"
 *   value="oracle.toplink.essentials.platform.database.H2Platform"/>
 * </pre>
 * See also: https://glassfish.dev.java.net/issues/show_bug.cgi?id=4042
 * @author Originally H2 Team
 * @author 2008-08-09 00h07 BSB Marcio Wesley Borges Brasilia-DF,Brazil
 */
public class H2Platform extends DatabasePlatform {
    public H2Platform() {
    }

    protected Hashtable buildFieldTypes() {
        Hashtable fieldTypeMapping;

        fieldTypeMapping = super.buildFieldTypes();
        fieldTypeMapping.put(Boolean.class, new FieldTypeDefinition("TINYINT", false));
        fieldTypeMapping.put(Integer.class, new FieldTypeDefinition("INTEGER", false));
        fieldTypeMapping.put(Long.class, new FieldTypeDefinition("NUMERIC", 19));
        fieldTypeMapping.put(Float.class, new FieldTypeDefinition("REAL", false));
        fieldTypeMapping.put(Double.class, new FieldTypeDefinition("REAL", false));
        fieldTypeMapping.put(Short.class, new FieldTypeDefinition("SMALLINT", false));
        fieldTypeMapping.put(Byte.class, new FieldTypeDefinition("SMALLINT", false));
        fieldTypeMapping.put(java.math.BigInteger.class, new FieldTypeDefinition("NUMERIC", 38));
        fieldTypeMapping.put(java.math.BigDecimal.class, new FieldTypeDefinition("NUMERIC", 38).setLimits(38, -19, 19));
        fieldTypeMapping.put(Number.class, new FieldTypeDefinition("NUMERIC", 38).setLimits(38, -19, 19));
        fieldTypeMapping.put(Byte[].class, new FieldTypeDefinition("BINARY", false));
        fieldTypeMapping.put(Character[].class, new FieldTypeDefinition("LONGVARCHAR", false));
        fieldTypeMapping.put(byte[].class, new FieldTypeDefinition("BINARY", false));
        fieldTypeMapping.put(char[].class, new FieldTypeDefinition("LONGVARCHAR", false));
        fieldTypeMapping.put(java.sql.Blob.class, new FieldTypeDefinition("BINARY", false));
        fieldTypeMapping.put(java.sql.Clob.class, new FieldTypeDefinition("LONGVARCHAR", false));
        fieldTypeMapping.put(java.sql.Date.class, new FieldTypeDefinition("DATE", false));
        fieldTypeMapping.put(java.sql.Time.class, new FieldTypeDefinition("TIME", false));
        fieldTypeMapping.put(java.sql.Timestamp.class, new FieldTypeDefinition("TIMESTAMP", false));

        return fieldTypeMapping;
    }


    // public boolean isHSQL() {
    //     return true;
    // }

    public boolean isH2() {
        return true;
    }

    public boolean supportsForeignKeyConstraints() {
        return true;
    }

    public ValueReadQuery buildSelectQueryForNativeSequence(String seqName, Integer size) {
        return new ValueReadQuery("CALL NEXT VALUE FOR " + getQualifiedSequenceName(seqName));
        // return new ValueReadQuery("SELECT " + getQualifiedSequenceName(seqName) + ".NEXTVAL FROM DUAL");
    }

    public boolean supportsNativeSequenceNumbers() {
        return true;
    }

    protected String getQualifiedSequenceName(String seqName) {
        if (getTableQualifier().equals("")) {
            return seqName;
        } else {
            return getTableQualifier() + "." + seqName;
        }
    }

    public boolean supportsSelectForUpdateNoWait() {
        return true;
    }

    protected ExpressionOperator todayOperator() {
        return ExpressionOperator.simpleFunctionNoParentheses(ExpressionOperator.Today, "SYSDATE");
    }

    protected void initializePlatformOperators() {
        super.initializePlatformOperators();
        addOperator(ExpressionOperator.simpleMath(ExpressionOperator.Concat, "||"));
    }

    public boolean shouldUseJDBCOuterJoinSyntax() {
        return false;
    }

    
/** @return <code>true</code> = Of course! */ public boolean supportsIdentity() { return true; } /** * Now we implement the another missing method to support * IDENTITY data type field. * @return What it was lacking. */ public ValueReadQuery buildSelectQueryForIdentity() { ValueReadQuery selectQuery = new ValueReadQuery(); selectQuery.setSQLString("SELECT IDENTITY()"); return selectQuery; }
}

To use it, remember to config correctly your persistence.xml supplying the expected property, like this:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="TrilhaPU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <class>net.marciowb.trilha.dao.Fleet</class>
    <class>net.marciowb.trilha.dao.Organization</class>
    <class>net.marciowb.trilha.dao.Terminal</class>
    <class>net.marciowb.trilha.dao.TerminalConfiguration</class>
    <class>net.marciowb.trilha.dao.TerminalHistory</class>
    <class>net.marciowb.trilha.dao.UserAccount</class>
    <class>net.marciowb.trilha.dao.Vehicle</class>
    <properties>
      <property name="toplink.jdbc.user" value=""/>
      <property name="toplink.jdbc.password" value=""/>
      <property name="toplink.jdbc.url" value="jdbc:h2:tcp://localhost//store/h2/trilha"/>
      <property name="toplink.jdbc.driver" value="org.h2.Driver"/>
      <property name="toplink.target-database" value="net.marciowb.trilha.dao.H2Platform"/>
    </properties>
  </persistence-unit>
</persistence>


If you wish, download the above H2Platform code here.

Thanks to

Labels: ,

2008/08/05

How to change the file encoding from a specific JSP file from Netbeans 6.1?!

Unmodifiable file encoding

Ok. I don' know!
You try edit the JSP file, change from a encoding to other, close the file and open it again to see if the Netbeans recognizes the change, but sometimes, it fails! I think it's Netbeans bug...

The Netbeans doesn't allow you to change the file encoding directly by file Properties Window - the property Encoding is read only. But you can try to edit the JSP file and change the charset/encoding manually. Eg. you can change the occurrences from ISO-8859-1 to UTF-8, see:
<?xml version="1.0" encoding="ISO-8859-1"?>
<jsp:root version="2.1" 
        xmlns:f="http://java.sun.com/jsf/core" 
        xmlns:h="http://java.sun.com/jsf/html" 
        xmlns:jsp="http://java.sun.com/JSP/Page"
        xmlns:webuijsf="http://www.sun.com/webui/webuijsf">
    <jsp:directive.page contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"/>

Unfortunately, sometimes, this doesn't works and I don't know the reason... you can try to open the file using an text editor and saving it using another charset, or use some kind of file utility to convert it, but Netbeans yet doesn't recognize the new charset/encoding... Why? Netbeans saves some file attributes into ~/.netbeans/6.1/var/attributes.xml (I'm using Linux, but there is an equivalent file in other OSs, too). So, you must close the Netbeans IDE, open the attributes.xml using some editor, find the correspondent JSP filename entry and change the char set/encoding schema and you can open the Netbeans IDE again and to our surprise the Netbeans, finally, recognize the encoding change. Don't forgot to change charset/encoding from the JSP file, also. Bellow is an entry from the attributes.xml with the charset attribute to be changed:

<fileobject name="|home|usuario|dev|projects|eletron|rastreador|TrilhaWeb|web|monitor|IndexX.jsp">
        <attr name="encoding" stringvalue="ISO-8859-1"/>
        <attr name="jsfjsp" boolvalue="true"/>
</fileobject>


Good luck!

Labels: ,

2008/07/31

Facelets com o Netbeans 6.1

Para quem deseja usar o Facelets com o Netbeans 6.1, finalmente (faz até algum tempinho) saiu o plugin do Facelets para Netbeans. Tem um artigo bem básico para quem deseja saber como isso pode ser feito, veja: Introduction to Facelets. Bem, para quem tentou instalar a última versão do Facelets, seja a FCS 6.1 ou 6.1 ML (eu uso a primeira, pois prefiro usar minhas ferramentas de desenvolvimento em inglês), terá uma linda resposta, como esta (a data 200804211638 pode até estar ligeiramente diferente):
Missing required modules for Plugin Facelets Support:
JSP Parser [module org.netbeans.modules.web.jspparser/3 = 200804211638]

Para solucionar a questão, após descompactar o arquivo nbfaceletssupport-6.1.zip ou nbfaceletssupport-6.1ml.zip, você deve também descompactar o módulo org-netbeans-modules-web-frameworks-facelets.nbm (que foi extraído do anterior) e editar o arquivo que está em Info/info.xml de modo a trocar o ponto onde se faz menção a data por uma versão (eu use 1.0.0 :).

Meu arquivo original estava assim:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Autoupdate Module Info 2.5//EN" "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">
<module codenamebase="org.netbeans.modules.web.frameworks.facelets" distribution="" downloadsize="0" homepage="https://facelets.dev.java.net" license="AD9FBBC9" moduleauthor="Petr Pisl &amp; Po-Ting Wu" needsrestart="false" releasedate="2008/06/04">
    <manifest AutoUpdate-Show-In-Client="true" OpenIDE-Module="org.netbeans.modules.web.frameworks.facelets" OpenIDE-Module-Display-Category="Web" OpenIDE-Module-Implementation-Version="080604" OpenIDE-Module-Java-Dependencies="Java &gt; 1.5" OpenIDE-Module-Long-Description="This module serves as a basic support for Facelets." OpenIDE-Module-Module-Dependencies="org.jdesktop.layout/1 &gt; 1.3.23, org.netbeans.api.java/1 &gt; 1.10.22, org.netbeans.api.web.webmodule &gt; 1.7.21, org.netbeans.api.xml/1 &gt; 1.13.21, org.netbeans.libs.facelets &gt; 1.0.1, org.netbeans.modules.editor/3 &gt; 1.26.21, org.netbeans.modules.editor.completion/1 &gt; 1.6.22, org.netbeans.modules.editor.lib/1 &gt; 1.9.21, org.netbeans.modules.html.editor/1 &gt; 1.5.20, org.netbeans.modules.html.editor.lib/1 &gt; 1.5.21, org.netbeans.modules.j2ee.dd/1 &gt; 1.8.20, org.netbeans.modules.java.project/1 &gt; 1.8.21, org.netbeans.modules.project.ant/1 &gt; 1.12.22, org.netbeans.modules.project.libraries/1 &gt; 1.13.21, org.netbeans.modules.projectapi/1 &gt; 1.9.21, org.netbeans.modules.projectuiapi/1 &gt; 1.13.21, org.netbeans.modules.servletjspapi/1 &gt; 1.0.20, org.netbeans.modules.web.core.syntax/2 = 1, org.netbeans.modules.web.jsf/1 &gt; 1.3.28, org.netbeans.modules.web.jspparser/3 = 200804211638, org.netbeans.modules.web.project &gt; 1.6, org.netbeans.modules.xml.core/2 &gt; 1.12.21.4, org.netbeans.modules.xml.xam/1 &gt; 1.2, org.netbeans.modules.xml.xdm/1 &gt; 1.2, org.netbeans.spi.palette/1 &gt; 1.6.1, org.openide.awt &gt; 6.7.22, org.openide.dialogs &gt; 6.5.21, org.openide.explorer &gt; 6.5.21, org.openide.filesystems &gt; 6.4.21, org.openide.loaders &gt; 5.9.21, org.openide.modules &gt; 6.5.22, org.openide.nodes &gt; 6.7.21, org.openide.options &gt; 6.7, org.openide.text &gt; 6.9.21, org.openide.util &gt; 6.8.21, org.openide.windows &gt; 6.5.21" OpenIDE-Module-Name="Facelets Support" OpenIDE-Module-Requires="org.openide.modules.ModuleFormat1" OpenIDE-Module-Short-Description="Support for development of web applications based on Facelets." OpenIDE-Module-Specification-Version="1.0.6"/>
    <license name="AD9FBBC9">[NO LICENSE SPECIFIED]
</license>
</module>

Ao invés de se fazer menção a um release de uma data específica, devemos fazer com que o módulo seja, digamos, um pouco menos exigente (ou menos estúpido!) e para isso devemos fazer com que ele utilize como referência uma versão mínima, por exemplo. Ao fim, o meu ficou assim:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//NetBeans//DTD Autoupdate Module Info 2.5//EN" "http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd">
<module codenamebase="org.netbeans.modules.web.frameworks.facelets" distribution="" downloadsize="0" homepage="https://facelets.dev.java.net" license="AD9FBBC9" moduleauthor="Petr Pisl &amp; Po-Ting Wu" needsrestart="false" releasedate="2008/06/04">
        <manifest AutoUpdate-Show-In-Client="true" OpenIDE-Module="org.netbeans.modules.web.frameworks.facelets" OpenIDE-Module-Display-Category="Web" OpenIDE-Module-Implementation-Version="080604" OpenIDE-Module-Java-Dependencies="Java &gt; 1.5" OpenIDE-Module-Long-Description="This module serves as a basic support for Facelets." OpenIDE-Module-Module-Dependencies="org.jdesktop.layout/1 &gt; 1.3.23, org.netbeans.api.java/1 &gt; 1.10.22, org.netbeans.api.web.webmodule &gt; 1.7.21, org.netbeans.api.xml/1 &gt; 1.13.21, org.netbeans.libs.facelets &gt; 1.0.1, org.netbeans.modules.editor/3 &gt; 1.26.21, org.netbeans.modules.editor.completion/1 &gt; 1.6.22, org.netbeans.modules.editor.lib/1 &gt; 1.9.21, org.netbeans.modules.html.editor/1 &gt; 1.5.20, org.netbeans.modules.html.editor.lib/1 &gt; 1.5.21, org.netbeans.modules.j2ee.dd/1 &gt; 1.8.20, org.netbeans.modules.java.project/1 &gt; 1.8.21, org.netbeans.modules.project.ant/1 &gt; 1.12.22, org.netbeans.modules.project.libraries/1 &gt; 1.13.21, org.netbeans.modules.projectapi/1 &gt; 1.9.21, org.netbeans.modules.projectuiapi/1 &gt; 1.13.21, org.netbeans.modules.servletjspapi/1 &gt; 1.0.20, org.netbeans.modules.web.core.syntax/2 = 1, org.netbeans.modules.web.jsf/1 &gt; 1.3.28, org.netbeans.modules.web.jspparser/3 = &gt; 1.0.0, org.netbeans.modules.web.project &gt; 1.6, org.netbeans.modules.xml.core/2 &gt; 1.12.21.4, org.netbeans.modules.xml.xam/1 &gt; 1.2, org.netbeans.modules.xml.xdm/1 &gt; 1.2, org.netbeans.spi.palette/1 &gt; 1.6.1, org.openide.awt &gt; 6.7.22, org.openide.dialogs &gt; 6.5.21, org.openide.explorer &gt; 6.5.21, org.openide.filesystems &gt; 6.4.21, org.openide.loaders &gt; 5.9.21, org.openide.modules &gt; 6.5.22, org.openide.nodes &gt; 6.7.21, org.openide.options &gt; 6.7, org.openide.text &gt; 6.9.21, org.openide.util &gt; 6.8.21, org.openide.windows &gt; 6.5.21" OpenIDE-Module-Name="Facelets Support" OpenIDE-Module-Requires="org.openide.modules.ModuleFormat1" OpenIDE-Module-Short-Description="Support for development of web applications based on Facelets." OpenIDE-Module-Specification-Version="1.0.6"/>
    <license name="AD9FBBC9">[NO LICENSE SPECIFIED]
</license>
</module>

Além disso, você terá que editar o arquivo META-INF/manifest.mf que se encontra dentro de netbeans/modules/org-netbeans-modules-web-frameworks-facelets.jar (novamente extraia o contéudo do arquivo, pois está dentro dele) e fazer a mesma coisa que fizemos com o arquivo info.xml. Após isso, monte novamente o arquivo org-netbeans-modules-web-frameworks-facelets.jar e coloque-o em netbeans/modules/ e finalmente monte o arquivo org-netbeans-modules-web-frameworks-facelets.nbm. E pronto! Isso será suficiente para o usarmos com o Netbeans 6.1!

Módulo Já Corrigido

Por comodidade, talvez você queira usar o pacote já pronto com as alterações que relato acima; baixe-o aqui: nbfaceletssupport-6.1.zip. Com as alterações que fizemos, ele irá (em princípio) funcionar em qualquer versão do Netbeans 6.xxx.

Thanks To

The JJ Blogger - Java, Oracle, PostgreSQL, and More... - If you need help installing Facelets with netbeans 6.1 or later and don't understand portuguese, see this post.
Po-Ting Wu's Weblog

Labels: ,

2008/07/30

Ć (C Acentuado) vs. Ç (C Cedilha) no Firefox32 rodando num AMD64 com Kubuntu 64 Bits

Eu uso um Kubuntu Hardy (Ubuntu 8.04.1) 64 bits rodando numa máquina AMD64 e opto preferencialmente por programas 64 bits, pois não vejo o menor sentido em ficar usando software 32 bits em máquinas de 64 - totalmente nosense. No entanto, devido as limitações do Firefox 64 bits (falta de plugins, incluindo suporte a applets Java, Flash e alguns add-ons Firefox), fui obrigado (após muito relutar!) usar o Firefox 32 Bits. Pois só nele encontro o suporte aos recursos que normalmente utilizo.

Instalação do Firefox 32 Bits

Já faz muito tempo que utilizo essa solução, mas sempre que preciso instalar o Firefox 32 bits com seus plugins e tudo mais desejável, opto por um script que automatiza o processo de instalação (sim sou newbie, e daí?!). O script de instalação do Firefox32 (para várias versões e sabores) pode ser encontrado, em: Howto Install 32 bit Firefox with Flash w/sound and Java for AMD64.

Praga: Ć ao invés de Ç

Meu sistema está configurado para a língua inglesa, ou mais precisamente, inglês estadunidense. Meu teclado não tem a tecla com Ç e realmente odeio teclados ABNT/ABTN 2. Meu teclado é no formato americano internacional e ao invés do cedilha, tem uma tecla com vírgula.

Quem tem essa configuração, sabe que é um desafio acentuar corretamente com o c cedilha. Normalmente teclariamos a tecla com a aspa simples (ou apóstrofo, ou ainda o acento agudo) e em seguida teclariamos o C. Bem, no meu caso isso não resolve e tive que sair em busca de uma solução. Aos poucos fui soluciando o problema em diferentes lugares.

Aplicações: QT (e KDE)

Ao contrário de quem usa o Ubuntu, a galera do Kubuntu vai querer configurar o QT (e KDE) de modo que suas aplicações possam usar o ' + c para fazer o ç. Para isso, edite o arquivo que se encontra em /usr/share/X11/locale/en_US.UTF-8/Compose e substitua todos os Ć por Ç e ć por ç. Se preferir, use o script abaixo:

sudo -i
cd /usr/share/X11/locale/en_US.UTF-8
cp Compose Compose.original
cat Compose.original | sed -e 's/Ć/ć/' -e 's/Ç/ç/' > Compose
exit

Se você estiver usando ISO-8859-1 ao invés de UTF8, provavelmente a modificação acima não será necessária no arquivo Compose equivalente, pois ao menos na minha máquina ele está mapeado corretamente (entenda "corretamente" como: correto para o uso que se espera aqui no Brasil, pois em muitos paises da Europa se utiliza o c com acento agudo). No meu caso, a variável de ambiente LANG está configurada para en_US.UTF8.
E antes que alguém indague: sim, prefiro usar meu OS em inglês que em português e até pagaria para não ter meu OS em português!

Configurando o GTK

Antes de mais nada: ODEIO GTK e IGUALMENTE, ODEIO GNOME.

Para usar o ç (c cedilha) em aplicações GTK, e isso inclui o Gnome, você terá que alterar o arquivo /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules de modo a acrescentar a lingua inglesa na lista de linguagens do módulo cedilla. Para isso, altere a linha:

"cedilla" "Cedilla" "gtk20" "/usr/share/locale" "az:ca:co:fr:gv:oc:pt:sq:tr:wa"

De modo que fique assim:
"cedilla" "Cedilla" "gtk20" "/usr/share/locale" "en:az:ca:co:fr:gv:oc:pt:sq:tr:wa"

Isso dirá a GTK que o módulo cedilla - responsável pelo reconhecimento do pressionamento '+c como ç - se aplique, também, a língua inglesa. Obviamente, isso só é necessário se você estiver usando inglês como língua em seu OS ou aplicativo. Para saber qual a sua configuração atual, vá no console (konsole) e digite:
locale
No meu caso, está configurado para:
LANG=en_US.ISO-8859-1
LANGUAGE=en_US:en
LC_CTYPE=en_US.utf8
LC_NUMERIC=en_US.utf8
LC_TIME=pt_BR
LC_COLLATE=en_US.utf8
LC_MONETARY=pt_BR
LC_MESSAGES=en_US.utf8
LC_PAPER=pt_BR
LC_NAME=pt_BR
LC_ADDRESS=en_US.utf8
LC_TELEPHONE=pt_BR
LC_MEASUREMENT=pt_BR
LC_IDENTIFICATION=en_US.utf8
LC_ALL=
Você pode controlar esses valores por intermédio do arquivo de configuração /etc/environment. No meu caso, o arquivo está configurado, como:
JAVA_HOME=/opt/jdk1.6.0_06/jre

KDE_NO_IPV6=true
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

LANGUAGE="en_US:en"
LANG="en_US.UTF-8"
Esse valores também podem ser controlados pelo arquivo de configuração /etc/default/locale.

Você deve forçar a GTK a carregar o módulo cedilla. Para isso, você terá que ter uma variável de ambiente chamada GTK_IM_MODULE e ela deverá ter o valor cedilla. Se essa variável não explicitar o módulo cedilla, ele não será carregado e você não terá o c cedilha, mas sim o c acentuado, mesmo que tenha acrescentado o "en" no arquivo libgtk2.0-0.immodules.
Essa variável de ambiente pode ser configurada em qualquer um de vários lugares, como:

/etc/environment
~/.profile
/etc/profile.d/
Se quiser, simplesmente rode:
sudo -i
echo "export GTK_IM_MODULE=cedilla" >> /etc/environment
exit

O Teste

Após fazer as alterações para a correta acentuação do sistema, você deverá reiniciar o X (interface gráfica), para isso, pode simplesmente reiniciar a máquina ou pressionar: CTRL + ALT + BACKSPACE. Você verá que as aplicações estão acentuando corretamente, tanto as QT, quanto GTK.

Firefox32 num Linux 64 bits

Quando você entrar no seu Firefox 32 bits ficará muito surpreso ao ver que somente ele não acentua corretamente! Se você iniciá-lo do console, verá uns avisos, assim:

usuario@maquina:~$ firefox

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libqtengine.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libqtengine.so: wrong ELF class: ELFCLASS64
FoxyProxy settingsDir = /home/usuario/.mozilla/firefox/rb9nj3cx.default

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

(firefox-bin:11868): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so: wrong ELF class: ELFCLASS64

(firefox-bin:11868): Gtk-WARNING **: Loading IM context type 'cedilla' failed

Eu perdi muito tempo tentando entender o porquê disso. Pois conforme se vê acima, a GTK tenta carregar uma biblioteca 64 bits para uma aplicação que é 32 bits... Ao invés de carregar /usr/lib/gtk-2.0/2.10.0/immodules/im-cedilla.so, ela deveria carregar: /usr/lib32/gtk-2.0/2.10.0/immodules/im-cedilla.so. Obviamente ela não vai conseguir carregar o módulo de 64 bits, pois o Firefox que usamos é 32 bits. Só que isso é consequência, não é a razão do problema. E eu não consegui descobrir o porquê e se você pesquisar muito na Internet, verá que ninguém conseguiu, também.

Bem, compreendendo o fato dele estar tentando carregar uma biblioteca de 64 bits ao invés da que deveria e que essa biblioteca é o módulo que desejamos que seja carregado, pois ele fará nosso ç e que também:

  • O módulo a ser carregado pela GTK é informado na variável de ambiente GTK_IM_MODULE;
  • Há uma versão da GTK para 64 bits e outra para 32 bits. Logo, haverá dois arquivos de configuração desses módulos e para cada módulo uma versão de acordo com a arquitetura;
  • O Firefox32 está, por alguma razão desconhecida, carregando o módulo de 64 bits. Após testes, verifiquei que a GTK também só lia o arquivo /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules - que é de 64 bits -, mas não o arquivo para a configuração de 32 bits /usr/lib32/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules;
  • Sei que ao menos aplicações GTK de 64 bits estão formando o c cedilha corretamente. Isso graças as configurações que foram realizadas anteriormente. Sendo assim, é desejável preservá-las;

Como não encontrava nenhuma solução para o problema e observado o já exposto, pensei em fazer o Firefox32 ao invés de usar o módulo GTK cedilla de 64 bits, usar o equivalente para 32 bits. Tudo preservando as configurações para as outras aplicações.

A Solução para Ç no Firefox32

O que fiz foi copiar a biblioteca im-cedilla.so de 32 bits para a pasta de módulos IM de 64 bits da GTK e, claro, a renomeei - dei o nome im-cedil32.so. Também, alterei o arquivo da configuração de 64 bits da GTK dos módulos IM para contemplar o "novo" módulo im-cedil32.so. O módulo internamente faz referência a seu próprio nome e por isso, tive que editar o arquivo (usei o khexedit, mas você poderia usar qualquer editor binário) e alterar no braço as referências a cedilla para cedil32.
Pronto. Funcionou! Isso foi o "suficiente".

Abaixo o script para reproduzir o que realizei:
sudo -i
cd /usr/lib/gtk-2.0/2.10.0/immodules/
cp /usr/lib32/gtk-2.0/2.10.0/immodules/im-cedilla.so /tmp/im-cedilla.32bits.so
apt-get install bbe
bbe -e s/edilla/edil32/ /tmp/im-cedilla.32bits.so | sudo bbe -e s/type_cedil32/type_cedilla/ -o im-cedil32.so
cd ../immodule-files.d/
echo "\
\"/usr/lib/gtk-2.0/2.10.0/immodules/im-cedil32.so\"
\"cedil32\" \"Cedil32\" \"gtk20\" \"/usr/share/locale\" \"az:ca:co:fr:gv:oc:pt:sq:tr:wa:en:us\"
" >> libgtk2.0-0.immodules
exit

Se precisar, pode pegar o binário que foi criado no passo acima, aqui: im-cedil32.so

E finalmente alteramos o script de inicializaćão (e de agora em diante escrevermos inicialização) do Firefox 32 bits para que ele sempre inicialize a variável de ambiente GTK_IM_MODULE para cedil32 ao invés de cedilla. Para isso, localize o script de inicialização do Firefox32 e modifique-o de modo a acrescentar a variável de ambiente que precisamos. Coloque isso logo no início do script.

Após, seu script de inicialização do Firefox32 conterá a seguinte linha em destaque:
## the mozilla-bin binary to work.
##

export GTK_IM_MODULE=cedil32

moz_pis_startstop_scripts()
{
  MOZ_USER_DIR=".mozilla/firefox"
  # MOZ_PIS_ is the name space for "Mozilla Plugable Init Scripts"

Uma forma diferente de fazer Ç ccedilha

Para fazer o C cedilha em qualquer aplicação, mesmo sem ter que fazer nada do que relato anteriormente, basta usar: ALT_DIR + , + c. Só serve a tecla ALT da direita, não serve a da esquerda.

Eu ainda prefiro: ´ + c
;)

Labels: ,

2008/07/22

Java: Sound at my Linux machine... It's ridiculous!

All right... Where is the sound?
I love my Kubuntu box, but I'm unable to play any sound from Java. Why? I think that the JVM needs exclusive access to the sound system, otherwise, nothing is played, or, other times, errors of kind LineUnavailableException are throwed. And, yes, I'm already using ALSA. It's serious, 'cause, except when I have exclusive access to the sound system, nothing bellow are working:

  • Toolkit.getDefaultToolkit().beep()
    No beep...
  • File file=new File("/opt/jdk1.6.0_06/demo/applets/JumpingBox/sounds/danger.au");
    AudioClip audioClip = Applet.newAudioClip(file).toURI().toURL();
    audioClip.loop();
    audioClip.play();

    No sound (or error)... nothing
  • System.out.print("\007");
    System.out.flush();

    No beep here, too..
  • String[] cmd = {"sh", "-c", "printf \"\\7\""};
    Runtime.getRuntime().exec(cmd);

    Again, nothing..

After search about this, I check that the current Java version (Hotspot 1.6.0_06) has some limitations about the sound. To Java share (and play) the sound system with others applications, the sound board needs to have mixer feature by hardware - software emulation isn't supported by Java. If another application is using the sound system, Java cannot play nothing. It's very displeasure.. because to listen a simple "beep" from my Java application, I must disable all other application that do sound usage.

Workaround = Gambiarra or Cat (brazilian ;)

To play some audio file with my Java application, I can do:
String path = "/opt/jdk1.6.0_06/demo/applets/JumpingBox/sounds/danger.au";
String[] cmd = {"sh", "-c", "aplay " + path};
Runtime.getRuntime().exec(cmd);
To generate some kind of noise (sound), uses:
String data = "09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azaZ";
data += "09azaZ09azaZ09azaZ09azaZ09azAZ";
data += "09aZAz09aZAz09aZAz09aZAz09aZAz";
data += "09aZAz09aZAz09aZAz09aZAz09aZAz";
String[] cmd = {"sh", "-c", "echo " + data + " | aplay -r 4"};
Runtime.getRuntime().exec(cmd);

Also we can use the festival to "say" "Beep, Beep, Beep" (or anything else). See:

String text = "Beep, Beep, Beep";
String[] cmd = {"sh", "-c", "echo \"" + text + "\" | festival --tts" };
Runtime.getRuntime().exec(cmd);

But now, if we want to create our wav sound data and play it on the fly, just do:

/** 
 * Sound utility class. 
 * @author Marcio Wesley Borges marciowb@gmail.com
 * @version 0.001, 2008-07-22
 */
public final class SoundUtil {
        
private static final AudioFormat AF = new AudioFormat(8000f, 8, 1, true, false);

public static boolean isSoundWorking() {
    SourceDataLine sdl = null;
    try {
        sdl = AudioSystem.getSourceDataLine(AF);
        sdl.open(AF);
    } catch (LineUnavailableException ex) {
        return false;
    } finally {
        if (sdl!=null)
            sdl.close();
    }
    return true;
}

public static void beep() {
    if (isSoundWorking())
        Toolkit.getDefaultToolkit().beep();
    else
        mimeBeep();
}

private static void mimeBeep() {

    final int SAMPLE_RATE = 8000; // sample per second
    final int SAMPLE_PER_MS = SAMPLE_RATE/1000; // sample per ms

    //make your adjustments here
    final int HZ = 400; // Frequency in hertz
    final int MSECS = 50; // Duration        

    final byte[] raw = new byte[MSECS * SAMPLE_PER_MS]; //duration_ms * (sample per ms)
    for (int i = 0; i < raw.length; i++) {
        double angle = i / (SAMPLE_RATE / (double) HZ) * 2.0d * Math.PI;
        raw[i] = (byte) (Math.sin(angle) * 81.11d);
    }

    final String[] cmd = {"sh", "-c", "aplay -c1 -fU8 -r" + SAMPLE_PER_MS };

    Process p = null;
    try {
        p = Runtime.getRuntime().exec(cmd);
        p.getOutputStream().write(raw);
        p.getOutputStream().close();
        Thread.sleep(MSECS+30); //Wait the outer process to play.
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (p!=null)
            p.destroy();
    }
}

public static void main(String[] args) {
    beep();
}

}//end class SoundUtil

Thanks to

Labels: , ,

2008/07/21

Java: Better Performance

I was searching about some flags to pass to my Sun Hotspot JVM (I'm using Java HotSpot(TM) 64-Bit Server VM (build 10.0-b22, mixed mode) at Kubuntu Hardy with an AMD64) and I found a most complete reference that I found until now; see in the page: jdk6options.html.

Assorted Java performance tips can be found at Java Performance Tuning.

Labels: ,

2008/07/16

Stardict: A alternativa Linux para o Babylon

Babylon

Não sei você, mas eu não vivo sem o Babylon. Para quem não sabe o Babylon, em minha opinião, é o programa mais versátil de tradução que existe para Windows. Acredite, ou não, eu pago por ele desde a versão 3.2. E já adquiri alguns glossários premium, como o Michaelis e os da Oxford. A questão é que em meu notebook, eu só uso Linux, mais propriamente o Kubuntu e só tenho Windows via VMWare - que só uso quando extritamente necessário. Apesar de já usar Linux diariamente desde 2005, tem certos programas que realmente fazem falta: Adoro o Dreamweaver, por exemplo; e em contrapartida odeio (queimem vivos os desenvolvedores dele) o Quanta Plus. Mas se tem um programa que realmente faz falta para mim, é o Babylon.

A cada seis meses eu pesquiso por alguma solução de dicionário semelhante ao Babylon, não quero nada diferente. Se igual, melhor. Quero com um simples clique selecionar uma palavra ou texto e ver a tradução imediatamente, tudo de forma simples, rápida e sem me atrapalhar.
Até ontem, desconhecia tal solução, mas hoje, eis que descobri o Stardict.

Bem, agora sim meu nix está completo! (Ou quase... mas ainda chega lá!)

Stardict

Stardict - dicionário em um clique para Linux

O Stardict é um programinha que é bem similar ao bem afamado Babylon, só que o Stardict é open source e gratuito! Funciona em Linux, (a galera é boazinha) Windows e Mac OSX.

Para instalá-lo no Ubuntu ou Kubuntu, use:

sudo apt-get install stardict stardict-common stardict-gnome stardict-plugin stardict-plugin-espeak stardict-plugin-festival stardict-plugin-spell stardict-tools

Eu imagino que nem todos os pacotes acima sejam necessários, mas da primeira vez eu instalei somente os pacotes que eu julguei necessário, e após instalar os dicionários, a definição do termo não aparecia, ao invés era exibida a seguinte mensagem: "HTML data parsing plug-in is not found". Por isso, instalei todos os pacotes, conforme dica que segui no forum do Ubuntu italiano.

Há uma versão online do Stardict, tanto html, quanto AJAX, em: www.stardict.org.

Dicionários

O Stardict permite usar glossários oriundos de várias fontes, tanto de arquivos locais, quanto via TCP (usando o dictd, por exemplo). Além disso, há vários utilitários que podem ser usados para converter glossários em outros formatos que não os usados diretamente pelo Stardict. É possível (e usual) até converter glossários inteiros do próprio Babylon para o Stardict.

Há vários glossários para stardict, prontos para serem usados. Acho interessante a seguinte série: stardict-dict-babylon - dicionários já convertidos do Babylon para o Stardict.
Quer ter a Wikipedia inteira e usá-la quando bem entender, mesmo offline? Bem, tá lá. Tem a Wikipedia e muito, muito, muito mais. São centenas de dicionários prontos para serem usados. Acesse o repositório de arquivos do Stardict no Sourceforge.net.

O processo de instalação dos dicionários Stardict, é bem simples (obviamente falo para o padrão Linux... e não Windows), veja:

  1. Baixe o dicionário que deseja;
  2. Descompacte o arquivo e você terá um diretório com arquivos de extensão, como: .ifo, .dict.dz, .syn, .idx, não necessariamente todos estes.
  3. Cópie o diretório do passo anterior, para: /usr/share/stardict/dic/.
Exemplo:

cd /tmp
wget http://sourceforge.net/project/downloading.php?groupname=stardict&filename=stardict-babylon-Concise_Oxford_Thesaurus-2.4.2.tar.bz2&use_mirror=ufpr
cd /usr/share/stardict/dic
tar -xvvjf /tmp/stardict-babylon-Concise_Oxford_Thesaurus-2.4.2.tar.bz2

Após instalar os dicionários, é necessário reiniciar o Stardict para que ele reconheça os dicionários que foram instalados.

Convertendo dicionários do Babylon

Para realizar a conversão de um dicionário qualquer do Babylon, você vai precisar de uma ferramenta chamada dictconv - ela realiza a conversão dos dicionários no formato Babylon (.BGL) para o Stardict. Você terá que baixá-la e compilá-la. Siga:

cd /tmp
wget http://downloads.sourceforge.net/ktranslator/dictconv-0.2.tar.bz2
tar -xvvjf dictconv-0.2.tar.bz2
cd dictconv-0.2
./configure
make
sudo make install

No exemplo abaixo, nós iremos baixar um dicionário no formato Babylon, extrair seus dados, corrigir o arquivo gerado, criar o dicionário para o Stardict, corrigir a flag de html e copiá-lo para o diretório de dicionários do Stardict. Veja:

cd /tmp
mkdir convertdict
cd convertdict

wget http://www.babylon.com/files/premium/michaelis/michaelis_ptg_ptg.bgl
dictconv -o michaelis_ptg_ptg.dic michaelis_ptg_ptg.bgl
cat michaelis_ptg_ptg.dic | sed 's/\$[0-9][0-9]*\$\t/\t/' > michaelis_ptg_ptg_fixed.dic
/usr/lib/stardict-tools/tabfile michaelis_ptg_ptg_fixed.dic
cat michaelis_ptg_ptg_fixed.ifo | sed 's/sametypesequence=m/sametypesequence=h/' > michaelis_ptg_ptg_fixed.ifo.html
mv michaelis_ptg_ptg_fixed.ifo.html michaelis_ptg_ptg_fixed.ifo

sudo mkdir /usr/share/stardict/dic/michaelis_ptg_ptg
sudo cp michaelis_ptg_ptg_fixed.* /usr/share/stardict/dic/michaelis_ptg_ptg/

O exemplo acima já modifica o arquivo .ifo setando a flag que informa se há ou não html no texto do dicionário. Em se tratando de dicionários do Babylon, sempre há html em meio ao texto e nós iremos querer renderizá-la adequadamente. Por isso, setamos a flag de forma que fique, assim sametypesequence=h. O default (que não queremos) é sametypesequence=m e torna bastante desagradável a leitura do dicionário.

Festival: Habilitando TTS Sintetizado

Se você instalou o Festival e ainda não consegue sintetizar o som, talvez seja melhor você forçá-lo a usar ALSA ao invés de OSS. Eu não conseguia reproduzir sons com o Festival (ele é usado pelo Stardic) e recebia a seguinte mensagem de erro:
Linux: can't open /dev/dsp
Após muito pesquisar, encontrei a solução num forum. Use o seguinte comando:

cd ~ && printf ";use ALSA\n(Parameter.set 'Audio_Method 'Audio_Command)\n(Parameter.set 'Audio_Command \"aplay -q -c 1 -t raw -f s16 -r \$SR \$FILE\")\n" > .festivalrc

RealPeopleTTS

O Stardic permite que se utilize um banco de wavs com sons pronunciados (falado e gravado) por pessoas reais, ao invés da sintetização. São mais de 21000 palavras, cada uma gravada em um arquivo .wav correspondente.

Para instalar esse banco de wavs, use:
cd /tmp
wget http://ufpr.dl.sourceforge.net/sourceforge/stardict/WyabdcRealPeopleTTS.tar.bz2
cd /usr/share
sudo tar -xvvjf /tmp/WyabdcRealPeopleTTS.tar.bz2

Eu estou usando o Kubuntu Hardy e tive que perder um pouco de tempo até descobrir o porquê do Stardic não estar reproduzindo as wavs com os sons das palavras. Era por causa do esd, conforme observei num forum. O Stardic utiliza-o em sua reprodução e por isso ele deve ser iniciado juntamente com a sessão do KDE - coisa que não estava sendo feita. Portanto, antes de iniciar o Stardic, certifique-se de que o esd está rodando.
Eu optei por colocá-lo para rodar automaticamente quando do início de uma sessão do KDE, e para isso, fiz:

cd ~/.kde/Autostart
ln -s /usr/bin/esd esd

Babylon ou Stardict?

Ainda não usei o Stardict no meu Vista (odeio Vista, prefiro XP), mas posso dizer que em todos os quesitos estou satisfeito com o Stardict; em nada fica devendo ao Babylon. Quer ver? Olhe as vantagens do Stardict:

  • Extensibilidade: suporte a plugins, e já sai do forno com vários;
  • TTF sintetizado e real;
  • Possibilidade de se usar qualquer TTF que se queira;
  • Pode-se usar qualquer banco de wavs;
  • Várias opções de pesquisa: simples, full text, parcial, curingas, fuzzy;
  • Sugestões fonéticas;
  • Rápido - até muito mais rápido que o Babylon - tanto para iniciar, quanto para pesquisar;
  • Tradução de textos inteiros ou de palavras;
  • Disponibilidade: pode ser usado em várias plataformas;
  • Imensurável número de dicionários: dos melhores e mais conhecidos aos mais específicos;
  • Integrável: compatível com webservices e com tecnologias já existentes, como o dict;
  • Farta disponibilidade de ferramentas para conversão de dicionários já existentes, inclusive os da própria Babylon, bem como de vários outros formatos, além, claro, da criação e edição de seus próprios dicionários;
  • open source;
  • gratuito;
Janela principal do Stardict

tee = Smartphones || Java Programmers

Para desenvolvedores Java, há um porte do Stardic de potencial interesse: TeeDict (AKA jStarDict). Há versões do jStarDict para diversos smartphones, Palms e desktop. E, acredite, você irá gostar de tê-lo instalado em seu celular. Tudo de graça e open source!

Babylon/Windows com Cleartype

O Babylon não funciona quando o ClearType está habilitado. O ClearType pode ser habilitado no Windows XP e já é padrão no Windows Vista. Portanto, onde é necessário que o Babylon utilize o OCR, ele irá falhar se o ClearType estiver ativo.

Outra lastima (ao menos para mim que sou um trouxa e pagou pelo Babylon 3/4 e 7) é que ele não captura textos do Firefox e uma tonelada de outros programas. Para mim, está quase imprestável! Pois sou obrigado a todas as vezes digitar manualmente o texto. Horrível!

Qualquer hora dessas me aventuro a dar uma melhorada no Stardict e não será difícil ter algo melhor que o Babylon no meu Windows Vista 64.

Referências

Labels: ,

2008/07/10

Cuidado! Há um DEMENTE no Senado e ele vai acabar com sua liberdade

A todos peço desculpas pelas asneiras que escrevo abaixo, mas, sinceramente, essas coisas destes tempos recentes, me dão vontade de cagar!

A merda

Há um louco no senado brasileiro que deseja muito acabar com a minha e a sua liberdade. Ele quer te privar da Internet e toma para si o exemplo chinês de censura e policiamento que se pratica lá por aqueles lados.

Não sei o que fazer, vou ter que mudar de casa, mudar de nome e provavelmente até de planeta se as coisas continuarem assim.

No senado brasileiro O Idiota quixotesco se esforça muito para te fuder, me fuder e fuder a todos da sociedade brasileira, um crime contra a liberdade na Internet.
Polícia para quem precisa! Cana para você, ladrão!
Seu fedor me enoja!
O tenho como larápio profissional, mas não esperava que fosse nos roubar a todos.

Nossa liberdade se esvai pelas mãos de um Senador (que nojo!) Azedo. Até Quixote consegue ser recompensado pelo seu esforço e aí, nesse ponto, sua aventura deixa de ter graça.

Por acaso alguém conhece algum criminoso de verdade que esteja disposto a se apresentar pessoalmente ao imoral Quixote regulador da moralidade da rede? Talvez assim ele aprenda a diferença entre um hacker e um fora da lei...

Sou contra!

Mais informações, em:

Labels: ,

2008/07/04

J2ME: Using CommConnection at Linux with an USB Serial Port Adapter

I use an USB Serial Adapter with my Linux (Kubuntu - Hardy) notebook. I'm developing a midlet to run into an Automatic Vehicle Locator (aka AVL) hardware Linux based and with MIDP 2.0 CLDC 1.1 support. To comunicate with the AVL I can use a standard RS-232 port or Internet (via GPRS). To program the AVL I prefer to use the serial port to transfer the JAR to it, but to debug, I want to use my full IDE features (I use Netbeans with full Sun mobility pack installed).

The AVL has three serial ports:

  • /dev/ttyS0 - to the standard console;
  • /dev/ttyS1 - to communicate with its GPS module (standard NMEA 0183);
  • /dev/ttyS2 - to communicate with its GSM/GPRS module (to transfer data and send/receive AT Commands).

Instead always transfer the JAR file to the AVL (I'm using screen + zmodem to do it), I wanted to debug it in my notebook and only after test it locally is that I would turn it in the AVL. To do it I attached a GSM/GPRS modem via an USB serial adapter to my notebook and also a GPS with another serial adapter. In Ubuntu the two USB serial port adapters appears as:

  • /dev/ttyUSB0
  • /dev/ttyUSB1

However, after trying to open the serial port from the J2ME midlet running in the emulator, I got exceptions:

set attr failed(00000005): Input/output error
java.io.IOException: Input/output error
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:285)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.ATCommand.(ATCommand.java:38)
at net.marciowb.cldc.avl.vt850.Rastreador.openIO(Rastreador.java:123)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:69)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)
Unable to create MIDlet net.marciowb.cldc.avl.vt850.Rastreador
java.lang.IllegalArgumentException: Missing device name
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:247)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.RS232.(RS232.java:40)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:70)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)

It happens when I try:

String cnnGsmStr = "comm:COM1;baudrate=115200;bitsperchar=8;stopbits=1;parity=none;blocking=off";
CommConnection cnnGsm = (CommConnection)Connector.open(cnnGsmStr);

If I try:

String cnnGsmStr = "comm:/dev/ttyUSB0;baudrate=115200;bitsperchar=8;stopbits=1;parity=none;blocking=off";
CommConnection cnnGsm = (CommConnection)Connector.open(cnnGsmStr);

I get:

Unable to create MIDlet net.marciowb.cldc.avl.vt850.Rastreador
java.lang.IllegalArgumentException: Illegal device name
at com.sun.midp.io.j2me.comm.Protocol.connect(Protocol.java:258)
at com.sun.midp.io.ConnectionBaseAdapter.openPrim(ConnectionBaseAdapter.java:103)
at javax.microedition.io.Connector.openPrim(Connector.java:329)
at javax.microedition.io.Connector.open(Connector.java:222)
at javax.microedition.io.Connector.open(Connector.java:198)
at javax.microedition.io.Connector.open(Connector.java:180)
at net.marciowb.cldc.avl.comm.ATCommand.(ATCommand.java:38)
at net.marciowb.cldc.avl.vt850.Rastreador.openIO(Rastreador.java:123)
at net.marciowb.cldc.avl.vt850.Rastreador.(Rastreador.java:69)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(Selector.java:150)

After search, try, read, try, think, try, read, search, try and no success, I find in /WTK2.5.2/lib/system.config references to COM1 and COM2, but after modify for several times this values I saw that it doesn't apply to my question. So, after do a full find in WTK directory I found the /WTK2.5.2/bin/libzayit.so file that contains hard code references to /dev/ttyS0 and /dev/ttyS1 but don't have any reference to /dev/ttyUSB0 or /dev/ttyUSB1. Half problem solved!

Then to do my midlet works with the Sun Mobility Pack in my Linux machine with the USB serial port adapter, just I do:

su
rm /dev/ttyS[01]
ln -s /dev/ttyUSB0 /dev/ttyS0
ln -s /dev/ttyUSB1 /dev/ttyS1
chmod a+w /dev/ttyS[01]

Done! Now You can use:

CommConnection cnnGsm = (CommConnection)Connector.open("comm:COM1;baudrate=115200");

That it works!

Labels: , ,

2005/08/07

Na falta de um webservice: Como obter a última cotação do dólar diretamente do BACEN.

No website do SIBPROvider eu necessito obter o valor da última cotação do dólar comercial, pois devido ao preço do SIBPROvider estar em Dólar eu preciso convertê-lo para Real. Para obter a cotação, eu utilizo uma página do Banco Central que a fornece. A questão é que a página está em html e como vocês devem saber o ideal é que a cotação fosse fornecida por meio de um webservice. Até onde eu sei, o BACEN não fornece um serviço do tipo. Antes de criar a solução que relato, eu pesquisei se não haveria um webservice gratuito e confiável que fornecesse a cotação. Também, não encontrei. Encontrei, sim, serviços pagos. Em decorrência, optei por usar a cotação da página do BACEN. É esta a solução que repasso a seguir.

A solução que proponho é bem simples. Basicamente o que se deve fazer é realizar um requisição do tipo GET por meio do protocolo HTTP ao website do BACEN solicitando a página que fornece a cotação, ou seja, a grosso modo deve-se fazer o que um browser faria para obter a página. O endereço da página é: http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm

No caso do website do SIBPROvider eu fiz essa tarefa em uma página ASP usando VBScript, mas a mesma lógica pode ser usada em .NET, Java, Delphi, Visual Basic, C/C++, Perl, PHP e em qualquer linguagem\tecnologia que seja possível realizar uma requisição HTTP.

Solução usando ASP & VBScript

Para realizar o acesso à página de cotação do dólar do BACEN, eu optei por usar o componente Msxml2.ServerXMLHttp. Este é um componente auxiliar que é fornecido juntamente com o pacote de componentes do SDK XML da Microsoft. Este componente já está instalado em máquina com Internet Explorer 5 (ou superior) e também em plataformas Windows 2000 (ou superiores). A vantagem deste componente é que ele torna fácil o acesso a HTTP. Por exemplo, no VBScript abaixo estamos solicitando a página de cotação do dólar no website do BACEN. Veja:

'O código abaixo obtém a página com a cotação do dólar no BACEN

'Endereço da página que desejamos acessar
const URL "http://www.bacen.gov.br/htms/infecon/taxas/taxas.htm"
dim xmlhttp

'Obtemos uma instância do objeto XMLHTTP
'Com ele se acessa a página
set xmlhttp CreateObject("Msxml2.ServerXMLHttp")

'Abrimos uma conexão com o servidor da URL
xmlhttp.Open "GET"URL